Skip to content

Commit 16f1cf3

Browse files
Boris OstrovskyDavid Vrabel
authored andcommitted
xen/xenbus: Update xenbus event channel on resume
After a resume the hypervisor/tools may change xenbus event channel number. We should re-query it. Signed-off-by: Boris Ostrovsky <boris.ostrovsky@oracle.com> Cc: <stable@vger.kernel.org> Signed-off-by: David Vrabel <david.vrabel@citrix.com>
1 parent 5cec988 commit 16f1cf3

File tree

1 file changed

+29
-0
lines changed

1 file changed

+29
-0
lines changed

drivers/xen/xenbus/xenbus_probe.c

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@
5757
#include <xen/xen.h>
5858
#include <xen/xenbus.h>
5959
#include <xen/events.h>
60+
#include <xen/xen-ops.h>
6061
#include <xen/page.h>
6162

6263
#include <xen/hvm.h>
@@ -735,6 +736,30 @@ static int __init xenstored_local_init(void)
735736
return err;
736737
}
737738

739+
static int xenbus_resume_cb(struct notifier_block *nb,
740+
unsigned long action, void *data)
741+
{
742+
int err = 0;
743+
744+
if (xen_hvm_domain()) {
745+
uint64_t v;
746+
747+
err = hvm_get_parameter(HVM_PARAM_STORE_EVTCHN, &v);
748+
if (!err && v)
749+
xen_store_evtchn = v;
750+
else
751+
pr_warn("Cannot update xenstore event channel: %d\n",
752+
err);
753+
} else
754+
xen_store_evtchn = xen_start_info->store_evtchn;
755+
756+
return err;
757+
}
758+
759+
static struct notifier_block xenbus_resume_nb = {
760+
.notifier_call = xenbus_resume_cb,
761+
};
762+
738763
static int __init xenbus_init(void)
739764
{
740765
int err = 0;
@@ -793,6 +818,10 @@ static int __init xenbus_init(void)
793818
goto out_error;
794819
}
795820

821+
if ((xen_store_domain_type != XS_LOCAL) &&
822+
(xen_store_domain_type != XS_UNKNOWN))
823+
xen_resume_notifier_register(&xenbus_resume_nb);
824+
796825
#ifdef CONFIG_XEN_COMPAT_XENFS
797826
/*
798827
* Create xenfs mountpoint in /proc for compatibility with

0 commit comments

Comments
 (0)