|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v1 05/10] libxl: synchronise configuration when we hotplug a device
On Wed, 2014-07-16 at 18:12 +0100, Wei Liu wrote:
> > > As we don't have a JSON config file for libxl toolstack domain
> > > (currently Dom0) we need to skip JSON manipulation for it.
> >
> > How hard would it be to create a stub/stunt JSON for dom0 when we notice
> > it is missing? Or from e.g. xencommons perhaps?
> >
>
> We need to determine:
> 1. when / where to generate such thing (xencommons?)
> 2. what to put in it
>
> I have yet had answers for #2. The simplest version can be "{}" I think.
> That is an empty configuration that every fields gets the default value.
> But we probably need more than that.
I think you would want at least a name and perhaps a uuid? And cinfo
type == PV.
Device arrays are all empty at start of day.
Some of the stuff about target and maxmem you could perhaps infer at
start of day?
> > > + DEVICE_ADD_JSON(vtpm, vtpms, num_vtpms, domid, &vtpm_saved,
> >
> > The second and third of these arguments could be derived from the first.
> >
>
> Unfortunately not: PCI device doesn't follow this rule. Otherwise I
> would have done it already. :-(
Ah. I had somehow concluded that you weren't using this for PCI. How
annoying.
You could consider DEVICE_ADD_JSON_SIMPLE (or some other word) which
calls the above for the non-PCI cases. Perhaps not worth it though.
>
> > > +#define DEVICE_ADD_JSON(type, ptr, cnt, domid, dev, compare, rc) \
> > > + do { \
> > > + int x; \
> > > + libxl_domain_config d_config; \
> > > + libxl_device_##type *p; \
> > > + \
> > > + if (domid == LIBXL_TOOLSTACK_DOMID) \
> > > + break; \
> > > + \
> > > + libxl_domain_config_init(&d_config); \
> > > + \
> > > + rc = libxl__get_domain_configuration(gc, (domid), &d_config); \
> > > + if (rc) \
> > > + goto add_done; \
> > > + \
> > > + /* Check for duplicated device */ \
> > > + for (x = 0; x < d_config.cnt; x++) { \
> > > + if (compare(&d_config.ptr[x], (dev))) { \
> >
> > Compare just checks ->devid etc, right?
> >
>
> It depends on specific device type. See those COMPARE_* macros.
> Disk and PCI devices don't have devid.
Sure. I just meant to use devid as a specific example.
> > What if this device has the same devid but a different config?
> >
> > That probably ought to be an error, have we already caught that or are
> > we relying on something later?
> >
>
> Then the caller should use DEVICE_UPDATE_JSON which is introduced in
> later patch.
>
> > I suppose either way we don't want to add the device again now.
> >
>
> Yes.
>
> > > + rc = 0; \
> > > + goto add_done; \
> > > + } \
> > > + } \
> > > + \
> > > + d_config.ptr = \
> > > + libxl__realloc(gc, d_config.ptr, \
> > > + (d_config.cnt + 1) * \
> > > + sizeof(libxl_device_##type)); \
> > > + p = &d_config.ptr[d_config.cnt]; \
> > > + d_config.cnt++; \
> > > + libxl_device_##type##_copy(CTX, p, (dev)); \
> > > + \
> > > + rc = libxl__set_domain_configuration(gc, (domid), &d_config); \
> >
> > How close to being possible is it to do this as a proper helper function
> > which takes a size_t and a bunch of fn pointers with void where the type
> > would be?
> >
>
> We need to know the type of this structure otherwise we don't know what
> *_copy function to call. Sadly there's no way to pass in type information
> in C in runtime.
You could pass a copyfn as a function pointer with a void * argument for
the object to a helper function which doesn't need the specifics and
then have a macro which simply defines the type safe wrappers around
that. ISTR thinking that the helper would need a sizeof passing to it
as well for the realloc.
Ian.
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |