[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
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |