|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v3 COLOPre 24/26] tools/libxl: rename remus device to checkpoint device
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.
> 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 <wency@xxxxxxxxxxxxxx>
> Signed-off-by: Yang Hongyang <yanghy@xxxxxxxxxxxxxx>
> ---
> 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 <yanghy@xxxxxxxxxxxxxx>
> + *
> + * 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 <yanghy@xxxxxxxxxxxxxx>
> - *
> - * 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 = "")
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |