aboutsummaryrefslogtreecommitdiffstats
path: root/tools/libxl
diff options
context:
space:
mode:
Diffstat (limited to 'tools/libxl')
-rw-r--r--tools/libxl/libxl.c126
-rw-r--r--tools/libxl/libxl_bootloader.c4
-rw-r--r--tools/libxl/libxl_create.c105
-rw-r--r--tools/libxl/libxl_device.c105
-rw-r--r--tools/libxl/libxl_dm.c186
-rw-r--r--tools/libxl/libxl_dom.c102
-rw-r--r--tools/libxl/libxl_exec.c20
-rw-r--r--tools/libxl/libxl_internal.c6
-rw-r--r--tools/libxl/libxl_internal.h70
-rw-r--r--tools/libxl/libxl_pci.c73
-rw-r--r--tools/libxl/libxl_utils.c8
11 files changed, 406 insertions, 399 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;
diff --git a/tools/libxl/libxl_bootloader.c b/tools/libxl/libxl_bootloader.c
index b7a0ba00de..133a11e486 100644
--- a/tools/libxl/libxl_bootloader.c
+++ b/tools/libxl/libxl_bootloader.c
@@ -271,7 +271,7 @@ out_err:
return NULL;
}
-static void parse_bootloader_result(libxl_ctx *ctx,
+static void parse_bootloader_result(libxl__gc *gc,
libxl_domain_build_info *info,
const char *o)
{
@@ -414,7 +414,7 @@ int libxl_run_bootloader(libxl_ctx *ctx,
goto out_close;
}
- parse_bootloader_result(ctx, info, blout);
+ parse_bootloader_result(&gc, info, blout);
rc = 0;
out_close:
diff --git a/tools/libxl/libxl_create.c b/tools/libxl/libxl_create.c
index b0939cc217..de77c52188 100644
--- a/tools/libxl/libxl_create.c
+++ b/tools/libxl/libxl_create.c
@@ -147,44 +147,43 @@ static int init_console_info(libxl_device_console *console, int dev_num, libxl_d
return 0;
}
-int libxl__domain_build(libxl_ctx *ctx, libxl_domain_build_info *info, uint32_t domid, libxl_domain_build_state *state)
+int libxl__domain_build(libxl__gc *gc, libxl_domain_build_info *info, uint32_t domid, libxl_domain_build_state *state)
{
- libxl__gc gc = LIBXL_INIT_GC(ctx);
char **vments = NULL, **localents = NULL;
struct timeval start_time;
int i, ret;
- ret = libxl__build_pre(ctx, domid, info, state);
+ ret = libxl__build_pre(gc, domid, info, state);
if (ret)
goto out;
gettimeofday(&start_time, NULL);
if (info->hvm) {
- ret = libxl__build_hvm(ctx, domid, info, state);
+ ret = libxl__build_hvm(gc, domid, info, state);
if (ret)
goto out;
- vments = libxl__calloc(&gc, 7, sizeof(char *));
+ vments = libxl__calloc(gc, 7, sizeof(char *));
vments[0] = "rtc/timeoffset";
vments[1] = (info->u.hvm.timeoffset) ? info->u.hvm.timeoffset : "";
vments[2] = "image/ostype";
vments[3] = "hvm";
vments[4] = "start_time";
- vments[5] = libxl__sprintf(&gc, "%lu.%02d", start_time.tv_sec,(int)start_time.tv_usec/10000);
+ vments[5] = libxl__sprintf(gc, "%lu.%02d", start_time.tv_sec,(int)start_time.tv_usec/10000);
} else {
- ret = libxl__build_pv(ctx, domid, info, state);
+ ret = libxl__build_pv(gc, domid, info, state);
if (ret)
goto out;
- vments = libxl__calloc(&gc, 11, sizeof(char *));
+ vments = libxl__calloc(gc, 11, sizeof(char *));
i = 0;
vments[i++] = "image/ostype";
vments[i++] = "linux";
vments[i++] = "image/kernel";
vments[i++] = (char*) info->kernel.path;
vments[i++] = "start_time";
- vments[i++] = libxl__sprintf(&gc, "%lu.%02d", start_time.tv_sec,(int)start_time.tv_usec/10000);
+ vments[i++] = libxl__sprintf(gc, "%lu.%02d", start_time.tv_sec,(int)start_time.tv_usec/10000);
if (info->u.pv.ramdisk.path) {
vments[i++] = "image/ramdisk";
vments[i++] = (char*) info->u.pv.ramdisk.path;
@@ -194,49 +193,47 @@ int libxl__domain_build(libxl_ctx *ctx, libxl_domain_build_info *info, uint32_t
vments[i++] = (char*) info->u.pv.cmdline;
}
}
- ret = libxl__build_post(ctx, domid, info, state, vments, localents);
+ ret = libxl__build_post(gc, domid, info, state, vments, localents);
out:
-
- libxl__free_all(&gc);
return ret;
}
-static int domain_restore(libxl_ctx *ctx, libxl_domain_build_info *info,
- uint32_t domid, int fd, libxl_domain_build_state *state,
- libxl_device_model_info *dm_info)
+static int domain_restore(libxl__gc *gc, libxl_domain_build_info *info,
+ uint32_t domid, int fd, libxl_domain_build_state *state,
+ libxl_device_model_info *dm_info)
{
- libxl__gc gc = LIBXL_INIT_GC(ctx);
+ libxl_ctx *ctx = libxl__gc_owner(gc);
char **vments = NULL, **localents = NULL;
struct timeval start_time;
int i, ret, esave, flags;
- ret = libxl__build_pre(ctx, domid, info, state);
+ ret = libxl__build_pre(gc, domid, info, state);
if (ret)
goto out;
- ret = libxl__domain_restore_common(ctx, domid, info, state, fd);
+ ret = libxl__domain_restore_common(gc, domid, info, state, fd);
if (ret)
goto out;
gettimeofday(&start_time, NULL);
if (info->hvm) {
- vments = libxl__calloc(&gc, 7, sizeof(char *));
+ vments = libxl__calloc(gc, 7, sizeof(char *));
vments[0] = "rtc/timeoffset";
vments[1] = (info->u.hvm.timeoffset) ? info->u.hvm.timeoffset : "";
vments[2] = "image/ostype";
vments[3] = "hvm";
vments[4] = "start_time";
- vments[5] = libxl__sprintf(&gc, "%lu.%02d", start_time.tv_sec,(int)start_time.tv_usec/10000);
+ vments[5] = libxl__sprintf(gc, "%lu.%02d", start_time.tv_sec,(int)start_time.tv_usec/10000);
} else {
- vments = libxl__calloc(&gc, 11, sizeof(char *));
+ vments = libxl__calloc(gc, 11, sizeof(char *));
i = 0;
vments[i++] = "image/ostype";
vments[i++] = "linux";
vments[i++] = "image/kernel";
vments[i++] = (char*) info->kernel.path;
vments[i++] = "start_time";
- vments[i++] = libxl__sprintf(&gc, "%lu.%02d", start_time.tv_sec,(int)start_time.tv_usec/10000);
+ vments[i++] = libxl__sprintf(gc, "%lu.%02d", start_time.tv_sec,(int)start_time.tv_usec/10000);
if (info->u.pv.ramdisk.path) {
vments[i++] = "image/ramdisk";
vments[i++] = (char*) info->u.pv.ramdisk.path;
@@ -246,7 +243,7 @@ static int domain_restore(libxl_ctx *ctx, libxl_domain_build_info *info,
vments[i++] = (char*) info->u.pv.cmdline;
}
}
- ret = libxl__build_post(ctx, domid, info, state, vments, localents);
+ ret = libxl__build_post(gc, domid, info, state, vments, localents);
if (ret)
goto out;
@@ -275,16 +272,15 @@ out:
}
errno = esave;
- libxl__free_all(&gc);
return ret;
}
-int libxl__domain_make(libxl_ctx *ctx, libxl_domain_create_info *info,
+int libxl__domain_make(libxl__gc *gc, libxl_domain_create_info *info,
uint32_t *domid)
/* on entry, libxl_domid_valid_guest(domid) must be false;
* on exit (even error exit), domid may be valid and refer to a domain */
{
- libxl__gc gc = LIBXL_INIT_GC(ctx); /* fixme: should be done by caller */
+ libxl_ctx *ctx = libxl__gc_owner(gc);
int flags, ret, i, rc;
char *uuid_string;
char *rw_paths[] = { "control/shutdown", "device", "device/suspend/event-channel" , "data"};
@@ -298,7 +294,7 @@ int libxl__domain_make(libxl_ctx *ctx, libxl_domain_create_info *info,
assert(!libxl_domid_valid_guest(*domid));
- uuid_string = libxl__uuid2string(&gc, info->uuid);
+ uuid_string = libxl__uuid2string(gc, info->uuid);
if (!uuid_string) {
rc = ERROR_NOMEM;
goto out;
@@ -326,13 +322,13 @@ int libxl__domain_make(libxl_ctx *ctx, libxl_domain_create_info *info,
goto out;
}
- dom_path = libxl__xs_get_dompath(&gc, *domid);
+ dom_path = libxl__xs_get_dompath(gc, *domid);
if (!dom_path) {
rc = ERROR_FAIL;
goto out;
}
- vm_path = libxl__sprintf(&gc, "/vm/%s", uuid_string);
+ vm_path = libxl__sprintf(gc, "/vm/%s", uuid_string);
if (!vm_path) {
LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "cannot allocate create paths");
rc = ERROR_FAIL;
@@ -357,31 +353,31 @@ retry_transaction:
xs_mkdir(ctx->xsh, t, vm_path);
xs_set_permissions(ctx->xsh, t, vm_path, roperm, ARRAY_SIZE(roperm));
- xs_write(ctx->xsh, t, libxl__sprintf(&gc, "%s/vm", dom_path), vm_path, strlen(vm_path));
+ xs_write(ctx->xsh, t, libxl__sprintf(gc, "%s/vm", dom_path), vm_path, strlen(vm_path));
rc = libxl_domain_rename(ctx, *domid, 0, info->name, t);
if (rc)
goto out;
for (i = 0; i < ARRAY_SIZE(rw_paths); i++) {
- char *path = libxl__sprintf(&gc, "%s/%s", dom_path, rw_paths[i]);
+ char *path = libxl__sprintf(gc, "%s/%s", dom_path, rw_paths[i]);
xs_mkdir(ctx->xsh, t, path);
xs_set_permissions(ctx->xsh, t, path, rwperm, ARRAY_SIZE(rwperm));
}
for (i = 0; i < ARRAY_SIZE(ro_paths); i++) {
- char *path = libxl__sprintf(&gc, "%s/%s", dom_path, ro_paths[i]);
+ char *path = libxl__sprintf(gc, "%s/%s", dom_path, ro_paths[i]);
xs_mkdir(ctx->xsh, t, path);
xs_set_permissions(ctx->xsh, t, path, roperm, ARRAY_SIZE(roperm));
}
- xs_write(ctx->xsh, t, libxl__sprintf(&gc, "%s/uuid", vm_path), uuid_string, strlen(uuid_string));
- xs_write(ctx->xsh, t, libxl__sprintf(&gc, "%s/name", vm_path), info->name, strlen(info->name));
+ xs_write(ctx->xsh, t, libxl__sprintf(gc, "%s/uuid", vm_path), uuid_string, strlen(uuid_string));
+ xs_write(ctx->xsh, t, libxl__sprintf(gc, "%s/name", vm_path), info->name, strlen(info->name));
if (info->poolname)
- xs_write(ctx->xsh, t, libxl__sprintf(&gc, "%s/pool_name", vm_path), info->poolname, strlen(info->poolname));
+ xs_write(ctx->xsh, t, libxl__sprintf(gc, "%s/pool_name", vm_path), info->poolname, strlen(info->poolname));
- libxl__xs_writev(&gc, t, dom_path, info->xsdata);
- libxl__xs_writev(&gc, t, libxl__sprintf(&gc, "%s/platform", dom_path), info->platformdata);
+ libxl__xs_writev(gc, t, dom_path, info->xsdata);
+ libxl__xs_writev(gc, t, libxl__sprintf(gc, "%s/platform", dom_path), info->platformdata);
- xs_write(ctx->xsh, t, libxl__sprintf(&gc, "%s/control/platform-feature-multiprocessor-suspend", dom_path), "1", 1);
+ xs_write(ctx->xsh, t, libxl__sprintf(gc, "%s/control/platform-feature-multiprocessor-suspend", dom_path), "1", 1);
if (!xs_transaction_end(ctx->xsh, t, 0)) {
if (errno == EAGAIN) {
t = 0;
@@ -397,14 +393,14 @@ retry_transaction:
rc = 0;
out:
if (t) xs_transaction_end(ctx->xsh, t, 1);
- libxl__free_all(&gc); /* fixme: should be done by caller */
return rc;
}
-static int do_domain_create(libxl_ctx *ctx, libxl_domain_config *d_config,
+static int do_domain_create(libxl__gc *gc, libxl_domain_config *d_config,
libxl_console_ready cb, void *priv,
uint32_t *domid_out, int restore_fd)
{
+ libxl_ctx *ctx = libxl__gc_owner(gc);
libxl__device_model_starting *dm_starting = 0;
libxl_device_model_info *dm_info = &d_config->dm_info;
libxl_domain_build_state state;
@@ -413,7 +409,7 @@ static int do_domain_create(libxl_ctx *ctx, libxl_domain_config *d_config,
domid = 0;
- ret = libxl__domain_make(ctx, &d_config->c_info, &domid);
+ ret = libxl__domain_make(gc, &d_config->c_info, &domid);
if (ret) {
fprintf(stderr, "cannot make domain: %d\n", ret);
ret = ERROR_FAIL;
@@ -434,13 +430,13 @@ static int do_domain_create(libxl_ctx *ctx, libxl_domain_config *d_config,
}
if ( restore_fd >= 0 ) {
- ret = domain_restore(ctx, &d_config->b_info, domid, restore_fd, &state, dm_info);
+ ret = domain_restore(gc, &d_config->b_info, domid, restore_fd, &state, dm_info);
} else {
if (dm_info->saved_state) {
free(dm_info->saved_state);
dm_info->saved_state = NULL;
}
- ret = libxl__domain_build(ctx, &d_config->b_info, domid, &state);
+ ret = libxl__domain_build(gc, &d_config->b_info, domid, &state);
}
if (ret) {
@@ -489,7 +485,7 @@ static int do_domain_create(libxl_ctx *ctx, libxl_domain_config *d_config,
libxl_device_console_destroy(&console);
dm_info->domid = domid;
- ret = libxl__create_device_model(ctx, dm_info,
+ ret = libxl__create_device_model(gc, dm_info,
d_config->disks, d_config->num_disks,
d_config->vifs, d_config->num_vifs,
&dm_starting);
@@ -514,7 +510,7 @@ static int do_domain_create(libxl_ctx *ctx, libxl_domain_config *d_config,
goto error_out;
console.domid = domid;
- need_qemu = libxl__need_xenpv_qemu(ctx, 1, &console,
+ need_qemu = libxl__need_xenpv_qemu(gc, 1, &console,
d_config->num_vfbs, d_config->vfbs,
d_config->num_disks, &d_config->disks[0]);
@@ -525,11 +521,11 @@ static int do_domain_create(libxl_ctx *ctx, libxl_domain_config *d_config,
libxl_device_console_destroy(&console);
if (need_qemu)
- libxl__create_xenpv_qemu(ctx, domid, d_config->vfbs, &dm_starting);
+ libxl__create_xenpv_qemu(gc, domid, d_config->vfbs, &dm_starting);
}
if (dm_starting) {
- ret = libxl__confirm_device_model_startup(ctx, dm_starting);
+ ret = libxl__confirm_device_model_startup(gc, dm_starting);
if (ret < 0) {
fprintf(stderr,"xl: fatal error: %s:%d, rc=%d: libxl__confirm_device_model_startup\n",
__FILE__,__LINE__, ret);
@@ -538,7 +534,7 @@ static int do_domain_create(libxl_ctx *ctx, libxl_domain_config *d_config,
}
for (i = 0; i < d_config->num_pcidevs; i++)
- libxl__device_pci_add(ctx, domid, &d_config->pcidevs[i], 1);
+ libxl__device_pci_add(gc, domid, &d_config->pcidevs[i], 1);
if ( cb && (d_config->c_info.hvm || d_config->b_info.u.pv.bootloader )) {
if ( (*cb)(ctx, domid, priv) )
@@ -554,14 +550,23 @@ error_out:
return ret;
}
+
int libxl_domain_create_new(libxl_ctx *ctx, libxl_domain_config *d_config,
libxl_console_ready cb, void *priv, uint32_t *domid)
{
- return do_domain_create(ctx, d_config, cb, priv, domid, -1);
+ libxl__gc gc = LIBXL_INIT_GC(ctx);
+ int rc;
+ rc = do_domain_create(&gc, d_config, cb, priv, domid, -1);
+ libxl__free_all(&gc);
+ return rc;
}
int libxl_domain_create_restore(libxl_ctx *ctx, libxl_domain_config *d_config,
libxl_console_ready cb, void *priv, uint32_t *domid, int restore_fd)
{
- return do_domain_create(ctx, d_config, cb, priv, domid, restore_fd);
+ libxl__gc gc = LIBXL_INIT_GC(ctx);
+ int rc;
+ rc = do_domain_create(&gc, d_config, cb, priv, domid, restore_fd);
+ libxl__free_all(&gc);
+ return rc;
}
diff --git a/tools/libxl/libxl_device.c b/tools/libxl/libxl_device.c
index 01d15650d4..d7b2a09579 100644
--- a/tools/libxl/libxl_device.c
+++ b/tools/libxl/libxl_device.c
@@ -61,10 +61,10 @@ char *libxl__device_backend_path(libxl__gc *gc, libxl__device *device)
device->domid, device->devid);
}
-int libxl__device_generic_add(libxl_ctx *ctx, libxl__device *device,
+int libxl__device_generic_add(libxl__gc *gc, libxl__device *device,
char **bents, char **fents)
{
- libxl__gc gc = LIBXL_INIT_GC(ctx);
+ libxl_ctx *ctx = libxl__gc_owner(gc);
char *frontend_path, *backend_path;
xs_transaction_t t;
struct xs_permissions frontend_perms[2];
@@ -76,8 +76,8 @@ int libxl__device_generic_add(libxl_ctx *ctx, libxl__device *device,
goto out;
}
- frontend_path = libxl__device_frontend_path(&gc, device);
- backend_path = libxl__device_backend_path(&gc, device);
+ frontend_path = libxl__device_frontend_path(gc, device);
+ backend_path = libxl__device_backend_path(gc, device);
frontend_perms[0].id = device->domid;
frontend_perms[0].perms = XS_PERM_NONE;
@@ -97,16 +97,16 @@ retry_transaction:
xs_rm(ctx->xsh, t, frontend_path);
xs_mkdir(ctx->xsh, t, frontend_path);
xs_set_permissions(ctx->xsh, t, frontend_path, frontend_perms, ARRAY_SIZE(frontend_perms));
- xs_write(ctx->xsh, t, libxl__sprintf(&gc, "%s/backend", frontend_path), backend_path, strlen(backend_path));
- libxl__xs_writev(&gc, t, frontend_path, fents);
+ xs_write(ctx->xsh, t, libxl__sprintf(gc, "%s/backend", frontend_path), backend_path, strlen(backend_path));
+ libxl__xs_writev(gc, t, frontend_path, fents);
}
if (bents) {
xs_rm(ctx->xsh, t, backend_path);
xs_mkdir(ctx->xsh, t, backend_path);
xs_set_permissions(ctx->xsh, t, backend_path, backend_perms, ARRAY_SIZE(backend_perms));
- xs_write(ctx->xsh, t, libxl__sprintf(&gc, "%s/frontend", backend_path), frontend_path, strlen(frontend_path));
- libxl__xs_writev(&gc, t, backend_path, bents);
+ xs_write(ctx->xsh, t, libxl__sprintf(gc, "%s/frontend", backend_path), frontend_path, strlen(frontend_path));
+ libxl__xs_writev(gc, t, backend_path, bents);
}
if (!xs_transaction_end(ctx->xsh, t, 0)) {
@@ -117,7 +117,6 @@ retry_transaction:
}
rc = 0;
out:
- libxl__free_all(&gc);
return rc;
}
@@ -239,12 +238,12 @@ int libxl__device_disk_dev_number(char *virtpath)
return -1;
}
-int libxl__device_destroy(libxl_ctx *ctx, char *be_path, int force)
+int libxl__device_destroy(libxl__gc *gc, char *be_path, int force)
{
- libxl__gc gc = LIBXL_INIT_GC(ctx);
+ libxl_ctx *ctx = libxl__gc_owner(gc);
xs_transaction_t t;
- char *state_path = libxl__sprintf(&gc, "%s/state", be_path);
- char *state = libxl__xs_read(&gc, XBT_NULL, state_path);
+ char *state_path = libxl__sprintf(gc, "%s/state", be_path);
+ char *state = libxl__xs_read(gc, XBT_NULL, state_path);
int rc = 0;
if (!state)
@@ -256,7 +255,7 @@ int libxl__device_destroy(libxl_ctx *ctx, char *be_path, int force)
retry_transaction:
t = xs_transaction_start(ctx->xsh);
- xs_write(ctx->xsh, t, libxl__sprintf(&gc, "%s/online", be_path), "0", strlen("0"));
+ xs_write(ctx->xsh, t, libxl__sprintf(gc, "%s/online", be_path), "0", strlen("0"));
xs_write(ctx->xsh, t, state_path, "5", strlen("5"));
if (!xs_transaction_end(ctx->xsh, t, 0)) {
if (errno == EAGAIN)
@@ -271,13 +270,12 @@ retry_transaction:
rc = 1;
}
out:
- libxl__free_all(&gc);
return rc;
}
-static int wait_for_dev_destroy(libxl_ctx *ctx, struct timeval *tv)
+static int wait_for_dev_destroy(libxl__gc *gc, struct timeval *tv)
{
- libxl__gc gc = LIBXL_INIT_GC(ctx);
+ libxl_ctx *ctx = libxl__gc_owner(gc);
int nfds, rc;
unsigned int n;
fd_set rfds;
@@ -290,7 +288,7 @@ static int wait_for_dev_destroy(libxl_ctx *ctx, struct timeval *tv)
if (select(nfds, &rfds, NULL, NULL, tv) > 0) {
l1 = xs_read_watch(ctx->xsh, &n);
if (l1 != NULL) {
- char *state = libxl__xs_read(&gc, XBT_NULL, l1[XS_WATCH_PATH]);
+ char *state = libxl__xs_read(gc, XBT_NULL, l1[XS_WATCH_PATH]);
if (!state || atoi(state) == 6) {
xs_unwatch(ctx->xsh, l1[0], l1[1]);
xs_rm(ctx->xsh, XBT_NULL, l1[XS_WATCH_TOKEN]);
@@ -300,13 +298,12 @@ static int wait_for_dev_destroy(libxl_ctx *ctx, struct timeval *tv)
free(l1);
}
}
- libxl__free_all(&gc);
return rc;
}
-int libxl__devices_destroy(libxl_ctx *ctx, uint32_t domid, int force)
+int libxl__devices_destroy(libxl__gc *gc, uint32_t domid, int force)
{
- libxl__gc gc = LIBXL_INIT_GC(ctx);
+ libxl_ctx *ctx = libxl__gc_owner(gc);
char *path, *be_path, *fe_path;
unsigned int num1, num2;
char **l1 = NULL, **l2 = NULL;
@@ -314,8 +311,8 @@ int libxl__devices_destroy(libxl_ctx *ctx, uint32_t domid, int force)
flexarray_t *toremove;
toremove = flexarray_make(16, 1);
- path = libxl__sprintf(&gc, "/local/domain/%d/device", domid);
- l1 = libxl__xs_directory(&gc, XBT_NULL, path, &num1);
+ path = libxl__sprintf(gc, "/local/domain/%d/device", domid);
+ l1 = libxl__xs_directory(gc, XBT_NULL, path, &num1);
if (!l1) {
if (errno != ENOENT) {
LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "unable to get xenstore"
@@ -327,17 +324,17 @@ int libxl__devices_destroy(libxl_ctx *ctx, uint32_t domid, int force)
for (i = 0; i < num1; i++) {
if (!strcmp("vfs", l1[i]))
continue;
- path = libxl__sprintf(&gc, "/local/domain/%d/device/%s", domid, l1[i]);
- l2 = libxl__xs_directory(&gc, XBT_NULL, path, &num2);
+ path = libxl__sprintf(gc, "/local/domain/%d/device/%s", domid, l1[i]);
+ l2 = libxl__xs_directory(gc, XBT_NULL, path, &num2);
if (!l2)
continue;
for (j = 0; j < num2; j++) {
- fe_path = libxl__sprintf(&gc, "/local/domain/%d/device/%s/%s", domid, l1[i], l2[j]);
- be_path = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/backend", fe_path));
+ fe_path = libxl__sprintf(gc, "/local/domain/%d/device/%s/%s", domid, l1[i], l2[j]);
+ be_path = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/backend", fe_path));
if (be_path != NULL) {
- if (libxl__device_destroy(ctx, be_path, force) > 0)
+ if (libxl__device_destroy(gc, be_path, force) > 0)
n_watches++;
- flexarray_set(toremove, n++, libxl__dirname(&gc, be_path));
+ flexarray_set(toremove, n++, libxl__dirname(gc, be_path));
} else {
xs_rm(ctx->xsh, XBT_NULL, path);
}
@@ -345,12 +342,12 @@ int libxl__devices_destroy(libxl_ctx *ctx, uint32_t domid, int force)
}
/* console 0 frontend directory is not under /local/domain/<domid>/device */
- fe_path = libxl__sprintf(&gc, "/local/domain/%d/console", domid);
- be_path = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/backend", fe_path));
+ fe_path = libxl__sprintf(gc, "/local/domain/%d/console", domid);
+ be_path = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/backend", fe_path));
if (be_path && strcmp(be_path, "")) {
- if (libxl__device_destroy(ctx, be_path, force) > 0)
+ if (libxl__device_destroy(gc, be_path, force) > 0)
n_watches++;
- flexarray_set(toremove, n++, libxl__dirname(&gc, be_path));
+ flexarray_set(toremove, n++, libxl__dirname(gc, be_path));
}
if (!force) {
@@ -363,7 +360,7 @@ int libxl__devices_destroy(libxl_ctx *ctx, uint32_t domid, int force)
tv.tv_sec = LIBXL_DESTROY_TIMEOUT;
tv.tv_usec = 0;
while (n_watches > 0) {
- if (wait_for_dev_destroy(ctx, &tv)) {
+ if (wait_for_dev_destroy(gc, &tv)) {
break;
} else {
n_watches--;
@@ -376,19 +373,17 @@ int libxl__devices_destroy(libxl_ctx *ctx, uint32_t domid, int force)
}
out:
flexarray_free(toremove);
- libxl__free_all(&gc);
return 0;
}
-int libxl__device_del(libxl_ctx *ctx, libxl__device *dev, int wait)
+int libxl__device_del(libxl__gc *gc, libxl__device *dev, int wait)
{
- libxl__gc gc = LIBXL_INIT_GC(ctx);
char *backend_path;
int rc;
- backend_path = libxl__device_backend_path(&gc, dev);
+ backend_path = libxl__device_backend_path(gc, dev);
- rc = libxl__device_destroy(ctx, backend_path, !wait);
+ rc = libxl__device_destroy(gc, backend_path, !wait);
if (rc == -1) {
rc = ERROR_FAIL;
goto out;
@@ -398,25 +393,24 @@ int libxl__device_del(libxl_ctx *ctx, libxl__device *dev, int wait)
struct timeval tv;
tv.tv_sec = LIBXL_DESTROY_TIMEOUT;
tv.tv_usec = 0;
- (void)wait_for_dev_destroy(ctx, &tv);
+ (void)wait_for_dev_destroy(gc, &tv);
}
rc = 0;
out:
- libxl__free_all(&gc);
return rc;
}
-int libxl__wait_for_device_model(libxl_ctx *ctx,
- uint32_t domid, char *state,
- int (*check_callback)(libxl_ctx *ctx,
- uint32_t domid,
- const char *state,
- void *userdata),
- void *check_callback_userdata)
+int libxl__wait_for_device_model(libxl__gc *gc,
+ uint32_t domid, char *state,
+ int (*check_callback)(libxl__gc *gc,
+ uint32_t domid,
+ const char *state,
+ void *userdata),
+ void *check_callback_userdata)
{
- libxl__gc gc = LIBXL_INIT_GC(ctx);
+ libxl_ctx *ctx = libxl__gc_owner(gc);
char *path;
char *p;
unsigned int len;
@@ -434,7 +428,7 @@ int libxl__wait_for_device_model(libxl_ctx *ctx,
goto err;
}
- path = libxl__sprintf(&gc, "/local/domain/0/device-model/%d/state", domid);
+ path = libxl__sprintf(gc, "/local/domain/0/device-model/%d/state", domid);
xs_watch(xsh, path, path);
tv.tv_sec = LIBXL_DEVICE_MODEL_START_TIMEOUT;
tv.tv_usec = 0;
@@ -448,7 +442,7 @@ int libxl__wait_for_device_model(libxl_ctx *ctx,
goto again;
if ( NULL != check_callback ) {
- rc = (*check_callback)(ctx, domid, p, check_callback_userdata);
+ rc = (*check_callback)(gc, domid, p, check_callback_userdata);
if ( rc > 0 )
goto again;
}
@@ -456,7 +450,6 @@ int libxl__wait_for_device_model(libxl_ctx *ctx,
free(p);
xs_unwatch(xsh, path, path);
xs_daemon_close(xsh);
- libxl__free_all(&gc);
return rc;
again:
free(p);
@@ -475,17 +468,16 @@ again:
xs_daemon_close(xsh);
LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "Device Model not ready");
err:
- libxl__free_all(&gc);
return -1;
}
-int libxl__wait_for_backend(libxl_ctx *ctx, char *be_path, char *state)
+int libxl__wait_for_backend(libxl__gc *gc, char *be_path, char *state)
{
- libxl__gc gc = LIBXL_INIT_GC(ctx);
+ libxl_ctx *ctx = libxl__gc_owner(gc);
int watchdog = 100;
unsigned int len;
char *p;
- char *path = libxl__sprintf(&gc, "%s/state", be_path);
+ char *path = libxl__sprintf(gc, "%s/state", be_path);
int rc = -1;
while (watchdog > 0) {
@@ -511,7 +503,6 @@ int libxl__wait_for_backend(libxl_ctx *ctx, char *be_path, char *state)
}
LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "Backend %s not ready", be_path);
out:
- libxl__free_all(&gc);
return rc;
}
diff --git a/tools/libxl/libxl_dm.c b/tools/libxl/libxl_dm.c
index 1ffcc909f8..d4ae72b70b 100644
--- a/tools/libxl/libxl_dm.c
+++ b/tools/libxl/libxl_dm.c
@@ -38,10 +38,10 @@ static const char *libxl_tapif_script(libxl__gc *gc)
#endif
}
-static char ** libxl_build_device_model_args_old(libxl__gc *gc,
- libxl_device_model_info *info,
- libxl_device_nic *vifs,
- int num_vifs)
+static char ** libxl__build_device_model_args_old(libxl__gc *gc,
+ libxl_device_model_info *info,
+ libxl_device_nic *vifs,
+ int num_vifs)
{
int i;
flexarray_t *dm_args;
@@ -170,10 +170,10 @@ static char ** libxl_build_device_model_args_old(libxl__gc *gc,
return (char **) flexarray_contents(dm_args);
}
-static char ** libxl_build_device_model_args_new(libxl__gc *gc,
- libxl_device_model_info *info,
- libxl_device_nic *vifs,
- int num_vifs)
+static char ** libxl__build_device_model_args_new(libxl__gc *gc,
+ libxl_device_model_info *info,
+ libxl_device_nic *vifs,
+ int num_vifs)
{
flexarray_t *dm_args;
libxl_device_disk *disks;
@@ -329,10 +329,10 @@ static char ** libxl_build_device_model_args_new(libxl__gc *gc,
return (char **) flexarray_contents(dm_args);
}
-static char ** libxl_build_device_model_args(libxl__gc *gc,
- libxl_device_model_info *info,
- libxl_device_nic *vifs,
- int num_vifs)
+static char ** libxl__build_device_model_args(libxl__gc *gc,
+ libxl_device_model_info *info,
+ libxl_device_nic *vifs,
+ int num_vifs)
{
libxl_ctx *ctx = libxl__gc_owner(gc);
int new_qemu;
@@ -340,9 +340,9 @@ static char ** libxl_build_device_model_args(libxl__gc *gc,
new_qemu = libxl_check_device_model_version(ctx, info->device_model);
if (new_qemu == 1) {
- return libxl_build_device_model_args_new(gc, info, vifs, num_vifs);
+ return libxl__build_device_model_args_new(gc, info, vifs, num_vifs);
} else {
- return libxl_build_device_model_args_old(gc, info, vifs, num_vifs);
+ return libxl__build_device_model_args_old(gc, info, vifs, num_vifs);
}
}
@@ -371,10 +371,10 @@ out:
free(pid);
}
-static int libxl_vfb_and_vkb_from_device_model_info(libxl_ctx *ctx,
- libxl_device_model_info *info,
- libxl_device_vfb *vfb,
- libxl_device_vkb *vkb)
+static int libxl__vfb_and_vkb_from_device_model_info(libxl__gc *gc,
+ libxl_device_model_info *info,
+ libxl_device_vfb *vfb,
+ libxl_device_vkb *vkb)
{
memset(vfb, 0x00, sizeof(libxl_device_vfb));
memset(vkb, 0x00, sizeof(libxl_device_vkb));
@@ -395,9 +395,9 @@ static int libxl_vfb_and_vkb_from_device_model_info(libxl_ctx *ctx,
return 0;
}
-static int libxl_write_dmargs(libxl_ctx *ctx, int domid, int guest_domid, char **args)
+static int libxl__write_dmargs(libxl__gc *gc, int domid, int guest_domid, char **args)
{
- libxl__gc gc = LIBXL_INIT_GC(ctx);
+ libxl_ctx *ctx = libxl__gc_owner(gc);
int i;
char *vm_path;
char *dmargs, *path;
@@ -410,7 +410,7 @@ static int libxl_write_dmargs(libxl_ctx *ctx, int domid, int guest_domid, char *
roperm[1].id = domid;
roperm[1].perms = XS_PERM_READ;
- vm_path = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "/local/domain/%d/vm", guest_domid));
+ vm_path = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "/local/domain/%d/vm", guest_domid));
i = 0;
dmargs_size = 0;
@@ -429,30 +429,29 @@ static int libxl_write_dmargs(libxl_ctx *ctx, int domid, int guest_domid, char *
}
i++;
}
- path = libxl__sprintf(&gc, "%s/image/dmargs", vm_path);
+ path = libxl__sprintf(gc, "%s/image/dmargs", vm_path);
retry_transaction:
t = xs_transaction_start(ctx->xsh);
xs_write(ctx->xsh, t, path, dmargs, strlen(dmargs));
xs_set_permissions(ctx->xsh, t, path, roperm, ARRAY_SIZE(roperm));
- xs_set_permissions(ctx->xsh, t, libxl__sprintf(&gc, "%s/rtc/timeoffset", vm_path), roperm, ARRAY_SIZE(roperm));
+ xs_set_permissions(ctx->xsh, t, libxl__sprintf(gc, "%s/rtc/timeoffset", vm_path), roperm, ARRAY_SIZE(roperm));
if (!xs_transaction_end(ctx->xsh, t, 0))
if (errno == EAGAIN)
goto retry_transaction;
free(dmargs);
- libxl__free_all(&gc);
return 0;
}
-static int libxl_create_stubdom(libxl_ctx *ctx,
- libxl_device_model_info *info,
- libxl_device_disk *disks, int num_disks,
- libxl_device_nic *vifs, int num_vifs,
- libxl_device_vfb *vfb,
- libxl_device_vkb *vkb,
- libxl__device_model_starting **starting_r)
+static int libxl__create_stubdom(libxl__gc *gc,
+ libxl_device_model_info *info,
+ libxl_device_disk *disks, int num_disks,
+ libxl_device_nic *vifs, int num_vifs,
+ libxl_device_vfb *vfb,
+ libxl_device_vkb *vkb,
+ libxl__device_model_starting **starting_r)
{
- libxl__gc gc = LIBXL_INIT_GC(ctx);
+ libxl_ctx *ctx = libxl__gc_owner(gc);
int i, num_console = STUBDOM_SPECIAL_CONSOLES, ret;
libxl_device_console *console;
libxl_domain_create_info c_info;
@@ -464,7 +463,7 @@ static int libxl_create_stubdom(libxl_ctx *ctx,
xs_transaction_t t;
libxl__device_model_starting *dm_starting = 0;
- args = libxl_build_device_model_args(&gc, info, vifs, num_vifs);
+ args = libxl__build_device_model_args(gc, info, vifs, num_vifs);
if (!args) {
ret = ERROR_FAIL;
goto out;
@@ -472,7 +471,7 @@ static int libxl_create_stubdom(libxl_ctx *ctx,
memset(&c_info, 0x00, sizeof(libxl_domain_create_info));
c_info.hvm = 0;
- c_info.name = libxl__sprintf(&gc, "%s-dm", libxl__domid_to_name(&gc, info->domid));
+ c_info.name = libxl__sprintf(gc, "%s-dm", libxl__domid_to_name(gc, info->domid));
libxl_uuid_copy(&c_info.uuid, &info->uuid);
@@ -480,27 +479,27 @@ static int libxl_create_stubdom(libxl_ctx *ctx,
b_info.max_vcpus = 1;
b_info.max_memkb = 32 * 1024;
b_info.target_memkb = b_info.max_memkb;
- b_info.kernel.path = libxl__abs_path(&gc, "ioemu-stubdom.gz", libxl_xenfirmwaredir_path());
- b_info.u.pv.cmdline = libxl__sprintf(&gc, " -d %d", info->domid);
+ b_info.kernel.path = libxl__abs_path(gc, "ioemu-stubdom.gz", libxl_xenfirmwaredir_path());
+ b_info.u.pv.cmdline = libxl__sprintf(gc, " -d %d", info->domid);
b_info.u.pv.ramdisk.path = "";
b_info.u.pv.features = "";
b_info.hvm = 0;
/* fixme: this function can leak the stubdom if it fails */
- ret = libxl__domain_make(ctx, &c_info, &domid);
+ ret = libxl__domain_make(gc, &c_info, &domid);
if (ret)
goto out_free;
- ret = libxl__domain_build(ctx, &b_info, domid, &state);
+ ret = libxl__domain_build(gc, &b_info, domid, &state);
if (ret)
goto out_free;
- libxl_write_dmargs(ctx, domid, info->domid, args);
- libxl__xs_write(&gc, XBT_NULL,
- libxl__sprintf(&gc, "%s/image/device-model-domid", libxl__xs_get_dompath(&gc, info->domid)),
+ libxl__write_dmargs(gc, domid, info->domid, args);
+ libxl__xs_write(gc, XBT_NULL,
+ libxl__sprintf(gc, "%s/image/device-model-domid", libxl__xs_get_dompath(gc, info->domid)),
"%d", domid);
- libxl__xs_write(&gc, XBT_NULL,
- libxl__sprintf(&gc, "%s/target", libxl__xs_get_dompath(&gc, domid)),
+ libxl__xs_write(gc, XBT_NULL,
+ libxl__sprintf(gc, "%s/target", libxl__xs_get_dompath(gc, domid)),
"%d", info->domid);
ret = xc_domain_set_target(ctx->xch, domid, info->domid);
if (ret<0) {
@@ -516,10 +515,10 @@ static int libxl_create_stubdom(libxl_ctx *ctx,
perm[1].perms = XS_PERM_READ;
retry_transaction:
t = xs_transaction_start(ctx->xsh);
- xs_mkdir(ctx->xsh, t, libxl__sprintf(&gc, "/local/domain/0/device-model/%d", info->domid));
- xs_set_permissions(ctx->xsh, t, libxl__sprintf(&gc, "/local/domain/0/device-model/%d", info->domid), perm, ARRAY_SIZE(perm));
- xs_mkdir(ctx->xsh, t, libxl__sprintf(&gc, "/local/domain/%d/device/vfs", domid));
- xs_set_permissions(ctx->xsh, t, libxl__sprintf(&gc, "/local/domain/%d/device/vfs",domid), perm, ARRAY_SIZE(perm));
+ xs_mkdir(ctx->xsh, t, libxl__sprintf(gc, "/local/domain/0/device-model/%d", info->domid));
+ xs_set_permissions(ctx->xsh, t, libxl__sprintf(gc, "/local/domain/0/device-model/%d", info->domid), perm, ARRAY_SIZE(perm));
+ xs_mkdir(ctx->xsh, t, libxl__sprintf(gc, "/local/domain/%d/device/vfs", domid));
+ xs_set_permissions(ctx->xsh, t, libxl__sprintf(gc, "/local/domain/%d/device/vfs",domid), perm, ARRAY_SIZE(perm));
if (!xs_transaction_end(ctx->xsh, t, 0))
if (errno == EAGAIN)
goto retry_transaction;
@@ -548,7 +547,7 @@ retry_transaction:
if (info->serial)
num_console++;
- console = libxl__calloc(&gc, num_console, sizeof(libxl_device_console));
+ console = libxl__calloc(gc, num_console, sizeof(libxl_device_console));
if (!console) {
ret = ERROR_NOMEM;
goto out_free;
@@ -566,18 +565,18 @@ retry_transaction:
char *filename;
char *name;
case STUBDOM_CONSOLE_LOGGING:
- name = libxl__sprintf(&gc, "qemu-dm-%s", libxl_domid_to_name(ctx, info->domid));
+ name = libxl__sprintf(gc, "qemu-dm-%s", libxl_domid_to_name(ctx, info->domid));
libxl_create_logfile(ctx, name, &filename);
- console[i].output = libxl__sprintf(&gc, "file:%s", filename);
+ console[i].output = libxl__sprintf(gc, "file:%s", filename);
console[i].build_state = &state;
free(filename);
break;
case STUBDOM_CONSOLE_SAVE:
- console[i].output = libxl__sprintf(&gc, "file:"SAVEFILE".%d", info->domid);
+ console[i].output = libxl__sprintf(gc, "file:"SAVEFILE".%d", info->domid);
break;
case STUBDOM_CONSOLE_RESTORE:
if (info->saved_state)
- console[i].output = libxl__sprintf(&gc, "pipe:%s", info->saved_state);
+ console[i].output = libxl__sprintf(gc, "pipe:%s", info->saved_state);
break;
default:
console[i].output = "pty";
@@ -587,11 +586,11 @@ retry_transaction:
if (ret)
goto out_free;
}
- if (libxl__create_xenpv_qemu(ctx, domid, vfb, &dm_starting) < 0) {
+ if (libxl__create_xenpv_qemu(gc, domid, vfb, &dm_starting) < 0) {
ret = ERROR_FAIL;
goto out_free;
}
- if (libxl__confirm_device_model_startup(ctx, dm_starting) < 0) {
+ if (libxl__confirm_device_model_startup(gc, dm_starting) < 0) {
ret = ERROR_FAIL;
goto out_free;
}
@@ -601,7 +600,7 @@ retry_transaction:
if (starting_r) {
*starting_r = calloc(sizeof(libxl__device_model_starting), 1);
(*starting_r)->domid = info->domid;
- (*starting_r)->dom_path = libxl__xs_get_dompath(&gc, info->domid);
+ (*starting_r)->dom_path = libxl__xs_get_dompath(gc, info->domid);
(*starting_r)->for_spawn = NULL;
}
@@ -610,17 +609,16 @@ retry_transaction:
out_free:
free(args);
out:
- libxl__free_all(&gc);
return ret;
}
-int libxl__create_device_model(libxl_ctx *ctx,
+int libxl__create_device_model(libxl__gc *gc,
libxl_device_model_info *info,
libxl_device_disk *disks, int num_disks,
libxl_device_nic *vifs, int num_vifs,
libxl__device_model_starting **starting_r)
{
- libxl__gc gc = LIBXL_INIT_GC(ctx);
+ libxl_ctx *ctx = libxl__gc_owner(gc);
char *path, *logfile;
int logfile_w, null;
int rc;
@@ -634,22 +632,22 @@ int libxl__create_device_model(libxl_ctx *ctx,
libxl_device_vfb vfb;
libxl_device_vkb vkb;
- libxl_vfb_and_vkb_from_device_model_info(ctx, info, &vfb, &vkb);
- rc = libxl_create_stubdom(ctx, info, disks, num_disks, vifs, num_vifs, &vfb, &vkb, starting_r);
+ libxl__vfb_and_vkb_from_device_model_info(gc, info, &vfb, &vkb);
+ rc = libxl__create_stubdom(gc, info, disks, num_disks, vifs, num_vifs, &vfb, &vkb, starting_r);
goto out;
}
- args = libxl_build_device_model_args(&gc, info, vifs, num_vifs);
+ args = libxl__build_device_model_args(gc, info, vifs, num_vifs);
if (!args) {
rc = ERROR_FAIL;
goto out;
}
- path = libxl__sprintf(&gc, "/local/domain/0/device-model/%d", info->domid);
+ path = libxl__sprintf(gc, "/local/domain/0/device-model/%d", info->domid);
xs_mkdir(ctx->xsh, XBT_NULL, path);
- libxl__xs_write(&gc, XBT_NULL, libxl__sprintf(&gc, "%s/disable_pf", path), "%d", !info->xen_platform_pci);
+ libxl__xs_write(gc, XBT_NULL, libxl__sprintf(gc, "%s/disable_pf", path), "%d", !info->xen_platform_pci);
- libxl_create_logfile(ctx, libxl__sprintf(&gc, "qemu-dm-%s", info->dom_name), &logfile);
+ libxl_create_logfile(ctx, libxl__sprintf(gc, "qemu-dm-%s", info->dom_name), &logfile);
logfile_w = open(logfile, O_WRONLY|O_CREAT, 0644);
free(logfile);
null = open("/dev/null", O_RDONLY);
@@ -667,7 +665,7 @@ int libxl__create_device_model(libxl_ctx *ctx,
}
p->domid = info->domid;
- p->dom_path = libxl__xs_get_dompath(&gc, info->domid);
+ p->dom_path = libxl__xs_get_dompath(gc, info->domid);
if (!p->dom_path) {
rc = ERROR_FAIL;
goto out_close;
@@ -677,26 +675,26 @@ int libxl__create_device_model(libxl_ctx *ctx,
retry_transaction:
/* Find uuid and the write the vnc password to xenstore for qemu. */
t = xs_transaction_start(ctx->xsh);
- vm_path = libxl__xs_read(&gc,t,libxl__sprintf(&gc, "%s/vm", p->dom_path));
+ vm_path = libxl__xs_read(gc,t,libxl__sprintf(gc, "%s/vm", p->dom_path));
if (vm_path) {
/* Now write the vncpassword into it. */
- pass_stuff = libxl__calloc(&gc, 3, sizeof(char *));
+ pass_stuff = libxl__calloc(gc, 3, sizeof(char *));
pass_stuff[0] = "vncpasswd";
pass_stuff[1] = info->vncpasswd;
- libxl__xs_writev(&gc,t,vm_path,pass_stuff);
+ libxl__xs_writev(gc,t,vm_path,pass_stuff);
if (!xs_transaction_end(ctx->xsh, t, 0))
if (errno == EAGAIN)
goto retry_transaction;
}
}
- rc = libxl__spawn_spawn(ctx, p, "device model", dm_xenstore_record_pid);
+ rc = libxl__spawn_spawn(gc, p, "device model", dm_xenstore_record_pid);
if (rc < 0)
goto out_close;
if (!rc) { /* inner child */
setsid();
libxl__exec(null, logfile_w, logfile_w,
- libxl__abs_path(&gc, info->device_model, libxl_libexec_path()),
+ libxl__abs_path(gc, info->device_model, libxl_libexec_path()),
args);
}
@@ -707,15 +705,14 @@ out_close:
close(logfile_w);
free(args);
out:
- libxl__free_all(&gc);
return rc;
}
-static int detach_device_model(libxl_ctx *ctx,
- libxl__device_model_starting *starting)
+static int detach_device_model(libxl__gc *gc,
+ libxl__device_model_starting *starting)
{
int rc;
- rc = libxl__spawn_detach(ctx, starting->for_spawn);
+ rc = libxl__spawn_detach(gc, starting->for_spawn);
if (starting->for_spawn)
free(starting->for_spawn);
free(starting);
@@ -723,24 +720,24 @@ static int detach_device_model(libxl_ctx *ctx,
}
-int libxl__confirm_device_model_startup(libxl_ctx *ctx,
+int libxl__confirm_device_model_startup(libxl__gc *gc,
libxl__device_model_starting *starting)
{
- int problem = libxl__wait_for_device_model(ctx, starting->domid, "running", NULL, NULL);
+ int problem = libxl__wait_for_device_model(gc, starting->domid, "running", NULL, NULL);
int detach;
if ( !problem )
- problem = libxl__spawn_check(ctx, starting->for_spawn);
- detach = detach_device_model(ctx, starting);
+ problem = libxl__spawn_check(gc, starting->for_spawn);
+ detach = detach_device_model(gc, starting);
return problem ? problem : detach;
}
-int libxl__destroy_device_model(libxl_ctx *ctx, uint32_t domid)
+int libxl__destroy_device_model(libxl__gc *gc, uint32_t domid)
{
- libxl__gc gc = LIBXL_INIT_GC(ctx);
+ libxl_ctx *ctx = libxl__gc_owner(gc);
char *pid;
int ret;
- pid = libxl__xs_read(&gc, XBT_NULL, libxl__sprintf(&gc, "/local/domain/%d/image/device-model-pid", domid));
+ pid = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "/local/domain/%d/image/device-model-pid", domid));
if (!pid) {
int stubdomid = libxl_get_stubdom_id(ctx, domid);
if (!stubdomid) {
@@ -767,17 +764,16 @@ int libxl__destroy_device_model(libxl_ctx *ctx, uint32_t domid)
goto out;
}
}
- xs_rm(ctx->xsh, XBT_NULL, libxl__sprintf(&gc, "/local/domain/0/device-model/%d", domid));
+ xs_rm(ctx->xsh, XBT_NULL, libxl__sprintf(gc, "/local/domain/0/device-model/%d", domid));
out:
- libxl__free_all(&gc);
return ret;
}
-static int libxl_build_xenpv_qemu_args(libxl__gc *gc,
- uint32_t domid,
- libxl_device_vfb *vfb,
- libxl_device_model_info *info)
+static int libxl__build_xenpv_qemu_args(libxl__gc *gc,
+ uint32_t domid,
+ libxl_device_vfb *vfb,
+ libxl_device_model_info *info)
{
libxl_ctx *ctx = libxl__gc_owner(gc);
memset(info, 0x00, sizeof(libxl_device_model_info));
@@ -803,13 +799,12 @@ static int libxl_build_xenpv_qemu_args(libxl__gc *gc,
return 0;
}
-int libxl__need_xenpv_qemu(libxl_ctx *ctx,
+int libxl__need_xenpv_qemu(libxl__gc *gc,
int nr_consoles, libxl_device_console *consoles,
int nr_vfbs, libxl_device_vfb *vfbs,
int nr_disks, libxl_device_disk *disks)
{
int i, ret = 0;
- libxl__gc gc = LIBXL_INIT_GC(ctx);
if (nr_consoles > 1) {
ret = 1;
@@ -834,7 +829,7 @@ int libxl__need_xenpv_qemu(libxl_ctx *ctx,
switch (disks[i].backend) {
case DISK_BACKEND_TAP:
if (blktap_enabled == -1)
- blktap_enabled = libxl__blktap_enabled(&gc);
+ blktap_enabled = libxl__blktap_enabled(gc);
if (!blktap_enabled) {
ret = 1;
goto out;
@@ -853,18 +848,15 @@ int libxl__need_xenpv_qemu(libxl_ctx *ctx,
}
out:
- libxl__free_all(&gc);
return ret;
}
-int libxl__create_xenpv_qemu(libxl_ctx *ctx, uint32_t domid, libxl_device_vfb *vfb,
- libxl__device_model_starting **starting_r)
+int libxl__create_xenpv_qemu(libxl__gc *gc, uint32_t domid, libxl_device_vfb *vfb,
+ libxl__device_model_starting **starting_r)
{
- libxl__gc gc = LIBXL_INIT_GC(ctx);
libxl_device_model_info info;
- libxl_build_xenpv_qemu_args(&gc, domid, vfb, &info);
- libxl__create_device_model(ctx, &info, NULL, 0, NULL, 0, starting_r);
- libxl__free_all(&gc);
+ libxl__build_xenpv_qemu_args(gc, domid, vfb, &info);
+ libxl__create_device_model(gc, &info, NULL, 0, NULL, 0, starting_r);
return 0;
}
diff --git a/tools/libxl/libxl_dom.c b/tools/libxl/libxl_dom.c
index c702cf7cc5..51269aeaf2 100644
--- a/tools/libxl/libxl_dom.c
+++ b/tools/libxl/libxl_dom.c
@@ -35,8 +35,9 @@
#include "libxl.h"
#include "libxl_internal.h"
-int libxl__domain_is_hvm(libxl_ctx *ctx, uint32_t domid)
+int libxl__domain_is_hvm(libxl__gc *gc, uint32_t domid)
{
+ libxl_ctx *ctx = libxl__gc_owner(gc);
xc_domaininfo_t info;
int ret;
@@ -48,8 +49,9 @@ int libxl__domain_is_hvm(libxl_ctx *ctx, uint32_t domid)
return !!(info.flags & XEN_DOMINF_hvm_guest);
}
-int libxl__domain_shutdown_reason(libxl_ctx *ctx, uint32_t domid)
+int libxl__domain_shutdown_reason(libxl__gc *gc, uint32_t domid)
{
+ libxl_ctx *ctx = libxl__gc_owner(gc);
xc_domaininfo_t info;
int ret;
@@ -64,9 +66,10 @@ int libxl__domain_shutdown_reason(libxl_ctx *ctx, uint32_t domid)
return (info.flags >> XEN_DOMINF_shutdownshift) & XEN_DOMINF_shutdownmask;
}
-int libxl__build_pre(libxl_ctx *ctx, uint32_t domid,
+int libxl__build_pre(libxl__gc *gc, uint32_t domid,
libxl_domain_build_info *info, libxl_domain_build_state *state)
{
+ libxl_ctx *ctx = libxl__gc_owner(gc);
xc_domain_max_vcpus(ctx->xch, domid, info->max_vcpus);
xc_domain_setmaxmem(ctx->xch, domid, info->target_memkb + LIBXL_MAXMEM_CONSTANT);
xc_domain_set_memmap_limit(ctx->xch, domid,
@@ -87,11 +90,11 @@ int libxl__build_pre(libxl_ctx *ctx, uint32_t domid,
return 0;
}
-int libxl__build_post(libxl_ctx *ctx, uint32_t domid,
+int libxl__build_post(libxl__gc *gc, uint32_t domid,
libxl_domain_build_info *info, libxl_domain_build_state *state,
char **vms_ents, char **local_ents)
{
- libxl__gc gc = LIBXL_INIT_GC(ctx);
+ libxl_ctx *ctx = libxl__gc_owner(gc);
char *dom_path, *vm_path;
xs_transaction_t t;
char **ents;
@@ -101,51 +104,50 @@ int libxl__build_post(libxl_ctx *ctx, uint32_t domid,
if (info->cpuid != NULL)
libxl_cpuid_set(ctx, domid, info->cpuid);
- ents = libxl__calloc(&gc, 12 + (info->max_vcpus * 2) + 2, sizeof(char *));
+ ents = libxl__calloc(gc, 12 + (info->max_vcpus * 2) + 2, sizeof(char *));
ents[0] = "memory/static-max";
- ents[1] = libxl__sprintf(&gc, "%d", info->max_memkb);
+ ents[1] = libxl__sprintf(gc, "%d", info->max_memkb);
ents[2] = "memory/target";
- ents[3] = libxl__sprintf(&gc, "%d", info->target_memkb - info->video_memkb);
+ ents[3] = libxl__sprintf(gc, "%d", info->target_memkb - info->video_memkb);
ents[4] = "memory/videoram";
- ents[5] = libxl__sprintf(&gc, "%d", info->video_memkb);
+ ents[5] = libxl__sprintf(gc, "%d", info->video_memkb);
ents[6] = "domid";
- ents[7] = libxl__sprintf(&gc, "%d", domid);
+ ents[7] = libxl__sprintf(gc, "%d", domid);
ents[8] = "store/port";
- ents[9] = libxl__sprintf(&gc, "%"PRIu32, state->store_port);
+ ents[9] = libxl__sprintf(gc, "%"PRIu32, state->store_port);
ents[10] = "store/ring-ref";
- ents[11] = libxl__sprintf(&gc, "%lu", state->store_mfn);
+ ents[11] = libxl__sprintf(gc, "%lu", state->store_mfn);
for (i = 0; i < info->max_vcpus; i++) {
- ents[12+(i*2)] = libxl__sprintf(&gc, "cpu/%d/availability", i);
+ ents[12+(i*2)] = libxl__sprintf(gc, "cpu/%d/availability", i);
ents[12+(i*2)+1] = (i && info->cur_vcpus && !(info->cur_vcpus & (1 << i)))
? "offline" : "online";
}
- dom_path = libxl__xs_get_dompath(&gc, domid);
+ dom_path = libxl__xs_get_dompath(gc, domid);
if (!dom_path) {
- libxl__free_all(&gc);
return ERROR_FAIL;
}
- vm_path = xs_read(ctx->xsh, XBT_NULL, libxl__sprintf(&gc, "%s/vm", dom_path), NULL);
+ vm_path = xs_read(ctx->xsh, XBT_NULL, libxl__sprintf(gc, "%s/vm", dom_path), NULL);
retry_transaction:
t = xs_transaction_start(ctx->xsh);
- libxl__xs_writev(&gc, t, dom_path, ents);
- libxl__xs_writev(&gc, t, dom_path, local_ents);
- libxl__xs_writev(&gc, t, vm_path, vms_ents);
+ libxl__xs_writev(gc, t, dom_path, ents);
+ libxl__xs_writev(gc, t, dom_path, local_ents);
+ libxl__xs_writev(gc, t, vm_path, vms_ents);
if (!xs_transaction_end(ctx->xsh, t, 0))
if (errno == EAGAIN)
goto retry_transaction;
xs_introduce_domain(ctx->xsh, domid, state->store_mfn, state->store_port);
free(vm_path);
- libxl__free_all(&gc);
return 0;
}
-int libxl__build_pv(libxl_ctx *ctx, uint32_t domid,
+int libxl__build_pv(libxl__gc *gc, uint32_t domid,
libxl_domain_build_info *info, libxl_domain_build_state *state)
{
+ libxl_ctx *ctx = libxl__gc_owner(gc);
struct xc_dom_image *dom;
int ret;
int flags = 0;
@@ -261,10 +263,10 @@ static int hvm_build_set_params(xc_interface *handle, uint32_t domid,
return 0;
}
-int libxl__build_hvm(libxl_ctx *ctx, uint32_t domid,
+int libxl__build_hvm(libxl__gc *gc, uint32_t domid,
libxl_domain_build_info *info, libxl_domain_build_state *state)
{
- libxl__gc gc = LIBXL_INIT_GC(ctx);
+ libxl_ctx *ctx = libxl__gc_owner(gc);
int ret, rc = ERROR_INVAL;
if (info->kernel.mapped) {
@@ -278,7 +280,7 @@ int libxl__build_hvm(libxl_ctx *ctx, uint32_t domid,
domid,
(info->max_memkb - info->video_memkb) / 1024,
(info->target_memkb - info->video_memkb) / 1024,
- libxl__abs_path(&gc, (char *)info->kernel.path,
+ libxl__abs_path(gc, (char *)info->kernel.path,
libxl_xenfirmwaredir_path()));
if (ret) {
LIBXL__LOG_ERRNOVAL(ctx, LIBXL__LOG_ERROR, ret, "hvm building failed");
@@ -292,14 +294,14 @@ int libxl__build_hvm(libxl_ctx *ctx, uint32_t domid,
}
rc = 0;
out:
- libxl__free_all(&gc);
return 0;
}
-int libxl__domain_restore_common(libxl_ctx *ctx, uint32_t domid,
+int libxl__domain_restore_common(libxl__gc *gc, uint32_t domid,
libxl_domain_build_info *info, libxl_domain_build_state *state,
int fd)
{
+ libxl_ctx *ctx = libxl__gc_owner(gc);
/* read signature */
int rc;
rc = xc_domain_restore(ctx->xch, fd, domid,
@@ -459,10 +461,10 @@ static int libxl__domain_suspend_common_callback(void *data)
return 0;
}
-int libxl__domain_suspend_common(libxl_ctx *ctx, uint32_t domid, int fd,
+int libxl__domain_suspend_common(libxl__gc *gc, uint32_t domid, int fd,
int hvm, int live, int debug)
{
- libxl__gc gc = LIBXL_INIT_GC(ctx);
+ libxl_ctx *ctx = libxl__gc_owner(gc);
int flags;
int port;
struct save_callbacks callbacks;
@@ -476,7 +478,7 @@ int libxl__domain_suspend_common(libxl_ctx *ctx, uint32_t domid, int fd,
si.domid = domid;
si.flags = flags;
si.hvm = hvm;
- si.gc = &gc;
+ si.gc = gc;
si.suspend_eventchn = -1;
si.guest_responded = 0;
@@ -518,27 +520,25 @@ int libxl__domain_suspend_common(libxl_ctx *ctx, uint32_t domid, int fd,
xc_evtchn_close(si.xce);
out:
- libxl__free_all(&gc);
return rc;
}
-int libxl__domain_save_device_model(libxl_ctx *ctx, uint32_t domid, int fd)
+int libxl__domain_save_device_model(libxl__gc *gc, uint32_t domid, int fd)
{
- libxl__gc gc = LIBXL_INIT_GC(ctx);
+ libxl_ctx *ctx = libxl__gc_owner(gc);
int fd2, c;
char buf[1024];
- char *filename = libxl__sprintf(&gc, "/var/lib/xen/qemu-save.%d", domid);
+ char *filename = libxl__sprintf(gc, "/var/lib/xen/qemu-save.%d", domid);
struct stat st;
uint32_t qemu_state_len;
LIBXL__LOG(ctx, LIBXL__LOG_DEBUG, "Saving device model state to %s", filename);
- libxl__xs_write(&gc, XBT_NULL, libxl__sprintf(&gc, "/local/domain/0/device-model/%d/command", domid), "save");
- libxl__wait_for_device_model(ctx, domid, "paused", NULL, NULL);
+ libxl__xs_write(gc, XBT_NULL, libxl__sprintf(gc, "/local/domain/0/device-model/%d/command", domid), "save");
+ libxl__wait_for_device_model(gc, domid, "paused", NULL, NULL);
if (stat(filename, &st) < 0)
{
LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "Unable to stat qemu save file\n");
- libxl__free_all(&gc);
return ERROR_FAIL;
}
@@ -547,36 +547,28 @@ int libxl__domain_save_device_model(libxl_ctx *ctx, uint32_t domid, int fd)
c = libxl_write_exactly(ctx, fd, QEMU_SIGNATURE, strlen(QEMU_SIGNATURE),
"saved-state file", "qemu signature");
- if (c) {
- libxl__free_all(&gc);
+ if (c)
return c;
- }
c = libxl_write_exactly(ctx, fd, &qemu_state_len, sizeof(qemu_state_len),
"saved-state file", "saved-state length");
- if (c) {
- libxl__free_all(&gc);
+ if (c)
return c;
- }
fd2 = open(filename, O_RDONLY);
while ((c = read(fd2, buf, sizeof(buf))) != 0) {
if (c < 0) {
if (errno == EINTR)
continue;
- libxl__free_all(&gc);
return errno;
}
c = libxl_write_exactly(
ctx, fd, buf, c, "saved-state file", "qemu state");
- if (c) {
- libxl__free_all(&gc);
+ if (c)
return c;
- }
}
close(fd2);
unlink(filename);
- libxl__free_all(&gc);
return 0;
}
@@ -614,7 +606,9 @@ static const char *userdata_path(libxl__gc *gc, uint32_t domid,
return path;
}
-static int userdata_delete(libxl_ctx *ctx, const char *path) {
+static int userdata_delete(libxl__gc *gc, const char *path)
+{
+ libxl_ctx *ctx = libxl__gc_owner(gc);
int r;
r = unlink(path);
if (r) {
@@ -624,14 +618,14 @@ static int userdata_delete(libxl_ctx *ctx, const char *path) {
return 0;
}
-void libxl__userdata_destroyall(libxl_ctx *ctx, uint32_t domid)
+void libxl__userdata_destroyall(libxl__gc *gc, uint32_t domid)
{
- libxl__gc gc = LIBXL_INIT_GC(ctx);
+ libxl_ctx *ctx = libxl__gc_owner(gc);
const char *pattern;
glob_t gl;
int r, i;
- pattern = userdata_path(&gc, domid, "*", "?");
+ pattern = userdata_path(gc, domid, "*", "?");
if (!pattern)
goto out;
@@ -645,11 +639,11 @@ void libxl__userdata_destroyall(libxl_ctx *ctx, uint32_t domid)
LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "glob failed for %s", pattern);
for (i=0; i<gl.gl_pathc; i++) {
- userdata_delete(ctx, gl.gl_pathv[i]);
+ userdata_delete(gc, gl.gl_pathv[i]);
}
globfree(&gl);
out:
- libxl__free_all(&gc);
+ return;
}
int libxl_userdata_store(libxl_ctx *ctx, uint32_t domid,
@@ -671,7 +665,7 @@ int libxl_userdata_store(libxl_ctx *ctx, uint32_t domid,
}
if (!datalen) {
- rc = userdata_delete(ctx, filename);
+ rc = userdata_delete(&gc, filename);
goto out;
}
diff --git a/tools/libxl/libxl_exec.c b/tools/libxl/libxl_exec.c
index e770fd3e09..a72cb83bee 100644
--- a/tools/libxl/libxl_exec.c
+++ b/tools/libxl/libxl_exec.c
@@ -91,12 +91,13 @@ void libxl_report_child_exitstatus(libxl_ctx *ctx,
}
}
-int libxl__spawn_spawn(libxl_ctx *ctx,
+int libxl__spawn_spawn(libxl__gc *gc,
libxl__device_model_starting *starting,
const char *what,
void (*intermediate_hook)(void *for_spawn,
pid_t innerchild))
{
+ libxl_ctx *ctx = libxl__gc_owner(gc);
pid_t child, got;
int status;
pid_t intermediate;
@@ -138,11 +139,12 @@ int libxl__spawn_spawn(libxl_ctx *ctx,
? WTERMSIG(status)+128 : -1);
}
-static void report_spawn_intermediate_status(libxl_ctx *ctx,
- libxl__spawn_starting *for_spawn,
- int status)
+static void report_spawn_intermediate_status(libxl__gc *gc,
+ libxl__spawn_starting *for_spawn,
+ int status)
{
if (!WIFEXITED(status)) {
+ libxl_ctx *ctx = libxl__gc_owner(gc);
char *intermediate_what;
/* intermediate process did the logging itself if it exited */
if ( asprintf(&intermediate_what,
@@ -154,9 +156,10 @@ static void report_spawn_intermediate_status(libxl_ctx *ctx,
}
}
-int libxl__spawn_detach(libxl_ctx *ctx,
+int libxl__spawn_detach(libxl__gc *gc,
libxl__spawn_starting *for_spawn)
{
+ libxl_ctx *ctx = libxl__gc_owner(gc);
int r, status;
pid_t got;
int rc = 0;
@@ -175,7 +178,7 @@ int libxl__spawn_detach(libxl_ctx *ctx,
got = call_waitpid(ctx->waitpid_instead, for_spawn->intermediate, &status, 0);
assert(got == for_spawn->intermediate);
if (!(WIFSIGNALED(status) && WTERMSIG(status) == SIGKILL)) {
- report_spawn_intermediate_status(ctx, for_spawn, status);
+ report_spawn_intermediate_status(gc, for_spawn, status);
rc = ERROR_FAIL;
}
for_spawn->intermediate = 0;
@@ -187,8 +190,9 @@ int libxl__spawn_detach(libxl_ctx *ctx,
return rc;
}
-int libxl__spawn_check(libxl_ctx *ctx, void *for_spawn_void)
+int libxl__spawn_check(libxl__gc *gc, void *for_spawn_void)
{
+ libxl_ctx *ctx = libxl__gc_owner(gc);
libxl__spawn_starting *for_spawn = for_spawn_void;
pid_t got;
int status;
@@ -200,7 +204,7 @@ int libxl__spawn_check(libxl_ctx *ctx, void *for_spawn_void)
if (!got) return 0;
assert(got == for_spawn->intermediate);
- report_spawn_intermediate_status(ctx, for_spawn, status);
+ report_spawn_intermediate_status(gc, for_spawn, status);
for_spawn->intermediate = 0;
return ERROR_FAIL;
diff --git a/tools/libxl/libxl_internal.c b/tools/libxl/libxl_internal.c
index 2aa87f7181..046e4435c7 100644
--- a/tools/libxl/libxl_internal.c
+++ b/tools/libxl/libxl_internal.c
@@ -29,7 +29,7 @@
#include "libxl_internal.h"
#include "libxl_utils.h"
-int libxl__error_set(libxl_ctx *ctx, int code)
+int libxl__error_set(libxl__gc *gc, int code)
{
return 0;
}
@@ -82,7 +82,7 @@ void *libxl__zalloc(libxl__gc *gc, int bytes)
{
void *ptr = calloc(bytes, 1);
if (!ptr) {
- libxl__error_set(libxl__gc_owner(gc), ENOMEM);
+ libxl__error_set(gc, ENOMEM);
return NULL;
}
@@ -94,7 +94,7 @@ void *libxl__calloc(libxl__gc *gc, size_t nmemb, size_t size)
{
void *ptr = calloc(nmemb, size);
if (!ptr) {
- libxl__error_set(libxl__gc_owner(gc), ENOMEM);
+ libxl__error_set(gc, ENOMEM);
return NULL;
}
diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h
index 277b04cc1f..f698d3669b 100644
--- a/tools/libxl/libxl_internal.h
+++ b/tools/libxl/libxl_internal.h
@@ -157,25 +157,25 @@ _hidden char **libxl__xs_directory(libxl__gc *gc, xs_transaction_t t,
/* On error: returns NULL, sets errno (no logging) */
/* from xl_dom */
-_hidden int libxl__domain_is_hvm(libxl_ctx *ctx, uint32_t domid);
-_hidden int libxl__domain_shutdown_reason(libxl_ctx *ctx, uint32_t domid);
+_hidden int libxl__domain_is_hvm(libxl__gc *gc, uint32_t domid);
+_hidden int libxl__domain_shutdown_reason(libxl__gc *gc, uint32_t domid);
-_hidden int libxl__build_pre(libxl_ctx *ctx, uint32_t domid,
+_hidden int libxl__build_pre(libxl__gc *gc, uint32_t domid,
libxl_domain_build_info *info, libxl_domain_build_state *state);
-_hidden int libxl__build_post(libxl_ctx *ctx, uint32_t domid,
+_hidden int libxl__build_post(libxl__gc *gc, uint32_t domid,
libxl_domain_build_info *info, libxl_domain_build_state *state,
char **vms_ents, char **local_ents);
-_hidden int libxl__build_pv(libxl_ctx *ctx, uint32_t domid,
+_hidden int libxl__build_pv(libxl__gc *gc, uint32_t domid,
libxl_domain_build_info *info, libxl_domain_build_state *state);
-_hidden int libxl__build_hvm(libxl_ctx *ctx, uint32_t domid,
+_hidden int libxl__build_hvm(libxl__gc *gc, uint32_t domid,
libxl_domain_build_info *info, libxl_domain_build_state *state);
-_hidden int libxl__domain_restore_common(libxl_ctx *ctx, uint32_t domid,
+_hidden int libxl__domain_restore_common(libxl__gc *gc, uint32_t domid,
libxl_domain_build_info *info, libxl_domain_build_state *state, int fd);
-_hidden int libxl__domain_suspend_common(libxl_ctx *ctx, uint32_t domid, int fd, int hvm, int live, int debug);
-_hidden int libxl__domain_save_device_model(libxl_ctx *ctx, uint32_t domid, int fd);
-_hidden void libxl__userdata_destroyall(libxl_ctx *ctx, uint32_t domid);
+_hidden int libxl__domain_suspend_common(libxl__gc *gc, uint32_t domid, int fd, int hvm, int live, int debug);
+_hidden int libxl__domain_save_device_model(libxl__gc *gc, uint32_t domid, int fd);
+_hidden void libxl__userdata_destroyall(libxl__gc *gc, uint32_t domid);
/* from xl_device */
_hidden char *libxl__device_disk_string_of_backend(libxl_disk_backend backend);
@@ -184,25 +184,18 @@ _hidden char *libxl__device_disk_string_of_format(libxl_disk_format format);
_hidden int libxl__device_physdisk_major_minor(const char *physpath, int *major, int *minor);
_hidden int libxl__device_disk_dev_number(char *virtpath);
-_hidden int libxl__device_generic_add(libxl_ctx *ctx, libxl__device *device,
+_hidden int libxl__device_generic_add(libxl__gc *gc, libxl__device *device,
char **bents, char **fents);
_hidden char *libxl__device_backend_path(libxl__gc *gc, libxl__device *device);
_hidden char *libxl__device_frontend_path(libxl__gc *gc, libxl__device *device);
-_hidden int libxl__device_del(libxl_ctx *ctx, libxl__device *dev, int wait);
-_hidden int libxl__device_destroy(libxl_ctx *ctx, char *be_path, int force);
-_hidden int libxl__devices_destroy(libxl_ctx *ctx, uint32_t domid, int force);
-_hidden int libxl__wait_for_device_model(libxl_ctx *ctx,
- uint32_t domid, char *state,
- int (*check_callback)(libxl_ctx *ctx,
- uint32_t domid,
- const char *state,
- void *userdata),
- void *check_callback_userdata);
-_hidden int libxl__wait_for_backend(libxl_ctx *ctx, char *be_path, char *state);
+_hidden int libxl__device_del(libxl__gc *gc, libxl__device *dev, int wait);
+_hidden int libxl__device_destroy(libxl__gc *gc, char *be_path, int force);
+_hidden int libxl__devices_destroy(libxl__gc *gc, uint32_t domid, int force);
+_hidden int libxl__wait_for_backend(libxl__gc *gc, char *be_path, char *state);
/* from libxl_pci */
-_hidden int libxl__device_pci_add(libxl_ctx *ctx, uint32_t domid, libxl_device_pci *pcidev, int starting);
+_hidden int libxl__device_pci_add(libxl__gc *gc, uint32_t domid, libxl_device_pci *pcidev, int starting);
/* xl_exec */
@@ -222,33 +215,40 @@ typedef struct {
} libxl__device_model_starting;
/* from xl_create */
-_hidden int libxl__domain_make(libxl_ctx *ctx, libxl_domain_create_info *info, uint32_t *domid);
-_hidden int libxl__domain_build(libxl_ctx *ctx, libxl_domain_build_info *info, uint32_t domid, /* out */ libxl_domain_build_state *state);
+_hidden int libxl__domain_make(libxl__gc *gc, libxl_domain_create_info *info, uint32_t *domid);
+_hidden int libxl__domain_build(libxl__gc *gc, libxl_domain_build_info *info, uint32_t domid, /* out */ libxl_domain_build_state *state);
/* for device model creation */
-_hidden int libxl__create_device_model(libxl_ctx *ctx,
+_hidden int libxl__create_device_model(libxl__gc *gc,
libxl_device_model_info *info,
libxl_device_disk *disk, int num_disks,
libxl_device_nic *vifs, int num_vifs,
libxl__device_model_starting **starting_r);
-_hidden int libxl__create_xenpv_qemu(libxl_ctx *ctx, uint32_t domid, libxl_device_vfb *vfb,
+_hidden int libxl__create_xenpv_qemu(libxl__gc *gc, uint32_t domid, libxl_device_vfb *vfb,
libxl__device_model_starting **starting_r);
-_hidden int libxl__need_xenpv_qemu(libxl_ctx *ctx,
+_hidden int libxl__need_xenpv_qemu(libxl__gc *gc,
int nr_consoles, libxl_device_console *consoles,
int nr_vfbs, libxl_device_vfb *vfbs,
int nr_disks, libxl_device_disk *disks);
-
/* Caller must either: pass starting_r==0, or on successful
* return pass *starting_r (which will be non-0) to
* libxl_confirm_device_model or libxl_detach_device_model. */
-_hidden int libxl__confirm_device_model_startup(libxl_ctx *ctx,
+_hidden int libxl__confirm_device_model_startup(libxl__gc *gc,
libxl__device_model_starting *starting);
+_hidden int libxl__detach_device_model(libxl__gc *gc, libxl__device_model_starting *starting);
+_hidden int libxl__wait_for_device_model(libxl__gc *gc,
+ uint32_t domid, char *state,
+ int (*check_callback)(libxl__gc *gc,
+ uint32_t domid,
+ const char *state,
+ void *userdata),
+ void *check_callback_userdata);
-_hidden int libxl__spawn_spawn(libxl_ctx *ctx,
+_hidden int libxl__spawn_spawn(libxl__gc *gc,
libxl__device_model_starting *starting,
const char *what,
void (*intermediate_hook)(void *for_spawn, pid_t innerchild));
-_hidden int libxl__destroy_device_model(libxl_ctx *ctx, uint32_t domid);
+_hidden int libxl__destroy_device_model(libxl__gc *gc, uint32_t domid);
/* Logs errors. A copy of "what" is taken. Return values:
* < 0 error, for_spawn need not be detached
@@ -256,11 +256,11 @@ _hidden int libxl__destroy_device_model(libxl_ctx *ctx, uint32_t domid);
* 0 caller is now the inner child, should probably call libxl__exec
* Caller, may pass 0 for for_spawn, in which case no need to detach.
*/
-_hidden int libxl__spawn_detach(libxl_ctx *ctx,
+_hidden int libxl__spawn_detach(libxl__gc *gc,
libxl__spawn_starting *for_spawn);
/* Logs errors. Idempotent, but only permitted after successful
* call to libxl__spawn_spawn, and no point calling it again if it fails. */
-_hidden int libxl__spawn_check(libxl_ctx *ctx,
+_hidden int libxl__spawn_check(libxl__gc *gc,
void *for_spawn);
/* Logs errors but also returns them.
* for_spawn must actually be a libxl__spawn_starting* but
@@ -325,7 +325,7 @@ struct libxl__xen_console_reader {
unsigned int index;
};
-_hidden int libxl__error_set(libxl_ctx *ctx, int code);
+_hidden int libxl__error_set(libxl__gc *gc, int code);
_hidden int libxl__file_reference_map(libxl_file_reference *f);
_hidden int libxl__file_reference_unmap(libxl_file_reference *f);
diff --git a/tools/libxl/libxl_pci.c b/tools/libxl/libxl_pci.c
index 5860116cd1..d6d299bd7f 100644
--- a/tools/libxl/libxl_pci.c
+++ b/tools/libxl/libxl_pci.c
@@ -234,7 +234,7 @@ static void libxl_create_pci_backend_device(libxl__gc *gc, flexarray_t *back, in
flexarray_append_pair(back, libxl__sprintf(gc, "state-%d", num), libxl__sprintf(gc, "%d", 1));
}
-static int libxl_create_pci_backend(libxl__gc *gc, uint32_t domid, libxl_device_pci *pcidev, int num)
+static int libxl__create_pci_backend(libxl__gc *gc, uint32_t domid, libxl_device_pci *pcidev, int num)
{
libxl_ctx *ctx = libxl__gc_owner(gc);
flexarray_t *front = NULL;
@@ -273,9 +273,9 @@ static int libxl_create_pci_backend(libxl__gc *gc, uint32_t domid, libxl_device_
flexarray_append_pair(front, "backend-id", libxl__sprintf(gc, "%d", 0));
flexarray_append_pair(front, "state", libxl__sprintf(gc, "%d", 1));
- libxl__device_generic_add(ctx, &device,
- libxl__xs_kvs_of_flexarray(gc, back, back->count),
- libxl__xs_kvs_of_flexarray(gc, front, front->count));
+ libxl__device_generic_add(gc, &device,
+ libxl__xs_kvs_of_flexarray(gc, back, back->count),
+ libxl__xs_kvs_of_flexarray(gc, front, front->count));
out:
if (back)
@@ -285,7 +285,7 @@ out:
return 0;
}
-static int libxl_device_pci_add_xenstore(libxl__gc *gc, uint32_t domid, libxl_device_pci *pcidev, int starting)
+static int libxl__device_pci_add_xenstore(libxl__gc *gc, uint32_t domid, libxl_device_pci *pcidev, int starting)
{
libxl_ctx *ctx = libxl__gc_owner(gc);
flexarray_t *back;
@@ -296,10 +296,10 @@ static int libxl_device_pci_add_xenstore(libxl__gc *gc, uint32_t domid, libxl_de
be_path = libxl__sprintf(gc, "%s/backend/pci/%d/0", libxl__xs_get_dompath(gc, 0), domid);
num_devs = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/num_devs", be_path));
if (!num_devs)
- return libxl_create_pci_backend(gc, domid, pcidev, 1);
+ return libxl__create_pci_backend(gc, domid, pcidev, 1);
- if (!starting && !libxl__domain_is_hvm(ctx, domid)) {
- if (libxl__wait_for_backend(ctx, be_path, "4") < 0)
+ if (!starting && !libxl__domain_is_hvm(gc, domid)) {
+ if (libxl__wait_for_backend(gc, be_path, "4") < 0)
return ERROR_FAIL;
}
@@ -326,7 +326,7 @@ retry_transaction:
return 0;
}
-static int libxl_device_pci_remove_xenstore(libxl__gc *gc, uint32_t domid, libxl_device_pci *pcidev)
+static int libxl__device_pci_remove_xenstore(libxl__gc *gc, uint32_t domid, libxl_device_pci *pcidev)
{
libxl_ctx *ctx = libxl__gc_owner(gc);
char *be_path, *num_devs_path, *num_devs, *xsdev, *tmp, *tmppath;
@@ -341,8 +341,8 @@ static int libxl_device_pci_remove_xenstore(libxl__gc *gc, uint32_t domid, libxl
return ERROR_INVAL;
num = atoi(num_devs);
- if (!libxl__domain_is_hvm(ctx, domid)) {
- if (libxl__wait_for_backend(ctx, be_path, "4") < 0) {
+ if (!libxl__domain_is_hvm(gc, domid)) {
+ if (libxl__wait_for_backend(gc, be_path, "4") < 0) {
LIBXL__LOG(ctx, LIBXL__LOG_DEBUG, "pci backend at %s is not ready", be_path);
return ERROR_FAIL;
}
@@ -369,8 +369,8 @@ retry_transaction:
if (errno == EAGAIN)
goto retry_transaction;
- if (!libxl__domain_is_hvm(ctx, domid)) {
- if (libxl__wait_for_backend(ctx, be_path, "4") < 0) {
+ if (!libxl__domain_is_hvm(gc, domid)) {
+ if (libxl__wait_for_backend(gc, be_path, "4") < 0) {
LIBXL__LOG(ctx, LIBXL__LOG_DEBUG, "pci backend at %s is not ready", be_path);
return ERROR_FAIL;
}
@@ -423,7 +423,7 @@ retry_transaction2:
if (num == 1) {
char *fe_path = libxl__xs_read(gc, XBT_NULL, libxl__sprintf(gc, "%s/frontend", be_path));
- libxl__device_destroy(ctx, be_path, 1);
+ libxl__device_destroy(gc, be_path, 1);
xs_rm(ctx->xsh, XBT_NULL, be_path);
xs_rm(ctx->xsh, XBT_NULL, fe_path);
return 0;
@@ -602,7 +602,7 @@ static int pci_multifunction_check(libxl__gc *gc, libxl_device_pci *pcidev, unsi
return 0;
}
-static int pci_ins_check(libxl_ctx *ctx, uint32_t domid, const char *state, void *priv)
+static int pci_ins_check(libxl__gc *gc, uint32_t domid, const char *state, void *priv)
{
char *orig_state = priv;
@@ -623,9 +623,9 @@ static int do_pci_add(libxl__gc *gc, uint32_t domid, libxl_device_pci *pcidev, i
char *state, *vdevfn;
int rc, hvm;
- hvm = libxl__domain_is_hvm(ctx, domid);
+ hvm = libxl__domain_is_hvm(gc, domid);
if (hvm) {
- if (libxl__wait_for_device_model(ctx, domid, "running", NULL, NULL) < 0) {
+ if (libxl__wait_for_device_model(gc, domid, "running", NULL, NULL) < 0) {
return ERROR_FAIL;
}
path = libxl__sprintf(gc, "/local/domain/0/device-model/%d/state", domid);
@@ -639,7 +639,7 @@ static int do_pci_add(libxl__gc *gc, uint32_t domid, libxl_device_pci *pcidev, i
pcidev->bus, pcidev->dev, pcidev->func);
path = libxl__sprintf(gc, "/local/domain/0/device-model/%d/command", domid);
xs_write(ctx->xsh, XBT_NULL, path, "pci-ins", strlen("pci-ins"));
- rc = libxl__wait_for_device_model(ctx, domid, NULL, pci_ins_check, state);
+ rc = libxl__wait_for_device_model(gc, domid, NULL, pci_ins_check, state);
path = libxl__sprintf(gc, "/local/domain/0/device-model/%d/parameter", domid);
vdevfn = libxl__xs_read(gc, XBT_NULL, path);
path = libxl__sprintf(gc, "/local/domain/0/device-model/%d/state", domid);
@@ -718,12 +718,12 @@ out:
}
}
- rc = libxl_device_pci_add_xenstore(gc, domid, pcidev, starting);
+ rc = libxl__device_pci_add_xenstore(gc, domid, pcidev, starting);
return rc;
}
-static int libxl_device_pci_reset(libxl__gc *gc, unsigned int domain, unsigned int bus,
- unsigned int dev, unsigned int func)
+static int libxl__device_pci_reset(libxl__gc *gc, unsigned int domain, unsigned int bus,
+ unsigned int dev, unsigned int func)
{
libxl_ctx *ctx = libxl__gc_owner(gc);
char *reset;
@@ -760,18 +760,22 @@ static int libxl_device_pci_reset(libxl__gc *gc, unsigned int domain, unsigned i
int libxl_device_pci_add(libxl_ctx *ctx, uint32_t domid, libxl_device_pci *pcidev)
{
- return libxl__device_pci_add(ctx, domid, pcidev, 0);
+ libxl__gc gc = LIBXL_INIT_GC(ctx);
+ int rc;
+ rc = libxl__device_pci_add(&gc, domid, pcidev, 0);
+ libxl__free_all(&gc);
+ return rc;
}
-int libxl__device_pci_add(libxl_ctx *ctx, uint32_t domid, libxl_device_pci *pcidev, int starting)
+int libxl__device_pci_add(libxl__gc *gc, uint32_t domid, libxl_device_pci *pcidev, int starting)
{
- libxl__gc gc = LIBXL_INIT_GC(ctx);
+ libxl_ctx *ctx = libxl__gc_owner(gc);
unsigned int orig_vdev, pfunc_mask;
libxl_device_pci *assigned;
int num_assigned, i, rc;
int stubdomid = 0;
- rc = get_all_assigned_devices(&gc, &assigned, &num_assigned);
+ rc = get_all_assigned_devices(gc, &assigned, &num_assigned);
if ( rc ) {
LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "cannot determine if device is assigned, refusing to continue");
goto out;
@@ -783,12 +787,12 @@ int libxl__device_pci_add(libxl_ctx *ctx, uint32_t domid, libxl_device_pci *pcid
goto out;
}
- libxl_device_pci_reset(&gc, pcidev->domain, pcidev->bus, pcidev->dev, pcidev->func);
+ libxl__device_pci_reset(gc, pcidev->domain, pcidev->bus, pcidev->dev, pcidev->func);
stubdomid = libxl_get_stubdom_id(ctx, domid);
if (stubdomid != 0) {
libxl_device_pci pcidev_s = *pcidev;
- rc = do_pci_add(&gc, stubdomid, &pcidev_s, starting);
+ rc = do_pci_add(gc, stubdomid, &pcidev_s, starting);
if ( rc )
goto out;
}
@@ -801,7 +805,7 @@ int libxl__device_pci_add(libxl_ctx *ctx, uint32_t domid, libxl_device_pci *pcid
rc = ERROR_INVAL;
goto out;
}
- if ( pci_multifunction_check(&gc, pcidev, &pfunc_mask) ) {
+ if ( pci_multifunction_check(gc, pcidev, &pfunc_mask) ) {
rc = ERROR_FAIL;
goto out;
}
@@ -823,13 +827,12 @@ int libxl__device_pci_add(libxl_ctx *ctx, uint32_t domid, libxl_device_pci *pcid
*/
pcidev->vdevfn = orig_vdev;
}
- if ( do_pci_add(&gc, domid, pcidev, starting) )
+ if ( do_pci_add(gc, domid, pcidev, starting) )
rc = ERROR_FAIL;
}
}
out:
- libxl__free_all(&gc);
return rc;
}
@@ -851,9 +854,9 @@ static int do_pci_remove(libxl__gc *gc, uint32_t domid,
}
}
- hvm = libxl__domain_is_hvm(ctx, domid);
+ hvm = libxl__domain_is_hvm(gc, domid);
if (hvm) {
- if (libxl__wait_for_device_model(ctx, domid, "running", NULL, NULL) < 0) {
+ if (libxl__wait_for_device_model(gc, domid, "running", NULL, NULL) < 0) {
return ERROR_FAIL;
}
path = libxl__sprintf(gc, "/local/domain/0/device-model/%d/state", domid);
@@ -867,7 +870,7 @@ static int do_pci_remove(libxl__gc *gc, uint32_t domid,
* device-model for function 0 */
if ( !force && (pcidev->vdevfn & 0x7) == 0 ) {
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) {
+ if (libxl__wait_for_device_model(gc, domid, "pci-removed", NULL, NULL) < 0) {
LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "Device Model didn't respond in time");
/* This depends on guest operating system acknowledging the
* SCI, if it doesn't respond in time then we may wish to
@@ -931,7 +934,7 @@ skip1:
out:
/* don't do multiple resets while some functions are still passed through */
if ( (pcidev->vdevfn & 0x7) == 0 ) {
- libxl_device_pci_reset(gc, pcidev->domain, pcidev->bus, pcidev->dev, pcidev->func);
+ libxl__device_pci_reset(gc, pcidev->domain, pcidev->bus, pcidev->dev, pcidev->func);
}
if (!libxl_is_stubdom(ctx, domid, NULL)) {
@@ -946,7 +949,7 @@ out:
libxl_device_pci_remove(ctx, stubdomid, &pcidev_s, force);
}
- libxl_device_pci_remove_xenstore(gc, domid, pcidev);
+ libxl__device_pci_remove_xenstore(gc, domid, pcidev);
return 0;
}
diff --git a/tools/libxl/libxl_utils.c b/tools/libxl/libxl_utils.c
index d13ae65821..37c50f2500 100644
--- a/tools/libxl/libxl_utils.c
+++ b/tools/libxl/libxl_utils.c
@@ -223,7 +223,9 @@ out:
return ret;
}
-static int logrename(libxl_ctx *ctx, const char *old, const char *new) {
+static int logrename(libxl__gc *gc, const char *old, const char *new)
+{
+ libxl_ctx *ctx = libxl__gc_owner(gc);
int r;
r = rename(old, new);
@@ -252,14 +254,14 @@ int libxl_create_logfile(libxl_ctx *ctx, char *name, char **full_name)
for (i = 9; i > 0; i--) {
logfile = libxl__sprintf(&gc, "/var/log/xen/%s.log.%d", name, i);
logfile_new = libxl__sprintf(&gc, "/var/log/xen/%s.log.%d", name, i + 1);
- rc = logrename(ctx, logfile, logfile_new);
+ rc = logrename(&gc, logfile, logfile_new);
if (rc)
goto out;
}
logfile = libxl__sprintf(&gc, "/var/log/xen/%s.log", name);
logfile_new = libxl__sprintf(&gc, "/var/log/xen/%s.log.1", name);
- rc = logrename(ctx, logfile, logfile_new);
+ rc = logrename(&gc, logfile, logfile_new);
if (rc)
goto out;
} else {