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

[Xen-devel] [RFC][PATCH 13/13] Kemari: use shared region with to flip logdirty_bitmap



This patch provides a shared memory to communicate between xc_kemari_save and
QEMU directly.  The number of active logdirty_bitmap and condition are sent
through the shared memory.

Signed-off-by: Yoshisato Yanagisawa <yanagisawa.yoshisato@xxxxxxxxxxxxx>
Signed-off-by: Yoshi Tamura <tamura.yoshiaki@xxxxxxxxxxxxx>
---
 xenstore.c |   62 ++++++++++++++++++++++++++++++++++++++++++++-----------------
 1 file changed, 45 insertions(+), 17 deletions(-)

commit 3050ae2f8fffc2238a9e763b2534f3778b1bb372
Author: Yoshisato YANAGISAWA <yanagisawa@xxxxxxxx>
Date:   Thu Feb 26 14:25:40 2009 +0900

    Add features required for Kemari.

diff --git a/xenstore.c b/xenstore.c
index ac91e20..9d5f94f 100644
--- a/xenstore.c
+++ b/xenstore.c
@@ -593,6 +593,7 @@ int xenstore_fd(void)
 unsigned long *logdirty_bitmap = NULL;
 unsigned long logdirty_bitmap_size;
 extern int vga_ram_size, bios_size;
+extern volatile int kemari_enabled;

 void xenstore_process_logdirty_event(void)
 {
@@ -600,6 +601,8 @@ void xenstore_process_logdirty_event(void)
     static char *active_path = NULL;
     static char *next_active_path = NULL;
     static char *seg = NULL;
+    static char *kemari_qemu_info = NULL;
+    static char *qemu_file = NULL;
     unsigned int len;
     int i;

@@ -666,6 +669,8 @@ void xenstore_process_logdirty_event(void)
             seg = NULL;
             return;
         }
+        kemari_qemu_info = seg + logdirty_bitmap_size * 2;
+        asprintf(&qemu_file, "/dev/shm/qemu-save.%d", domid); /* use tmpfs */
 #endif

         /* Remember the paths for the next-active and active entries */
@@ -683,26 +688,49 @@ void xenstore_process_logdirty_event(void)
         }
     }

-    fprintf(logfile, "Triggered log-dirty buffer switch\n");
+    if (kemari_enabled) {
+        while (kemari_qemu_info[1])
+            xen_rmb();
+
+        /* Switch buffers */
+        i = kemari_qemu_info[0];
+        if (i != 0 && i != 1) {
+            fprintf(logfile, "Log-dirty: bad next-active entry: %s\n", act);
+            exit(1);
+        }
+        logdirty_bitmap = (unsigned long *)(seg + i * logdirty_bitmap_size);
+        kemari_qemu_info[1] = 1;
+        xen_wmb();
+
+        /* Save QEMU status */
+        while (kemari_qemu_info[2])
+            xen_rmb();
+        do_savevm(qemu_file);
+        kemari_qemu_info[2] = 1;
+        xen_wmb();
+    } else {
+
+        fprintf(logfile, "Triggered log-dirty buffer switch\n");

-    /* Read the required active buffer from the store */
-    act = xs_read(xsh, XBT_NULL, next_active_path, &len);
-    if (!act) {
-        fprintf(logfile, "Log-dirty: can't read next-active\n");
-        exit(1);
-    }
+        /* Read the required active buffer from the store */
+        act = xs_read(xsh, XBT_NULL, next_active_path, &len);
+        if (!act) {
+            fprintf(logfile, "Log-dirty: can't read next-active\n");
+            exit(1);
+        }

-    /* Switch buffers */
-    i = act[0] - '0';
-    if (i != 0 && i != 1) {
-        fprintf(logfile, "Log-dirty: bad next-active entry: %s\n", act);
-        exit(1);
-    }
-    logdirty_bitmap = (unsigned long *)(seg + i * logdirty_bitmap_size);
+        /* Switch buffers */
+        i = act[0] - '0';
+        if (i != 0 && i != 1) {
+            fprintf(logfile, "Log-dirty: bad next-active entry: %s\n", act);
+            exit(1);
+        }
+        logdirty_bitmap = (unsigned long *)(seg + i * logdirty_bitmap_size);

-    /* Ack that we've switched */
-    xs_write(xsh, XBT_NULL, active_path, act, len);
-    free(act);
+        /* Ack that we've switched */
+        xs_write(xsh, XBT_NULL, active_path, act, len);
+        free(act);
+    }
 }





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


 


Rackspace

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