63 lines
2.0 KiB
Diff
63 lines
2.0 KiB
Diff
|
# HG changeset patch
|
||
|
# User Tim Deegan <Tim.Deegan@xensource.com>
|
||
|
# 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@xensource.com>
|
||
|
|
||
|
Index: xen-3.1-testing/tools/xcutils/xc_save.c
|
||
|
===================================================================
|
||
|
--- xen-3.1-testing.orig/tools/xcutils/xc_save.c
|
||
|
+++ xen-3.1-testing/tools/xcutils/xc_save.c
|
||
|
@@ -54,8 +54,18 @@ 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);
|