[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-changelog] [xen-unstable] [HVM] Save/restore: don't leak shared-memory segments after HVM live-migrate.



# HG changeset patch
# User Tim Deegan <Tim.Deegan@xxxxxxxxxxxxx>
# Date 1185447632 -3600
# Node ID 07655ed2fe58ebf883b8a4b5c2dccf15576f4778
# Parent  3ec3e2840a29bb6d4c64b8094248381712370f17
[HVM] Save/restore: don't leak shared-memory segments after HVM live-migrate.
Signed-off-by: Tim Deegan <Tim.Deegan@xxxxxxxxxxxxx>
---
 tools/xcutils/xc_save.c |   25 ++++++++++++++++++-------
 1 files changed, 18 insertions(+), 7 deletions(-)

diff -r 3ec3e2840a29 -r 07655ed2fe58 tools/xcutils/xc_save.c
--- a/tools/xcutils/xc_save.c   Wed Jul 25 09:51:14 2007 +0100
+++ b/tools/xcutils/xc_save.c   Thu Jul 26 12:00:32 2007 +0100
@@ -54,7 +54,17 @@ static int suspend(int domid)
 
 static char *qemu_active_path;
 static char *qemu_next_active_path;
+static int qemu_shmid = -1;
 static struct xs_handle *xs;
+
+
+/* Mark the shared-memory segment for destruction */
+static void qemu_destroy_buffer(void)
+{
+    if (qemu_shmid != -1)
+        shmctl(qemu_shmid, IPC_RMID, NULL);
+    qemu_shmid = -1;
+}
 
 /* Get qemu to change buffers. */
 static void qemu_flip_buffer(int domid, int next_active)
@@ -97,22 +107,23 @@ static void * init_qemu_maps(int domid, 
 {
     key_t key;
     char key_ascii[17] = {0,};
-    int shmid = -1;
     void *seg; 
     char *path, *p;
 
     /* Make a shared-memory segment */
-    while (shmid == -1)
-    {
+    do {
         key = rand(); /* No security, just a sequence of numbers */
-        shmid = shmget(key, 2 * bitmap_size, 
+        qemu_shmid = shmget(key, 2 * bitmap_size, 
                        IPC_CREAT|IPC_EXCL|S_IRUSR|S_IWUSR);
-        if (shmid == -1 && errno != EEXIST)
+        if (qemu_shmid == -1 && errno != EEXIST)
             errx(1, "can't get shmem to talk to qemu-dm");
-    }
+    } while (qemu_shmid == -1);
+
+    /* Remember to tidy up after ourselves */
+    atexit(qemu_destroy_buffer);
 
     /* Map it into our address space */
-    seg = shmat(shmid, NULL, 0);
+    seg = shmat(qemu_shmid, NULL, 0);
     if (seg == (void *) -1) 
         errx(1, "can't map shmem to talk to qemu-dm");
     memset(seg, 0, 2 * bitmap_size);

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.