[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v2 06/18] libxl: store a copy of configuration when creating domain
On Wed, 2014-07-30 at 19:23 +0100, Wei Liu wrote: > 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 has a window that the domain exists but has no JSON config in "therefore have a window". > 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(+) > > diff --git a/tools/libxl/libxl_create.c b/tools/libxl/libxl_create.c > index 0686f96..c997d7a 100644 > --- a/tools/libxl/libxl_create.c > +++ b/tools/libxl/libxl_create.c > @@ -1350,10 +1350,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_data(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_data(lock); > + } > + } > + > + libxl_domain_config_dispose(d_config_saved); > + > if (rc) { > if (dcs->guest_domid) { > dcs->dds.ao = ao; > @@ -1404,6 +1424,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 052315b..a002899 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 52d4d6c..02708c7 100644 > --- a/tools/libxl/libxl_internal.h > +++ b/tools/libxl/libxl_internal.h > @@ -2779,6 +2779,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; > @@ -3247,6 +3248,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 > > /* _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |