[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] libxenlight: fix GC when cloning contexts
# HG changeset patch # User Keir Fraser <keir.fraser@xxxxxxxxxx> # Date 1259910169 0 # Node ID 46734df54a46edbc8f9c20722eb3b9168d2fdaf3 # Parent fb8f879b6428b541970a296333f0fe47fc38bbff libxenlight: fix GC when cloning contexts Provide a function to clone a context. This is necessary because simply copying the structs will eventually corrup the GC: maxsize is updated in the cloned context but not in the originating, yet they have the same array of referenced pointers alloc_ptrs. Signed-off-by: Andres Lagar-Cavilla <andres@xxxxxxxxxxxxxxxx> --- tools/libxl/libxl.c | 21 ++++++++++++++++----- tools/libxl/libxl_device.c | 14 +++++++++----- tools/libxl/libxl_internal.c | 22 ++++++++++++++++++++++ tools/libxl/libxl_internal.h | 17 +++++++++++++++++ 4 files changed, 64 insertions(+), 10 deletions(-) diff -r fb8f879b6428 -r 46734df54a46 tools/libxl/libxl.c --- a/tools/libxl/libxl.c Fri Dec 04 07:00:25 2009 +0000 +++ b/tools/libxl/libxl.c Fri Dec 04 07:02:49 2009 +0000 @@ -656,10 +656,17 @@ void dm_xenstore_record_pid(struct libxl struct libxl_device_model_starting *starting = for_spawn; struct libxl_ctx clone; char *kvs[3]; - int rc; - - clone = *ctx; - clone.xsh = xs_daemon_open(); + int rc, cloned; + + if (libxl_clone_context_xs(ctx, &clone)) { + XL_LOG(ctx, XL_LOG_ERROR, "Out of memory when cloning context"); + /* Throw a prayer fallback */ + clone = *ctx; + clone.xsh = xs_daemon_open(); + cloned = 0; + } else { + cloned = 1; + } /* we mustn't use the parent's handle in the child */ kvs[0] = "image/device-model-pid"; @@ -669,7 +676,11 @@ void dm_xenstore_record_pid(struct libxl if (rc) XL_LOG_ERRNO(&clone, 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); + if (cloned) { + libxl_discard_cloned_context_xs(&clone); + } else { + xs_daemon_close(clone.xsh); + } } static int libxl_vfb_and_vkb_from_device_model_info(struct libxl_ctx *ctx, diff -r fb8f879b6428 -r 46734df54a46 tools/libxl/libxl_device.c --- a/tools/libxl/libxl_device.c Fri Dec 04 07:00:25 2009 +0000 +++ b/tools/libxl/libxl_device.c Fri Dec 04 07:02:49 2009 +0000 @@ -212,15 +212,19 @@ int libxl_devices_destroy(struct libxl_c fd_set rfds; struct timeval tv; flexarray_t *toremove; - struct libxl_ctx clone = *ctx; - - clone.xsh = xs_daemon_open(); + struct libxl_ctx clone; + + if (libxl_clone_context_xs(ctx, &clone)) { + XL_LOG(ctx, XL_LOG_ERROR, "Out of memory when cloning context"); + return ERROR_NOMEM; + } + toremove = flexarray_make(16, 1); path = libxl_sprintf(&clone, "/local/domain/%d/device", domid); l1 = libxl_xs_directory(&clone, XBT_NULL, path, &num1); if (!l1) { XL_LOG(&clone, XL_LOG_ERROR, "%s is empty", path); - xs_daemon_close(clone.xsh); + libxl_discard_cloned_context_xs(&clone); return -1; } for (i = 0; i < num1; i++) { @@ -269,7 +273,7 @@ int libxl_devices_destroy(struct libxl_c xs_rm(clone.xsh, XBT_NULL, path); } flexarray_free(toremove); - xs_daemon_close(clone.xsh); + libxl_discard_cloned_context_xs(&clone); return 0; } diff -r fb8f879b6428 -r 46734df54a46 tools/libxl/libxl_internal.c --- a/tools/libxl/libxl_internal.c Fri Dec 04 07:00:25 2009 +0000 +++ b/tools/libxl/libxl_internal.c Fri Dec 04 07:02:49 2009 +0000 @@ -28,6 +28,28 @@ int libxl_error_set(struct libxl_ctx *ct return 0; } +int libxl_clone_context(struct libxl_ctx *from, struct libxl_ctx *to) +{ + /* We could just copy the structs, but since + * maxsize is not a pointer we need to take care + * of our own GC. */ + *to = *from; + to->alloc_ptrs = NULL; + to->alloc_maxsize = 256; + to->alloc_ptrs = calloc(to->alloc_maxsize, sizeof(void *)); + if (!to->alloc_ptrs) + return ERROR_NOMEM; + return 0; +} + +void libxl_discard_cloned_context(struct libxl_ctx *ctx) +{ + /* We only need to worry about GC-related fields */ + (void)libxl_ctx_free(ctx); + if (ctx->alloc_ptrs) + free(ctx->alloc_ptrs); +} + int libxl_ptr_add(struct libxl_ctx *ctx, void *ptr) { int i; diff -r fb8f879b6428 -r 46734df54a46 tools/libxl/libxl_internal.h --- a/tools/libxl/libxl_internal.h Fri Dec 04 07:00:25 2009 +0000 +++ b/tools/libxl/libxl_internal.h Fri Dec 04 07:02:49 2009 +0000 @@ -63,6 +63,23 @@ typedef struct { #define PRINTF_ATTRIBUTE(x, y) __attribute__((format(printf, x, y))) /* memory allocation tracking/helpers */ +int libxl_clone_context(struct libxl_ctx *from, struct libxl_ctx *to); +static inline int libxl_clone_context_xs( + struct libxl_ctx *from, struct libxl_ctx *to) +{ + int rc; + rc = libxl_clone_context(from, to); + if (rc) return rc; + to->xsh = xs_daemon_open(); + return 0; +} +void libxl_discard_cloned_context(struct libxl_ctx *ctx); +static inline void libxl_discard_cloned_context_xs( + struct libxl_ctx *ctx) +{ + libxl_discard_cloned_context(ctx); + xs_daemon_close(ctx->xsh); +} int libxl_ptr_add(struct libxl_ctx *ctx, void *ptr); int libxl_free(struct libxl_ctx *ctx, void *ptr); int libxl_free_all(struct libxl_ctx *ctx); _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |