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

Re: [Xen-devel] [PATCH] libxenlight: fix multiple xenstore watches probl

On Thu, 3 Dec 2009, Vincent Hanquez wrote:
> On Thu, Dec 03, 2009 at 03:39:57PM +0000, Stefano Stabellini wrote:
> > You are right about that, but Andres found the bug and fixed it with his
> > "clone context to avoid GC corruption" patch.
> 
> that's not about whether or not it can works. I think it's just confusing to
> clone and share a context in a mono thread where the only thing you want out 
> of
> it, is a xenstore handle. You can simply clone a new xs handle, and worst case
> scenario, you can extends the xl context to store 2 xs connections.
> 
> In the end, the approch is overkill, and complex solution often lead to
> unforseen bug (at this was the case here)
> 

All right then, I am OK with not cloning the whole context but just the
xenstore connection, however it would also be nice to be able to wrap
the connection opening in a nice function like Andres did with the
context.

What about the following as a fix to the cloning context problem, and as
an alternative to Andres' 0/7 patch:

---


diff -r 0f35fb4f73d6 tools/libxl/libxl.c
--- a/tools/libxl/libxl.c       Thu Dec 03 13:52:02 2009 +0000
+++ b/tools/libxl/libxl.c       Thu Dec 03 18:17:13 2009 +0000
@@ -654,22 +654,20 @@
 void dm_xenstore_record_pid(struct libxl_ctx *ctx, void *for_spawn,
                             pid_t innerchild) {
     struct libxl_device_model_starting *starting = for_spawn;
-    struct libxl_ctx clone;
     char *kvs[3];
     int rc;
 
-    clone = *ctx;
-    clone.xsh = xs_daemon_open();
+    libxl_ctx_open_xstemp(ctx);
     /* we mustn't use the parent's handle in the child */
 
     kvs[0] = "image/device-model-pid";
-    kvs[1] = libxl_sprintf(&clone, "%d", innerchild);
+    kvs[1] = libxl_sprintf(ctx, "%d", innerchild);
     kvs[2] = NULL;
-    rc = libxl_xs_writev(&clone, XBT_NULL, starting->dom_path, kvs);
-    if (rc) XL_LOG_ERRNO(&clone, XL_LOG_ERROR,
+    rc = libxl_xs_writev(ctx, XBT_NULL, starting->dom_path, kvs);
+    if (rc) XL_LOG_ERRNO(ctx, XL_LOG_ERROR,
                          "Couldn't record device model pid %ld at %s/%s",
                          (unsigned long)innerchild, starting->dom_path, kvs);
-    xs_daemon_close(clone.xsh);
+    libxl_ctx_close_xstemp(ctx);
 }
 
 static int libxl_vfb_and_vkb_from_device_model_info(struct libxl_ctx *ctx,
diff -r 0f35fb4f73d6 tools/libxl/libxl.h
--- a/tools/libxl/libxl.h       Thu Dec 03 13:52:02 2009 +0000
+++ b/tools/libxl/libxl.h       Thu Dec 03 18:17:13 2009 +0000
@@ -35,6 +35,8 @@
 struct libxl_ctx {
     int xch;
     struct xs_handle *xsh;
+    struct xs_handle *xsh_temp;
+
     /* errors/debug buf */
     void *log_userdata;
     libxl_log_callback log_callback;
diff -r 0f35fb4f73d6 tools/libxl/libxl_device.c
--- a/tools/libxl/libxl_device.c        Thu Dec 03 13:52:02 2009 +0000
+++ b/tools/libxl/libxl_device.c        Thu Dec 03 18:17:13 2009 +0000
@@ -212,50 +212,49 @@
     fd_set rfds;
     struct timeval tv;
     flexarray_t *toremove;
-    struct libxl_ctx clone = *ctx;
 
-    clone.xsh = xs_daemon_open();
+    libxl_ctx_open_xstemp(ctx);
     toremove = flexarray_make(16, 1);
-    path = libxl_sprintf(&clone, "/local/domain/%d/device", domid);
-    l1 = libxl_xs_directory(&clone, XBT_NULL, path, &num1);
+    path = libxl_sprintf(ctx, "/local/domain/%d/device", domid);
+    l1 = libxl_xs_directory(ctx, XBT_NULL, path, &num1);
     if (!l1) {
-        XL_LOG(&clone, XL_LOG_ERROR, "%s is empty", path);
-        xs_daemon_close(clone.xsh);
+        XL_LOG(ctx, XL_LOG_ERROR, "%s is empty", path);
+        libxl_ctx_close_xstemp(ctx);
         return -1;
     }
     for (i = 0; i < num1; i++) {
-        path = libxl_sprintf(&clone, "/local/domain/%d/device/%s", domid, 
l1[i]);
-        l2 = libxl_xs_directory(&clone, XBT_NULL, path, &num2);
+        path = libxl_sprintf(ctx, "/local/domain/%d/device/%s", domid, l1[i]);
+        l2 = libxl_xs_directory(ctx, XBT_NULL, path, &num2);
         if (!l2)
             continue;
         for (j = 0; j < num2; j++) {
-            fe_path = libxl_sprintf(&clone, "/local/domain/%d/device/%s/%s", 
domid, l1[i], l2[j]);
-            be_path = libxl_xs_read(&clone, XBT_NULL, libxl_sprintf(&clone, 
"%s/backend", fe_path));
+            fe_path = libxl_sprintf(ctx, "/local/domain/%d/device/%s/%s", 
domid, l1[i], l2[j]);
+            be_path = libxl_xs_read(ctx, XBT_NULL, libxl_sprintf(ctx, 
"%s/backend", fe_path));
             if (be_path != NULL) {
-                if (libxl_device_destroy(&clone, be_path, force) > 0)
+                if (libxl_device_destroy(ctx, be_path, force) > 0)
                     n_watches++;
-                flexarray_set(toremove, n++, libxl_dirname(&clone, be_path));
+                flexarray_set(toremove, n++, libxl_dirname(ctx, be_path));
             } else {
-                xs_rm(clone.xsh, XBT_NULL, path);
+                xs_rm(ctx->xsh, XBT_NULL, path);
             }
         }
     }
     if (!force) {
-        nfds = xs_fileno(clone.xsh) + 1;
+        nfds = xs_fileno(ctx->xsh) + 1;
         /* Linux-ism */
         tv.tv_sec = LIBXL_DESTROY_TIMEOUT;
         tv.tv_usec = 0;
         while (n_watches > 0 && tv.tv_sec > 0) {
             FD_ZERO(&rfds);
-            FD_SET(xs_fileno(clone.xsh), &rfds);
+            FD_SET(xs_fileno(ctx->xsh), &rfds);
             if (select(nfds, &rfds, NULL, NULL, &tv) > 0) {
-                l1 = xs_read_watch(clone.xsh, &num1);
+                l1 = xs_read_watch(ctx->xsh, &num1);
                 if (l1 != NULL) {
-                    char *state = libxl_xs_read(&clone, XBT_NULL, l1[0]);
+                    char *state = libxl_xs_read(ctx, XBT_NULL, l1[0]);
                     if (!state || atoi(state) == 6) {
-                        xs_unwatch(clone.xsh, l1[0], l1[1]);
-                        xs_rm(clone.xsh, XBT_NULL, l1[1]);
-                        XL_LOG(&clone, XL_LOG_DEBUG, "Destroyed device backend 
at %s", l1[1]);
+                        xs_unwatch(ctx->xsh, l1[0], l1[1]);
+                        xs_rm(ctx->xsh, XBT_NULL, l1[1]);
+                        XL_LOG(ctx, XL_LOG_DEBUG, "Destroyed device backend at 
%s", l1[1]);
                         n_watches--;
                     }
                     free(l1);
@@ -266,10 +265,10 @@
     }
     for (i = 0; i < n; i++) {
         flexarray_get(toremove, i, (void**) &path);
-        xs_rm(clone.xsh, XBT_NULL, path);
+        xs_rm(ctx->xsh, XBT_NULL, path);
     }
     flexarray_free(toremove);
-    xs_daemon_close(clone.xsh);
+    libxl_ctx_close_xstemp(ctx);
     return 0;
 }
 
diff -r 0f35fb4f73d6 tools/libxl/libxl_internal.c
--- a/tools/libxl/libxl_internal.c      Thu Dec 03 13:52:02 2009 +0000
+++ b/tools/libxl/libxl_internal.c      Thu Dec 03 18:17:13 2009 +0000
@@ -26,6 +26,24 @@
 int libxl_error_set(struct libxl_ctx *ctx, int code)
 {
     return 0;
+}
+
+int libxl_ctx_open_xstemp(struct libxl_ctx *ctx)
+{
+    if (ctx->xsh_temp)
+        return -1;
+    ctx->xsh_temp = ctx->xsh;
+    ctx->xsh = xs_daemon_open();
+    return 0;
+}
+
+int libxl_ctx_close_xstemp(struct libxl_ctx *ctx)
+{
+    if (!ctx->xsh_temp)
+        return -1;
+    xs_daemon_close(ctx->xsh);
+    ctx->xsh = ctx->xsh_temp;
+    ctx->xsh_temp = NULL;
 }
 
 int libxl_ptr_add(struct libxl_ctx *ctx, void *ptr)
diff -r 0f35fb4f73d6 tools/libxl/libxl_internal.h
--- a/tools/libxl/libxl_internal.h      Thu Dec 03 13:52:02 2009 +0000
+++ b/tools/libxl/libxl_internal.h      Thu Dec 03 18:17:13 2009 +0000
@@ -61,6 +61,10 @@
 #define PCI_BAR_IO             0x01
 
 #define PRINTF_ATTRIBUTE(x, y) __attribute__((format(printf, x, y)))
+
+/* open\close a seconday xenstore connection */
+int libxl_ctx_open_xstemp(struct libxl_ctx *ctx);
+int libxl_ctx_close_xstemp(struct libxl_ctx *ctx);
 
 /* memory allocation tracking/helpers */
 int libxl_ptr_add(struct libxl_ctx *ctx, void *ptr);

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