[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen master] libxl: store a copy of configuration when creating domain
commit af1f8aa9899f5ff8a1783a49fe6f0c566b8b7bc7 Author: Wei Liu <wei.liu2@xxxxxxxxxx> AuthorDate: Thu Sep 4 23:43:11 2014 +0100 Commit: Ian Campbell <ian.campbell@xxxxxxxxxx> CommitDate: Tue Sep 9 12:46:23 2014 +0100 libxl: store a copy of configuration when creating domain The configuration is stored in libxl-json format. It will be used as template to reconstruct domain configuration during runtime. There's only one write to disk when domain creation finishes. We therefore have a window that the domain exists but has no JSON config in disk. We define this state as domain being created or destroyed. Any other operations that need to access JSON config should bail. Signed-off-by: Wei Liu <wei.liu2@xxxxxxxxxx> Acked-by: Ian Campbell <ian.campbell@xxxxxxxxxx> --- tools/libxl/libxl_create.c | 22 ++++++++++++++++++++++ tools/libxl/libxl_internal.c | 21 +++++++++++++++++++++ tools/libxl/libxl_internal.h | 21 +++++++++++++++++++++ 3 files changed, 64 insertions(+), 0 deletions(-) diff --git a/tools/libxl/libxl_create.c b/tools/libxl/libxl_create.c index ee328e9..57a0ece 100644 --- a/tools/libxl/libxl_create.c +++ b/tools/libxl/libxl_create.c @@ -1389,10 +1389,30 @@ static void domcreate_complete(libxl__egc *egc, { STATE_AO_GC(dcs->ao); libxl_domain_config *const d_config = dcs->guest_config; + libxl_domain_config *d_config_saved = &dcs->guest_config_saved; if (!rc && d_config->b_info.exec_ssidref) rc = xc_flask_relabel_domain(CTX->xch, dcs->guest_domid, d_config->b_info.exec_ssidref); + if (!rc) { + libxl__carefd *lock; + + /* Note that we hold CTX lock at this point so only need to + * take data store lock + */ + lock = libxl__lock_domain_userdata(gc, dcs->guest_domid); + if (!lock) { + rc = ERROR_LOCK_FAIL; + } else { + libxl__update_domain_configuration(gc, d_config_saved, d_config); + rc = libxl__set_domain_configuration(gc, dcs->guest_domid, + d_config_saved); + libxl__unlock_domain_userdata(lock); + } + } + + libxl_domain_config_dispose(d_config_saved); + if (rc) { if (dcs->guest_domid) { dcs->dds.ao = ao; @@ -1443,6 +1463,8 @@ static int do_domain_create(libxl_ctx *ctx, libxl_domain_config *d_config, GCNEW(cdcs); cdcs->dcs.ao = ao; cdcs->dcs.guest_config = d_config; + libxl_domain_config_init(&cdcs->dcs.guest_config_saved); + libxl_domain_config_copy(ctx, &cdcs->dcs.guest_config_saved, d_config); cdcs->dcs.restore_fd = restore_fd; cdcs->dcs.callback = domain_create_cb; cdcs->dcs.checkpointed_stream = checkpointed_stream; diff --git a/tools/libxl/libxl_internal.c b/tools/libxl/libxl_internal.c index 8ac1c14..e9747f1 100644 --- a/tools/libxl/libxl_internal.c +++ b/tools/libxl/libxl_internal.c @@ -506,6 +506,27 @@ out: return rc; } +void libxl__update_domain_configuration(libxl__gc *gc, + libxl_domain_config *dst, + const libxl_domain_config *src) +{ + int i; + + /* update network interface information */ + for (i = 0; i < src->num_nics; i++) + libxl__update_config_nic(gc, &dst->nics[i], &src->nics[i]); + + /* update vtpm information */ + for (i = 0; i < src->num_vtpms; i++) + libxl__update_config_vtpm(gc, &dst->vtpms[i], &src->vtpms[i]); + + /* update guest UUID */ + libxl_uuid_copy(CTX, &dst->c_info.uuid, &src->c_info.uuid); + + /* video ram */ + dst->b_info.video_memkb = src->b_info.video_memkb; +} + /* * Local variables: * mode: C diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h index 22c564f..3b8f74e 100644 --- a/tools/libxl/libxl_internal.h +++ b/tools/libxl/libxl_internal.h @@ -2781,6 +2781,7 @@ struct libxl__domain_create_state { /* filled in by user */ libxl__ao *ao; libxl_domain_config *guest_config; + libxl_domain_config guest_config_saved; /* vanilla config */ int restore_fd; libxl__domain_create_cb *callback; libxl_asyncprogress_how aop_console_how; @@ -3249,6 +3250,26 @@ int libxl__get_domain_configuration(libxl__gc *gc, uint32_t domid, int libxl__set_domain_configuration(libxl__gc *gc, uint32_t domid, libxl_domain_config *d_config); +/* ------ Things related to updating domain configurations ----- */ +void libxl__update_domain_configuration(libxl__gc *gc, + libxl_domain_config *dst, + const libxl_domain_config *src); +static inline void libxl__update_config_nic(libxl__gc *gc, + libxl_device_nic *dst, + libxl_device_nic *src) +{ + dst->devid = src->devid; + libxl_mac_copy(CTX, &dst->mac, &src->mac); +} + +static inline void libxl__update_config_vtpm(libxl__gc *gc, + libxl_device_vtpm *dst, + libxl_device_vtpm *src) +{ + dst->devid = src->devid; + libxl_uuid_copy(CTX, &dst->uuid, &src->uuid); +} + #endif /* -- generated by git-patchbot for /home/xen/git/xen.git#master _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |