aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKeir Fraser <keir.fraser@citrix.com>2008-07-04 12:39:18 +0100
committerKeir Fraser <keir.fraser@citrix.com>2008-07-04 12:39:18 +0100
commit52d9d32d02078742805861e7152c45b03209ebab (patch)
tree336ff7656ef06cbf4f2ce569093a010973e59bb6
parentddfd61bd7e71b4ad602da69473586d072017992b (diff)
downloadxen-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.c3
-rw-r--r--tools/libxc/xenctrl.h3
-rw-r--r--tools/xcutils/xc_save.c21
-rw-r--r--xen/common/domain.c2
-rw-r--r--xen/common/event_channel.c12
-rw-r--r--xen/include/xen/event.h7
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);