| From 16f1cf3ba7303228372d3756677bf7d10e79cf9f Mon Sep 17 00:00:00 2001 |
| From: Boris Ostrovsky <boris.ostrovsky@oracle.com> |
| Date: Wed, 29 Apr 2015 17:10:13 -0400 |
| Subject: xen/xenbus: Update xenbus event channel on resume |
| |
| From: Boris Ostrovsky <boris.ostrovsky@oracle.com> |
| |
| commit 16f1cf3ba7303228372d3756677bf7d10e79cf9f upstream. |
| |
| 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> |
| Signed-off-by: David Vrabel <david.vrabel@citrix.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/xen/xenbus/xenbus_probe.c | 29 +++++++++++++++++++++++++++++ |
| 1 file changed, 29 insertions(+) |
| |
| --- a/drivers/xen/xenbus/xenbus_probe.c |
| +++ b/drivers/xen/xenbus/xenbus_probe.c |
| @@ -57,6 +57,7 @@ |
| #include <xen/xen.h> |
| #include <xen/xenbus.h> |
| #include <xen/events.h> |
| +#include <xen/xen-ops.h> |
| #include <xen/page.h> |
| |
| #include <xen/hvm.h> |
| @@ -735,6 +736,30 @@ static int __init xenstored_local_init(v |
| return err; |
| } |
| |
| +static int xenbus_resume_cb(struct notifier_block *nb, |
| + unsigned long action, void *data) |
| +{ |
| + int err = 0; |
| + |
| + if (xen_hvm_domain()) { |
| + uint64_t v; |
| + |
| + err = hvm_get_parameter(HVM_PARAM_STORE_EVTCHN, &v); |
| + if (!err && v) |
| + xen_store_evtchn = v; |
| + else |
| + pr_warn("Cannot update xenstore event channel: %d\n", |
| + err); |
| + } else |
| + xen_store_evtchn = xen_start_info->store_evtchn; |
| + |
| + return err; |
| +} |
| + |
| +static struct notifier_block xenbus_resume_nb = { |
| + .notifier_call = xenbus_resume_cb, |
| +}; |
| + |
| static int __init xenbus_init(void) |
| { |
| int err = 0; |
| @@ -793,6 +818,10 @@ static int __init xenbus_init(void) |
| goto out_error; |
| } |
| |
| + if ((xen_store_domain_type != XS_LOCAL) && |
| + (xen_store_domain_type != XS_UNKNOWN)) |
| + xen_resume_notifier_register(&xenbus_resume_nb); |
| + |
| #ifdef CONFIG_XEN_COMPAT_XENFS |
| /* |
| * Create xenfs mountpoint in /proc for compatibility with |