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] Merge

# HG changeset patch
# User Keir Fraser <keir.fraser@xxxxxxxxxx>
# Date 1279562162 -3600
# Node ID c1c6706e4162dfd05e007d8fe726bb04c0b6234a
# Parent  785873d52123b6ab36ba5070a04ef01ac2760d9f
# Parent  91c486918e020b3d7c15ac880734701bf0277dd2
Merge
---
 tools/console/daemon/io.c      |    5 +
 tools/libxl/libxl.c            |  130 +++++++++++++++++++++++++++++------------
 tools/libxl/libxl.h            |   11 +++
 tools/libxl/libxl_bootloader.c |    4 -
 tools/libxl/libxl_dom.c        |   21 +++---
 tools/libxl/libxl_exec.c       |    2 
 tools/libxl/libxl_internal.h   |    3 
 tools/libxl/xl.h               |    2 
 tools/libxl/xl_cmdimpl.c       |   71 +++++++++++++++++-----
 tools/libxl/xl_cmdtable.c      |   10 +++
 tools/misc/xen-hvmctx.c        |    2 
 tools/python/xen/xend/osdep.py |   16 +++--
 12 files changed, 207 insertions(+), 70 deletions(-)

diff -r 785873d52123 -r c1c6706e4162 tools/console/daemon/io.c
--- a/tools/console/daemon/io.c Mon Jul 19 15:10:20 2010 +0100
+++ b/tools/console/daemon/io.c Mon Jul 19 18:56:02 2010 +0100
@@ -747,6 +747,11 @@ static void cleanup_domain(struct domain
 {
        domain_close_tty(d);
 
+       if (d->log_fd != -1) {
+               close(d->log_fd);
+               d->log_fd = -1;
+       }
+
        free(d->buffer.data);
        d->buffer.data = NULL;
 
diff -r 785873d52123 -r c1c6706e4162 tools/libxl/libxl.c
--- a/tools/libxl/libxl.c       Mon Jul 19 15:10:20 2010 +0100
+++ b/tools/libxl/libxl.c       Mon Jul 19 18:56:02 2010 +0100
@@ -37,6 +37,28 @@
 #include "tap-ctl.h"
 
 #define PAGE_TO_MEMKB(pages) ((pages) * 4)
+
+int libxl_xc_error(int xc_err)
+{
+    int ret = ERROR_FAIL;
+
+    switch(xc_err) {
+    case XC_ERROR_NONE:
+        return 0;
+    case XC_INVALID_PARAM:
+        ret = ERROR_INVAL;
+        break;
+    case XC_OUT_OF_MEMORY:
+        ret = ERROR_NOMEM;
+        break;
+    case XC_INTERNAL_ERROR:
+    case XC_INVALID_KERNEL:
+    default:
+        break;
+    }
+
+    return ret;
+}
 
 int libxl_ctx_init(struct libxl_ctx *ctx, int version, xentoollog_logger *lg)
 {
@@ -519,14 +541,23 @@ int libxl_domain_suspend(struct libxl_ct
 
 int libxl_domain_pause(struct libxl_ctx *ctx, uint32_t domid)
 {
-    xc_domain_pause(ctx->xch, domid);
-    return 0;
+    int rc;
+    rc = xc_domain_pause(ctx->xch, domid);
+    return libxl_xc_error(rc);
+}
+
+int libxl_domain_core_dump(struct libxl_ctx *ctx, uint32_t domid, const char 
*filename)
+{
+    int rc;
+    rc = xc_domain_dumpcore(ctx->xch, domid, filename);
+    return libxl_xc_error(rc);
 }
 
 int libxl_domain_unpause(struct libxl_ctx *ctx, uint32_t domid)
 {
     char *path;
     char *state;
+    int rc;
 
     if (is_hvm(ctx, domid)) {
         path = libxl_sprintf(ctx, "/local/domain/0/device-model/%d/state", 
domid);
@@ -536,9 +567,8 @@ int libxl_domain_unpause(struct libxl_ct
             libxl_wait_for_device_model(ctx, domid, "running", NULL, NULL);
         }
     }
-    xc_domain_unpause(ctx->xch, domid);
-
-    return 0;
+    rc = xc_domain_unpause(ctx->xch, domid);
+    return libxl_xc_error(rc);
 }
 
 static char *req_table[] = {
@@ -553,6 +583,7 @@ int libxl_domain_shutdown(struct libxl_c
 {
     char *shutdown_path;
     char *dom_path;
+    int rc = 0;
 
     if (req > ARRAY_SIZE(req_table))
         return ERROR_INVAL;
@@ -570,9 +601,9 @@ int libxl_domain_shutdown(struct libxl_c
         xc_get_hvm_param(ctx->xch, domid, HVM_PARAM_ACPI_S_STATE, 
&acpi_s_state);
         xc_get_hvm_param(ctx->xch, domid, HVM_PARAM_CALLBACK_IRQ, &pvdriver);
         if (!pvdriver || acpi_s_state != 0)
-            xc_domain_shutdown(ctx->xch, domid, req);
-    }
-    return 0;
+            rc = xc_domain_shutdown(ctx->xch, domid, req);
+    }
+    return libxl_xc_error(rc);
 }
 
 int libxl_get_wait_fd(struct libxl_ctx *ctx, int *fd)
@@ -617,7 +648,7 @@ int libxl_get_event(struct libxl_ctx *ct
     char **events = xs_read_watch(ctx->xsh, &num);
     if (num != 2) {
         free(events);
-        return -1;
+        return ERROR_FAIL;
     }
     event->path = strdup(events[XS_WATCH_PATH]);
     event->token = strdup(events[XS_WATCH_TOKEN]);
@@ -629,7 +660,7 @@ int libxl_stop_waiting(struct libxl_ctx 
 int libxl_stop_waiting(struct libxl_ctx *ctx, libxl_waiter *waiter)
 {
     if (!xs_unwatch(ctx->xsh, waiter->path, waiter->token))
-        return -1;
+        return ERROR_FAIL;
     else
         return 0;
 }
@@ -709,7 +740,7 @@ static int libxl_destroy_device_model(st
         int stubdomid = libxl_get_stubdom_id(ctx, domid);
         if (!stubdomid) {
             XL_LOG_ERRNO(ctx, XL_LOG_ERROR, "Couldn't find device model's 
pid");
-            return -1;
+            return ERROR_INVAL;
         }
         XL_LOG(ctx, XL_LOG_ERROR, "Device model is a stubdom, domid=%d\n", 
stubdomid);
         return libxl_domain_destroy(ctx, stubdomid, 0);
@@ -747,7 +778,7 @@ int libxl_domain_destroy(struct libxl_ct
 
     dom_path = libxl_xs_get_dompath(ctx, domid);
     if (!dom_path)
-        return -1;
+        return ERROR_FAIL;
 
     if (libxl_device_pci_shutdown(ctx, domid) < 0)
         XL_LOG(ctx, XL_LOG_ERROR, "pci shutdown failed for domid %d", domid);
@@ -759,7 +790,7 @@ int libxl_domain_destroy(struct libxl_ct
     rc = xc_domain_pause(ctx->xch, domid);
     if (rc < 0) {
         XL_LOG_ERRNOVAL(ctx, XL_LOG_ERROR, rc, "xc_domain_pause failed for 
%d", domid);
-        return -1;
+        return libxl_xc_error(rc);
     }
     if (dm_present) {
         if (libxl_destroy_device_model(ctx, domid) < 0)
@@ -790,7 +821,7 @@ int libxl_domain_destroy(struct libxl_ct
     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 libxl_xc_error(rc);
     }
     return 0;
 }
@@ -801,6 +832,15 @@ int libxl_console_exec(struct libxl_ctx 
     char *domid_s = libxl_sprintf(ctx, "%d", domid);
     char *cons_num_s = libxl_sprintf(ctx, "%d", cons_num);
     return execl(p, p, domid_s, "--num", cons_num_s, (void *)NULL) == 0 ? 0 : 
ERROR_FAIL;
+}
+
+int libxl_primary_console_exec(struct libxl_ctx *ctx, uint32_t domid_vm)
+{
+    uint32_t stubdomid = libxl_get_stubdom_id(ctx, domid_vm);
+    if (stubdomid)
+        return libxl_console_exec(ctx, stubdomid, 1);
+    else
+        return libxl_console_exec(ctx, domid_vm, 0);
 }
 
 static char ** libxl_build_device_model_args(struct libxl_ctx *ctx,
@@ -1136,11 +1176,11 @@ retry_transaction:
     }
     if (libxl_create_xenpv_qemu(ctx, vfb, num_console, console, &dm_starting) 
< 0) {
         free(args);
-        return -1;
+        return ERROR_FAIL;
     }
     if (libxl_confirm_device_model_startup(ctx, dm_starting) < 0) {
         free(args);
-        return -1;
+        return ERROR_FAIL;
     }
 
     libxl_domain_unpause(ctx, domid);
@@ -1344,7 +1384,7 @@ int libxl_device_disk_add(struct libxl_c
                 if (!dev)
                     dev = make_blktap2_device(ctx, disk->physpath, type);
                 if (!dev)
-                    return -1;
+                    return ERROR_FAIL;
                 flexarray_set(back, boffset++, "tapdisk-params");
                 flexarray_set(back, boffset++, libxl_sprintf(ctx, "%s:%s", 
device_disk_string_of_phystype(disk->phystype), disk->physpath));
                 flexarray_set(back, boffset++, "params");
@@ -2044,7 +2084,7 @@ int libxl_cdrom_insert(struct libxl_ctx 
     }
     if (i == num) {
         XL_LOG(ctx, XL_LOG_ERROR, "Virtual device not found");
-        return -1;
+        return ERROR_FAIL;
     }
     libxl_device_disk_del(ctx, disks + i, 1);
     libxl_device_disk_add(ctx, domid, disk);
@@ -2294,7 +2334,7 @@ static int libxl_device_pci_add_xenstore
 
     if (!is_hvm(ctx, domid)) {
         if (libxl_wait_for_backend(ctx, be_path, "4") < 0)
-            return -1;
+            return ERROR_FAIL;
     }
 
     back = flexarray_make(16, 1);
@@ -2343,13 +2383,13 @@ static int libxl_device_pci_remove_xenst
     num_devs_path = libxl_sprintf(ctx, "%s/num_devs", be_path);
     num_devs = libxl_xs_read(ctx, XBT_NULL, num_devs_path);
     if (!num_devs)
-        return -1;
+        return ERROR_INVAL;
     num = atoi(num_devs);
 
     if (!is_hvm(ctx, domid)) {
         if (libxl_wait_for_backend(ctx, be_path, "4") < 0) {
             XL_LOG(ctx, XL_LOG_DEBUG, "pci backend at %s is not ready", 
be_path);
-            return -1;
+            return ERROR_FAIL;
         }
     }
 
@@ -2363,7 +2403,7 @@ static int libxl_device_pci_remove_xenst
     }
     if (i == num) {
         XL_LOG(ctx, XL_LOG_ERROR, "Couldn't find the device on xenstore");
-        return -1;
+        return ERROR_INVAL;
     }
 
 retry_transaction:
@@ -2377,7 +2417,7 @@ retry_transaction:
     if (!is_hvm(ctx, domid)) {
         if (libxl_wait_for_backend(ctx, be_path, "4") < 0) {
             XL_LOG(ctx, XL_LOG_DEBUG, "pci backend at %s is not ready", 
be_path);
-            return -1;
+            return ERROR_FAIL;
         }
     }
 
@@ -2457,7 +2497,7 @@ int libxl_device_pci_add(struct libxl_ct
     hvm = is_hvm(ctx, domid);
     if (hvm) {
         if (libxl_wait_for_device_model(ctx, domid, "running", NULL, NULL) < 
0) {
-            return -1;
+            return ERROR_FAIL;
         }
         path = libxl_sprintf(ctx, "/local/domain/0/device-model/%d/state", 
domid);
         state = libxl_xs_read(ctx, XBT_NULL, path);
@@ -2487,7 +2527,7 @@ int libxl_device_pci_add(struct libxl_ct
 
         if (f == NULL) {
             XL_LOG_ERRNO(ctx, XL_LOG_ERROR, "Couldn't open %s", sysfs_path);
-            return -1;
+            return ERROR_FAIL;
         }
         for (i = 0; i < PROC_PCI_NUM_RESOURCES; i++) {
             if (fscanf(f, "0x%llx 0x%llx 0x%llx\n", &start, &end, &flags) != 3)
@@ -2550,7 +2590,7 @@ int libxl_device_pci_remove(struct libxl
     hvm = is_hvm(ctx, domid);
     if (hvm) {
         if (libxl_wait_for_device_model(ctx, domid, "running", NULL, NULL) < 
0) {
-            return -1;
+            return ERROR_FAIL;
         }
         path = libxl_sprintf(ctx, "/local/domain/0/device-model/%d/state", 
domid);
         state = libxl_xs_read(ctx, XBT_NULL, path);
@@ -2561,7 +2601,7 @@ int libxl_device_pci_remove(struct libxl
         xs_write(ctx->xsh, XBT_NULL, path, "pci-rem", strlen("pci-rem"));
         if (libxl_wait_for_device_model(ctx, domid, "pci-removed", NULL, NULL) 
< 0) {
             XL_LOG(ctx, XL_LOG_ERROR, "Device Model didn't respond in time");
-            return -1;
+            return ERROR_FAIL;
         }
         path = libxl_sprintf(ctx, "/local/domain/0/device-model/%d/state", 
domid);
         xs_write(ctx->xsh, XBT_NULL, path, state, strlen(state));
@@ -2685,7 +2725,7 @@ int libxl_device_pci_shutdown(struct lib
     pcidevs = libxl_device_pci_list(ctx, domid, &num);
     for (i = 0; i < num; i++) {
         if (libxl_device_pci_remove(ctx, domid, pcidevs + i) < 0)
-            return -1;
+            return ERROR_FAIL;
     }
     free(pcidevs);
     return 0;
@@ -2971,14 +3011,14 @@ int libxl_sched_credit_domain_set(struct
     if (scinfo->weight < 1 || scinfo->weight > 65535) {
         XL_LOG_ERRNOVAL(ctx, XL_LOG_ERROR, rc,
             "Cpu weight out of range, valid values are within range from 1 to 
65535");
-        return -1;
+        return ERROR_INVAL;
     }
 
     if (scinfo->cap < 0 || scinfo->cap > (domaininfo.max_vcpu_id + 1) * 100) {
         XL_LOG_ERRNOVAL(ctx, XL_LOG_ERROR, rc,
             "Cpu cap out of range, valid range is from 0 to %d for specified 
number of vcpus",
             ((domaininfo.max_vcpu_id + 1) * 100));
-        return -1;
+        return ERROR_INVAL;
     }
 
     sdom.weight = scinfo->weight;
@@ -2986,7 +3026,7 @@ int libxl_sched_credit_domain_set(struct
 
     rc = xc_sched_credit_domain_set(ctx->xch, domid, &sdom);
     if (rc != 0)
-        return rc;
+        return libxl_xc_error(rc);
 
     return 0;
 }
@@ -3015,7 +3055,7 @@ int libxl_send_trigger(struct libxl_ctx 
     if (trigger_type == -1) {
         XL_LOG_ERRNOVAL(ctx, XL_LOG_ERROR, -1,
             "Invalid trigger, valid triggers are 
<nmi|reset|init|power|sleep>");
-        return -1;
+        return ERROR_INVAL;
     }
 
     rc = xc_domain_send_trigger(ctx->xch, domid, trigger_type, vcpuid);
@@ -3023,7 +3063,7 @@ int libxl_send_trigger(struct libxl_ctx 
         XL_LOG_ERRNOVAL(ctx, XL_LOG_ERROR, rc,
             "Send trigger '%s' failed", trigger_name);
 
-    return rc;
+    return libxl_xc_error(rc);
 }
 
 int libxl_send_sysrq(struct libxl_ctx *ctx, uint32_t domid, char sysrq)
@@ -3149,7 +3189,7 @@ int libxl_tmem_freeze(struct libxl_ctx *
     if (rc < 0) {
         XL_LOG_ERRNOVAL(ctx, XL_LOG_ERROR, rc,
             "Can not freeze tmem pools");
-        return -1;
+        return ERROR_FAIL;
     }
 
     return rc;
@@ -3164,7 +3204,7 @@ int libxl_tmem_destroy(struct libxl_ctx 
     if (rc < 0) {
         XL_LOG_ERRNOVAL(ctx, XL_LOG_ERROR, rc,
             "Can not destroy tmem pools");
-        return -1;
+        return ERROR_FAIL;
     }
 
     return rc;
@@ -3179,7 +3219,7 @@ int libxl_tmem_thaw(struct libxl_ctx *ct
     if (rc < 0) {
         XL_LOG_ERRNOVAL(ctx, XL_LOG_ERROR, rc,
             "Can not thaw tmem pools");
-        return -1;
+        return ERROR_FAIL;
     }
 
     return rc;
@@ -3205,13 +3245,13 @@ int libxl_tmem_set(struct libxl_ctx *ctx
     if (subop == -1) {
         XL_LOG_ERRNOVAL(ctx, XL_LOG_ERROR, -1,
             "Invalid set, valid sets are <weight|cap|compress>");
-        return -1;
+        return ERROR_INVAL;
     }
     rc = xc_tmem_control(ctx->xch, -1, subop, domid, set, 0, 0, NULL);
     if (rc < 0) {
         XL_LOG_ERRNOVAL(ctx, XL_LOG_ERROR, rc,
             "Can not set tmem %s", name);
-        return -1;
+        return libxl_xc_error(rc);
     }
 
     return rc;
@@ -3226,6 +3266,20 @@ int libxl_tmem_shared_auth(struct libxl_
     if (rc < 0) {
         XL_LOG_ERRNOVAL(ctx, XL_LOG_ERROR, rc,
             "Can not set tmem shared auth");
+        return libxl_xc_error(rc);
+    }
+
+    return rc;
+}
+
+int libxl_tmem_freeable(struct libxl_ctx *ctx)
+{
+    int rc;
+
+    rc = xc_tmem_control(ctx->xch, -1, TMEMC_QUERY_FREEABLE_MB, -1, 0, 0, 0, 
0);
+    if (rc < 0) {
+        XL_LOG_ERRNOVAL(ctx, XL_LOG_ERROR, rc,
+            "Can not get tmem freeable memory");
         return -1;
     }
 
diff -r 785873d52123 -r c1c6706e4162 tools/libxl/libxl.h
--- a/tools/libxl/libxl.h       Mon Jul 19 15:10:20 2010 +0100
+++ b/tools/libxl/libxl.h       Mon Jul 19 18:56:02 2010 +0100
@@ -395,10 +395,20 @@ int libxl_domain_pause(struct libxl_ctx 
 int libxl_domain_pause(struct libxl_ctx *ctx, uint32_t domid);
 int libxl_domain_unpause(struct libxl_ctx *ctx, uint32_t domid);
 
+int libxl_domain_core_dump(struct libxl_ctx *ctx, uint32_t domid, const char 
*filename);
+
 int libxl_domain_setmaxmem(struct libxl_ctx *ctx, uint32_t domid, uint32_t 
target_memkb);
 int libxl_set_memory_target(struct libxl_ctx *ctx, uint32_t domid, uint32_t 
target_memkb, int enforce);
 
 int libxl_console_exec(struct libxl_ctx *ctx, uint32_t domid, int cons_num);
+/* libxl_primary_console_exec finds the domid and console number
+ * corresponding to the primary console of the given vm, then calls
+ * libxl_console_exec with the right arguments (domid might be different
+ * if the guest is using stubdoms).
+ * This function can be called after creating the device model, in
+ * case of HVM guests, and before libxl_run_bootloader in case of PV
+ * guests using pygrub. */ 
+int libxl_primary_console_exec(struct libxl_ctx *ctx, uint32_t domid_vm);
 
 int libxl_domain_info(struct libxl_ctx*, struct libxl_dominfo *info_r,
                       uint32_t domid);
@@ -602,6 +612,7 @@ int libxl_tmem_set(struct libxl_ctx *ctx
                    uint32_t set);
 int libxl_tmem_shared_auth(struct libxl_ctx *ctx, uint32_t domid, char* uuid,
                            int auth);
+int libxl_tmem_freeable(struct libxl_ctx *ctx);
 
 typedef struct {
     char *backend;
diff -r 785873d52123 -r c1c6706e4162 tools/libxl/libxl_bootloader.c
--- a/tools/libxl/libxl_bootloader.c    Mon Jul 19 15:10:20 2010 +0100
+++ b/tools/libxl/libxl_bootloader.c    Mon Jul 19 18:56:02 2010 +0100
@@ -251,7 +251,7 @@ static char * bootloader_interact(struct
                 if (temp == NULL)
                     goto out_err;
                 output = temp;
-                memset(output + size_out, new_size - size_out, 0);
+                memset(output + size_out, 0, new_size - size_out);
                 size_out = new_size;
             }
 
@@ -386,7 +386,7 @@ int libxl_run_bootloader(struct libxl_ct
     }
 
     dom_console_xs_path = libxl_sprintf(ctx, "%s/serial/0/tty", 
libxl_xs_get_dompath(ctx, domid));
-    libxl_xs_write(ctx, XBT_NULL, dom_console_xs_path, 
dom_console_slave_tty_path);
+    libxl_xs_write(ctx, XBT_NULL, dom_console_xs_path, "%s", 
dom_console_slave_tty_path);
 
     pid = fork_exec_bootloader(&bootloader_fd, (char *)info->u.pv.bootloader, 
args);
     if (pid < 0) {
diff -r 785873d52123 -r c1c6706e4162 tools/libxl/libxl_dom.c
--- a/tools/libxl/libxl_dom.c   Mon Jul 19 15:10:20 2010 +0100
+++ b/tools/libxl/libxl_dom.c   Mon Jul 19 18:56:02 2010 +0100
@@ -212,7 +212,7 @@ int build_pv(struct libxl_ctx *ctx, uint
     ret = 0;
 out:
     xc_dom_release(dom);
-    return ret == 0 ? 0 : ERROR_FAIL;
+    return libxl_xc_error(ret);
 }
 
 int build_hvm(struct libxl_ctx *ctx, uint32_t domid,
@@ -250,10 +250,12 @@ int restore_common(struct libxl_ctx *ctx
                    int fd)
 {
     /* read signature */
-    return xc_domain_restore(ctx->xch, fd, domid,
+    int rc;
+    rc = xc_domain_restore(ctx->xch, fd, domid,
                              state->store_port, &state->store_mfn,
                              state->console_port, &state->console_mfn,
                              info->hvm, info->u.hvm.pae, 0);
+    return libxl_xc_error(rc);
 }
 
 struct suspendinfo {
@@ -359,7 +361,7 @@ int core_suspend(struct libxl_ctx *ctx, 
 
     si.xce = xc_evtchn_open();
     if (si.xce < 0)
-        return -1;
+        return ERROR_FAIL;
 
     if (si.xce > 0) {
         port = xs_suspend_evtchn_port(si.domid);
@@ -438,7 +440,7 @@ static const char *userdata_path(struct 
     if (rc) {
         XL_LOG_ERRNO(ctx, XL_LOG_ERROR, "unable to find domain info"
                      " for domain %"PRIu32, domid);
-        return 0;
+        return NULL;
     }
     uuid_string = string_of_uuid(ctx, info.uuid);
 
@@ -493,13 +495,13 @@ int libxl_userdata_store(struct libxl_ct
     size_t rs;
 
     filename = userdata_path(ctx, domid, userdata_userid, "d");
-    if (!filename) return ENOMEM;
+    if (!filename) return ERROR_NOMEM;
 
     if (!datalen)
         return userdata_delete(ctx, filename);
 
     newfilename = userdata_path(ctx, domid, userdata_userid, "n");
-    if (!newfilename) return ENOMEM;
+    if (!newfilename) return ERROR_NOMEM;
 
     fd= open(newfilename, O_RDWR|O_CREAT|O_TRUNC, 0600);
     if (fd<0) goto xe;
@@ -523,9 +525,10 @@ int libxl_userdata_store(struct libxl_ct
     if (f) fclose(f);
     if (fd>=0) close(fd);
 
+    errno = e;
     XL_LOG_ERRNO(ctx, XL_LOG_ERROR, "cannot write %s for %s",
                  newfilename, filename);
-    return e;
+    return ERROR_FAIL;
 }
 
 int libxl_userdata_retrieve(struct libxl_ctx *ctx, uint32_t domid,
@@ -537,14 +540,14 @@ int libxl_userdata_retrieve(struct libxl
     void *data = 0;
 
     filename = userdata_path(ctx, domid, userdata_userid, "d");
-    if (!filename) return ENOMEM;
+    if (!filename) return ERROR_NOMEM;
 
     e = libxl_read_file_contents(ctx, filename, data_r ? &data : 0, &datalen);
 
     if (!e && !datalen) {
         XL_LOG(ctx, XL_LOG_ERROR, "userdata file %s is empty", filename);
         if (data_r) assert(!*data_r);
-        return EPROTO;
+        return ERROR_FAIL;
     }
 
     if (data_r) *data_r = data;
diff -r 785873d52123 -r c1c6706e4162 tools/libxl/libxl_exec.c
--- a/tools/libxl/libxl_exec.c  Mon Jul 19 15:10:20 2010 +0100
+++ b/tools/libxl/libxl_exec.c  Mon Jul 19 18:56:02 2010 +0100
@@ -53,7 +53,7 @@ void libxl_exec(int stdinfd, int stdoutf
     /* in case our caller set it to IGN.  subprocesses are entitled
      * to assume they got DFL. */
 
-    execv(arg0, args);
+    execvp(arg0, args);
     _exit(-1);
 }
 
diff -r 785873d52123 -r c1c6706e4162 tools/libxl/libxl_internal.h
--- a/tools/libxl/libxl_internal.h      Mon Jul 19 15:10:20 2010 +0100
+++ b/tools/libxl/libxl_internal.h      Mon Jul 19 18:56:02 2010 +0100
@@ -222,5 +222,8 @@ char *libxl_abs_path(struct libxl_ctx *c
 #define XL_LOG_WARNING XTL_WARN
 #define XL_LOG_ERROR   XTL_ERROR
 
+/* Error handling */
+int libxl_xc_error(int xc_err);
+
 #endif
 
diff -r 785873d52123 -r c1c6706e4162 tools/libxl/xl.h
--- a/tools/libxl/xl.h  Mon Jul 19 15:10:20 2010 +0100
+++ b/tools/libxl/xl.h  Mon Jul 19 18:56:02 2010 +0100
@@ -37,6 +37,7 @@ int main_migrate_receive(int argc, char 
 int main_migrate_receive(int argc, char **argv);
 int main_save(int argc, char **argv);
 int main_migrate(int argc, char **argv);
+int main_dump_core(int argc, char **argv);
 int main_pause(int argc, char **argv);
 int main_unpause(int argc, char **argv);
 int main_destroy(int argc, char **argv);
@@ -72,6 +73,7 @@ int main_tmem_thaw(int argc, char **argv
 int main_tmem_thaw(int argc, char **argv);
 int main_tmem_set(int argc, char **argv);
 int main_tmem_shared_auth(int argc, char **argv);
+int main_tmem_freeable(int argc, char **argv);
 int main_network2attach(int argc, char **argv);
 int main_network2list(int argc, char **argv);
 int main_network2detach(int argc, char **argv);
diff -r 785873d52123 -r c1c6706e4162 tools/libxl/xl_cmdimpl.c
--- a/tools/libxl/xl_cmdimpl.c  Mon Jul 19 15:10:20 2010 +0100
+++ b/tools/libxl/xl_cmdimpl.c  Mon Jul 19 18:56:02 2010 +0100
@@ -947,9 +947,9 @@ static void *xrealloc(void *ptr, size_t 
     return r;
 }
 
-int autoconnect_console(int cons_num)
-{
-    int status;
+int autoconnect_console(int hvm)
+{
+    int status, options;
     pid_t pid, r;
 
     /*
@@ -966,14 +966,21 @@ int autoconnect_console(int cons_num)
         return 0;
 
     /*
-     * Catch failure of the create process.
+     * In the PV case we only catch failure of the create process, in
+     * the HVM case we also wait for the creation process to be
+     * completed so that the stubdom is already up and running and we
+     * can connect to it.
      */
+    if (hvm)
+        options = 0;
+    else
+        options = WNOHANG;
     sleep(1);
-    r = waitpid(pid, &status, WNOHANG);
+    r = waitpid(pid, &status, options);
     if (r > 0 && WIFEXITED(status) && WEXITSTATUS(status) != 0)
         _exit(WEXITSTATUS(status));
 
-    libxl_console_exec(&ctx, domid, cons_num);
+    libxl_primary_console_exec(&ctx, domid);
     /* Do not return. xl continued in child process */
     fprintf(stderr, "Unable to attach console\n");
     _exit(1);
@@ -1170,7 +1177,7 @@ start:
     }
 
     if (dom_info->console_autoconnect) {
-        ret = autoconnect_console(0);
+        ret = autoconnect_console(info1.hvm);
         if (ret)
             goto error_out;
     }
@@ -1624,18 +1631,13 @@ int main_cd_insert(int argc, char **argv
 
 int main_console(int argc, char **argv)
 {
-    int opt = 0, cons_num = 0;
+    int opt = 0;
 
     while ((opt = getopt(argc, argv, "hn:")) != -1) {
         switch (opt) {
         case 'h':
             help("console");
             exit(0);
-        case 'n':
-            if (optarg) {
-                cons_num = strtol(optarg, NULL, 10);
-            }
-            break;
         default:
             fprintf(stderr, "option not supported\n");
             break;
@@ -1647,7 +1649,7 @@ int main_console(int argc, char **argv)
     }
 
     find_domain(argv[optind]);
-    libxl_console_exec(&ctx, domid, 0);
+    libxl_primary_console_exec(&ctx, domid);
     fprintf(stderr, "Unable to attach console\n");
     return 1;
 }
@@ -2262,6 +2264,14 @@ static void migrate_domain(char *domain_
     exit(-ERROR_BADFAIL);
 }
 
+static void core_dump_domain(const char *domain_spec, const char *filename)
+{
+    int rc;
+    find_domain(domain_spec);
+    rc=libxl_domain_core_dump(&ctx, domid, filename);
+    if (rc) { fprintf(stderr,"core dump failed (rc=%d)\n.",rc);exit(-1); }
+}
+
 static void migrate_receive(int debug, int daemonize)
 {
     int rc, rc2;
@@ -2528,6 +2538,16 @@ int main_migrate(int argc, char **argv)
     }
 
     migrate_domain(p, rune, config_filename);
+    exit(0);
+}
+
+int main_dump_core(int argc, char **argv)
+{
+    if ( argc-optind < 2 ) {
+        help("dump-core");
+        exit(2);
+    }
+    core_dump_domain(argv[optind], argv[optind + 1]);
     exit(0);
 }
 
@@ -4586,3 +4606,26 @@ int main_tmem_shared_auth(int argc, char
     exit(0);
 }
 
+int main_tmem_freeable(int argc, char **argv)
+{
+    int opt;
+    int mb;
+
+    while ((opt = getopt(argc, argv, "h")) != -1) {
+        switch (opt) {
+        case 'h':
+            help("tmem-freeable");
+            exit(0);
+        default:
+            fprintf(stderr, "option `%c' not supported.\n", opt);
+            break;
+        }
+    }
+
+    mb = libxl_tmem_freeable(&ctx);
+    if (mb == -1)
+        exit(-1);
+
+    printf("%d\n", mb);
+    exit(0);
+}
diff -r 785873d52123 -r c1c6706e4162 tools/libxl/xl_cmdtable.c
--- a/tools/libxl/xl_cmdtable.c Mon Jul 19 15:10:20 2010 +0100
+++ b/tools/libxl/xl_cmdtable.c Mon Jul 19 18:56:02 2010 +0100
@@ -102,6 +102,11 @@ struct cmd_spec cmd_table[] = {
       "-e              Do not wait in the background (on <host>) for the 
death\n"
       "                of the domain."
     },
+    { "dump-core",
+      &main_dump_core,
+      "Core dump a domain",
+      "<Domain> <filename>"
+    },
     { "restore",
       &main_restore,
       "Restore a domain from a saved state",
@@ -294,6 +299,11 @@ struct cmd_spec cmd_table[] = {
       "  -u UUID                        Specify uuid\n"
       "                                 
(abcdef01-2345-6789-1234-567890abcdef)\n"
       "  -A AUTH                        0=auth,1=deauth",
+    },
+    { "tmem-freeable",
+      &main_tmem_freeable,
+      "Get information about how much freeable memory (MB) is in-use by tmem",
+      "",
     },
     { "network2-attach",
       &main_network2attach,
diff -r 785873d52123 -r c1c6706e4162 tools/misc/xen-hvmctx.c
--- a/tools/misc/xen-hvmctx.c   Mon Jul 19 15:10:20 2010 +0100
+++ b/tools/misc/xen-hvmctx.c   Mon Jul 19 18:56:02 2010 +0100
@@ -156,7 +156,7 @@ static void dump_cpu(void)
            "             ss 0x%8.8x (0x%16.16llx + 0x%8.8x / 0x%5.5x)\n"
            "             tr 0x%8.8x (0x%16.16llx + 0x%8.8x / 0x%5.5x)\n"
            "           ldtr 0x%8.8x (0x%16.16llx + 0x%8.8x / 0x%5.5x)\n"
-           "           itdr            (0x%16.16llx + 0x%8.8x)\n"
+           "           idtr            (0x%16.16llx + 0x%8.8x)\n"
            "           gdtr            (0x%16.16llx + 0x%8.8x)\n"
            "    sysenter cs 0x%8.8llx  eip 0x%16.16llx  esp 0x%16.16llx\n"
            "      shadow gs 0x%16.16llx\n"
diff -r 785873d52123 -r c1c6706e4162 tools/python/xen/xend/osdep.py
--- a/tools/python/xen/xend/osdep.py    Mon Jul 19 15:10:20 2010 +0100
+++ b/tools/python/xen/xend/osdep.py    Mon Jul 19 18:56:02 2010 +0100
@@ -83,13 +83,19 @@ def _netbsd_balloon_stat(label):
 
     import commands
 
-    if label != 'current':
-       return None
-    cmd = "/sbin/sysctl hw.physmem64"
+    xend2netbsd_labels = { 'current'      : 'kern.xen.balloon.current',
+                           'target'       : 'kern.xen.balloon.target',
+                           'low-balloon'  : None,
+                           'high-balloon' : None,
+                           'limit'        : None }
+
+    cmdarg = xend2netbsd_labels[label]
+    if cmdarg is None:
+        return None
+    cmd = "/sbin/sysctl " + cmdarg
     sysctloutput = commands.getoutput(cmd)
     (name, value) = sysctloutput.split('=')
-    """Return value in KB."""
-    return int(value) / 1024
+    return int(value)
 
 def _solaris_balloon_stat(label):
     """Returns the value for the named label, or None if an error occurs."""

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

<Prev in Thread] Current Thread [Next in Thread>