From mboxrd@z Thu Jan 1 00:00:00 1970 From: Yoshiaki Tamura Subject: [RFC][PATCH 13/13] Kemari: use shared region with to flip logdirty_bitmap Date: Fri, 06 Mar 2009 15:47:33 +0900 Message-ID: <49B0C705.1030308@lab.ntt.co.jp> References: <49B0B8DC.5000606@lab.ntt.co.jp> Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-2022-JP Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <49B0B8DC.5000606@lab.ntt.co.jp> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xensource.com Errors-To: xen-devel-bounces@lists.xensource.com To: xen-devel Cc: ospk-vm@lab.ntt.co.jp, Ian Pratt , ian.jackson@eu.citrix.com, Keir Fraser List-Id: xen-devel@lists.xenproject.org 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 Signed-off-by: Yoshi Tamura --- xenstore.c | 62 ++++++++++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 45 insertions(+), 17 deletions(-) commit 3050ae2f8fffc2238a9e763b2534f3778b1bb372 Author: Yoshisato YANAGISAWA 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); + } }