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

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



This is an updated version of the following patch.  It will receive a
notification of flip change through an event channel.

http://lists.xensource.com/archives/html/xen-devel/2009-03/msg00757.html

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

diff --git a/xenstore.c b/xenstore.c
index 928e950..caef5ef 100644
--- a/xenstore.c
+++ b/xenstore.c
@@ -33,6 +33,7 @@
 struct xs_handle *xsh = NULL;
 static char *media_filename[MAX_DRIVES+1];
 static QEMUTimer *insert_timer = NULL;
+static int xce = 0;

 #define UWAIT_MAX (30*1000000) /* thirty seconds */
 #define UWAIT     (100000)     /* 1/10th second  */
@@ -301,6 +302,42 @@ const char *xenstore_get_guest_uuid(void)
     return already_computed;
 }

+/* prototype of xenstore_process_logdirty_event */
+void xenstore_process_logdirty_event(void);
+
+static int get_kemari_port(void)
+{
+    static int kemari_port = -1;
+    if (kemari_port > 0)
+        return kemari_port;
+
+    kemari_port = xc_evtchn_bind_unbound_port(xce, DOMID_SELF);
+    return kemari_port;
+}
+
+static void kemari_handler(void *dummy)
+{
+    int port;
+
+    port = xc_evtchn_pending(xce);
+    if (port < 0) {
+        fprintf(logfile, "xc_evtchn_pending failed");
+        return;
+    }
+
+    if (port == get_kemari_port()) {
+        kemari_enabled = 1; /* QEMU will run in kemari mode */
+        xenstore_process_logdirty_event();
+    } else {
+        fprintf(logfile, "unexpected port %d fired", port);
+    }
+
+    if (xc_evtchn_unmask(xce, port) < 0) {
+        fprintf(logfile, "xc_evtchn_unmask failed");
+        return;
+    }
+}
+
 #define DIRECT_PCI_STR_LEN 512
 #define PT_PCI_MSITRANSLATE_DEFAULT 1
 char direct_pci_str[DIRECT_PCI_STR_LEN];
@@ -326,6 +363,12 @@ void xenstore_parse_domain_config(int hvm_domid)

     xenstore_get_guest_uuid();

+    xce = xc_evtchn_open();
+    if (xce < 0) {
+        fprintf(logfile, "Could not open event channel\n");
+        return;
+    }
+
     xsh = xs_daemon_open();
     if (xsh == NULL) {
         fprintf(logfile, "Could not contact xenstore for domain config\n");
@@ -363,6 +406,27 @@ void xenstore_parse_domain_config(int hvm_domid)
             break;
         }
     }
+
+    /* kemari */
+    {
+        int port;
+        char port_string[128];
+        port = get_kemari_port();
+        if (port < 0) {
+            fprintf(stderr, "failed to get kemari port\n");
+            goto out;
+        }
+        snprintf(port_string, sizeof(port_string), "%d", port);
+
+        if (pasprintf(&buf, "/local/domain/%u/kemari/event-channel",
+                hvm_domid) == -1)
+            goto out;
+
+        xs_write(xsh, XBT_NULL, buf, port_string, strlen(port_string));
+        qemu_set_fd_handler2(xc_evtchn_fd(xce),
+            NULL, kemari_handler, NULL, NULL);
+        fprintf(stderr, "Kemari port is enabled: %d\n", port);
+    }

     for (i = 0; i < num; i++) {
        format = NULL; /* don't know what the format is yet */
@@ -639,6 +703,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;

@@ -705,6 +771,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 */
@@ -722,6 +790,30 @@ void xenstore_process_logdirty_event(void)
         }
     }

+#ifndef CONFIG_STUBDOM
+    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: %d\n", i);
+            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();
+        return;
+    }
+#endif /* !CONFIG_STUBDOM */
     fprintf(logfile, "Triggered log-dirty buffer switch\n");

     /* Read the required active buffer from the store */




_______________________________________________
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®.