From mboxrd@z Thu Jan 1 00:00:00 1970 From: Andrew Cooper Subject: [PATCH v3 08/28] tools/libxl: Add save_helper_state pointers to libxl__xc_domain_{save, restore}() Date: Mon, 13 Jul 2015 13:01:27 +0100 Message-ID: <1436788907-1921-9-git-send-email-andrew.cooper3@citrix.com> References: <1436788907-1921-1-git-send-email-andrew.cooper3@citrix.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <1436788907-1921-1-git-send-email-andrew.cooper3@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: Xen-devel Cc: Andrew Cooper , Ian Jackson , Ian Campbell , Wei Liu List-Id: xen-devel@lists.xenproject.org Currently, libxl__xc_domain_{save,restore}() have specific knowledge of where the libxl__save_helper_state lives inside a libxl__domain_{create,save}_state object. In later changes, the logical ownership of the libxl__save_helper_state will change and will no longer be d{c,s}s->shs. No functional change. Signed-off-by: Andrew Cooper CC: Ian Campbell CC: Ian Jackson CC: Wei Liu --- New in v3 --- tools/libxl/libxl_create.c | 4 +-- tools/libxl/libxl_dom.c | 20 +++++++------- tools/libxl/libxl_internal.h | 5 +++- tools/libxl/libxl_save_callout.c | 54 ++++++++++++++++++++------------------ 4 files changed, 44 insertions(+), 39 deletions(-) diff --git a/tools/libxl/libxl_create.c b/tools/libxl/libxl_create.c index 1f43b43..5d57bc3 100644 --- a/tools/libxl/libxl_create.c +++ b/tools/libxl/libxl_create.c @@ -989,7 +989,7 @@ static void domcreate_bootloader_done(libxl__egc *egc, goto out; } libxl__save_helper_init(&dcs->shs); - libxl__xc_domain_restore(egc, dcs, + libxl__xc_domain_restore(egc, dcs, &dcs->shs, hvm, pae, superpages); return; @@ -1001,7 +1001,7 @@ void libxl__srm_callout_callback_restore_results(unsigned long store_mfn, unsigned long console_mfn, void *user) { libxl__save_helper_state *shs = user; - libxl__domain_create_state *dcs = CONTAINER_OF(shs, *dcs, shs); + libxl__domain_create_state *dcs = shs->caller_state; STATE_AO_GC(dcs->ao); libxl__domain_build_state *const state = &dcs->build_state; diff --git a/tools/libxl/libxl_dom.c b/tools/libxl/libxl_dom.c index 63e2f47..9719837 100644 --- a/tools/libxl/libxl_dom.c +++ b/tools/libxl/libxl_dom.c @@ -1121,7 +1121,7 @@ int libxl__toolstack_restore(uint32_t domid, const uint8_t *ptr, uint32_t size, void *user) { libxl__save_helper_state *shs = user; - libxl__domain_create_state *dcs = CONTAINER_OF(shs, *dcs, shs); + libxl__domain_create_state *dcs = shs->caller_state; STATE_AO_GC(dcs->ao); int ret; uint32_t version = 0, bufsize; @@ -1188,7 +1188,7 @@ static void logdirty_init(libxl__logdirty_switch *lds) libxl__save_helper_state *shs) { libxl__egc *egc = shs->egc; - libxl__domain_suspend_state *dss = CONTAINER_OF(shs, *dss, shs); + libxl__domain_suspend_state *dss = shs->caller_state; libxl__logdirty_switch *lds = &dss->logdirty; STATE_AO_GC(dss->ao); int rc; @@ -1260,7 +1260,7 @@ static void logdirty_init(libxl__logdirty_switch *lds) libxl__save_helper_state *shs) { libxl__egc *egc = shs->egc; - libxl__domain_suspend_state *dss = CONTAINER_OF(shs, *dss, shs); + libxl__domain_suspend_state *dss = shs->caller_state; STATE_AO_GC(dss->ao); int rc; @@ -1279,7 +1279,7 @@ static void logdirty_init(libxl__logdirty_switch *lds) { libxl__save_helper_state *shs = user; libxl__egc *egc = shs->egc; - libxl__domain_suspend_state *dss = CONTAINER_OF(shs, *dss, shs); + libxl__domain_suspend_state *dss = shs->caller_state; STATE_AO_GC(dss->ao); switch (libxl__device_model_version_running(gc, domid)) { @@ -1832,7 +1832,7 @@ static void libxl__domain_suspend_callback(void *data) { libxl__save_helper_state *shs = data; libxl__egc *egc = shs->egc; - libxl__domain_suspend_state *dss = CONTAINER_OF(shs, *dss, shs); + libxl__domain_suspend_state *dss = shs->caller_state; dss->callback_common_done = domain_suspend_callback_common_done; domain_suspend_callback_common(egc, dss); @@ -1859,7 +1859,7 @@ static void libxl__remus_domain_suspend_callback(void *data) { libxl__save_helper_state *shs = data; libxl__egc *egc = shs->egc; - libxl__domain_suspend_state *dss = CONTAINER_OF(shs, *dss, shs); + libxl__domain_suspend_state *dss = shs->caller_state; dss->callback_common_done = remus_domain_suspend_callback_common_done; domain_suspend_callback_common(egc, dss); @@ -1902,7 +1902,7 @@ static void libxl__remus_domain_resume_callback(void *data) { libxl__save_helper_state *shs = data; libxl__egc *egc = shs->egc; - libxl__domain_suspend_state *dss = CONTAINER_OF(shs, *dss, shs); + libxl__domain_suspend_state *dss = shs->caller_state; STATE_AO_GC(dss->ao); libxl__remus_devices_state *const rds = &dss->rds; @@ -1947,8 +1947,8 @@ static void remus_next_checkpoint(libxl__egc *egc, libxl__ev_time *ev, static void libxl__remus_domain_checkpoint_callback(void *data) { libxl__save_helper_state *shs = data; - libxl__domain_suspend_state *dss = CONTAINER_OF(shs, *dss, shs); - libxl__egc *egc = dss->shs.egc; + libxl__domain_suspend_state *dss = shs->caller_state; + libxl__egc *egc = shs->egc; STATE_AO_GC(dss->ao); /* This would go into tailbuf. */ @@ -2118,7 +2118,7 @@ void libxl__domain_suspend(libxl__egc *egc, libxl__domain_suspend_state *dss) dss->shs.callbacks.save.toolstack_save = libxl__toolstack_save; libxl__save_helper_init(&dss->shs); - libxl__xc_domain_save(egc, dss); + libxl__xc_domain_save(egc, dss, &dss->shs); return; out: diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h index 8ce3d49..3f1fed8 100644 --- a/tools/libxl/libxl_internal.h +++ b/tools/libxl/libxl_internal.h @@ -3241,7 +3241,9 @@ _hidden void libxl__domain_suspend(libxl__egc *egc, /* calls libxl__xc_domain_suspend_done when done */ -_hidden void libxl__xc_domain_save(libxl__egc*, libxl__domain_suspend_state*); +_hidden void libxl__xc_domain_save(libxl__egc *egc, + libxl__domain_suspend_state *dss, + libxl__save_helper_state *shs); /* If rc==0 then retval is the return value from xc_domain_save * and errnoval is the errno value it provided. * If rc!=0, retval and errnoval are undefined. */ @@ -3265,6 +3267,7 @@ _hidden int libxl__toolstack_save(uint32_t domid, uint8_t **buf, /* calls libxl__xc_domain_restore_done when done */ _hidden void libxl__xc_domain_restore(libxl__egc *egc, libxl__domain_create_state *dcs, + libxl__save_helper_state *shs, int hvm, int pae, int superpages); /* If rc==0 then retval is the return value from xc_domain_save * and errnoval is the errno value it provided. diff --git a/tools/libxl/libxl_save_callout.c b/tools/libxl/libxl_save_callout.c index 0fb1fdc..b8feb9f 100644 --- a/tools/libxl/libxl_save_callout.c +++ b/tools/libxl/libxl_save_callout.c @@ -42,6 +42,7 @@ static void helper_exited(libxl__egc *egc, libxl__ev_child *ch, /*----- entrypoints -----*/ void libxl__xc_domain_restore(libxl__egc *egc, libxl__domain_create_state *dcs, + libxl__save_helper_state *shs, int hvm, int pae, int superpages) { STATE_AO_GC(dcs->ao); @@ -51,8 +52,8 @@ void libxl__xc_domain_restore(libxl__egc *egc, libxl__domain_create_state *dcs, const int restore_fd = dcs->libxc_fd; libxl__domain_build_state *const state = &dcs->build_state; - unsigned cbflags = libxl__srm_callout_enumcallbacks_restore - (&dcs->shs.callbacks.restore.a); + unsigned cbflags = + libxl__srm_callout_enumcallbacks_restore(&shs->callbacks.restore.a); const unsigned long argnums[] = { domid, @@ -63,19 +64,20 @@ void libxl__xc_domain_restore(libxl__egc *egc, libxl__domain_create_state *dcs, cbflags, dcs->restore_params.checkpointed_stream, }; - dcs->shs.ao = ao; - dcs->shs.domid = domid; - dcs->shs.recv_callback = libxl__srm_callout_received_restore; - dcs->shs.completion_callback = libxl__xc_domain_restore_done; - dcs->shs.caller_state = dcs; - dcs->shs.need_results = 1; - dcs->shs.toolstack_data_file = 0; + shs->ao = ao; + shs->domid = domid; + shs->recv_callback = libxl__srm_callout_received_restore; + shs->completion_callback = libxl__xc_domain_restore_done; + shs->caller_state = dcs; + shs->need_results = 1; + shs->toolstack_data_file = 0; - run_helper(egc, &dcs->shs, "--restore-domain", restore_fd, 0,0, + run_helper(egc, shs, "--restore-domain", restore_fd, 0, 0, argnums, ARRAY_SIZE(argnums)); } -void libxl__xc_domain_save(libxl__egc *egc, libxl__domain_suspend_state *dss) +void libxl__xc_domain_save(libxl__egc *egc, libxl__domain_suspend_state *dss, + libxl__save_helper_state *shs) { STATE_AO_GC(dss->ao); int r, rc, toolstack_data_fd = -1; @@ -84,21 +86,21 @@ void libxl__xc_domain_save(libxl__egc *egc, libxl__domain_suspend_state *dss) /* Resources we need to free */ uint8_t *toolstack_data_buf = 0; - unsigned cbflags = libxl__srm_callout_enumcallbacks_save - (&dss->shs.callbacks.save.a); + unsigned cbflags = + libxl__srm_callout_enumcallbacks_save(&shs->callbacks.save.a); - if (dss->shs.callbacks.save.toolstack_save) { - r = dss->shs.callbacks.save.toolstack_save + if (shs->callbacks.save.toolstack_save) { + r = shs->callbacks.save.toolstack_save (dss->domid, &toolstack_data_buf, &toolstack_data_len, dss); if (r) { rc = ERROR_FAIL; goto out; } - dss->shs.toolstack_data_file = tmpfile(); - if (!dss->shs.toolstack_data_file) { + shs->toolstack_data_file = tmpfile(); + if (!shs->toolstack_data_file) { LOGE(ERROR, "cannot create toolstack data tmpfile"); rc = ERROR_FAIL; goto out; } - toolstack_data_fd = fileno(dss->shs.toolstack_data_file); + toolstack_data_fd = fileno(shs->toolstack_data_file); r = libxl_write_exactly(CTX, toolstack_data_fd, toolstack_data_buf, toolstack_data_len, @@ -116,23 +118,23 @@ void libxl__xc_domain_save(libxl__egc *egc, libxl__domain_suspend_state *dss) cbflags, }; - dss->shs.ao = ao; - dss->shs.domid = dss->domid; - dss->shs.recv_callback = libxl__srm_callout_received_save; - dss->shs.completion_callback = libxl__xc_domain_save_done; - dss->shs.caller_state = dss; - dss->shs.need_results = 0; + shs->ao = ao; + shs->domid = dss->domid; + shs->recv_callback = libxl__srm_callout_received_save; + shs->completion_callback = libxl__xc_domain_save_done; + shs->caller_state = dss; + shs->need_results = 0; free(toolstack_data_buf); - run_helper(egc, &dss->shs, "--save-domain", dss->fd, + run_helper(egc, shs, "--save-domain", dss->fd, &toolstack_data_fd, 1, argnums, ARRAY_SIZE(argnums)); return; out: free(toolstack_data_buf); - if (dss->shs.toolstack_data_file) fclose(dss->shs.toolstack_data_file); + if (shs->toolstack_data_file) fclose(shs->toolstack_data_file); libxl__xc_domain_save_done(egc, dss, rc, 0, 0); } -- 1.7.10.4