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-changelog

[Xen-changelog] [xen-unstable] libxenlight: clean up the domain when it

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] [xen-unstable] libxenlight: clean up the domain when it dies
From: Xen patchbot-unstable <patchbot-unstable@xxxxxxxxxxxxxxxxxxx>
Date: Wed, 25 Nov 2009 06:25:10 -0800
Delivery-date: Wed, 25 Nov 2009 06:25:10 -0800
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-changelog-request@lists.xensource.com?subject=help>
List-id: BK change log <xen-changelog.lists.xensource.com>
List-post: <mailto:xen-changelog@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=unsubscribe>
Reply-to: xen-devel@xxxxxxxxxxxxxxxxxxx
Sender: xen-changelog-bounces@xxxxxxxxxxxxxxxxxxx
# HG changeset patch
# User Keir Fraser <keir.fraser@xxxxxxxxxx>
# Date 1259158760 0
# Node ID 0e64f0b7d049264ea9eaeeabf12d611e424376ef
# Parent  a4dd434bf97541c95ddc09185a12ba94ad3f60cb
libxenlight: clean up the domain when it dies

This patch adds two functions to libxenlight to be able to recognize
when a particular domain dies. After creating a domain, xl uses these
functions to wait for its death and clean up its resources.

Signed-off-by: Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx>
---
 tools/libxl/libxl.c |   63 ++++++++++++++++++++++++++++++++++++++++++++++------
 tools/libxl/libxl.h |    4 +++
 tools/libxl/xl.c    |   39 +++++++++++++++++++++++++++++++-
 3 files changed, 98 insertions(+), 8 deletions(-)

diff -r a4dd434bf975 -r 0e64f0b7d049 tools/libxl/libxl.c
--- a/tools/libxl/libxl.c       Wed Nov 25 14:15:57 2009 +0000
+++ b/tools/libxl/libxl.c       Wed Nov 25 14:19:20 2009 +0000
@@ -54,9 +54,18 @@ int libxl_ctx_free(struct libxl_ctx *ctx
 {
     libxl_free_all(ctx);
     free(ctx->alloc_ptrs);
-    ctx->alloc_ptrs = NULL;
+    ctx->alloc_ptrs = calloc(ctx->alloc_maxsize, sizeof(void *));
+    if (!ctx->alloc_ptrs)
+        return ERROR_NOMEM;
+    return 0;
+}
+
+int libxl_ctx_close(struct libxl_ctx *ctx)
+{
+    libxl_ctx_free(ctx);
+    free(ctx->alloc_ptrs);
     xc_interface_close(ctx->xch);
-    xs_daemon_close(ctx->xsh);
+    xs_daemon_close(ctx->xsh); 
     return 0;
 }
 
@@ -352,6 +361,46 @@ int libxl_domain_shutdown(struct libxl_c
     return 0;
 }
 
+int libxl_wait_for_domain_death(struct libxl_ctx *ctx, uint32_t domid, int *fd)
+{
+    if (!xs_watch(ctx->xsh, "@releaseDomain", "domain_death"))
+        return -1;
+    *fd = xs_fileno(ctx->xsh);
+    return 0;
+}
+
+int libxl_is_domain_dead(struct libxl_ctx *ctx, uint32_t domid, xc_dominfo_t 
*info)
+{
+    unsigned int num;
+    int nb_domain, i, rc = 0;
+    char **vec = NULL;
+    xc_dominfo_t *list = NULL;
+
+    vec = xs_read_watch(ctx->xsh, &num);
+    if (!vec)
+        return 0;
+    if (!strcmp(vec[XS_WATCH_TOKEN], "domain_death")) {
+        list = libxl_domain_infolist(ctx, &nb_domain);
+        for (i = 0; i < nb_domain; i++) {
+            if (domid == list[i].domid) {
+                if (list[i].running || (!list[i].shutdown && !list[i].crashed 
&& !list[i].dying))
+                    goto out;
+                *info = list[i];
+                rc = 1;
+                goto out;
+            }
+        }
+        memset(info, 0x00, sizeof(xc_dominfo_t));
+        rc = 1;
+        goto out;
+    }
+
+out:
+    free(list);
+    free(vec);
+    return rc;
+}
+
 static int libxl_destroy_device_model(struct libxl_ctx *ctx, uint32_t domid)
 {
     char *pid;
@@ -409,11 +458,6 @@ int libxl_domain_destroy(struct libxl_ct
     }
     if (libxl_destroy_device_model(ctx, domid) < 0)
         XL_LOG(ctx, XL_LOG_ERROR, "libxl_destroy_device_model failed for %d", 
domid);
-    rc = xc_domain_destroy(ctx->xch, domid);
-    if (rc < 0) {
-        XL_LOG_ERRNOVAL(ctx, XL_LOG_ERROR, rc, "xc_domain_destroy failed for 
%d", domid);
-        return -1;
-    }
     if (libxl_devices_destroy(ctx, domid, force) < 0)
         XL_LOG(ctx, XL_LOG_ERROR, "libxl_destroy_devices failed for %d", 
domid);
     if (!xs_rm(ctx->xsh, XBT_NULL, dom_path))
@@ -421,6 +465,11 @@ int libxl_domain_destroy(struct libxl_ct
     snprintf(vm_path, sizeof(vm_path), "/vm/%s", libxl_uuid_to_string(ctx, 
uuid));
     if (!xs_rm(ctx->xsh, XBT_NULL, vm_path))
         XL_LOG_ERRNO(ctx, XL_LOG_ERROR, "xs_rm failed for %s", vm_path);
+    rc = xc_domain_destroy(ctx->xch, domid);
+    if (rc < 0) {
+        XL_LOG_ERRNOVAL(ctx, XL_LOG_ERROR, rc, "xc_domain_destroy failed for 
%d", domid);
+        return -1;
+    }
     return 0;
 }
 
diff -r a4dd434bf975 -r 0e64f0b7d049 tools/libxl/libxl.h
--- a/tools/libxl/libxl.h       Wed Nov 25 14:15:57 2009 +0000
+++ b/tools/libxl/libxl.h       Wed Nov 25 14:19:20 2009 +0000
@@ -227,6 +227,7 @@ typedef struct  {
 /* context functions */
 int libxl_ctx_init(struct libxl_ctx *ctx);
 int libxl_ctx_free(struct libxl_ctx *ctx);
+int libxl_ctx_close(struct libxl_ctx *ctx);
 int libxl_ctx_set_log(struct libxl_ctx *ctx, libxl_log_callback log_callback, 
void *log_data);
 
 /* domain related functions */
@@ -238,6 +239,9 @@ int libxl_domain_suspend(struct libxl_ct
                           uint32_t domid, int fd);
 int libxl_domain_shutdown(struct libxl_ctx *ctx, uint32_t domid, int req);
 int libxl_domain_destroy(struct libxl_ctx *ctx, uint32_t domid, int force);
+
+int libxl_wait_for_domain_death(struct libxl_ctx *ctx, uint32_t domid, int 
*fd);
+int libxl_is_domain_dead(struct libxl_ctx *ctx, uint32_t domid, xc_dominfo_t 
*info);
 
 int libxl_domain_pause(struct libxl_ctx *ctx, uint32_t domid);
 int libxl_domain_unpause(struct libxl_ctx *ctx, uint32_t domid);
diff -r a4dd434bf975 -r 0e64f0b7d049 tools/libxl/xl.c
--- a/tools/libxl/xl.c  Wed Nov 25 14:15:57 2009 +0000
+++ b/tools/libxl/xl.c  Wed Nov 25 14:19:20 2009 +0000
@@ -25,7 +25,10 @@
 #include <sys/time.h> /* for time */
 #include <getopt.h>
 #include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
 #include <sys/socket.h>
+#include <sys/select.h>
 #include <arpa/inet.h>
 #include <xenctrl.h>
 
@@ -584,13 +587,17 @@ static void create_domain(int debug, con
     libxl_device_vkb *vkbs = NULL;
     libxl_device_console console;
     int num_disks = 0, num_vifs = 0, num_pcidevs = 0, num_vfbs = 0, num_vkbs = 
0;
-    int i;
+    int i, fd;
+    int need_daemon = 1;
     libxl_device_model_starting *dm_starting = 0;
 
     printf("Parsing config file %s\n", filename);
     parse_config_file(filename, &info1, &info2, &disks, &num_disks, &vifs, 
&num_vifs, &pcidevs, &num_pcidevs, &vfbs, &num_vfbs, &vkbs, &num_vkbs, 
&dm_info);
     if (debug)
         printf_info(&info1, &info2, disks, num_disks, vifs, num_vifs, pcidevs, 
num_pcidevs, vfbs, num_vfbs, vkbs, num_vkbs, &dm_info);
+
+start:
+    domid = 0;
 
     libxl_ctx_init(&ctx);
     libxl_ctx_set_log(&ctx, log_callback, NULL);
@@ -631,6 +638,36 @@ static void create_domain(int debug, con
         libxl_device_pci_add(&ctx, domid, &pcidevs[i]);
 
     libxl_domain_unpause(&ctx, domid);
+
+    if (need_daemon) {
+        daemon(0, 0);
+        need_daemon = 0;
+    }
+    
+    libxl_wait_for_domain_death(&ctx, domid, &fd);
+    while (1) {
+        int ret;
+        fd_set rfds;
+        xc_dominfo_t info;
+        memset(&info, 0x00, sizeof(xc_dominfo_t));
+
+        FD_ZERO(&rfds);
+        FD_SET(fd, &rfds);
+
+        ret = select(fd + 1, &rfds, NULL, NULL, NULL);
+        if (!ret)
+            continue;
+        if (libxl_is_domain_dead(&ctx, domid, &info)) {
+            if (info.crashed || info.dying || (info.shutdown && 
(info.shutdown_reason != SHUTDOWN_suspend))) {
+                libxl_domain_destroy(&ctx, domid, 0);
+                if (info.shutdown && (info.shutdown_reason == 
SHUTDOWN_reboot)) {
+                    libxl_ctx_free(&ctx);
+                    goto start;
+                }
+            }
+            exit(0);
+        }
+    }
 
     for (i = 0; i < num_vifs; i++) {
         free(vifs[i].smac);

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

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-changelog] [xen-unstable] libxenlight: clean up the domain when it dies, Xen patchbot-unstable <=