WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-devel

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

To: xen-devel <xen-devel@xxxxxxxxxxxxxxxxxxx>
Subject: Re: [Xen-devel] [RFC][PATCH 13/13] Kemari: use shared region with to flip logdirty_bitmap
From: Yoshiaki Tamura <tamura.yoshiaki@xxxxxxxxxxxxx>
Date: Tue, 24 Mar 2009 15:59:38 +0900
Cc: Ian Pratt <ian.pratt@xxxxxxxxxx>, ian.jackson@xxxxxxxxxxxxx, "柳澤佳里(yanagisawa yoshisato)" <yanagisawa.yoshisato@xxxxxxxxxxxxx>, Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx>, Keir Fraser <keir.fraser@xxxxxxxxxxxxx>
Delivery-date: Tue, 24 Mar 2009 00:14:19 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
In-reply-to: <49B86400.8090601@xxxxxxxxxxxxx>
List-help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-id: Xen developer discussion <xen-devel.lists.xensource.com>
List-post: <mailto:xen-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
References: <49B86208.2020205@xxxxxxxxxxxxx> <49B86400.8090601@xxxxxxxxxxxxx>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
User-agent: Thunderbird 2.0.0.21 (Windows/20090302)
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