Cleanups to suspend-event-channel patches.
authorKeir Fraser <keir.fraser@citrix.com>
Fri, 4 Jul 2008 11:39:18 +0000 (12:39 +0100)
committerKeir Fraser <keir.fraser@citrix.com>
Fri, 4 Jul 2008 11:39:18 +0000 (12:39 +0100)
Signed-off-by: Keir Fraser <keir.fraser@citrix.com>
tools/libxc/xc_domain.c
tools/libxc/xenctrl.h
tools/xcutils/xc_save.c
xen/common/domain.c
xen/common/event_channel.c
xen/include/xen/event.h

index b4d7895801c943e567f3ea7093847c264a17b9b9..f46fe4a671d7c4d254172dcf46e06fa43fe38e8b 100644 (file)
@@ -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;
 
index cbe6bf853691705d24d200ae4771fe9bc9e3b668..bb10ead825814cd18d1587a5176b6469b4510b73 100644 (file)
@@ -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 *
index c72500a700e3f1a22e171eb2c87f2204f9601e30..3826fbb12556ddb2f7359e6bc6ed13bafe5f3634 100644 (file)
@@ -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 */
index 6838b5c70644382cb7e0a39fd59921deffa1e8ec..ab59987cfe37ba87f6150f27f054b1b85f425fab 100644 (file)
@@ -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);
 }
index f27efef13b23cb062cc40d502bbfc4ca55f4d2ed..eb06b352cf3ac811406104637f78faa43251a42f 100644 (file)
@@ -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;
     }
 
index fadf01b7ec5da01eab48005e09cb03ab489cc798..67b83c50a6b0347bd8ad6e76ce8cc038add5f5a4 100644 (file)
@@ -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);