diff options
author | Keir Fraser <keir.fraser@citrix.com> | 2008-07-04 12:39:18 +0100 |
---|---|---|
committer | Keir Fraser <keir.fraser@citrix.com> | 2008-07-04 12:39:18 +0100 |
commit | 52d9d32d02078742805861e7152c45b03209ebab (patch) | |
tree | 336ff7656ef06cbf4f2ce569093a010973e59bb6 | |
parent | ddfd61bd7e71b4ad602da69473586d072017992b (diff) | |
download | xen-52d9d32d02078742805861e7152c45b03209ebab.tar.gz xen-52d9d32d02078742805861e7152c45b03209ebab.tar.bz2 xen-52d9d32d02078742805861e7152c45b03209ebab.zip |
Cleanups to suspend-event-channel patches.
Signed-off-by: Keir Fraser <keir.fraser@citrix.com>
-rw-r--r-- | tools/libxc/xc_domain.c | 3 | ||||
-rw-r--r-- | tools/libxc/xenctrl.h | 3 | ||||
-rw-r--r-- | tools/xcutils/xc_save.c | 21 | ||||
-rw-r--r-- | xen/common/domain.c | 2 | ||||
-rw-r--r-- | xen/common/event_channel.c | 12 | ||||
-rw-r--r-- | xen/include/xen/event.h | 7 |
6 files changed, 16 insertions, 32 deletions
diff --git a/tools/libxc/xc_domain.c b/tools/libxc/xc_domain.c index b4d7895801..f46fe4a671 100644 --- a/tools/libxc/xc_domain.c +++ b/tools/libxc/xc_domain.c @@ -981,7 +981,8 @@ int xc_domain_set_target( return do_domctl(xc_handle, &domctl); } -int xc_dom_subscribe(int xc_handle, domid_t dom, evtchn_port_t port) +int xc_domain_subscribe_for_suspend( + int xc_handle, domid_t dom, evtchn_port_t port) { DECLARE_DOMCTL; diff --git a/tools/libxc/xenctrl.h b/tools/libxc/xenctrl.h index cbe6bf8536..bb10ead825 100644 --- a/tools/libxc/xenctrl.h +++ b/tools/libxc/xenctrl.h @@ -814,7 +814,8 @@ int xc_flask_op(int xc_handle, flask_op_t *op); * Subscribe to state changes in a domain via evtchn. * Returns -1 on failure, in which case errno will be set appropriately. */ -int xc_dom_subscribe(int xc_handle, domid_t domid, evtchn_port_t port); +int xc_domain_subscribe_for_suspend( + int xc_handle, domid_t domid, evtchn_port_t port); /************************** * GRANT TABLE OPERATIONS * diff --git a/tools/xcutils/xc_save.c b/tools/xcutils/xc_save.c index c72500a700..3826fbb125 100644 --- a/tools/xcutils/xc_save.c +++ b/tools/xcutils/xc_save.c @@ -25,9 +25,7 @@ static struct suspendinfo { int xce; /* event channel handle */ - int suspend_evtchn; - int suspended_evtchn; } si; /** @@ -47,11 +45,6 @@ static int compat_suspend(int domid) static int suspend_evtchn_release(int xc, int domid) { - if (si.suspended_evtchn >= 0) { - xc_dom_subscribe(xc, domid, 0); - xc_evtchn_unbind(si.xce, si.suspended_evtchn); - si.suspended_evtchn = -1; - } if (si.suspend_evtchn >= 0) { xc_evtchn_unbind(si.xce, si.suspend_evtchn); si.suspend_evtchn = -1; @@ -75,7 +68,6 @@ static int suspend_evtchn_init(int xc, int domid) si.xce = -1; si.suspend_evtchn = -1; - si.suspended_evtchn = -1; xs = xs_daemon_open(); if (!xs) { @@ -107,14 +99,7 @@ static int suspend_evtchn_init(int xc, int domid) goto cleanup; } - si.suspended_evtchn = xc_evtchn_bind_unbound_port(si.xce, domid); - if (si.suspended_evtchn < 0) { - errx(1, "failed to allocate suspend notification port: %d", - si.suspended_evtchn); - goto cleanup; - } - - rc = xc_dom_subscribe(xc, domid, si.suspended_evtchn); + rc = xc_domain_subscribe_for_suspend(xc, domid, port); if (rc < 0) { errx(1, "failed to subscribe to domain: %d", rc); goto cleanup; @@ -149,10 +134,10 @@ static int evtchn_suspend(int domid) errx(1, "error polling suspend notification channel: %d", rc); return 0; } - } while (rc != si.suspended_evtchn); + } while (rc != si.suspend_evtchn); /* harmless for one-off suspend */ - if (xc_evtchn_unmask(si.xce, si.suspended_evtchn) < 0) + if (xc_evtchn_unmask(si.xce, si.suspend_evtchn) < 0) errx(1, "failed to unmask suspend notification channel: %d", rc); /* notify xend that it can do device migration */ diff --git a/xen/common/domain.c b/xen/common/domain.c index 6838b5c706..ab59987cfe 100644 --- a/xen/common/domain.c +++ b/xen/common/domain.c @@ -98,7 +98,7 @@ static void __domain_finalise_shutdown(struct domain *d) d->is_shut_down = 1; if ( (d->shutdown_code == SHUTDOWN_suspend) && d->suspend_evtchn ) - evtchn_set_pending(dom0->vcpu[0], d->suspend_evtchn); + evtchn_send(d, d->suspend_evtchn); else send_guest_global_virq(dom0, VIRQ_DOM_EXC); } diff --git a/xen/common/event_channel.c b/xen/common/event_channel.c index f27efef13b..eb06b352cf 100644 --- a/xen/common/event_channel.c +++ b/xen/common/event_channel.c @@ -56,6 +56,8 @@ goto out; \ } while ( 0 ) +static int evtchn_set_pending(struct vcpu *v, int port); + static int virq_is_global(int virq) { int rc; @@ -470,11 +472,10 @@ static long evtchn_close(evtchn_close_t *close) return __evtchn_close(current->domain, close->port); } - -long evtchn_send(unsigned int lport) +int evtchn_send(struct domain *d, unsigned int lport) { struct evtchn *lchn, *rchn; - struct domain *ld = current->domain, *rd; + struct domain *ld = d, *rd; struct vcpu *rvcpu; int rport, ret = 0; @@ -534,8 +535,7 @@ out: return ret; } - -int evtchn_set_pending(struct vcpu *v, int port) +static int evtchn_set_pending(struct vcpu *v, int port) { struct domain *d = v->domain; @@ -891,7 +891,7 @@ long do_event_channel_op(int cmd, XEN_GUEST_HANDLE(void) arg) struct evtchn_send send; if ( copy_from_guest(&send, arg, 1) != 0 ) return -EFAULT; - rc = evtchn_send(send.port); + rc = evtchn_send(current->domain, send.port); break; } diff --git a/xen/include/xen/event.h b/xen/include/xen/event.h index fadf01b7ec..67b83c50a6 100644 --- a/xen/include/xen/event.h +++ b/xen/include/xen/event.h @@ -16,9 +16,6 @@ #include <asm/bitops.h> #include <asm/event.h> -/* Returns TRUE if the delivery port was already pending. */ -int evtchn_set_pending(struct vcpu *v, int port); - /* * send_guest_vcpu_virq: Notify guest via a per-VCPU VIRQ. * @v: VCPU to which virtual IRQ should be sent @@ -41,8 +38,8 @@ void send_guest_global_virq(struct domain *d, int virq); */ int send_guest_pirq(struct domain *d, int pirq); -/* Send a notification from a local event-channel port. */ -long evtchn_send(unsigned int lport); +/* Send a notification from a given domain's event-channel port. */ +int evtchn_send(struct domain *d, unsigned int lport); /* Bind a local event-channel port to the specified VCPU. */ long evtchn_bind_vcpu(unsigned int port, unsigned int vcpu_id); |