From 0d50124e512707fefc206010079865f805494ae8 Mon Sep 17 00:00:00 2001 From: Diego Sueiro Date: Thu, 18 Feb 2021 16:09:29 +0000 Subject: [PATCH] arm-autonomy: Fix XenStore initialisation for host kernels < 5.10.13 The arm-autonomy-host kernels older than 5.10.13 need to backport the 0001-xen-Fix-XenStore-initialisation-for-XS_LOCAL.patch in order to be able to use the `xl block-attach` and fix this issue: ``` xl block-attach 0 "phy:/dev/vg-xen-vda3/base" xvda w libxl: error: libxl_xshelp.c:201:libxl__xs_read_mandatory: xenstore read failed: `/libxl/0/type': No such file or directory libxl: warning: libxl_dom.c:52:libxl__domain_type: unable to get domain type for domid=0, assuming HVM libxl: error: libxl_disk.c:314:device_disk_add: device already exists in xenstore libxl: error: libxl_device.c:1407:device_addrm_aocomplete: unable to add device ``` This issue is not present in linux-linaro-arm[-rt] 5.4.0 used by N1SDP, hence we do not apply this patch for it. Issue-Id: SCM-2151 Signed-off-by: Diego Sueiro Change-Id: I1a38e22084161fb4b6028ef12443707cc566d56e Signed-off-by: Jon Mason --- ...XenStore-initialisation-for-XS_LOCAL.patch | 98 +++++++++++++++++++ .../linux/linux-arm-autonomy.inc | 7 ++ 2 files changed, 105 insertions(+) create mode 100644 meta-arm-autonomy/recipes-kernel/linux/files/0001-xen-Fix-XenStore-initialisation-for-XS_LOCAL.patch diff --git a/meta-arm-autonomy/recipes-kernel/linux/files/0001-xen-Fix-XenStore-initialisation-for-XS_LOCAL.patch b/meta-arm-autonomy/recipes-kernel/linux/files/0001-xen-Fix-XenStore-initialisation-for-XS_LOCAL.patch new file mode 100644 index 00000000..5bf9b745 --- /dev/null +++ b/meta-arm-autonomy/recipes-kernel/linux/files/0001-xen-Fix-XenStore-initialisation-for-XS_LOCAL.patch @@ -0,0 +1,98 @@ +From 5f3d54c00f1f2682cee9c590c22655b0330ffd18 Mon Sep 17 00:00:00 2001 +Message-Id: <5f3d54c00f1f2682cee9c590c22655b0330ffd18.1612780458.git.diego.sueiro@arm.com> +From: David Woodhouse +Date: Tue, 26 Jan 2021 17:01:49 +0000 +Subject: [PATCH] xen: Fix XenStore initialisation for XS_LOCAL + +commit 5f46400f7a6a4fad635d5a79e2aa5a04a30ffea1 upstream. + +In commit 3499ba8198ca ("xen: Fix event channel callback via INTX/GSI") +I reworked the triggering of xenbus_probe(). + +I tried to simplify things by taking out the workqueue based startup +triggered from wake_waiting(); the somewhat poorly named xenbus IRQ +handler. + +I missed the fact that in the XS_LOCAL case (Dom0 starting its own +xenstored or xenstore-stubdom, which happens after the kernel is booted +completely), that IRQ-based trigger is still actually needed. + +So... put it back, except more cleanly. By just spawning a xenbus_probe +thread which waits on xb_waitq and runs the probe the first time it +gets woken, just as the workqueue-based hack did. + +This is actually a nicer approach for *all* the back ends with different +interrupt methods, and we can switch them all over to that without the +complex conditions for when to trigger it. But not in -rc6. This is +the minimal fix for the regression, although it's a step in the right +direction instead of doing a partial revert and actually putting the +workqueue back. It's also simpler than the workqueue. + +Fixes: 3499ba8198ca ("xen: Fix event channel callback via INTX/GSI") +Reported-by: Juergen Gross +Signed-off-by: David Woodhouse +Reviewed-by: Juergen Gross +Link: https://lore.kernel.org/r/4c9af052a6e0f6485d1de43f2c38b1461996db99.camel@infradead.org +Signed-off-by: Juergen Gross +Cc: Salvatore Bonaccorso +Cc: Jason Andryuk +Signed-off-by: Greg Kroah-Hartman + +Upstream-Status: Backport +Signed-off-by: Diego Sueiro +--- + drivers/xen/xenbus/xenbus_probe.c | 31 +++++++++++++++++++++++++++++++ + 1 file changed, 31 insertions(+) + +diff --git a/drivers/xen/xenbus/xenbus_probe.c b/drivers/xen/xenbus/xenbus_probe.c +index c8f0282bb649..18ffd0551b54 100644 +--- a/drivers/xen/xenbus/xenbus_probe.c ++++ b/drivers/xen/xenbus/xenbus_probe.c +@@ -714,6 +714,23 @@ static bool xs_hvm_defer_init_for_callback(void) + #endif + } + ++static int xenbus_probe_thread(void *unused) ++{ ++ DEFINE_WAIT(w); ++ ++ /* ++ * We actually just want to wait for *any* trigger of xb_waitq, ++ * and run xenbus_probe() the moment it occurs. ++ */ ++ prepare_to_wait(&xb_waitq, &w, TASK_INTERRUPTIBLE); ++ schedule(); ++ finish_wait(&xb_waitq, &w); ++ ++ DPRINTK("probing"); ++ xenbus_probe(); ++ return 0; ++} ++ + static int __init xenbus_probe_initcall(void) + { + /* +@@ -725,6 +742,20 @@ static int __init xenbus_probe_initcall(void) + !xs_hvm_defer_init_for_callback())) + xenbus_probe(); + ++ /* ++ * For XS_LOCAL, spawn a thread which will wait for xenstored ++ * or a xenstore-stubdom to be started, then probe. It will be ++ * triggered when communication starts happening, by waiting ++ * on xb_waitq. ++ */ ++ if (xen_store_domain_type == XS_LOCAL) { ++ struct task_struct *probe_task; ++ ++ probe_task = kthread_run(xenbus_probe_thread, NULL, ++ "xenbus_probe"); ++ if (IS_ERR(probe_task)) ++ return PTR_ERR(probe_task); ++ } + return 0; + } + device_initcall(xenbus_probe_initcall); +-- +2.17.1 + diff --git a/meta-arm-autonomy/recipes-kernel/linux/linux-arm-autonomy.inc b/meta-arm-autonomy/recipes-kernel/linux/linux-arm-autonomy.inc index 89c9fce1..e14ea96e 100644 --- a/meta-arm-autonomy/recipes-kernel/linux/linux-arm-autonomy.inc +++ b/meta-arm-autonomy/recipes-kernel/linux/linux-arm-autonomy.inc @@ -38,8 +38,15 @@ python() { from distutils.version import LooseVersion kernelVersion = d.getVar('LINUX_VERSION') + pn = d.getVar('PN') if kernelVersion and LooseVersion(kernelVersion) < '5.10': if oe.utils.any_distro_features(d, "arm-autonomy-host arm-autonomy-guest"): d.appendVar('SRC_URI', ' file://files/0001-xen-arm-do-not-setup-the-runstate-info-page-if-kpti-.patch' ) + + if kernelVersion and LooseVersion(kernelVersion) < '5.10.13' \ + and pn != 'linux-libc-headers' \ + and not pn.startswith('linux-linaro-arm') \ + and oe.utils.any_distro_features(d, "arm-autonomy-host"): + d.appendVar('SRC_URI', ' file://files/0001-xen-Fix-XenStore-initialisation-for-XS_LOCAL.patch' ) }