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
|