summaryrefslogtreecommitdiff
path: root/drivers/xen/xenbus/xenbus_comms.c
diff options
context:
space:
mode:
authorStephen Rothwell <sfr@canb.auug.org.au>2008-06-13 13:39:00 +1000
committerStephen Rothwell <sfr@canb.auug.org.au>2008-06-13 13:39:00 +1000
commitf2603c77e8cd7777742da9eb8feea06fbd85c267 (patch)
treea2ecf7df8e2aed5db5fd58987390bb7ca65715d5 /drivers/xen/xenbus/xenbus_comms.c
parent9546e899e803ea8e738911b36bfcfe020031eefe (diff)
parent0536899878853e1963e516c322d4578dc5b4fcd0 (diff)
Merge commit 'x86/auto-x86-next'
Conflicts: arch/x86/kernel/io_apic_32.c arch/x86/kernel/nmi_32.c arch/x86/kernel/process_32.c arch/x86/kernel/process_64.c
Diffstat (limited to 'drivers/xen/xenbus/xenbus_comms.c')
-rw-r--r--drivers/xen/xenbus/xenbus_comms.c23
1 files changed, 12 insertions, 11 deletions
diff --git a/drivers/xen/xenbus/xenbus_comms.c b/drivers/xen/xenbus/xenbus_comms.c
index 6efbe3f29ca5..090c61ee8fd0 100644
--- a/drivers/xen/xenbus/xenbus_comms.c
+++ b/drivers/xen/xenbus/xenbus_comms.c
@@ -203,7 +203,6 @@ int xb_read(void *data, unsigned len)
int xb_init_comms(void)
{
struct xenstore_domain_interface *intf = xen_store_interface;
- int err;
if (intf->req_prod != intf->req_cons)
printk(KERN_ERR "XENBUS request ring is not quiescent "
@@ -216,18 +215,20 @@ int xb_init_comms(void)
intf->rsp_cons = intf->rsp_prod;
}
- if (xenbus_irq)
- unbind_from_irqhandler(xenbus_irq, &xb_waitq);
+ if (xenbus_irq) {
+ /* Already have an irq; assume we're resuming */
+ rebind_evtchn_irq(xen_store_evtchn, xenbus_irq);
+ } else {
+ int err;
+ err = bind_evtchn_to_irqhandler(xen_store_evtchn, wake_waiting,
+ 0, "xenbus", &xb_waitq);
+ if (err <= 0) {
+ printk(KERN_ERR "XENBUS request irq failed %i\n", err);
+ return err;
+ }
- err = bind_evtchn_to_irqhandler(
- xen_store_evtchn, wake_waiting,
- 0, "xenbus", &xb_waitq);
- if (err <= 0) {
- printk(KERN_ERR "XENBUS request irq failed %i\n", err);
- return err;
+ xenbus_irq = err;
}
- xenbus_irq = err;
-
return 0;
}