From mboxrd@z Thu Jan 1 00:00:00 1970 From: Yang Hongyang Subject: Re: [PATCH v3 COLOPre 24/26] tools/libxl: rename remus device to checkpoint device Date: Wed, 1 Jul 2015 11:11:16 +0800 Message-ID: <55935A54.3070507@cn.fujitsu.com> References: <1435213552-10556-1-git-send-email-yanghy@cn.fujitsu.com> <1435213552-10556-25-git-send-email-yanghy@cn.fujitsu.com> <1435661009.21469.86.camel@citrix.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii"; Format="flowed" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <1435661009.21469.86.camel@citrix.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: Ian Campbell Cc: wei.liu2@citrix.com, wency@cn.fujitsu.com, andrew.cooper3@citrix.com, yunhong.jiang@intel.com, eddie.dong@intel.com, xen-devel@lists.xen.org, guijianfeng@cn.fujitsu.com, rshriram@cs.ubc.ca, ian.jackson@eu.citrix.com List-Id: xen-devel@lists.xenproject.org On 06/30/2015 06:43 PM, Ian Campbell wrote: > On Thu, 2015-06-25 at 14:25 +0800, Yang Hongyang wrote: >> This patch is auto generated by the following commands: >> 1. git mv tools/libxl/libxl_remus_device.c tools/libxl/libxl_checkpoint_device.c > > Please use the -M option to git format-patch/send-email, which will make > the move and subsequent changes far more apparent. Ok. > >> 2. perl -pi -e 's/libxl_remus_device/libxl_checkpoint_device/g' tools/libxl/Makefile >> 3. perl -pi -e 's/\blibxl__remus_devices/libxl__checkpoint_devices/g' tools/libxl/*.[ch] >> 4. perl -pi -e 's/\blibxl__remus_device\b/libxl__checkpoint_device/g' tools/libxl/*.[ch] >> 5. perl -pi -e 's/\blibxl__remus_device_instance_ops\b/libxl__checkpoint_device_instance_ops/g' tools/libxl/*.[ch] >> 6. perl -pi -e 's/\blibxl__remus_callback\b/libxl__checkpoint_callback/g' tools/libxl/*.[ch] >> 7. perl -pi -e 's/\bremus_device_init\b/checkpoint_device_init/g' tools/libxl/*.[ch] >> 8. perl -pi -e 's/\bremus_devices_setup\b/checkpoint_devices_setup/g' tools/libxl/*.[ch] >> 9. perl -pi -e 's/\bdefine_remus_checkpoint_api\b/define_checkpoint_api/g' tools/libxl/*.[ch] >> 10. perl -pi -e 's/\brds\b/cds/g' tools/libxl/*.[ch] >> 11. perl -pi -e 's/REMUS_DEVICE/CHECKPOINT_DEVICE/g' tools/libxl/*.[ch] tools/libxl/*.idl >> 12. perl -pi -e 's/REMUS_DEVOPS/CHECKPOINT_DEVOPS/g' tools/libxl/*.[ch] tools/libxl/*.idl >> 13. perl -pi -e 's/\bremus\b/checkpoint/g' tools/libxl/libxl_checkpoint_device.[ch] >> 14. perl -pi -e 's/\bremus device/checkpoint device/g' tools/libxl/libxl_internal.h >> 15. perl -pi -e 's/\bRemus device/checkpoint device/g' tools/libxl/libxl_internal.h >> 16. perl -pi -e 's/\bremus abstract/checkpoint abstract/g' tools/libxl/libxl_internal.h >> 17. perl -pi -e 's/\bremus invocation/checkpoint invocation/g' tools/libxl/libxl_internal.h >> 18. perl -pi -e 's/\blibxl__remus_device_\(/libxl__checkpoint_device_(/g' tools/libxl/libxl_internal.h > > Wowza! > >> >> Signed-off-by: Wen Congyang >> Signed-off-by: Yang Hongyang >> --- >> tools/libxl/Makefile | 2 +- >> tools/libxl/libxl_checkpoint_device.c | 327 ++++++++++++++++++++++++++++++++++ >> tools/libxl/libxl_internal.h | 112 ++++++------ >> tools/libxl/libxl_netbuffer.c | 108 +++++------ >> tools/libxl/libxl_nonetbuffer.c | 10 +- >> tools/libxl/libxl_remus.c | 76 ++++---- >> tools/libxl/libxl_remus_device.c | 327 ---------------------------------- >> tools/libxl/libxl_remus_disk_drbd.c | 52 +++--- >> tools/libxl/libxl_types.idl | 4 +- >> 9 files changed, 509 insertions(+), 509 deletions(-) >> create mode 100644 tools/libxl/libxl_checkpoint_device.c >> delete mode 100644 tools/libxl/libxl_remus_device.c >> >> diff --git a/tools/libxl/Makefile b/tools/libxl/Makefile >> index d61c191..2f4efd4 100644 >> --- a/tools/libxl/Makefile >> +++ b/tools/libxl/Makefile >> @@ -56,7 +56,7 @@ else >> LIBXL_OBJS-y += libxl_nonetbuffer.o >> endif >> >> -LIBXL_OBJS-y += libxl_remus.o libxl_remus_device.o libxl_remus_disk_drbd.o >> +LIBXL_OBJS-y += libxl_remus.o libxl_checkpoint_device.o libxl_remus_disk_drbd.o >> >> LIBXL_OBJS-$(CONFIG_X86) += libxl_cpuid.o libxl_x86.o libxl_psr.o >> LIBXL_OBJS-$(CONFIG_ARM) += libxl_nocpuid.o libxl_arm.o libxl_libfdt_compat.o >> diff --git a/tools/libxl/libxl_checkpoint_device.c b/tools/libxl/libxl_checkpoint_device.c >> new file mode 100644 >> index 0000000..109cd23 >> --- /dev/null >> +++ b/tools/libxl/libxl_checkpoint_device.c >> @@ -0,0 +1,327 @@ >> +/* >> + * Copyright (C) 2014 FUJITSU LIMITED >> + * Author: Yang Hongyang >> + * >> + * This program is free software; you can redistribute it and/or modify >> + * it under the terms of the GNU Lesser General Public License as published >> + * by the Free Software Foundation; version 2.1 only. with the special >> + * exception on linking described in file LICENSE. >> + * >> + * This program is distributed in the hope that it will be useful, >> + * but WITHOUT ANY WARRANTY; without even the implied warranty of >> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the >> + * GNU Lesser General Public License for more details. >> + */ >> + >> +#include "libxl_osdeps.h" /* must come before any other headers */ >> + >> +#include "libxl_internal.h" >> + >> +extern const libxl__checkpoint_device_instance_ops remus_device_nic; >> +extern const libxl__checkpoint_device_instance_ops remus_device_drbd_disk; >> +static const libxl__checkpoint_device_instance_ops *remus_ops[] = { >> + &remus_device_nic, >> + &remus_device_drbd_disk, >> + NULL, >> +}; >> + >> +/*----- helper functions -----*/ >> + >> +static int init_device_subkind(libxl__checkpoint_devices_state *cds) >> +{ >> + /* init device subkind-specific state in the libxl ctx */ >> + int rc; >> + STATE_AO_GC(cds->ao); >> + >> + if (libxl__netbuffer_enabled(gc)) { >> + rc = init_subkind_nic(cds); >> + if (rc) goto out; >> + } >> + >> + rc = init_subkind_drbd_disk(cds); >> + if (rc) goto out; >> + >> + rc = 0; >> +out: >> + return rc; >> +} >> + >> +static void cleanup_device_subkind(libxl__checkpoint_devices_state *cds) >> +{ >> + /* cleanup device subkind-specific state in the libxl ctx */ >> + STATE_AO_GC(cds->ao); >> + >> + if (libxl__netbuffer_enabled(gc)) >> + cleanup_subkind_nic(cds); >> + >> + cleanup_subkind_drbd_disk(cds); >> +} >> + >> +/*----- setup() and teardown() -----*/ >> + >> +/* callbacks */ >> + >> +static void all_devices_setup_cb(libxl__egc *egc, >> + libxl__multidev *multidev, >> + int rc); >> +static void device_setup_iterate(libxl__egc *egc, >> + libxl__ao_device *aodev); >> +static void devices_teardown_cb(libxl__egc *egc, >> + libxl__multidev *multidev, >> + int rc); >> + >> +/* checkpoint device setup and teardown */ >> + >> +static libxl__checkpoint_device* checkpoint_device_init(libxl__egc *egc, >> + libxl__checkpoint_devices_state *cds, >> + libxl__device_kind kind, >> + void *libxl_dev) >> +{ >> + libxl__checkpoint_device *dev = NULL; >> + >> + STATE_AO_GC(cds->ao); >> + GCNEW(dev); >> + dev->backend_dev = libxl_dev; >> + dev->kind = kind; >> + dev->cds = cds; >> + >> + return dev; >> +} >> + >> +static void checkpoint_devices_setup(libxl__egc *egc, >> + libxl__checkpoint_devices_state *cds); >> + >> +void libxl__checkpoint_devices_setup(libxl__egc *egc, libxl__checkpoint_devices_state *cds) >> +{ >> + int i, rc; >> + >> + STATE_AO_GC(cds->ao); >> + >> + rc = init_device_subkind(cds); >> + if (rc) >> + goto out; >> + >> + cds->num_devices = 0; >> + cds->num_nics = 0; >> + cds->num_disks = 0; >> + >> + if (cds->device_kind_flags & (1 << LIBXL__DEVICE_KIND_VIF)) >> + cds->nics = libxl_device_nic_list(CTX, cds->domid, &cds->num_nics); >> + >> + if (cds->device_kind_flags & (1 << LIBXL__DEVICE_KIND_VBD)) >> + cds->disks = libxl_device_disk_list(CTX, cds->domid, &cds->num_disks); >> + >> + if (cds->num_nics == 0 && cds->num_disks == 0) >> + goto out; >> + >> + GCNEW_ARRAY(cds->devs, cds->num_nics + cds->num_disks); >> + >> + for (i = 0; i < cds->num_nics; i++) { >> + cds->devs[cds->num_devices++] = checkpoint_device_init(egc, cds, >> + LIBXL__DEVICE_KIND_VIF, >> + &cds->nics[i]); >> + } >> + >> + for (i = 0; i < cds->num_disks; i++) { >> + cds->devs[cds->num_devices++] = checkpoint_device_init(egc, cds, >> + LIBXL__DEVICE_KIND_VBD, >> + &cds->disks[i]); >> + } >> + >> + checkpoint_devices_setup(egc, cds); >> + >> + return; >> + >> +out: >> + cds->callback(egc, cds, rc); >> +} >> + >> +static void checkpoint_devices_setup(libxl__egc *egc, >> + libxl__checkpoint_devices_state *cds) >> +{ >> + int i, rc; >> + >> + STATE_AO_GC(cds->ao); >> + >> + libxl__multidev_begin(ao, &cds->multidev); >> + cds->multidev.callback = all_devices_setup_cb; >> + for (i = 0; i < cds->num_devices; i++) { >> + libxl__checkpoint_device *dev = cds->devs[i]; >> + dev->ops_index = -1; >> + libxl__multidev_prepare_with_aodev(&cds->multidev, &dev->aodev); >> + >> + dev->aodev.rc = ERROR_CHECKPOINT_DEVICE_NOT_SUPPORTED; >> + dev->aodev.callback = device_setup_iterate; >> + device_setup_iterate(egc,&dev->aodev); >> + } >> + >> + rc = 0; >> + libxl__multidev_prepared(egc, &cds->multidev, rc); >> +} >> + >> + >> +static void device_setup_iterate(libxl__egc *egc, libxl__ao_device *aodev) >> +{ >> + libxl__checkpoint_device *dev = CONTAINER_OF(aodev, *dev, aodev); >> + EGC_GC; >> + >> + if (aodev->rc != ERROR_CHECKPOINT_DEVICE_NOT_SUPPORTED && >> + aodev->rc != ERROR_CHECKPOINT_DEVOPS_DOES_NOT_MATCH) >> + /* might be success or disaster */ >> + goto out; >> + >> + do { >> + dev->ops = remus_ops[++dev->ops_index]; >> + if (!dev->ops) { >> + libxl_device_nic * nic = NULL; >> + libxl_device_disk * disk = NULL; >> + uint32_t domid; >> + int devid; >> + if (dev->kind == LIBXL__DEVICE_KIND_VIF) { >> + nic = (libxl_device_nic *)dev->backend_dev; >> + domid = nic->backend_domid; >> + devid = nic->devid; >> + } else if (dev->kind == LIBXL__DEVICE_KIND_VBD) { >> + disk = (libxl_device_disk *)dev->backend_dev; >> + domid = disk->backend_domid; >> + devid = libxl__device_disk_dev_number(disk->vdev, NULL, NULL); >> + } else { >> + LOG(ERROR,"device kind not handled by checkpoint: %s", >> + libxl__device_kind_to_string(dev->kind)); >> + aodev->rc = ERROR_FAIL; >> + goto out; >> + } >> + LOG(ERROR,"device not handled by checkpoint" >> + " (device=%s:%"PRId32"/%"PRId32")", >> + libxl__device_kind_to_string(dev->kind), >> + domid, devid); >> + aodev->rc = ERROR_CHECKPOINT_DEVICE_NOT_SUPPORTED; >> + goto out; >> + } >> + } while (dev->ops->kind != dev->kind); >> + >> + /* found the next ops_index to try */ >> + assert(dev->aodev.callback == device_setup_iterate); >> + dev->ops->setup(egc,dev); >> + return; >> + >> + out: >> + libxl__multidev_one_callback(egc,aodev); >> +} >> + >> +static void all_devices_setup_cb(libxl__egc *egc, >> + libxl__multidev *multidev, >> + int rc) >> +{ >> + STATE_AO_GC(multidev->ao); >> + >> + /* Convenience aliases */ >> + libxl__checkpoint_devices_state *const cds = >> + CONTAINER_OF(multidev, *cds, multidev); >> + >> + cds->callback(egc, cds, rc); >> +} >> + >> +void libxl__checkpoint_devices_teardown(libxl__egc *egc, >> + libxl__checkpoint_devices_state *cds) >> +{ >> + int i; >> + libxl__checkpoint_device *dev; >> + >> + STATE_AO_GC(cds->ao); >> + >> + libxl__multidev_begin(ao, &cds->multidev); >> + cds->multidev.callback = devices_teardown_cb; >> + for (i = 0; i < cds->num_devices; i++) { >> + dev = cds->devs[i]; >> + if (!dev->ops || !dev->matched) >> + continue; >> + >> + libxl__multidev_prepare_with_aodev(&cds->multidev, &dev->aodev); >> + dev->ops->teardown(egc,dev); >> + } >> + >> + libxl__multidev_prepared(egc, &cds->multidev, 0); >> +} >> + >> +static void devices_teardown_cb(libxl__egc *egc, >> + libxl__multidev *multidev, >> + int rc) >> +{ >> + int i; >> + >> + STATE_AO_GC(multidev->ao); >> + >> + /* Convenience aliases */ >> + libxl__checkpoint_devices_state *const cds = >> + CONTAINER_OF(multidev, *cds, multidev); >> + >> + /* clean nic */ >> + for (i = 0; i < cds->num_nics; i++) >> + libxl_device_nic_dispose(&cds->nics[i]); >> + free(cds->nics); >> + cds->nics = NULL; >> + cds->num_nics = 0; >> + >> + /* clean disk */ >> + for (i = 0; i < cds->num_disks; i++) >> + libxl_device_disk_dispose(&cds->disks[i]); >> + free(cds->disks); >> + cds->disks = NULL; >> + cds->num_disks = 0; >> + >> + cleanup_device_subkind(cds); >> + >> + cds->callback(egc, cds, rc); >> +} >> + >> +/*----- checkpointing APIs -----*/ >> + >> +/* callbacks */ >> + >> +static void devices_checkpoint_cb(libxl__egc *egc, >> + libxl__multidev *multidev, >> + int rc); >> + >> +/* API implementations */ >> + >> +#define define_checkpoint_api(api) \ >> +void libxl__checkpoint_devices_##api(libxl__egc *egc, \ >> + libxl__checkpoint_devices_state *cds) \ >> +{ \ >> + int i; \ >> + libxl__checkpoint_device *dev; \ >> + \ >> + STATE_AO_GC(cds->ao); \ >> + \ >> + libxl__multidev_begin(ao, &cds->multidev); \ >> + cds->multidev.callback = devices_checkpoint_cb; \ >> + for (i = 0; i < cds->num_devices; i++) { \ >> + dev = cds->devs[i]; \ >> + if (!dev->matched || !dev->ops->api) \ >> + continue; \ >> + libxl__multidev_prepare_with_aodev(&cds->multidev, &dev->aodev);\ >> + dev->ops->api(egc,dev); \ >> + } \ >> + \ >> + libxl__multidev_prepared(egc, &cds->multidev, 0); \ >> +} >> + >> +define_checkpoint_api(postsuspend); >> + >> +define_checkpoint_api(preresume); >> + >> +define_checkpoint_api(commit); >> + >> +static void devices_checkpoint_cb(libxl__egc *egc, >> + libxl__multidev *multidev, >> + int rc) >> +{ >> + STATE_AO_GC(multidev->ao); >> + >> + /* Convenience aliases */ >> + libxl__checkpoint_devices_state *const cds = >> + CONTAINER_OF(multidev, *cds, multidev); >> + >> + cds->callback(egc, cds, rc); >> +} >> diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h >> index bd369f2..ae3b964 100644 >> --- a/tools/libxl/libxl_internal.h >> +++ b/tools/libxl/libxl_internal.h >> @@ -2651,9 +2651,9 @@ typedef struct libxl__save_helper_state { >> * marshalling and xc callback functions */ >> } libxl__save_helper_state; >> >> -/*----- remus device related state structure -----*/ >> +/*----- checkpoint device related state structure -----*/ >> /* >> - * The abstract Remus device layer exposes a common >> + * The abstract checkpoint device layer exposes a common >> * set of API to [external] libxl for manipulating devices attached to >> * a guest protected by Remus. The device layer also exposes a set of >> * [internal] interfaces that every device type must implement. >> @@ -2661,34 +2661,34 @@ typedef struct libxl__save_helper_state { >> * The following API are exposed to libxl: >> * >> * One-time configuration operations: >> - * +libxl__remus_devices_setup >> + * +libxl__checkpoint_devices_setup >> * > Enable output buffering for NICs, setup disk replication, etc. >> - * +libxl__remus_devices_teardown >> + * +libxl__checkpoint_devices_teardown >> * > Disable output buffering and disk replication; teardown any >> * associated external setups like qdiscs for NICs. >> * >> * Operations executed every checkpoint (in order of invocation): >> - * +libxl__remus_devices_postsuspend >> - * +libxl__remus_devices_preresume >> - * +libxl__remus_devices_commit >> + * +libxl__checkpoint_devices_postsuspend >> + * +libxl__checkpoint_devices_preresume >> + * +libxl__checkpoint_devices_commit >> * >> * Each device type needs to implement the interfaces specified in >> - * the libxl__remus_device_instance_ops if it wishes to support Remus. >> + * the libxl__checkpoint_device_instance_ops if it wishes to support Remus. >> * >> - * The high-level control flow through the Remus device layer is shown below: >> + * The high-level control flow through the checkpoint device layer is shown below: >> * >> * xl remus >> * |-> libxl_domain_remus_start >> - * |-> libxl__remus_devices_setup >> - * |-> Per-checkpoint libxl__remus_devices_[postsuspend,preresume,commit] >> + * |-> libxl__checkpoint_devices_setup >> + * |-> Per-checkpoint libxl__checkpoint_devices_[postsuspend,preresume,commit] >> * ... >> * |-> On backup failure, network error or other internal errors: >> - * libxl__remus_devices_teardown >> + * libxl__checkpoint_devices_teardown >> */ >> >> -typedef struct libxl__remus_device libxl__remus_device; >> -typedef struct libxl__remus_devices_state libxl__remus_devices_state; >> -typedef struct libxl__remus_device_instance_ops libxl__remus_device_instance_ops; >> +typedef struct libxl__checkpoint_device libxl__checkpoint_device; >> +typedef struct libxl__checkpoint_devices_state libxl__checkpoint_devices_state; >> +typedef struct libxl__checkpoint_device_instance_ops libxl__checkpoint_device_instance_ops; >> >> /* >> * Interfaces to be implemented by every device subkind that wishes to >> @@ -2698,7 +2698,7 @@ typedef struct libxl__remus_device_instance_ops libxl__remus_device_instance_ops >> * synchronous and call dev->aodev.callback directly (as the last >> * thing they do). >> */ >> -struct libxl__remus_device_instance_ops { >> +struct libxl__checkpoint_device_instance_ops { >> /* the device kind this ops belongs to... */ >> libxl__device_kind kind; >> >> @@ -2709,12 +2709,12 @@ struct libxl__remus_device_instance_ops { >> * Asynchronous. >> */ >> >> - void (*postsuspend)(libxl__egc *egc, libxl__remus_device *dev); >> - void (*preresume)(libxl__egc *egc, libxl__remus_device *dev); >> - void (*commit)(libxl__egc *egc, libxl__remus_device *dev); >> + void (*postsuspend)(libxl__egc *egc, libxl__checkpoint_device *dev); >> + void (*preresume)(libxl__egc *egc, libxl__checkpoint_device *dev); >> + void (*commit)(libxl__egc *egc, libxl__checkpoint_device *dev); >> >> /* >> - * setup() and teardown() are refer to the actual remus device. >> + * setup() and teardown() are refer to the actual checkpoint device. >> * Asynchronous. >> * teardown is called even if setup fails. >> */ >> @@ -2723,45 +2723,45 @@ struct libxl__remus_device_instance_ops { >> * device. If matched, the device will then be managed with this set of >> * subkind operations. >> * Yields 0 if the device successfully set up. >> - * REMUS_DEVOPS_DOES_NOT_MATCH if the ops does not match the device. >> + * CHECKPOINT_DEVOPS_DOES_NOT_MATCH if the ops does not match the device. >> * any other rc indicates failure. >> */ >> - void (*setup)(libxl__egc *egc, libxl__remus_device *dev); >> - void (*teardown)(libxl__egc *egc, libxl__remus_device *dev); >> + void (*setup)(libxl__egc *egc, libxl__checkpoint_device *dev); >> + void (*teardown)(libxl__egc *egc, libxl__checkpoint_device *dev); >> }; >> >> -int init_subkind_nic(libxl__remus_devices_state *rds); >> -void cleanup_subkind_nic(libxl__remus_devices_state *rds); >> -int init_subkind_drbd_disk(libxl__remus_devices_state *rds); >> -void cleanup_subkind_drbd_disk(libxl__remus_devices_state *rds); >> +int init_subkind_nic(libxl__checkpoint_devices_state *cds); >> +void cleanup_subkind_nic(libxl__checkpoint_devices_state *cds); >> +int init_subkind_drbd_disk(libxl__checkpoint_devices_state *cds); >> +void cleanup_subkind_drbd_disk(libxl__checkpoint_devices_state *cds); >> >> -typedef void libxl__remus_callback(libxl__egc *, >> - libxl__remus_devices_state *, int rc); >> +typedef void libxl__checkpoint_callback(libxl__egc *, >> + libxl__checkpoint_devices_state *, int rc); >> >> /* >> - * State associated with a remus invocation, including parameters >> - * passed to the remus abstract device layer by the remus >> + * State associated with a checkpoint invocation, including parameters >> + * passed to the checkpoint abstract device layer by the remus >> * save/restore machinery. >> */ >> -struct libxl__remus_devices_state { >> - /*---- must be set by caller of libxl__remus_device_(setup|teardown) ----*/ >> +struct libxl__checkpoint_devices_state { >> + /*---- must be set by caller of libxl__checkpoint_device_(setup|teardown) ----*/ >> >> libxl__ao *ao; >> uint32_t domid; >> - libxl__remus_callback *callback; >> + libxl__checkpoint_callback *callback; >> int device_kind_flags; >> >> /*----- private for abstract layer only -----*/ >> >> int num_devices; >> /* >> - * this array is allocated before setup the remus devices by the >> - * remus abstract layer. >> - * devs may be NULL, means there's no remus devices that has been set up. >> + * this array is allocated before setup the checkpoint devices by the >> + * checkpoint abstract layer. >> + * devs may be NULL, means there's no checkpoint devices that has been set up. >> * the size of this array is 'num_devices', which is the total number >> * of libxl nic devices and disk devices(num_nics + num_disks). >> */ >> - libxl__remus_device **devs; >> + libxl__checkpoint_device **devs; >> >> libxl_device_nic *nics; >> int num_nics; >> @@ -2783,20 +2783,20 @@ struct libxl__remus_devices_state { >> >> /* >> * Information about a single device being handled by remus. >> - * Allocated by the remus abstract layer. >> + * Allocated by the checkpoint abstract layer. >> */ >> -struct libxl__remus_device { >> +struct libxl__checkpoint_device { >> /*----- shared between abstract and concrete layers -----*/ >> /* >> * if this is true, that means the subkind ops match the device >> */ >> bool matched; >> >> - /*----- set by remus device abstruct layer -----*/ >> - /* libxl__device_* which this remus device related to */ >> + /*----- set by checkpoint device abstruct layer -----*/ >> + /* libxl__device_* which this checkpoint device related to */ >> const void *backend_dev; >> libxl__device_kind kind; >> - libxl__remus_devices_state *rds; >> + libxl__checkpoint_devices_state *cds; >> libxl__ao_device aodev; >> >> /*----- private for abstract layer only -----*/ >> @@ -2807,7 +2807,7 @@ struct libxl__remus_device { >> * individual devices. >> */ >> int ops_index; >> - const libxl__remus_device_instance_ops *ops; >> + const libxl__checkpoint_device_instance_ops *ops; >> >> /*----- private for concrete (device-specific) layer -----*/ >> >> @@ -2815,17 +2815,17 @@ struct libxl__remus_device { >> void *concrete_data; >> }; >> >> -/* the following 5 APIs are async ops, call rds->callback when done */ >> -_hidden void libxl__remus_devices_setup(libxl__egc *egc, >> - libxl__remus_devices_state *rds); >> -_hidden void libxl__remus_devices_teardown(libxl__egc *egc, >> - libxl__remus_devices_state *rds); >> -_hidden void libxl__remus_devices_postsuspend(libxl__egc *egc, >> - libxl__remus_devices_state *rds); >> -_hidden void libxl__remus_devices_preresume(libxl__egc *egc, >> - libxl__remus_devices_state *rds); >> -_hidden void libxl__remus_devices_commit(libxl__egc *egc, >> - libxl__remus_devices_state *rds); >> +/* the following 5 APIs are async ops, call cds->callback when done */ >> +_hidden void libxl__checkpoint_devices_setup(libxl__egc *egc, >> + libxl__checkpoint_devices_state *cds); >> +_hidden void libxl__checkpoint_devices_teardown(libxl__egc *egc, >> + libxl__checkpoint_devices_state *cds); >> +_hidden void libxl__checkpoint_devices_postsuspend(libxl__egc *egc, >> + libxl__checkpoint_devices_state *cds); >> +_hidden void libxl__checkpoint_devices_preresume(libxl__egc *egc, >> + libxl__checkpoint_devices_state *cds); >> +_hidden void libxl__checkpoint_devices_commit(libxl__egc *egc, >> + libxl__checkpoint_devices_state *cds); >> _hidden int libxl__netbuffer_enabled(libxl__gc *gc); >> >> /*----- Legacy conversion helper -----*/ >> @@ -2959,7 +2959,7 @@ struct libxl__domain_save_state { >> libxl__domain_suspend_state dsps; >> int hvm; >> int xcflags; >> - libxl__remus_devices_state rds; >> + libxl__checkpoint_devices_state cds; >> libxl__ev_time checkpoint_timeout; /* used for Remus checkpoint */ >> int interval; /* checkpoint interval (for Remus) */ >> libxl__save_helper_state shs; >> diff --git a/tools/libxl/libxl_netbuffer.c b/tools/libxl/libxl_netbuffer.c >> index 71c6531..86afba6 100644 >> --- a/tools/libxl/libxl_netbuffer.c >> +++ b/tools/libxl/libxl_netbuffer.c >> @@ -38,21 +38,21 @@ int libxl__netbuffer_enabled(libxl__gc *gc) >> return 1; >> } >> >> -int init_subkind_nic(libxl__remus_devices_state *rds) >> +int init_subkind_nic(libxl__checkpoint_devices_state *cds) >> { >> int rc, ret; >> - libxl__domain_save_state *dss = CONTAINER_OF(rds, *dss, rds); >> + libxl__domain_save_state *dss = CONTAINER_OF(cds, *dss, cds); >> >> - STATE_AO_GC(rds->ao); >> + STATE_AO_GC(cds->ao); >> >> - rds->nlsock = nl_socket_alloc(); >> - if (!rds->nlsock) { >> + cds->nlsock = nl_socket_alloc(); >> + if (!cds->nlsock) { >> LOG(ERROR, "cannot allocate nl socket"); >> rc = ERROR_FAIL; >> goto out; >> } >> >> - ret = nl_connect(rds->nlsock, NETLINK_ROUTE); >> + ret = nl_connect(cds->nlsock, NETLINK_ROUTE); >> if (ret) { >> LOG(ERROR, "failed to open netlink socket: %s", >> nl_geterror(ret)); >> @@ -61,7 +61,7 @@ int init_subkind_nic(libxl__remus_devices_state *rds) >> } >> >> /* get list of all qdiscs installed on network devs. */ >> - ret = rtnl_qdisc_alloc_cache(rds->nlsock, &rds->qdisc_cache); >> + ret = rtnl_qdisc_alloc_cache(cds->nlsock, &cds->qdisc_cache); >> if (ret) { >> LOG(ERROR, "failed to allocate qdisc cache: %s", >> nl_geterror(ret)); >> @@ -70,9 +70,9 @@ int init_subkind_nic(libxl__remus_devices_state *rds) >> } >> >> if (dss->remus->netbufscript) { >> - rds->netbufscript = libxl__strdup(gc, dss->remus->netbufscript); >> + cds->netbufscript = libxl__strdup(gc, dss->remus->netbufscript); >> } else { >> - rds->netbufscript = GCSPRINTF("%s/remus-netbuf-setup", >> + cds->netbufscript = GCSPRINTF("%s/remus-netbuf-setup", >> libxl__xen_script_dir_path()); >> } >> >> @@ -82,22 +82,22 @@ out: >> return rc; >> } >> >> -void cleanup_subkind_nic(libxl__remus_devices_state *rds) >> +void cleanup_subkind_nic(libxl__checkpoint_devices_state *cds) >> { >> - STATE_AO_GC(rds->ao); >> + STATE_AO_GC(cds->ao); >> >> /* free qdisc cache */ >> - if (rds->qdisc_cache) { >> - nl_cache_clear(rds->qdisc_cache); >> - nl_cache_free(rds->qdisc_cache); >> - rds->qdisc_cache = NULL; >> + if (cds->qdisc_cache) { >> + nl_cache_clear(cds->qdisc_cache); >> + nl_cache_free(cds->qdisc_cache); >> + cds->qdisc_cache = NULL; >> } >> >> /* close & free nlsock */ >> - if (rds->nlsock) { >> - nl_close(rds->nlsock); >> - nl_socket_free(rds->nlsock); >> - rds->nlsock = NULL; >> + if (cds->nlsock) { >> + nl_close(cds->nlsock); >> + nl_socket_free(cds->nlsock); >> + cds->nlsock = NULL; >> } >> } >> >> @@ -111,17 +111,17 @@ void cleanup_subkind_nic(libxl__remus_devices_state *rds) >> * it must ONLY be used for remus because if driver domains >> * were in use it would constitute a security vulnerability. >> */ >> -static const char *get_vifname(libxl__remus_device *dev, >> +static const char *get_vifname(libxl__checkpoint_device *dev, >> const libxl_device_nic *nic) >> { >> const char *vifname = NULL; >> const char *path; >> int rc; >> >> - STATE_AO_GC(dev->rds->ao); >> + STATE_AO_GC(dev->cds->ao); >> >> /* Convenience aliases */ >> - const uint32_t domid = dev->rds->domid; >> + const uint32_t domid = dev->cds->domid; >> >> path = GCSPRINTF("%s/backend/vif/%d/%d/vifname", >> libxl__xs_get_dompath(gc, 0), domid, nic->devid); >> @@ -144,19 +144,19 @@ static void free_qdisc(libxl__remus_device_nic *remus_nic) >> remus_nic->qdisc = NULL; >> } >> >> -static int init_qdisc(libxl__remus_devices_state *rds, >> +static int init_qdisc(libxl__checkpoint_devices_state *cds, >> libxl__remus_device_nic *remus_nic) >> { >> int rc, ret, ifindex; >> struct rtnl_link *ifb = NULL; >> struct rtnl_qdisc *qdisc = NULL; >> >> - STATE_AO_GC(rds->ao); >> + STATE_AO_GC(cds->ao); >> >> /* Now that we have brought up REMUS_IFB device with plug qdisc for >> * this vif, so we need to refill the qdisc cache. >> */ >> - ret = nl_cache_refill(rds->nlsock, rds->qdisc_cache); >> + ret = nl_cache_refill(cds->nlsock, cds->qdisc_cache); >> if (ret) { >> LOG(ERROR, "cannot refill qdisc cache: %s", nl_geterror(ret)); >> rc = ERROR_FAIL; >> @@ -164,7 +164,7 @@ static int init_qdisc(libxl__remus_devices_state *rds, >> } >> >> /* get a handle to the REMUS_IFB interface */ >> - ret = rtnl_link_get_kernel(rds->nlsock, 0, remus_nic->ifb, &ifb); >> + ret = rtnl_link_get_kernel(cds->nlsock, 0, remus_nic->ifb, &ifb); >> if (ret) { >> LOG(ERROR, "cannot obtain handle for %s: %s", remus_nic->ifb, >> nl_geterror(ret)); >> @@ -187,7 +187,7 @@ static int init_qdisc(libxl__remus_devices_state *rds, >> * There is no need to explicitly free this qdisc as its just a >> * reference from the qdisc cache we allocated earlier. >> */ >> - qdisc = rtnl_qdisc_get_by_parent(rds->qdisc_cache, ifindex, TC_H_ROOT); >> + qdisc = rtnl_qdisc_get_by_parent(cds->qdisc_cache, ifindex, TC_H_ROOT); >> if (qdisc) { >> const char *tc_kind = rtnl_tc_get_kind(TC_CAST(qdisc)); >> /* Sanity check: Ensure that the root qdisc is a plug qdisc. */ >> @@ -231,19 +231,19 @@ static void netbuf_teardown_script_cb(libxl__egc *egc, >> * $REMUS_IFB (for teardown) >> * setup/teardown as command line arg. >> */ >> -static void setup_async_exec(libxl__remus_device *dev, char *op) >> +static void setup_async_exec(libxl__checkpoint_device *dev, char *op) >> { >> int arraysize, nr = 0; >> char **env = NULL, **args = NULL; >> libxl__remus_device_nic *remus_nic = dev->concrete_data; >> - libxl__remus_devices_state *rds = dev->rds; >> + libxl__checkpoint_devices_state *cds = dev->cds; >> libxl__async_exec_state *aes = &dev->aodev.aes; >> >> - STATE_AO_GC(rds->ao); >> + STATE_AO_GC(cds->ao); >> >> /* Convenience aliases */ >> - char *const script = libxl__strdup(gc, rds->netbufscript); >> - const uint32_t domid = rds->domid; >> + char *const script = libxl__strdup(gc, cds->netbufscript); >> + const uint32_t domid = cds->domid; >> const int dev_id = remus_nic->devid; >> const char *const vif = remus_nic->vif; >> const char *const ifb = remus_nic->ifb; >> @@ -269,7 +269,7 @@ static void setup_async_exec(libxl__remus_device *dev, char *op) >> args[nr++] = NULL; >> assert(nr == arraysize); >> >> - aes->ao = dev->rds->ao; >> + aes->ao = dev->cds->ao; >> aes->what = GCSPRINTF("%s %s", args[0], args[1]); >> aes->env = env; >> aes->args = args; >> @@ -286,13 +286,13 @@ static void setup_async_exec(libxl__remus_device *dev, char *op) >> >> /* setup() and teardown() */ >> >> -static void nic_setup(libxl__egc *egc, libxl__remus_device *dev) >> +static void nic_setup(libxl__egc *egc, libxl__checkpoint_device *dev) >> { >> int rc; >> libxl__remus_device_nic *remus_nic; >> const libxl_device_nic *nic = dev->backend_dev; >> >> - STATE_AO_GC(dev->rds->ao); >> + STATE_AO_GC(dev->cds->ao); >> >> /* >> * thers's no subkind of nic devices, so nic ops is always matched >> @@ -330,16 +330,16 @@ static void netbuf_setup_script_cb(libxl__egc *egc, >> int status) >> { >> libxl__ao_device *aodev = CONTAINER_OF(aes, *aodev, aes); >> - libxl__remus_device *dev = CONTAINER_OF(aodev, *dev, aodev); >> + libxl__checkpoint_device *dev = CONTAINER_OF(aodev, *dev, aodev); >> libxl__remus_device_nic *remus_nic = dev->concrete_data; >> - libxl__remus_devices_state *rds = dev->rds; >> + libxl__checkpoint_devices_state *cds = dev->cds; >> const char *out_path_base, *hotplug_error = NULL; >> int rc; >> >> - STATE_AO_GC(rds->ao); >> + STATE_AO_GC(cds->ao); >> >> /* Convenience aliases */ >> - const uint32_t domid = rds->domid; >> + const uint32_t domid = cds->domid; >> const int devid = remus_nic->devid; >> const char *const vif = remus_nic->vif; >> const char **const ifb = &remus_nic->ifb; >> @@ -373,7 +373,7 @@ static void netbuf_setup_script_cb(libxl__egc *egc, >> >> if (hotplug_error) { >> LOG(ERROR, "netbuf script %s setup failed for vif %s: %s", >> - rds->netbufscript, vif, hotplug_error); >> + cds->netbufscript, vif, hotplug_error); >> rc = ERROR_FAIL; >> goto out; >> } >> @@ -384,17 +384,17 @@ static void netbuf_setup_script_cb(libxl__egc *egc, >> } >> >> LOG(DEBUG, "%s will buffer packets from vif %s", *ifb, vif); >> - rc = init_qdisc(rds, remus_nic); >> + rc = init_qdisc(cds, remus_nic); >> >> out: >> aodev->rc = rc; >> aodev->callback(egc, aodev); >> } >> >> -static void nic_teardown(libxl__egc *egc, libxl__remus_device *dev) >> +static void nic_teardown(libxl__egc *egc, libxl__checkpoint_device *dev) >> { >> int rc; >> - STATE_AO_GC(dev->rds->ao); >> + STATE_AO_GC(dev->cds->ao); >> >> setup_async_exec(dev, "teardown"); >> >> @@ -415,7 +415,7 @@ static void netbuf_teardown_script_cb(libxl__egc *egc, >> { >> int rc; >> libxl__ao_device *aodev = CONTAINER_OF(aes, *aodev, aes); >> - libxl__remus_device *dev = CONTAINER_OF(aodev, *dev, aodev); >> + libxl__checkpoint_device *dev = CONTAINER_OF(aodev, *dev, aodev); >> libxl__remus_device_nic *remus_nic = dev->concrete_data; >> >> if (status) >> @@ -440,12 +440,12 @@ enum { >> /* API implementations */ >> >> static int remus_netbuf_op(libxl__remus_device_nic *remus_nic, >> - libxl__remus_devices_state *rds, >> + libxl__checkpoint_devices_state *cds, >> int buffer_op) >> { >> int rc, ret; >> >> - STATE_AO_GC(rds->ao); >> + STATE_AO_GC(cds->ao); >> >> if (buffer_op == tc_buffer_start) >> ret = rtnl_qdisc_plug_buffer(remus_nic->qdisc); >> @@ -457,7 +457,7 @@ static int remus_netbuf_op(libxl__remus_device_nic *remus_nic, >> goto out; >> } >> >> - ret = rtnl_qdisc_add(rds->nlsock, remus_nic->qdisc, NLM_F_REQUEST); >> + ret = rtnl_qdisc_add(cds->nlsock, remus_nic->qdisc, NLM_F_REQUEST); >> if (ret) { >> rc = ERROR_FAIL; >> goto out; >> @@ -474,33 +474,33 @@ out: >> return rc; >> } >> >> -static void nic_postsuspend(libxl__egc *egc, libxl__remus_device *dev) >> +static void nic_postsuspend(libxl__egc *egc, libxl__checkpoint_device *dev) >> { >> int rc; >> libxl__remus_device_nic *remus_nic = dev->concrete_data; >> >> - STATE_AO_GC(dev->rds->ao); >> + STATE_AO_GC(dev->cds->ao); >> >> - rc = remus_netbuf_op(remus_nic, dev->rds, tc_buffer_start); >> + rc = remus_netbuf_op(remus_nic, dev->cds, tc_buffer_start); >> >> dev->aodev.rc = rc; >> dev->aodev.callback(egc, &dev->aodev); >> } >> >> -static void nic_commit(libxl__egc *egc, libxl__remus_device *dev) >> +static void nic_commit(libxl__egc *egc, libxl__checkpoint_device *dev) >> { >> int rc; >> libxl__remus_device_nic *remus_nic = dev->concrete_data; >> >> - STATE_AO_GC(dev->rds->ao); >> + STATE_AO_GC(dev->cds->ao); >> >> - rc = remus_netbuf_op(remus_nic, dev->rds, tc_buffer_release); >> + rc = remus_netbuf_op(remus_nic, dev->cds, tc_buffer_release); >> >> dev->aodev.rc = rc; >> dev->aodev.callback(egc, &dev->aodev); >> } >> >> -const libxl__remus_device_instance_ops remus_device_nic = { >> +const libxl__checkpoint_device_instance_ops remus_device_nic = { >> .kind = LIBXL__DEVICE_KIND_VIF, >> .setup = nic_setup, >> .teardown = nic_teardown, >> diff --git a/tools/libxl/libxl_nonetbuffer.c b/tools/libxl/libxl_nonetbuffer.c >> index 3c659c2..4b68152 100644 >> --- a/tools/libxl/libxl_nonetbuffer.c >> +++ b/tools/libxl/libxl_nonetbuffer.c >> @@ -22,25 +22,25 @@ int libxl__netbuffer_enabled(libxl__gc *gc) >> return 0; >> } >> >> -int init_subkind_nic(libxl__remus_devices_state *rds) >> +int init_subkind_nic(libxl__checkpoint_devices_state *cds) >> { >> return 0; >> } >> >> -void cleanup_subkind_nic(libxl__remus_devices_state *rds) >> +void cleanup_subkind_nic(libxl__checkpoint_devices_state *cds) >> { >> return; >> } >> >> -static void nic_setup(libxl__egc *egc, libxl__remus_device *dev) >> +static void nic_setup(libxl__egc *egc, libxl__checkpoint_device *dev) >> { >> - STATE_AO_GC(dev->rds->ao); >> + STATE_AO_GC(dev->cds->ao); >> >> dev->aodev.rc = ERROR_FAIL; >> dev->aodev.callback(egc, &dev->aodev); >> } >> >> -const libxl__remus_device_instance_ops remus_device_nic = { >> +const libxl__checkpoint_device_instance_ops remus_device_nic = { >> .kind = LIBXL__DEVICE_KIND_VIF, >> .setup = nic_setup, >> }; >> diff --git a/tools/libxl/libxl_remus.c b/tools/libxl/libxl_remus.c >> index 0c449ad..fe4acc8 100644 >> --- a/tools/libxl/libxl_remus.c >> +++ b/tools/libxl/libxl_remus.c >> @@ -20,14 +20,14 @@ >> /*----- Remus setup and teardown -----*/ >> >> static void remus_setup_done(libxl__egc *egc, >> - libxl__remus_devices_state *rds, int rc); >> + libxl__checkpoint_devices_state *cds, int rc); >> static void remus_setup_failed(libxl__egc *egc, >> - libxl__remus_devices_state *rds, int rc); >> + libxl__checkpoint_devices_state *cds, int rc); >> >> void libxl__remus_setup(libxl__egc *egc, libxl__domain_save_state *dss) >> { >> /* Convenience aliases */ >> - libxl__remus_devices_state *const rds = &dss->rds; >> + libxl__checkpoint_devices_state *const cds = &dss->cds; >> const libxl_domain_remus_info *const info = dss->remus; >> >> STATE_AO_GC(dss->ao); >> @@ -37,17 +37,17 @@ void libxl__remus_setup(libxl__egc *egc, libxl__domain_save_state *dss) >> LOG(ERROR, "Remus: No support for network buffering"); >> goto out; >> } >> - rds->device_kind_flags |= (1 << LIBXL__DEVICE_KIND_VIF); >> + cds->device_kind_flags |= (1 << LIBXL__DEVICE_KIND_VIF); >> } >> >> if (libxl_defbool_val(info->diskbuf)) >> - rds->device_kind_flags |= (1 << LIBXL__DEVICE_KIND_VBD); >> + cds->device_kind_flags |= (1 << LIBXL__DEVICE_KIND_VBD); >> >> - rds->ao = ao; >> - rds->domid = dss->domid; >> - rds->callback = remus_setup_done; >> + cds->ao = ao; >> + cds->domid = dss->domid; >> + cds->callback = remus_setup_done; >> >> - libxl__remus_devices_setup(egc, rds); >> + libxl__checkpoint_devices_setup(egc, cds); >> return; >> >> out: >> @@ -55,9 +55,9 @@ out: >> } >> >> static void remus_setup_done(libxl__egc *egc, >> - libxl__remus_devices_state *rds, int rc) >> + libxl__checkpoint_devices_state *cds, int rc) >> { >> - libxl__domain_save_state *dss = CONTAINER_OF(rds, *dss, rds); >> + libxl__domain_save_state *dss = CONTAINER_OF(cds, *dss, cds); >> STATE_AO_GC(dss->ao); >> >> if (!rc) { >> @@ -67,14 +67,14 @@ static void remus_setup_done(libxl__egc *egc, >> >> LOG(ERROR, "Remus: failed to setup device for guest with domid %u, rc %d", >> dss->domid, rc); >> - rds->callback = remus_setup_failed; >> - libxl__remus_devices_teardown(egc, rds); >> + cds->callback = remus_setup_failed; >> + libxl__checkpoint_devices_teardown(egc, cds); >> } >> >> static void remus_setup_failed(libxl__egc *egc, >> - libxl__remus_devices_state *rds, int rc) >> + libxl__checkpoint_devices_state *cds, int rc) >> { >> - libxl__domain_save_state *dss = CONTAINER_OF(rds, *dss, rds); >> + libxl__domain_save_state *dss = CONTAINER_OF(cds, *dss, cds); >> STATE_AO_GC(dss->ao); >> >> if (rc) >> @@ -85,7 +85,7 @@ static void remus_setup_failed(libxl__egc *egc, >> } >> >> static void remus_teardown_done(libxl__egc *egc, >> - libxl__remus_devices_state *rds, >> + libxl__checkpoint_devices_state *cds, >> int rc); >> void libxl__remus_teardown(libxl__egc *egc, >> libxl__domain_save_state *dss, >> @@ -95,15 +95,15 @@ void libxl__remus_teardown(libxl__egc *egc, >> >> LOG(WARN, "Remus: Domain suspend terminated with rc %d," >> " teardown Remus devices...", rc); >> - dss->rds.callback = remus_teardown_done; >> - libxl__remus_devices_teardown(egc, &dss->rds); >> + dss->cds.callback = remus_teardown_done; >> + libxl__checkpoint_devices_teardown(egc, &dss->cds); >> } >> >> static void remus_teardown_done(libxl__egc *egc, >> - libxl__remus_devices_state *rds, >> + libxl__checkpoint_devices_state *cds, >> int rc) >> { >> - libxl__domain_save_state *dss = CONTAINER_OF(rds, *dss, rds); >> + libxl__domain_save_state *dss = CONTAINER_OF(cds, *dss, cds); >> STATE_AO_GC(dss->ao); >> >> if (rc) >> @@ -118,10 +118,10 @@ static void remus_teardown_done(libxl__egc *egc, >> static void remus_domain_suspend_callback_common_done(libxl__egc *egc, >> libxl__domain_suspend_state *dsps, int ok); >> static void remus_devices_postsuspend_cb(libxl__egc *egc, >> - libxl__remus_devices_state *rds, >> + libxl__checkpoint_devices_state *cds, >> int rc); >> static void remus_devices_preresume_cb(libxl__egc *egc, >> - libxl__remus_devices_state *rds, >> + libxl__checkpoint_devices_state *cds, >> int rc); >> >> void libxl__remus_domain_suspend_callback(void *data) >> @@ -143,9 +143,9 @@ static void remus_domain_suspend_callback_common_done(libxl__egc *egc, >> if (!ok) >> goto out; >> >> - libxl__remus_devices_state *const rds = &dss->rds; >> - rds->callback = remus_devices_postsuspend_cb; >> - libxl__remus_devices_postsuspend(egc, rds); >> + libxl__checkpoint_devices_state *const cds = &dss->cds; >> + cds->callback = remus_devices_postsuspend_cb; >> + libxl__checkpoint_devices_postsuspend(egc, cds); >> return; >> >> out: >> @@ -153,11 +153,11 @@ out: >> } >> >> static void remus_devices_postsuspend_cb(libxl__egc *egc, >> - libxl__remus_devices_state *rds, >> + libxl__checkpoint_devices_state *cds, >> int rc) >> { >> int ok = 0; >> - libxl__domain_save_state *dss = CONTAINER_OF(rds, *dss, rds); >> + libxl__domain_save_state *dss = CONTAINER_OF(cds, *dss, cds); >> >> if (rc) >> goto out; >> @@ -175,17 +175,17 @@ void libxl__remus_domain_resume_callback(void *data) >> libxl__domain_save_state *dss = CONTAINER_OF(shs, *dss, shs); >> STATE_AO_GC(dss->ao); >> >> - libxl__remus_devices_state *const rds = &dss->rds; >> - rds->callback = remus_devices_preresume_cb; >> - libxl__remus_devices_preresume(egc, rds); >> + libxl__checkpoint_devices_state *const cds = &dss->cds; >> + cds->callback = remus_devices_preresume_cb; >> + libxl__checkpoint_devices_preresume(egc, cds); >> } >> >> static void remus_devices_preresume_cb(libxl__egc *egc, >> - libxl__remus_devices_state *rds, >> + libxl__checkpoint_devices_state *cds, >> int rc) >> { >> int ok = 0; >> - libxl__domain_save_state *dss = CONTAINER_OF(rds, *dss, rds); >> + libxl__domain_save_state *dss = CONTAINER_OF(cds, *dss, cds); >> STATE_AO_GC(dss->ao); >> >> if (rc) >> @@ -207,7 +207,7 @@ out: >> static void remus_checkpoint_stream_written( >> libxl__egc *egc, libxl__stream_write_state *stream, int rc); >> static void remus_devices_commit_cb(libxl__egc *egc, >> - libxl__remus_devices_state *rds, >> + libxl__checkpoint_devices_state *cds, >> int rc); >> static void remus_next_checkpoint(libxl__egc *egc, libxl__ev_time *ev, >> const struct timeval *requested_abs); >> @@ -229,7 +229,7 @@ static void remus_checkpoint_stream_written( >> libxl__domain_save_state *dss = CONTAINER_OF(stream, *dss, sws); >> >> /* Convenience aliases */ >> - libxl__remus_devices_state *const rds = &dss->rds; >> + libxl__checkpoint_devices_state *const cds = &dss->cds; >> >> STATE_AO_GC(dss->ao); >> >> @@ -238,8 +238,8 @@ static void remus_checkpoint_stream_written( >> goto out; >> } >> >> - rds->callback = remus_devices_commit_cb; >> - libxl__remus_devices_commit(egc, rds); >> + cds->callback = remus_devices_commit_cb; >> + libxl__checkpoint_devices_commit(egc, cds); >> >> return; >> >> @@ -248,10 +248,10 @@ out: >> } >> >> static void remus_devices_commit_cb(libxl__egc *egc, >> - libxl__remus_devices_state *rds, >> + libxl__checkpoint_devices_state *cds, >> int rc) >> { >> - libxl__domain_save_state *dss = CONTAINER_OF(rds, *dss, rds); >> + libxl__domain_save_state *dss = CONTAINER_OF(cds, *dss, cds); >> >> STATE_AO_GC(dss->ao); >> >> diff --git a/tools/libxl/libxl_remus_device.c b/tools/libxl/libxl_remus_device.c >> deleted file mode 100644 >> index a6cb7f6..0000000 >> --- a/tools/libxl/libxl_remus_device.c >> +++ /dev/null >> @@ -1,327 +0,0 @@ >> -/* >> - * Copyright (C) 2014 FUJITSU LIMITED >> - * Author: Yang Hongyang >> - * >> - * This program is free software; you can redistribute it and/or modify >> - * it under the terms of the GNU Lesser General Public License as published >> - * by the Free Software Foundation; version 2.1 only. with the special >> - * exception on linking described in file LICENSE. >> - * >> - * This program is distributed in the hope that it will be useful, >> - * but WITHOUT ANY WARRANTY; without even the implied warranty of >> - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the >> - * GNU Lesser General Public License for more details. >> - */ >> - >> -#include "libxl_osdeps.h" /* must come before any other headers */ >> - >> -#include "libxl_internal.h" >> - >> -extern const libxl__remus_device_instance_ops remus_device_nic; >> -extern const libxl__remus_device_instance_ops remus_device_drbd_disk; >> -static const libxl__remus_device_instance_ops *remus_ops[] = { >> - &remus_device_nic, >> - &remus_device_drbd_disk, >> - NULL, >> -}; >> - >> -/*----- helper functions -----*/ >> - >> -static int init_device_subkind(libxl__remus_devices_state *rds) >> -{ >> - /* init device subkind-specific state in the libxl ctx */ >> - int rc; >> - STATE_AO_GC(rds->ao); >> - >> - if (libxl__netbuffer_enabled(gc)) { >> - rc = init_subkind_nic(rds); >> - if (rc) goto out; >> - } >> - >> - rc = init_subkind_drbd_disk(rds); >> - if (rc) goto out; >> - >> - rc = 0; >> -out: >> - return rc; >> -} >> - >> -static void cleanup_device_subkind(libxl__remus_devices_state *rds) >> -{ >> - /* cleanup device subkind-specific state in the libxl ctx */ >> - STATE_AO_GC(rds->ao); >> - >> - if (libxl__netbuffer_enabled(gc)) >> - cleanup_subkind_nic(rds); >> - >> - cleanup_subkind_drbd_disk(rds); >> -} >> - >> -/*----- setup() and teardown() -----*/ >> - >> -/* callbacks */ >> - >> -static void all_devices_setup_cb(libxl__egc *egc, >> - libxl__multidev *multidev, >> - int rc); >> -static void device_setup_iterate(libxl__egc *egc, >> - libxl__ao_device *aodev); >> -static void devices_teardown_cb(libxl__egc *egc, >> - libxl__multidev *multidev, >> - int rc); >> - >> -/* remus device setup and teardown */ >> - >> -static libxl__remus_device* remus_device_init(libxl__egc *egc, >> - libxl__remus_devices_state *rds, >> - libxl__device_kind kind, >> - void *libxl_dev) >> -{ >> - libxl__remus_device *dev = NULL; >> - >> - STATE_AO_GC(rds->ao); >> - GCNEW(dev); >> - dev->backend_dev = libxl_dev; >> - dev->kind = kind; >> - dev->rds = rds; >> - >> - return dev; >> -} >> - >> -static void remus_devices_setup(libxl__egc *egc, >> - libxl__remus_devices_state *rds); >> - >> -void libxl__remus_devices_setup(libxl__egc *egc, libxl__remus_devices_state *rds) >> -{ >> - int i, rc; >> - >> - STATE_AO_GC(rds->ao); >> - >> - rc = init_device_subkind(rds); >> - if (rc) >> - goto out; >> - >> - rds->num_devices = 0; >> - rds->num_nics = 0; >> - rds->num_disks = 0; >> - >> - if (rds->device_kind_flags & (1 << LIBXL__DEVICE_KIND_VIF)) >> - rds->nics = libxl_device_nic_list(CTX, rds->domid, &rds->num_nics); >> - >> - if (rds->device_kind_flags & (1 << LIBXL__DEVICE_KIND_VBD)) >> - rds->disks = libxl_device_disk_list(CTX, rds->domid, &rds->num_disks); >> - >> - if (rds->num_nics == 0 && rds->num_disks == 0) >> - goto out; >> - >> - GCNEW_ARRAY(rds->devs, rds->num_nics + rds->num_disks); >> - >> - for (i = 0; i < rds->num_nics; i++) { >> - rds->devs[rds->num_devices++] = remus_device_init(egc, rds, >> - LIBXL__DEVICE_KIND_VIF, >> - &rds->nics[i]); >> - } >> - >> - for (i = 0; i < rds->num_disks; i++) { >> - rds->devs[rds->num_devices++] = remus_device_init(egc, rds, >> - LIBXL__DEVICE_KIND_VBD, >> - &rds->disks[i]); >> - } >> - >> - remus_devices_setup(egc, rds); >> - >> - return; >> - >> -out: >> - rds->callback(egc, rds, rc); >> -} >> - >> -static void remus_devices_setup(libxl__egc *egc, >> - libxl__remus_devices_state *rds) >> -{ >> - int i, rc; >> - >> - STATE_AO_GC(rds->ao); >> - >> - libxl__multidev_begin(ao, &rds->multidev); >> - rds->multidev.callback = all_devices_setup_cb; >> - for (i = 0; i < rds->num_devices; i++) { >> - libxl__remus_device *dev = rds->devs[i]; >> - dev->ops_index = -1; >> - libxl__multidev_prepare_with_aodev(&rds->multidev, &dev->aodev); >> - >> - dev->aodev.rc = ERROR_REMUS_DEVICE_NOT_SUPPORTED; >> - dev->aodev.callback = device_setup_iterate; >> - device_setup_iterate(egc,&dev->aodev); >> - } >> - >> - rc = 0; >> - libxl__multidev_prepared(egc, &rds->multidev, rc); >> -} >> - >> - >> -static void device_setup_iterate(libxl__egc *egc, libxl__ao_device *aodev) >> -{ >> - libxl__remus_device *dev = CONTAINER_OF(aodev, *dev, aodev); >> - EGC_GC; >> - >> - if (aodev->rc != ERROR_REMUS_DEVICE_NOT_SUPPORTED && >> - aodev->rc != ERROR_REMUS_DEVOPS_DOES_NOT_MATCH) >> - /* might be success or disaster */ >> - goto out; >> - >> - do { >> - dev->ops = remus_ops[++dev->ops_index]; >> - if (!dev->ops) { >> - libxl_device_nic * nic = NULL; >> - libxl_device_disk * disk = NULL; >> - uint32_t domid; >> - int devid; >> - if (dev->kind == LIBXL__DEVICE_KIND_VIF) { >> - nic = (libxl_device_nic *)dev->backend_dev; >> - domid = nic->backend_domid; >> - devid = nic->devid; >> - } else if (dev->kind == LIBXL__DEVICE_KIND_VBD) { >> - disk = (libxl_device_disk *)dev->backend_dev; >> - domid = disk->backend_domid; >> - devid = libxl__device_disk_dev_number(disk->vdev, NULL, NULL); >> - } else { >> - LOG(ERROR,"device kind not handled by remus: %s", >> - libxl__device_kind_to_string(dev->kind)); >> - aodev->rc = ERROR_FAIL; >> - goto out; >> - } >> - LOG(ERROR,"device not handled by remus" >> - " (device=%s:%"PRId32"/%"PRId32")", >> - libxl__device_kind_to_string(dev->kind), >> - domid, devid); >> - aodev->rc = ERROR_REMUS_DEVICE_NOT_SUPPORTED; >> - goto out; >> - } >> - } while (dev->ops->kind != dev->kind); >> - >> - /* found the next ops_index to try */ >> - assert(dev->aodev.callback == device_setup_iterate); >> - dev->ops->setup(egc,dev); >> - return; >> - >> - out: >> - libxl__multidev_one_callback(egc,aodev); >> -} >> - >> -static void all_devices_setup_cb(libxl__egc *egc, >> - libxl__multidev *multidev, >> - int rc) >> -{ >> - STATE_AO_GC(multidev->ao); >> - >> - /* Convenience aliases */ >> - libxl__remus_devices_state *const rds = >> - CONTAINER_OF(multidev, *rds, multidev); >> - >> - rds->callback(egc, rds, rc); >> -} >> - >> -void libxl__remus_devices_teardown(libxl__egc *egc, >> - libxl__remus_devices_state *rds) >> -{ >> - int i; >> - libxl__remus_device *dev; >> - >> - STATE_AO_GC(rds->ao); >> - >> - libxl__multidev_begin(ao, &rds->multidev); >> - rds->multidev.callback = devices_teardown_cb; >> - for (i = 0; i < rds->num_devices; i++) { >> - dev = rds->devs[i]; >> - if (!dev->ops || !dev->matched) >> - continue; >> - >> - libxl__multidev_prepare_with_aodev(&rds->multidev, &dev->aodev); >> - dev->ops->teardown(egc,dev); >> - } >> - >> - libxl__multidev_prepared(egc, &rds->multidev, 0); >> -} >> - >> -static void devices_teardown_cb(libxl__egc *egc, >> - libxl__multidev *multidev, >> - int rc) >> -{ >> - int i; >> - >> - STATE_AO_GC(multidev->ao); >> - >> - /* Convenience aliases */ >> - libxl__remus_devices_state *const rds = >> - CONTAINER_OF(multidev, *rds, multidev); >> - >> - /* clean nic */ >> - for (i = 0; i < rds->num_nics; i++) >> - libxl_device_nic_dispose(&rds->nics[i]); >> - free(rds->nics); >> - rds->nics = NULL; >> - rds->num_nics = 0; >> - >> - /* clean disk */ >> - for (i = 0; i < rds->num_disks; i++) >> - libxl_device_disk_dispose(&rds->disks[i]); >> - free(rds->disks); >> - rds->disks = NULL; >> - rds->num_disks = 0; >> - >> - cleanup_device_subkind(rds); >> - >> - rds->callback(egc, rds, rc); >> -} >> - >> -/*----- checkpointing APIs -----*/ >> - >> -/* callbacks */ >> - >> -static void devices_checkpoint_cb(libxl__egc *egc, >> - libxl__multidev *multidev, >> - int rc); >> - >> -/* API implementations */ >> - >> -#define define_remus_checkpoint_api(api) \ >> -void libxl__remus_devices_##api(libxl__egc *egc, \ >> - libxl__remus_devices_state *rds) \ >> -{ \ >> - int i; \ >> - libxl__remus_device *dev; \ >> - \ >> - STATE_AO_GC(rds->ao); \ >> - \ >> - libxl__multidev_begin(ao, &rds->multidev); \ >> - rds->multidev.callback = devices_checkpoint_cb; \ >> - for (i = 0; i < rds->num_devices; i++) { \ >> - dev = rds->devs[i]; \ >> - if (!dev->matched || !dev->ops->api) \ >> - continue; \ >> - libxl__multidev_prepare_with_aodev(&rds->multidev, &dev->aodev);\ >> - dev->ops->api(egc,dev); \ >> - } \ >> - \ >> - libxl__multidev_prepared(egc, &rds->multidev, 0); \ >> -} >> - >> -define_remus_checkpoint_api(postsuspend); >> - >> -define_remus_checkpoint_api(preresume); >> - >> -define_remus_checkpoint_api(commit); >> - >> -static void devices_checkpoint_cb(libxl__egc *egc, >> - libxl__multidev *multidev, >> - int rc) >> -{ >> - STATE_AO_GC(multidev->ao); >> - >> - /* Convenience aliases */ >> - libxl__remus_devices_state *const rds = >> - CONTAINER_OF(multidev, *rds, multidev); >> - >> - rds->callback(egc, rds, rc); >> -} >> diff --git a/tools/libxl/libxl_remus_disk_drbd.c b/tools/libxl/libxl_remus_disk_drbd.c >> index afe9b61..50b897d 100644 >> --- a/tools/libxl/libxl_remus_disk_drbd.c >> +++ b/tools/libxl/libxl_remus_disk_drbd.c >> @@ -26,30 +26,30 @@ typedef struct libxl__remus_drbd_disk { >> int ackwait; >> } libxl__remus_drbd_disk; >> >> -int init_subkind_drbd_disk(libxl__remus_devices_state *rds) >> +int init_subkind_drbd_disk(libxl__checkpoint_devices_state *cds) >> { >> - STATE_AO_GC(rds->ao); >> + STATE_AO_GC(cds->ao); >> >> - rds->drbd_probe_script = GCSPRINTF("%s/block-drbd-probe", >> + cds->drbd_probe_script = GCSPRINTF("%s/block-drbd-probe", >> libxl__xen_script_dir_path()); >> >> return 0; >> } >> >> -void cleanup_subkind_drbd_disk(libxl__remus_devices_state *rds) >> +void cleanup_subkind_drbd_disk(libxl__checkpoint_devices_state *cds) >> { >> return; >> } >> >> /*----- helper functions, for async calls -----*/ >> static void drbd_async_call(libxl__egc *egc, >> - libxl__remus_device *dev, >> - void func(libxl__remus_device *), >> + libxl__checkpoint_device *dev, >> + void func(libxl__checkpoint_device *), >> libxl__ev_child_callback callback) >> { >> int pid = -1, rc; >> libxl__ao_device *aodev = &dev->aodev; >> - STATE_AO_GC(dev->rds->ao); >> + STATE_AO_GC(dev->cds->ao); >> >> /* Fork and call */ >> pid = libxl__ev_child_fork(gc, &aodev->child, callback); >> @@ -82,21 +82,21 @@ static void match_async_exec_cb(libxl__egc *egc, >> >> /* implementations */ >> >> -static void match_async_exec(libxl__egc *egc, libxl__remus_device *dev); >> +static void match_async_exec(libxl__egc *egc, libxl__checkpoint_device *dev); >> >> -static void drbd_setup(libxl__egc *egc, libxl__remus_device *dev) >> +static void drbd_setup(libxl__egc *egc, libxl__checkpoint_device *dev) >> { >> - STATE_AO_GC(dev->rds->ao); >> + STATE_AO_GC(dev->cds->ao); >> >> match_async_exec(egc, dev); >> } >> >> -static void match_async_exec(libxl__egc *egc, libxl__remus_device *dev) >> +static void match_async_exec(libxl__egc *egc, libxl__checkpoint_device *dev) >> { >> int arraysize, nr = 0, rc; >> const libxl_device_disk *disk = dev->backend_dev; >> libxl__async_exec_state *aes = &dev->aodev.aes; >> - STATE_AO_GC(dev->rds->ao); >> + STATE_AO_GC(dev->cds->ao); >> >> /* setup env & args */ >> arraysize = 1; >> @@ -107,12 +107,12 @@ static void match_async_exec(libxl__egc *egc, libxl__remus_device *dev) >> arraysize = 3; >> nr = 0; >> GCNEW_ARRAY(aes->args, arraysize); >> - aes->args[nr++] = dev->rds->drbd_probe_script; >> + aes->args[nr++] = dev->cds->drbd_probe_script; >> aes->args[nr++] = disk->pdev_path; >> aes->args[nr++] = NULL; >> assert(nr <= arraysize); >> >> - aes->ao = dev->rds->ao; >> + aes->ao = dev->cds->ao; >> aes->what = GCSPRINTF("%s %s", aes->args[0], aes->args[1]); >> aes->timeout_ms = LIBXL_HOTPLUG_TIMEOUT * 1000; >> aes->callback = match_async_exec_cb; >> @@ -137,14 +137,14 @@ static void match_async_exec_cb(libxl__egc *egc, >> { >> int rc; >> libxl__ao_device *aodev = CONTAINER_OF(aes, *aodev, aes); >> - libxl__remus_device *dev = CONTAINER_OF(aodev, *dev, aodev); >> + libxl__checkpoint_device *dev = CONTAINER_OF(aodev, *dev, aodev); >> libxl__remus_drbd_disk *drbd_disk; >> const libxl_device_disk *disk = dev->backend_dev; >> >> STATE_AO_GC(aodev->ao); >> >> if (status) { >> - rc = ERROR_REMUS_DEVOPS_DOES_NOT_MATCH; >> + rc = ERROR_CHECKPOINT_DEVOPS_DOES_NOT_MATCH; >> /* BUG: seems to assume that any exit status means `no match' */ >> /* BUG: exit status will have been logged as an error */ >> goto out; >> @@ -169,10 +169,10 @@ out: >> aodev->callback(egc, aodev); >> } >> >> -static void drbd_teardown(libxl__egc *egc, libxl__remus_device *dev) >> +static void drbd_teardown(libxl__egc *egc, libxl__checkpoint_device *dev) >> { >> libxl__remus_drbd_disk *drbd_disk = dev->concrete_data; >> - STATE_AO_GC(dev->rds->ao); >> + STATE_AO_GC(dev->cds->ao); >> >> close(drbd_disk->ctl_fd); >> dev->aodev.rc = 0; >> @@ -189,9 +189,9 @@ static void checkpoint_async_call_done(libxl__egc *egc, >> /* API implementations */ >> >> /* this op will not wait and block, so implement as sync op */ >> -static void drbd_postsuspend(libxl__egc *egc, libxl__remus_device *dev) >> +static void drbd_postsuspend(libxl__egc *egc, libxl__checkpoint_device *dev) >> { >> - STATE_AO_GC(dev->rds->ao); >> + STATE_AO_GC(dev->cds->ao); >> >> libxl__remus_drbd_disk *rdd = dev->concrete_data; >> >> @@ -205,16 +205,16 @@ static void drbd_postsuspend(libxl__egc *egc, libxl__remus_device *dev) >> } >> >> >> -static void drbd_preresume_async(libxl__remus_device *dev); >> +static void drbd_preresume_async(libxl__checkpoint_device *dev); >> >> -static void drbd_preresume(libxl__egc *egc, libxl__remus_device *dev) >> +static void drbd_preresume(libxl__egc *egc, libxl__checkpoint_device *dev) >> { >> - STATE_AO_GC(dev->rds->ao); >> + STATE_AO_GC(dev->cds->ao); >> >> drbd_async_call(egc, dev, drbd_preresume_async, checkpoint_async_call_done); >> } >> >> -static void drbd_preresume_async(libxl__remus_device *dev) >> +static void drbd_preresume_async(libxl__checkpoint_device *dev) >> { >> libxl__remus_drbd_disk *rdd = dev->concrete_data; >> int ackwait = rdd->ackwait; >> @@ -233,7 +233,7 @@ static void checkpoint_async_call_done(libxl__egc *egc, >> { >> int rc; >> libxl__ao_device *aodev = CONTAINER_OF(child, *aodev, child); >> - libxl__remus_device *dev = CONTAINER_OF(aodev, *dev, aodev); >> + libxl__checkpoint_device *dev = CONTAINER_OF(aodev, *dev, aodev); >> libxl__remus_drbd_disk *rdd = dev->concrete_data; >> >> STATE_AO_GC(aodev->ao); >> @@ -251,7 +251,7 @@ out: >> aodev->callback(egc, aodev); >> } >> >> -const libxl__remus_device_instance_ops remus_device_drbd_disk = { >> +const libxl__checkpoint_device_instance_ops remus_device_drbd_disk = { >> .kind = LIBXL__DEVICE_KIND_VBD, >> .setup = drbd_setup, >> .teardown = drbd_teardown, >> diff --git a/tools/libxl/libxl_types.idl b/tools/libxl/libxl_types.idl >> index 5c7b82d..e05d12b 100644 >> --- a/tools/libxl/libxl_types.idl >> +++ b/tools/libxl/libxl_types.idl >> @@ -61,8 +61,8 @@ libxl_error = Enumeration("error", [ >> (-15, "LOCK_FAIL"), >> (-16, "JSON_CONFIG_EMPTY"), >> (-17, "DEVICE_EXISTS"), >> - (-18, "REMUS_DEVOPS_DOES_NOT_MATCH"), >> - (-19, "REMUS_DEVICE_NOT_SUPPORTED"), >> + (-18, "CHECKPOINT_DEVOPS_DOES_NOT_MATCH"), >> + (-19, "CHECKPOINT_DEVICE_NOT_SUPPORTED"), >> (-20, "VNUMA_CONFIG_INVALID"), >> (-21, "DOMAIN_NOTFOUND"), >> ], value_namespace = "") > > > . > -- Thanks, Yang.