diff options
Diffstat (limited to 'tools/libxl/libxl.c')
-rw-r--r-- | tools/libxl/libxl.c | 126 |
1 files changed, 71 insertions, 55 deletions
diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c index 73f155c700..a8455d8a30 100644 --- a/tools/libxl/libxl.c +++ b/tools/libxl/libxl.c @@ -223,7 +223,7 @@ int libxl_domain_resume(libxl_ctx *ctx, uint32_t domid) libxl__gc gc = LIBXL_INIT_GC(ctx); int rc = 0; - if (libxl__domain_is_hvm(ctx, domid)) { + if (libxl__domain_is_hvm(&gc, domid)) { LIBXL__LOG(ctx, LIBXL__LOG_DEBUG, "Called domain_resume on " "non-cooperative hvm domain %u", domid); rc = ERROR_NI; @@ -455,14 +455,16 @@ libxl_vminfo * libxl_list_vm(libxl_ctx *ctx, int *nb_vm) int libxl_domain_suspend(libxl_ctx *ctx, libxl_domain_suspend_info *info, uint32_t domid, int fd) { - int hvm = libxl__domain_is_hvm(ctx, domid); + libxl__gc gc = LIBXL_INIT_GC(ctx); + int hvm = libxl__domain_is_hvm(&gc, domid); int live = info != NULL && info->flags & XL_SUSPEND_LIVE; int debug = info != NULL && info->flags & XL_SUSPEND_DEBUG; int rc = 0; - rc = libxl__domain_suspend_common(ctx, domid, fd, hvm, live, debug); + rc = libxl__domain_suspend_common(&gc, domid, fd, hvm, live, debug); if (!rc && hvm) - rc = libxl__domain_save_device_model(ctx, domid, fd); + rc = libxl__domain_save_device_model(&gc, domid, fd); + libxl__free_all(&gc); return rc; } @@ -497,12 +499,12 @@ int libxl_domain_unpause(libxl_ctx *ctx, uint32_t domid) char *state; int ret, rc = 0; - if (libxl__domain_is_hvm(ctx, domid)) { + if (libxl__domain_is_hvm(&gc, domid)) { path = libxl__sprintf(&gc, "/local/domain/0/device-model/%d/state", domid); state = libxl__xs_read(&gc, XBT_NULL, path); if (state != NULL && !strcmp(state, "paused")) { libxl__xs_write(&gc, XBT_NULL, libxl__sprintf(&gc, "/local/domain/0/device-model/%d/command", domid), "continue"); - libxl__wait_for_device_model(ctx, domid, "running", NULL, NULL); + libxl__wait_for_device_model(&gc, domid, "running", NULL, NULL); } } ret = xc_domain_unpause(ctx->xch, domid); @@ -539,7 +541,7 @@ int libxl_domain_shutdown(libxl_ctx *ctx, uint32_t domid, int req) return ERROR_FAIL; } - if (libxl__domain_is_hvm(ctx,domid)) { + if (libxl__domain_is_hvm(&gc, domid)) { unsigned long pvdriver = 0; int ret; ret = xc_get_hvm_param(ctx->xch, domid, HVM_PARAM_CALLBACK_IRQ, &pvdriver); @@ -713,7 +715,7 @@ int libxl_domain_destroy(libxl_ctx *ctx, uint32_t domid, int force) return rc; } - if (libxl__domain_is_hvm(ctx, domid)) { + if (libxl__domain_is_hvm(&gc, domid)) { dm_present = 1; } else { char *pid; @@ -734,10 +736,10 @@ int libxl_domain_destroy(libxl_ctx *ctx, uint32_t domid, int force) LIBXL__LOG_ERRNOVAL(ctx, LIBXL__LOG_ERROR, rc, "xc_domain_pause failed for %d", domid); } if (dm_present) { - if (libxl__destroy_device_model(ctx, domid) < 0) + if (libxl__destroy_device_model(&gc, domid) < 0) LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "libxl__destroy_device_model failed for %d", domid); } - if (libxl__devices_destroy(ctx, domid, force) < 0) + if (libxl__devices_destroy(&gc, domid, force) < 0) LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "libxl_destroy_devices failed for %d", domid); vm_path = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/vm", dom_path)); @@ -748,7 +750,7 @@ int libxl_domain_destroy(libxl_ctx *ctx, uint32_t domid, int force) if (!xs_rm(ctx->xsh, XBT_NULL, dom_path)) LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "xs_rm failed for %s", dom_path); - libxl__userdata_destroyall(ctx, domid); + libxl__userdata_destroyall(&gc, domid); rc = xc_domain_destroy(ctx->xch, domid); if (rc < 0) { @@ -790,16 +792,20 @@ out: int libxl_primary_console_exec(libxl_ctx *ctx, uint32_t domid_vm) { + libxl__gc gc = LIBXL_INIT_GC(ctx); uint32_t stubdomid = libxl_get_stubdom_id(ctx, domid_vm); + int rc; if (stubdomid) - return libxl_console_exec(ctx, stubdomid, - STUBDOM_CONSOLE_SERIAL, LIBXL_CONSTYPE_PV); + rc = libxl_console_exec(ctx, stubdomid, + STUBDOM_CONSOLE_SERIAL, LIBXL_CONSTYPE_PV); else { - if (libxl__domain_is_hvm(ctx, domid_vm)) - return libxl_console_exec(ctx, domid_vm, 0, LIBXL_CONSTYPE_SERIAL); + if (libxl__domain_is_hvm(&gc, domid_vm)) + rc = libxl_console_exec(ctx, domid_vm, 0, LIBXL_CONSTYPE_SERIAL); else - return libxl_console_exec(ctx, domid_vm, 0, LIBXL_CONSTYPE_PV); + rc = libxl_console_exec(ctx, domid_vm, 0, LIBXL_CONSTYPE_PV); } + libxl__free_all(&gc); + return rc; } int libxl_vncviewer_exec(libxl_ctx *ctx, uint32_t domid, int autopass) @@ -877,9 +883,10 @@ int libxl_vncviewer_exec(libxl_ctx *ctx, uint32_t domid, int autopass) /******************************************************************************/ -static int validate_virtual_disk(libxl_ctx *ctx, char *file_name, - libxl_device_disk *disk) +static int validate_virtual_disk(libxl__gc *gc, char *file_name, + libxl_device_disk *disk) { + libxl_ctx *ctx = libxl__gc_owner(gc); struct stat stat_buf; char *delimiter; @@ -924,7 +931,7 @@ int libxl_device_disk_add(libxl_ctx *ctx, uint32_t domid, libxl_device_disk *dis libxl__device device; int major, minor, rc; - rc = validate_virtual_disk(ctx, disk->pdev_path, disk); + rc = validate_virtual_disk(&gc, disk->pdev_path, disk); if (rc) return rc; @@ -1035,7 +1042,7 @@ int libxl_device_disk_add(libxl_ctx *ctx, uint32_t domid, libxl_device_disk *dis flexarray_append(front, "x86_32-abi"); /* hardcoded ! */ } - libxl__device_generic_add(ctx, &device, + libxl__device_generic_add(&gc, &device, libxl__xs_kvs_of_flexarray(&gc, back, back->count), libxl__xs_kvs_of_flexarray(&gc, front, front->count)); @@ -1049,7 +1056,7 @@ out: return rc; } -int libxl_device_disk_del(libxl_ctx *ctx, +int libxl_device_disk_del(libxl_ctx *ctx, libxl_device_disk *disk, int wait) { libxl__gc gc = LIBXL_INIT_GC(ctx); @@ -1059,12 +1066,12 @@ int libxl_device_disk_del(libxl_ctx *ctx, devid = libxl__device_disk_dev_number(disk->vdev); device.backend_domid = disk->backend_domid; device.backend_devid = devid; - device.backend_kind = + device.backend_kind = (disk->backend == DISK_BACKEND_PHY) ? DEVICE_VBD : DEVICE_TAP; device.domid = disk->domid; device.devid = devid; device.kind = DEVICE_VBD; - rc = libxl__device_del(ctx, &device, wait); + rc = libxl__device_del(&gc, &device, wait); xs_rm(ctx->xsh, XBT_NULL, libxl__device_backend_path(&gc, &device)); xs_rm(ctx->xsh, XBT_NULL, libxl__device_frontend_path(&gc, &device)); libxl__free_all(&gc); @@ -1078,7 +1085,7 @@ char * libxl_device_disk_local_attach(libxl_ctx *ctx, libxl_device_disk *disk) char *ret = NULL; switch (disk->backend) { - case DISK_BACKEND_PHY: + case DISK_BACKEND_PHY: if (disk->format != DISK_FORMAT_RAW) { LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "physical block device must" " be raw"); @@ -1088,7 +1095,7 @@ char * libxl_device_disk_local_attach(libxl_ctx *ctx, libxl_device_disk *disk) disk->pdev_path); dev = disk->pdev_path; break; - case DISK_BACKEND_TAP: + case DISK_BACKEND_TAP: if (disk->format == DISK_FORMAT_VHD || disk->format == DISK_FORMAT_RAW) { if (libxl__blktap_enabled(&gc)) @@ -1115,7 +1122,7 @@ char * libxl_device_disk_local_attach(libxl_ctx *ctx, libxl_device_disk *disk) "type: %d", disk->backend); break; } - case DISK_BACKEND_QDISK: + case DISK_BACKEND_QDISK: if (disk->format != DISK_FORMAT_RAW) { LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "cannot locally attach a qdisk " "image if the format is not raw"); @@ -1126,7 +1133,7 @@ char * libxl_device_disk_local_attach(libxl_ctx *ctx, libxl_device_disk *disk) dev = disk->pdev_path; break; case DISK_BACKEND_UNKNOWN: - default: + default: LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "unrecognized disk backend " "type: %d", disk->backend); break; @@ -1258,7 +1265,7 @@ int libxl_device_nic_add(libxl_ctx *ctx, uint32_t domid, libxl_device_nic *nic) flexarray_append(front, "x86_32-abi"); /* hardcoded ! */ } - libxl__device_generic_add(ctx, &device, + libxl__device_generic_add(&gc, &device, libxl__xs_kvs_of_flexarray(&gc, back, back->count), libxl__xs_kvs_of_flexarray(&gc, front, front->count)); @@ -1272,10 +1279,12 @@ out: return rc; } -int libxl_device_nic_del(libxl_ctx *ctx, +int libxl_device_nic_del(libxl_ctx *ctx, libxl_device_nic *nic, int wait) { + libxl__gc gc = LIBXL_INIT_GC(ctx); libxl__device device; + int rc; device.backend_devid = nic->devid; device.backend_domid = nic->backend_domid; @@ -1284,7 +1293,9 @@ int libxl_device_nic_del(libxl_ctx *ctx, device.domid = nic->domid; device.kind = DEVICE_VIF; - return libxl__device_del(ctx, &device, wait); + rc = libxl__device_del(&gc, &device, wait); + libxl__free_all(&gc); + return rc; } libxl_nicinfo *libxl_list_nics(libxl_ctx *ctx, uint32_t domid, unsigned int *nb) @@ -1470,7 +1481,7 @@ int libxl_device_net2_add(libxl_ctx *ctx, uint32_t domid, libxl_device_net2 *net flexarray_append(front, "state"); flexarray_append(front, "1"); - libxl__device_generic_add(ctx, &device, + libxl__device_generic_add(&gc, &device, libxl__xs_kvs_of_flexarray(&gc, back, back->count), libxl__xs_kvs_of_flexarray(&gc, front, front->count)); @@ -1547,7 +1558,9 @@ err: int libxl_device_net2_del(libxl_ctx *ctx, libxl_device_net2 *net2, int wait) { + libxl__gc gc = LIBXL_INIT_GC(ctx); libxl__device device; + int rc; device.backend_devid = net2->devid; device.backend_domid = net2->backend_domid; @@ -1556,7 +1569,9 @@ int libxl_device_net2_del(libxl_ctx *ctx, libxl_device_net2 *net2, int wait) device.domid = net2->domid; device.kind = DEVICE_VIF2; - return libxl__device_del(ctx, &device, wait); + rc = libxl__device_del(&gc, &device, wait); + libxl__free_all(&gc); + return rc; } @@ -1626,7 +1641,7 @@ int libxl_device_console_add(libxl_ctx *ctx, uint32_t domid, libxl_device_consol flexarray_append(front, LIBXL_XENCONSOLE_PROTOCOL); } - libxl__device_generic_add(ctx, &device, + libxl__device_generic_add(&gc, &device, libxl__xs_kvs_of_flexarray(&gc, back, back->count), libxl__xs_kvs_of_flexarray(&gc, front, front->count)); rc = 0; @@ -1685,7 +1700,7 @@ int libxl_device_vkb_add(libxl_ctx *ctx, uint32_t domid, libxl_device_vkb *vkb) flexarray_append(front, "state"); flexarray_append(front, libxl__sprintf(&gc, "%d", 1)); - libxl__device_generic_add(ctx, &device, + libxl__device_generic_add(&gc, &device, libxl__xs_kvs_of_flexarray(&gc, back, back->count), libxl__xs_kvs_of_flexarray(&gc, front, front->count)); rc = 0; @@ -1707,22 +1722,22 @@ int libxl_device_vkb_hard_shutdown(libxl_ctx *ctx, uint32_t domid) return ERROR_NI; } -static unsigned int libxl_append_disk_list_of_type(libxl_ctx *ctx, - uint32_t domid, - const char *type, - libxl_device_disk **disks, - unsigned int *ndisks) +static unsigned int libxl__append_disk_list_of_type(libxl__gc *gc, + uint32_t domid, + const char *type, + libxl_device_disk **disks, + unsigned int *ndisks) { - libxl__gc gc = LIBXL_INIT_GC(ctx); + libxl_ctx *ctx = libxl__gc_owner(gc); char *be_path = NULL; char **dir = NULL; unsigned int n = 0, len = 0; libxl_device_disk *pdisk = NULL, *pdisk_end = NULL; char *physpath_tmp = NULL; - be_path = libxl__sprintf(&gc, "%s/backend/%s/%d", - libxl__xs_get_dompath(&gc, 0), type, domid); - dir = libxl__xs_directory(&gc, XBT_NULL, be_path, &n); + be_path = libxl__sprintf(gc, "%s/backend/%s/%d", + libxl__xs_get_dompath(gc, 0), type, domid); + dir = libxl__xs_directory(gc, XBT_NULL, be_path, &n); if (dir) { *disks = realloc(*disks, sizeof (libxl_device_disk) * (*ndisks + n)); pdisk = *disks + *ndisks; @@ -1731,40 +1746,41 @@ static unsigned int libxl_append_disk_list_of_type(libxl_ctx *ctx, for (; pdisk < pdisk_end; pdisk++, dir++) { pdisk->backend_domid = 0; pdisk->domid = domid; - physpath_tmp = xs_read(ctx->xsh, XBT_NULL, libxl__sprintf(&gc, "%s/%s/params", be_path, *dir), &len); + physpath_tmp = xs_read(ctx->xsh, XBT_NULL, libxl__sprintf(gc, "%s/%s/params", be_path, *dir), &len); if (physpath_tmp && strchr(physpath_tmp, ':')) { pdisk->pdev_path = strdup(strchr(physpath_tmp, ':') + 1); free(physpath_tmp); } else { pdisk->pdev_path = physpath_tmp; } - libxl_string_to_backend(ctx, libxl__xs_read(&gc, XBT_NULL, - libxl__sprintf(&gc, "%s/%s/type", be_path, *dir)), + libxl_string_to_backend(ctx, libxl__xs_read(gc, XBT_NULL, + libxl__sprintf(gc, "%s/%s/type", be_path, *dir)), &(pdisk->backend)); - pdisk->vdev = xs_read(ctx->xsh, XBT_NULL, libxl__sprintf(&gc, "%s/%s/dev", be_path, *dir), &len); - pdisk->unpluggable = atoi(libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/%s/removable", be_path, *dir))); - if (!strcmp(libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/%s/mode", be_path, *dir)), "w")) + pdisk->vdev = xs_read(ctx->xsh, XBT_NULL, libxl__sprintf(gc, "%s/%s/dev", be_path, *dir), &len); + pdisk->unpluggable = atoi(libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/%s/removable", be_path, *dir))); + if (!strcmp(libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/%s/mode", be_path, *dir)), "w")) pdisk->readwrite = 1; else pdisk->readwrite = 0; - type = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/device-type", libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/%s/frontend", be_path, *dir)))); + type = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/device-type", libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/%s/frontend", be_path, *dir)))); pdisk->is_cdrom = !strcmp(type, "cdrom"); } } - libxl__free_all(&gc); return n; } libxl_device_disk *libxl_device_disk_list(libxl_ctx *ctx, uint32_t domid, int *num) { + libxl__gc gc = LIBXL_INIT_GC(ctx); libxl_device_disk *disks = NULL; unsigned int ndisks = 0; - *num = libxl_append_disk_list_of_type(ctx, domid, "vbd", &disks, &ndisks); - *num += libxl_append_disk_list_of_type(ctx, domid, "tap", &disks, &ndisks); - *num += libxl_append_disk_list_of_type(ctx, domid, "qdisk", &disks, &ndisks); + *num = libxl__append_disk_list_of_type(&gc, domid, "vbd", &disks, &ndisks); + *num += libxl__append_disk_list_of_type(&gc, domid, "tap", &disks, &ndisks); + *num += libxl__append_disk_list_of_type(&gc, domid, "qdisk", &disks, &ndisks); + libxl__free_all(&gc); return disks; } @@ -1908,7 +1924,7 @@ int libxl_device_vfb_add(libxl_ctx *ctx, uint32_t domid, libxl_device_vfb *vfb) flexarray_append_pair(front, "backend-id", libxl__sprintf(&gc, "%d", vfb->backend_domid)); flexarray_append_pair(front, "state", libxl__sprintf(&gc, "%d", 1)); - libxl__device_generic_add(ctx, &device, + libxl__device_generic_add(&gc, &device, libxl__xs_kvs_of_flexarray(&gc, back, back->count), libxl__xs_kvs_of_flexarray(&gc, front, front->count)); rc = 0; |