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

[Xen-devel] [PATCH] tools: add closure to xc_domain_save switch_qemu_log

To: xen-devel@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-devel] [PATCH] tools: add closure to xc_domain_save switch_qemu_logdirty callback
From: Ian Campbell <ian.campbell@xxxxxxxxxx>
Date: Tue, 12 Oct 2010 17:05:10 +0100
Cc: Ian Campbell <ian.campbell@xxxxxxxxxx>
Delivery-date: Tue, 12 Oct 2010 09:30:28 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
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>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
# HG changeset patch
# User Ian Campbell <ian.campbell@xxxxxxxxxx>
# Date 1286899422 -3600
# Node ID 92be1317280b14e63b381285cdf342dfae014e66
# Parent  372959917c012db7d90aad0626a4af6b8f9b186f
tools: add closure to xc_domain_save switch_qemu_logdirty callback

Also move the function into struct save_callbacks with the others.

Use this in libxl to pass the save context to
libxl__domain_suspend_common_switch_qemu_logdirty allowing us to reuse
the parent's xenstore handle, gc context etc.

Also add an apparently missing libxl__free_all to
libxl__domain_suspend_common.

(Now that switch_qemu_logdirty takes a closure it's not clear if
checkpoint can be changed to use the callback rather than doing the
switch itself and implementing a nop callback, Branden?)

Signed-off-by: Ian Campbell <ian.campbell@xxxxxxxxxx>
---
Change from v1:
  Compile test from missed call to xc_domain_save in
  tools/python/xen/lowlevel/checkpoint/libcheckpoint.c

diff -r 372959917c01 -r 92be1317280b tools/libxc/xc_domain_save.c
--- a/tools/libxc/xc_domain_save.c      Tue Oct 12 17:03:42 2010 +0100
+++ b/tools/libxc/xc_domain_save.c      Tue Oct 12 17:03:42 2010 +0100
@@ -879,7 +879,7 @@ int xc_domain_save(xc_interface *xch, in
 int xc_domain_save(xc_interface *xch, int io_fd, uint32_t dom, uint32_t 
max_iters,
                    uint32_t max_factor, uint32_t flags,
                    struct save_callbacks* callbacks,
-                   int hvm, void (*switch_qemu_logdirty)(int, unsigned))
+                   int hvm)
 {
     xc_dominfo_t info;
     DECLARE_DOMCTL;
@@ -1015,7 +1015,7 @@ int xc_domain_save(xc_interface *xch, in
 
         /* Enable qemu-dm logging dirty pages to xen */
         if ( hvm )
-            switch_qemu_logdirty(dom, 1);
+            callbacks->switch_qemu_logdirty(dom, 1, callbacks->data);
     }
     else
     {
@@ -1876,7 +1876,7 @@ int xc_domain_save(xc_interface *xch, in
                                NULL, 0, NULL, 0, NULL) < 0 )
             DPRINTF("Warning - couldn't disable shadow mode");
         if ( hvm )
-            switch_qemu_logdirty(dom, 0);
+            callbacks->switch_qemu_logdirty(dom, 0, callbacks->data);
     }
 
     if ( live_shinfo )
diff -r 372959917c01 -r 92be1317280b tools/libxc/xenguest.h
--- a/tools/libxc/xenguest.h    Tue Oct 12 17:03:42 2010 +0100
+++ b/tools/libxc/xenguest.h    Tue Oct 12 17:03:42 2010 +0100
@@ -40,6 +40,8 @@ struct save_callbacks {
      * 1: take another checkpoint */
     int (*checkpoint)(void* data);
 
+    void (*switch_qemu_logdirty)(int domid, unsigned enable, void *data); /* 
HVM only */
+
     /* to be provided as the first argument to each callback function */
     void* data;
 };
@@ -55,7 +57,7 @@ int xc_domain_save(xc_interface *xch, in
 int xc_domain_save(xc_interface *xch, int io_fd, uint32_t dom, uint32_t 
max_iters,
                    uint32_t max_factor, uint32_t flags /* XCFLAGS_xxx */,
                    struct save_callbacks* callbacks,
-                   int hvm, void (*switch_qemu_logdirty)(int, unsigned)); /* 
HVM only */
+                   int hvm);
 
 
 /**
diff -r 372959917c01 -r 92be1317280b tools/libxl/libxl_dom.c
--- a/tools/libxl/libxl_dom.c   Tue Oct 12 17:03:42 2010 +0100
+++ b/tools/libxl/libxl_dom.c   Tue Oct 12 17:03:42 2010 +0100
@@ -325,21 +325,18 @@ struct suspendinfo {
     unsigned int flags;
 };
 
-static void libxl__domain_suspend_common_switch_qemu_logdirty(int domid, 
unsigned int enable)
+static void libxl__domain_suspend_common_switch_qemu_logdirty(int domid, 
unsigned int enable, void *data)
 {
-    struct xs_handle *xsh;
-    char path[64];
+    struct suspendinfo *si = data;
+    libxl_ctx *ctx = libxl__gc_owner(si->gc);
+    char *path;
 
-    snprintf(path, sizeof(path), 
"/local/domain/0/device-model/%u/logdirty/cmd", domid);
-
-    xsh = xs_daemon_open();
+    path = libxl__sprintf(si->gc, 
"/local/domain/0/device-model/%u/logdirty/cmd", domid);
 
     if (enable)
-        xs_write(xsh, XBT_NULL, path, "enable", strlen("enable"));
+        xs_write(ctx->xsh, XBT_NULL, path, "enable", strlen("enable"));
     else
-        xs_write(xsh, XBT_NULL, path, "disable", strlen("disable"));
-
-    xs_daemon_close(xsh);
+        xs_write(ctx->xsh, XBT_NULL, path, "disable", strlen("disable"));
 }
 
 static int libxl__domain_suspend_common_callback(void *data)
@@ -437,11 +434,11 @@ int libxl__domain_suspend_common(libxl_c
 
     memset(&callbacks, 0, sizeof(callbacks));
     callbacks.suspend = libxl__domain_suspend_common_callback;
+    callbacks.switch_qemu_logdirty = 
libxl__domain_suspend_common_switch_qemu_logdirty;
     callbacks.data = &si;
 
     xc_domain_save(ctx->xch, fd, domid, 0, 0, flags,
-                   &callbacks, hvm,
-                   &libxl__domain_suspend_common_switch_qemu_logdirty);
+                   &callbacks, hvm);
 
     if (si.suspend_eventchn > 0)
         xc_suspend_evtchn_release(ctx->xch, si.xce, domid, 
si.suspend_eventchn);
@@ -450,6 +447,7 @@ int libxl__domain_suspend_common(libxl_c
 
     rc = 0;
 out:
+    libxl__free_all(&gc);
     return rc;
 }
 
diff -r 372959917c01 -r 92be1317280b 
tools/python/xen/lowlevel/checkpoint/libcheckpoint.c
--- a/tools/python/xen/lowlevel/checkpoint/libcheckpoint.c      Tue Oct 12 
17:03:42 2010 +0100
+++ b/tools/python/xen/lowlevel/checkpoint/libcheckpoint.c      Tue Oct 12 
17:03:42 2010 +0100
@@ -164,7 +164,7 @@ void checkpoint_close(checkpoint_state* 
 
 /* we toggle logdirty ourselves around the xc_domain_save call --
  * it avoids having to pass around checkpoint_state */
-static void noop_switch_logdirty(int domid, unsigned enable)
+static void noop_switch_logdirty(int domid, unsigned enable, void *data)
 {
     return;
 }
@@ -189,8 +189,9 @@ int checkpoint_start(checkpoint_state* s
            return rc;
     }
 
-    rc = xc_domain_save(s->xch, fd, s->domid, 0, 0, flags, callbacks, hvm,
-       noop_switch_logdirty);
+    callbacks->switch_qemu_logdirty = noop_switch_logdirty;
+
+    rc = xc_domain_save(s->xch, fd, s->domid, 0, 0, flags, callbacks, hvm);
 
     if (hvm)
        switch_qemu_logdirty(s, 0);
diff -r 372959917c01 -r 92be1317280b tools/xcutils/xc_save.c
--- a/tools/xcutils/xc_save.c   Tue Oct 12 17:03:42 2010 +0100
+++ b/tools/xcutils/xc_save.c   Tue Oct 12 17:03:42 2010 +0100
@@ -102,7 +102,7 @@ static int suspend(void* data)
  * active buffer. */
 
 
-static void switch_qemu_logdirty(int domid, unsigned int enable)
+static void switch_qemu_logdirty(int domid, unsigned int enable, void *data)
 {
     struct xs_handle *xs;
     char *path, *p, *ret_str, *cmd_str, **watch;
@@ -205,9 +205,9 @@ main(int argc, char **argv)
     }
     memset(&callbacks, 0, sizeof(callbacks));
     callbacks.suspend = suspend;
+    callbacks.switch_qemu_logdirty = switch_qemu_logdirty;
     ret = xc_domain_save(si.xch, io_fd, si.domid, maxit, max_f, si.flags, 
-                         &callbacks, !!(si.flags & XCFLAGS_HVM),
-                         &switch_qemu_logdirty);
+                         &callbacks, !!(si.flags & XCFLAGS_HVM));
 
     if (si.suspend_evtchn > 0)
         xc_suspend_evtchn_release(si.xch, si.xce, si.domid, si.suspend_evtchn);

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel