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