|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH RFC v2 5/8] Improved migration flow syntax in libxl
---
tools/libxl/libxl_create.c | 5 +++--
tools/libxl/libxl_dm.c | 10 +++++-----
tools/libxl/libxl_internal.h | 4 ++--
tools/libxl/libxl_save_callout.c | 41 +++++++++++++++++++++-------------------
tools/libxl/libxl_save_helper.c | 15 ++++++++++-----
tools/libxl/libxl_types.idl | 6 ++++++
6 files changed, 48 insertions(+), 33 deletions(-)
diff --git a/tools/libxl/libxl_create.c b/tools/libxl/libxl_create.c
index f10f2ce..6df2754 100644
--- a/tools/libxl/libxl_create.c
+++ b/tools/libxl/libxl_create.c
@@ -1121,6 +1121,7 @@ static void domcreate_bootloader_done(libxl__egc *egc,
dcs->sdss.dm.spawn.ao = ao;
dcs->sdss.dm.guest_config = dcs->guest_config;
dcs->sdss.dm.build_state = &dcs->build_state;
+ dcs->sdss.dm.mirror_qemu_disks = dcs->mirror_qemu_disks;
if(!dcs->mirror_qemu_disks) {
dcs->sdss.dm.callback = domcreate_devmodel_started;
dcs->sdss.callback = domcreate_devmodel_started;
@@ -1518,7 +1519,7 @@ static void domcreate_launch_dm(libxl__egc *egc,
libxl__multidev *multidev,
if (libxl_defbool_val(d_config->b_info.device_model_stubdomain))
libxl__spawn_stub_dm(egc, &dcs->sdss);
else
- libxl__spawn_local_dm(egc, &dcs->sdss.dm, dcs->mirror_qemu_disks);
+ libxl__spawn_local_dm(egc, &dcs->sdss.dm);
/*
* Handle the domain's (and the related stubdomain's) access to
@@ -1550,7 +1551,7 @@ static void domcreate_launch_dm(libxl__egc *egc,
libxl__multidev *multidev,
goto error_out;
if (ret) {
dcs->sdss.dm.guest_domid = domid;
- libxl__spawn_local_dm(egc, &dcs->sdss.dm, 0);
+ libxl__spawn_local_dm(egc, &dcs->sdss.dm);
return;
} else {
assert(!dcs->sdss.dm.guest_domid);
diff --git a/tools/libxl/libxl_dm.c b/tools/libxl/libxl_dm.c
index ff6721d..001e14e 100644
--- a/tools/libxl/libxl_dm.c
+++ b/tools/libxl/libxl_dm.c
@@ -1396,7 +1396,7 @@ static int libxl__build_device_model_args_new(libxl__gc
*gc,
}
}
- if (state->saved_state && !mirror_qemu_disks) {
+ if (state->saved_state) {
/* This file descriptor is meant to be used by QEMU */
*dm_state_fd = open(state->saved_state, O_RDONLY);
flexarray_append(dm_args, "-incoming");
@@ -2062,7 +2062,7 @@ static void spawn_stub_launch_dm(libxl__egc *egc,
/* If dom0 qemu not needed, do not launch it */
spawn_stubdom_pvqemu_cb(egc, &sdss->pvqemu, 0);
} else {
- libxl__spawn_local_dm(egc, &sdss->pvqemu, 0);
+ libxl__spawn_local_dm(egc, &sdss->pvqemu);
}
return;
@@ -2167,8 +2167,7 @@ static void device_model_spawn_outcome(libxl__egc *egc,
libxl__dm_spawn_state *dmss,
int rc);
-void libxl__spawn_local_dm(libxl__egc *egc, libxl__dm_spawn_state *dmss,
- int mirror_qemu_disks)
+void libxl__spawn_local_dm(libxl__egc *egc, libxl__dm_spawn_state *dmss)
{
/* convenience aliases */
const int domid = dmss->guest_domid;
@@ -2208,7 +2207,8 @@ void libxl__spawn_local_dm(libxl__egc *egc,
libxl__dm_spawn_state *dmss,
}
rc = libxl__build_device_model_args(gc, dm, domid, guest_config,
&args, &envs, state,
- &dm_state_fd, mirror_qemu_disks);
+ &dm_state_fd,
+ dmss->mirror_qemu_disks);
if (rc)
goto out;
diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h
index 16a476f..30862c6 100644
--- a/tools/libxl/libxl_internal.h
+++ b/tools/libxl/libxl_internal.h
@@ -3780,7 +3780,7 @@ _hidden void libxl__domain_save(libxl__egc *egc,
_hidden void libxl__xc_domain_save(libxl__egc *egc,
libxl__domain_save_state *dss,
libxl__save_helper_state *shs,
- int mirror_qemu_disks);
+ int migration_phase);
/* 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. */
@@ -3813,7 +3813,7 @@ _hidden int libxl__restore_emulator_xenstore_data
_hidden void libxl__xc_domain_restore(libxl__egc *egc,
libxl__domain_create_state *dcs,
libxl__save_helper_state *shs,
- int hvm, int pae, int mirror_qemu_disks);
+ int hvm, int pae, int migration_phase);
/* 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. */
diff --git a/tools/libxl/libxl_save_callout.c b/tools/libxl/libxl_save_callout.c
index 290d91d..48f96d8 100644
--- a/tools/libxl/libxl_save_callout.c
+++ b/tools/libxl/libxl_save_callout.c
@@ -43,7 +43,7 @@ static void helper_done(libxl__egc *egc,
libxl__save_helper_state *shs);
void libxl__xc_domain_restore(libxl__egc *egc, libxl__domain_create_state *dcs,
libxl__save_helper_state *shs,
- int hvm, int pae, int mirror_qemu_disks)
+ int hvm, int pae, int migration_phase)
{
STATE_AO_GC(dcs->ao);
@@ -62,8 +62,7 @@ void libxl__xc_domain_restore(libxl__egc *egc,
libxl__domain_create_state *dcs,
state->store_domid, state->console_port,
state->console_domid,
hvm, pae,
- cbflags, dcs->restore_params.checkpointed_stream,
- mirror_qemu_disks,
+ cbflags, dcs->restore_params.checkpointed_stream
};
shs->ao = ao;
@@ -73,21 +72,25 @@ void libxl__xc_domain_restore(libxl__egc *egc,
libxl__domain_create_state *dcs,
LIBXL_CHECKPOINTED_STREAM_COLO) {
shs->completion_callback = libxl__colo_restore_teardown;
} else {
- if(!mirror_qemu_disks){
+ if ( migration_phase != LIBXL_MIGRATION_PHASE_MIRROR_DISK ) {
shs->completion_callback = libxl__xc_domain_restore_done;
+ if( local_disks == LIBXL_MIGRATION_PHASE_VIRTUAL_RAM )
+ shs->need_results = 0;
+ else
+ shs->need_results = 1;
} else {
- shs->completion_callback = libxl__xc_hvm_params_restore_done;
+ shs->completion_callback = libxl__xc_mirror_disks_restore_done;
+ shs->need_results = 1;
}
}
shs->caller_state = dcs;
- shs->need_results = 1;
run_helper(egc, shs, "--restore-domain", restore_fd, send_back_fd, 0, 0,
argnums, ARRAY_SIZE(argnums));
}
void libxl__xc_domain_save(libxl__egc *egc, libxl__domain_save_state *dss,
- libxl__save_helper_state *shs, int
mirror_qemu_disks)
+ libxl__save_helper_state *shs, int migration_phase)
{
STATE_AO_GC(dss->ao);
@@ -96,17 +99,17 @@ void libxl__xc_domain_save(libxl__egc *egc,
libxl__domain_save_state *dss,
const unsigned long argnums[] = {
dss->domid, 0, 0, dss->xcflags, dss->hvm,
- cbflags, dss->checkpointed_stream, mirror_qemu_disks,
+ cbflags, dss->checkpointed_stream, migration_phase,
};
shs->ao = ao;
shs->domid = dss->domid;
shs->recv_callback = libxl__srm_callout_received_save;
- if(!mirror_qemu_disks){
+ if ( migration_phase != LIBXL_MIGRATION_PHASE_MIRROR_DISK )
shs->completion_callback = libxl__xc_domain_save_done;
- }else{
- shs->completion_callback = libxl__xc_hvm_params_save_done;
- }
+ else
+ shs->completion_callback = libxl__xc_mirror_disks_save_done;
+
shs->caller_state = dss;
shs->need_results = 0;
@@ -346,13 +349,13 @@ static void helper_exited(libxl__egc *egc,
libxl__ev_child *ch,
if (!shs->rc)
shs->rc = ERROR_FAIL;
}
-// balvisio: TODO: FIX
-// if (shs->need_results) {
-// if (!shs->rc) {
-// LOGD(ERROR,shs->domid,"%s exited without providing
results",what);
-// shs->rc = ERROR_FAIL;
-// }
-// }
+
+ if (shs->need_results) {
+ if (!shs->rc) {
+ LOGD(ERROR,shs->domid,"%s exited without providing results",what);
+ shs->rc = ERROR_FAIL;
+ }
+ }
if (!shs->completed) {
if (!shs->rc) {
diff --git a/tools/libxl/libxl_save_helper.c b/tools/libxl/libxl_save_helper.c
index cfc9279..9a57b28 100644
--- a/tools/libxl/libxl_save_helper.c
+++ b/tools/libxl/libxl_save_helper.c
@@ -257,7 +257,7 @@ int main(int argc, char **argv)
int hvm = atoi(NEXTARG);
unsigned cbflags = strtoul(NEXTARG,0,10);
xc_migration_stream_t stream_type = strtoul(NEXTARG,0,10);
- int mirror_qemu_disks = atoi(NEXTARG);
+ int migration_phase = atoi(NEXTARG);
assert(!*++argv);
helper_setcallbacks_save(&helper_save_callbacks, cbflags);
@@ -267,7 +267,7 @@ int main(int argc, char **argv)
r = xc_domain_save(xch, io_fd, dom, max_iters, max_factor, flags,
&helper_save_callbacks, hvm, stream_type,
- recv_fd, mirror_qemu_disks);
+ recv_fd, migration_phase);
complete(r);
} else if (!strcmp(mode,"--restore-domain")) {
@@ -283,7 +283,7 @@ int main(int argc, char **argv)
unsigned int pae = strtoul(NEXTARG,0,10);
unsigned cbflags = strtoul(NEXTARG,0,10);
xc_migration_stream_t stream_type = strtoul(NEXTARG,0,10);
- int mirror_qemu_disks = atoi(NEXTARG);
+ int migration_phase = atoi(NEXTARG);
assert(!*++argv);
helper_setcallbacks_restore(&helper_restore_callbacks, cbflags);
@@ -298,8 +298,13 @@ int main(int argc, char **argv)
store_domid, console_evtchn, &console_mfn,
console_domid, hvm, pae,
stream_type,
- &helper_restore_callbacks, send_back_fd);
- helper_stub_restore_results(store_mfn,console_mfn,0);
+ &helper_restore_callbacks, send_back_fd,
+ migration_phase);
+
+ if (migration_phase == LIBXL_MIGRATION_PHASE_NON_LOCAL_DISK ||
+ migration_phase == LIBXL_MIGRATION_PHASE_MIRROR_DISK) {
+ helper_stub_restore_results(store_mfn,console_mfn,0);
+ }
complete(r);
} else {
diff --git a/tools/libxl/libxl_types.idl b/tools/libxl/libxl_types.idl
index 173d70a..de5f536 100644
--- a/tools/libxl/libxl_types.idl
+++ b/tools/libxl/libxl_types.idl
@@ -240,6 +240,12 @@ libxl_checkpointed_stream =
Enumeration("checkpointed_stream", [
(2, "COLO"),
])
+libxl_stream_phase = Enumeration("migration_phase", [
+ (0, "NON_LOCAL_DISK"),
+ (1, "VIRTUAL_RAM"),
+ (2, "MIRROR_DISK"),
+ ])
+
#
# Complex libxl types
#
--
2.3.2 (Apple Git-55)
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |