]> xenbits.xensource.com Git - xen.git/commitdiff
Change the global suspend event channel lock file to a per-domain lock file
authorKeir Fraser <keir.fraser@citrix.com>
Tue, 4 May 2010 11:12:28 +0000 (12:12 +0100)
committerKeir Fraser <keir.fraser@citrix.com>
Tue, 4 May 2010 11:12:28 +0000 (12:12 +0100)
This allows multiple guests to be migrated or protected by Remus
simultaneously.

Signed-off-by: Shriram Rajagopalan <rshriram@cs.ubc.ca>
Acked-by: Brendan Cully <brendan@cs.ubc.ca>
tools/libxc/xc_suspend.c
tools/libxc/xenguest.h
tools/libxl/libxl_dom.c
tools/python/xen/lowlevel/checkpoint/libcheckpoint.c
tools/xcutils/xc_save.c

index a9999b38ed4192458c0beaae351a7b35fceab7d1..a334e821c101abee93e50f4a0bf43da9b66e4d60 100644 (file)
@@ -7,18 +7,22 @@
 #include "xc_private.h"
 #include "xenguest.h"
 
-#define SUSPEND_LOCK_FILE "/var/lib/xen/suspend_evtchn_lock.d"
-static int lock_suspend_event(void)
+#define SUSPEND_LOCK_FILE "/var/lib/xen/suspend_evtchn"
+static int lock_suspend_event(int domid)
 {
     int fd, rc;
     mode_t mask;
     char buf[128];
+    char suspend_file[256];
 
+    snprintf(suspend_file, sizeof(suspend_file), "%s_%d_lock.d",
+           SUSPEND_LOCK_FILE, domid);
     mask = umask(022);
-    fd = open(SUSPEND_LOCK_FILE, O_CREAT | O_EXCL | O_RDWR, 0666);
+    fd = open(suspend_file, O_CREAT | O_EXCL | O_RDWR, 0666);
     if (fd < 0)
     {
-        ERROR("Can't create lock file for suspend event channel\n");
+        ERROR("Can't create lock file for suspend event channel %s\n",
+               suspend_file);
         return -EINVAL;
     }
     umask(mask);
@@ -30,12 +34,15 @@ static int lock_suspend_event(void)
     return rc;
 }
 
-static int unlock_suspend_event(void)
+static int unlock_suspend_event(int domid)
 {
     int fd, pid, n;
     char buf[128];
+    char suspend_file[256];
 
-    fd = open(SUSPEND_LOCK_FILE, O_RDWR);
+    snprintf(suspend_file, sizeof(suspend_file), "%s_%d_lock.d",
+           SUSPEND_LOCK_FILE, domid);
+    fd = open(suspend_file, O_RDWR);
 
     if (fd < 0)
         return -EINVAL;
@@ -50,7 +57,7 @@ static int unlock_suspend_event(void)
         /* We are the owner, so we can simply delete the file */
         if (pid == getpid())
         {
-            unlink(SUSPEND_LOCK_FILE);
+            unlink(suspend_file);
             return 0;
         }
     }
@@ -77,19 +84,19 @@ int xc_await_suspend(int xce, int suspend_evtchn)
     return 0;
 }
 
-int xc_suspend_evtchn_release(int xce, int suspend_evtchn)
+int xc_suspend_evtchn_release(int xce, int domid, int suspend_evtchn)
 {
     if (suspend_evtchn >= 0)
         xc_evtchn_unbind(xce, suspend_evtchn);
 
-    return unlock_suspend_event();
+    return unlock_suspend_event(domid);
 }
 
 int xc_suspend_evtchn_init(int xc, int xce, int domid, int port)
 {
     int rc, suspend_evtchn = -1;
 
-    if (lock_suspend_event())
+    if (lock_suspend_event(domid))
         return -EINVAL;
 
     suspend_evtchn = xc_evtchn_bind_interdomain(xce, domid, port);
@@ -111,7 +118,7 @@ int xc_suspend_evtchn_init(int xc, int xce, int domid, int port)
 
 cleanup:
     if (suspend_evtchn != -1)
-        xc_suspend_evtchn_release(xce, suspend_evtchn);
+        xc_suspend_evtchn_release(xce, domid, suspend_evtchn);
 
     return -1;
 }
index 851f76985c209498b74524df98f471d58cec998e..d1d86b2c1ca65837b198b3d03a134d92b2faacfd 100644 (file)
@@ -157,7 +157,7 @@ int xc_hvm_build_mem(int xc_handle,
                      const char *image_buffer,
                      unsigned long image_size);
 
-int xc_suspend_evtchn_release(int xce, int suspend_evtchn);
+int xc_suspend_evtchn_release(int xce, int domid, int suspend_evtchn);
 
 int xc_suspend_evtchn_init(int xc, int xce, int domid, int port);
 
index 75691d2f2d958822fef05b6e93be4afc589a7b5e..89ba8b9a347e9d8c9bf01056d3eb9643facb2bfa 100644 (file)
@@ -326,7 +326,7 @@ int core_suspend(struct libxl_ctx *ctx, uint32_t domid, int fd,
                    &core_suspend_switch_qemu_logdirty);
 
     if (si.suspend_eventchn > 0)
-        xc_suspend_evtchn_release(si.xce, si.suspend_eventchn);
+        xc_suspend_evtchn_release(si.xce, domid, si.suspend_eventchn);
     if (si.xce > 0)
         xc_evtchn_close(si.xce);
 
index 459141fcb988ca1eb1eab6dbb7c324c1fc5de6e8..d84fa831d086606f5e789b8c61c542164171032e 100644 (file)
@@ -360,7 +360,7 @@ static void release_suspend_evtchn(checkpoint_state *s)
 {
   /* TODO: teach xen to clean up if port is unbound */
   if (s->xce >= 0 && s->suspend_evtchn >= 0) {
-    xc_suspend_evtchn_release(s->xce, s->suspend_evtchn);
+    xc_suspend_evtchn_release(s->xce, s->domid, s->suspend_evtchn);
     s->suspend_evtchn = -1;
   }
 }
index 55e4b1d4ef029626f6b021b38ae4fb322c108296..02570bda453ce0e6c27664b10b1e4575b03053a4 100644 (file)
@@ -210,7 +210,7 @@ main(int argc, char **argv)
                          &switch_qemu_logdirty);
 
     if (si.suspend_evtchn > 0)
-        xc_suspend_evtchn_release(si.xce, si.suspend_evtchn);
+        xc_suspend_evtchn_release(si.xce, si.domid, si.suspend_evtchn);
 
     if (si.xce > 0)
         xc_evtchn_close(si.xce);