From mboxrd@z Thu Jan 1 00:00:00 1970 From: Wen Congyang Subject: [RFC Patch 04/25] don't touch remus in remus_device Date: Fri, 18 Jul 2014 19:38:49 +0800 Message-ID: <1405683551-12579-5-git-send-email-wency@cn.fujitsu.com> References: <1405683551-12579-1-git-send-email-wency@cn.fujitsu.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <1405683551-12579-1-git-send-email-wency@cn.fujitsu.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: xen devel Cc: Ian Campbell , Wen Congyang , Ian Jackson , Jiang Yunhong , Dong Eddie , Yang Hongyang , Lai Jiangshan List-Id: xen-devel@lists.xenproject.org remus device is an abstract layer to do checkpoint. COLO can also use it to do checkpoint. But there is still some codes in remus device which touch remus: 1. netbufscript is for remus, move it to domain_suspend_state 2. diskbuf: not a suitable name for checkpoint. Use enabled_device_kinds to instead of it. Signed-off-by: Wen Congyang --- tools/libxl/libxl.c | 9 ++++++--- tools/libxl/libxl_internal.h | 19 ++++++++++++------- tools/libxl/libxl_netbuffer.c | 7 +++++-- tools/libxl/libxl_remus_device.c | 4 ++-- 4 files changed, 25 insertions(+), 14 deletions(-) diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c index cd038d1..94087ff 100644 --- a/tools/libxl/libxl.c +++ b/tools/libxl/libxl.c @@ -832,10 +832,10 @@ int libxl_domain_remus_start(libxl_ctx *ctx, libxl_domain_remus_info *info, } if (info->netbufscript) { - rds->netbufscript = + dss->netbufscript = libxl__strdup(gc, info->netbufscript); } else { - rds->netbufscript = + dss->netbufscript = GCSPRINTF("%s/remus-netbuf-setup", libxl__xen_script_dir_path()); } @@ -844,9 +844,12 @@ int libxl_domain_remus_start(libxl_ctx *ctx, libxl_domain_remus_info *info, rds->ao = ao; rds->egc = egc; rds->domid = domid; - rds->diskbuf = info->diskbuf; rds->callback = libxl__remus_setup_done; rds->ops = remus_ops; + if (info->diskbuf) + rds->enabled_device_kinds |= LIBXL__REMUS_DEVICE_DISK; + if (info->netbuf) + rds->enabled_device_kinds |= LIBXL__REMUS_DEVICE_NIC; /* Point of no return */ libxl__remus_devices_setup(egc, rds); diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h index 441a51f..e327604 100644 --- a/tools/libxl/libxl_internal.h +++ b/tools/libxl/libxl_internal.h @@ -2505,8 +2505,8 @@ typedef struct libxl__save_helper_state { */ typedef enum libxl__remus_device_kind { - LIBXL__REMUS_DEVICE_NIC, - LIBXL__REMUS_DEVICE_DISK, + LIBXL__REMUS_DEVICE_NIC = (1 << 0), + LIBXL__REMUS_DEVICE_DISK= (1 << 1), } libxl__remus_device_kind; typedef struct libxl__remus_device libxl__remus_device; @@ -2581,8 +2581,7 @@ struct libxl__remus_device_state { libxl__remus_callback *callback; /* the last ops must be NULL */ const libxl__remus_device_subkind_ops **ops; - const char *netbufscript; - bool diskbuf; + int enabled_device_kinds; /* private */ /* devices that have been set up */ @@ -2692,9 +2691,15 @@ struct libxl__domain_suspend_state { libxl__ev_xswatch guest_watch; libxl__ev_time guest_timeout; const char *dm_savefile; - libxl__remus_device_state rds; - libxl__ev_time checkpoint_timeout; /* used for Remus checkpoint */ - int interval; /* checkpoint interval (for Remus) */ + /* for Remus */ + struct { + libxl__remus_device_state rds; + const char *netbufscript; + /* used for Remus checkpoint */ + libxl__ev_time checkpoint_timeout; + /* checkpoint interval */ + int interval; + }; libxl__save_helper_state shs; libxl__logdirty_switch logdirty; void (*callback_common_done)(libxl__egc*, diff --git a/tools/libxl/libxl_netbuffer.c b/tools/libxl/libxl_netbuffer.c index 39025f4..2387563 100644 --- a/tools/libxl/libxl_netbuffer.c +++ b/tools/libxl/libxl_netbuffer.c @@ -28,6 +28,7 @@ struct libxl__remus_netbuf_state { libxl__ao *ao; uint32_t domid; + const char *netbufscript; struct nl_sock *nlsock; struct nl_cache *qdisc_cache; @@ -51,6 +52,7 @@ static int nic_init(libxl__remus_device_state *rds) { int rc, ret; libxl__remus_netbuf_state *ns; + libxl__domain_suspend_state *dss = CONTAINER_OF(rds, *dss, rds); STATE_AO_GC(rds->ao); @@ -83,6 +85,7 @@ static int nic_init(libxl__remus_device_state *rds) ns->ao = rds->ao; ns->domid = rds->domid; + ns->netbufscript = dss->netbufscript; rc = 0; @@ -258,7 +261,7 @@ static void setup_async_exec(libxl__remus_device *dev, char *op) /* Convenience aliases */ libxl__remus_netbuf_state *ns = CTX->rns; - char *const script = libxl__strdup(gc, dev->rds->netbufscript); + char *const script = libxl__strdup(gc, ns->netbufscript); const uint32_t domid = ns->domid; const int dev_id = remus_nic->devid; const char *const vif = remus_nic->vif; @@ -381,7 +384,7 @@ static void netbuf_setup_script_cb(libxl__egc *egc, if (hotplug_error) { LOG(ERROR, "netbuf script %s setup failed for vif %s: %s", - dev->rds->netbufscript, vif, hotplug_error); + CTX->rns->netbufscript, vif, hotplug_error); rc = ERROR_FAIL; goto out; } diff --git a/tools/libxl/libxl_remus_device.c b/tools/libxl/libxl_remus_device.c index c9df7f0..2acf3bb 100644 --- a/tools/libxl/libxl_remus_device.c +++ b/tools/libxl/libxl_remus_device.c @@ -86,10 +86,10 @@ void libxl__remus_devices_setup(libxl__egc *egc, libxl__remus_device_state *rds) rds->num_nics = 0; rds->num_disks = 0; - if (rds->netbufscript) + if (rds->enabled_device_kinds & LIBXL__REMUS_DEVICE_NIC) rds->nics = libxl_device_nic_list(CTX, rds->domid, &rds->num_nics); - if (rds->diskbuf) + if (rds->enabled_device_kinds & LIBXL__REMUS_DEVICE_NIC) rds->disks = libxl_device_disk_list(CTX, rds->domid, &rds->num_disks); if (rds->num_nics == 0 && rds->num_disks == 0) -- 1.9.3