[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH 1/5] libxl: introduce cpuid interface to domain build



On Thu, 2010-09-09 at 20:16 +0100, Andre Przywara wrote:
> Ian Campbell wrote:
> > On Wed, 2010-09-08 at 10:19 +0100, Andre Przywara wrote:
> >> Add a cpuid parameter into libxl_domain_build_info and use
> >> it's content while setting up the domain. This is a only paving the way, 
> >> the real functionality is implemented in a later patch.
> >>
> >> Signed-off-by: Andre Przywara <andre.przywara@xxxxxxx>
> > 
> > The destructor function should free the type but not the reference to
> > it, so:
> > 
> >> @@ -102,6 +102,21 @@ void
> >> libxl_key_value_list_destroy(libxl_key_value_list *pkvl)
> >>      free(kvl);
> >>  }
> >>  
> >> +void libxl_cpuid_destroy(libxl_cpuid_policy_list cpuid_list)
> > 
> > This should be *cpuid_list and the function should be adjusted to free
> > the elements of *cpuid_list but not cpuid_list itself.
> > 
> >> --- a/tools/libxl/libxl.idl
> >> +++ b/tools/libxl/libxl.idl
> >> @@ -11,6 +11,7 @@ libxl_console_consback = Builtin("console_consback")
> >>  libxl_console_constype = Builtin("console_constype")
> >>  libxl_disk_phystype = Builtin("disk_phystype")
> >>  libxl_nic_type = Builtin("nic_type")
> >> +libxl_cpuid_policy_list = Builtin("cpuid_policy_list", 
> >> destructor_fn="libxl_cpuid_destroy")
> > 
> > And this should have passby=PASS_BY_REFERENCE.
> > 
> > See 22078:573ddf5cc145 for a similar change to the libxl_string_list and
> > libxl_key_value_list destructor functions.
> Do you mean like in the attached patch?

Yes it looks good from the IDL perspective.

> > 
> >> --- a/tools/libxl/libxl.h
> >> +++ b/tools/libxl/libxl.h
> >> @@ -172,6 +172,22 @@ typedef enum {
> >>      NICTYPE_VIF,
> >>  } libxl_nic_type;
> >>  
> >> +/* holds the CPUID response for a single CPUID leaf
> >> + * input contains the value of the EAX and ECX register,
> >> + * and each policy string contains a filter to apply to
> >> + * the host given values for that particular leaf.
> >> + */ 
> >> +struct libxl_cpuid_policy {
> >> +    uint32_t input[2];
> >> +    char *policy[4];
> >> +};
> > 
> > I realise (at least I think I do) that this is just exposing the
> > existing hypervisor/libxc interface warts and all but would this be more
> > obvious to users if it was:
> > struct libxl_cpuid_policy {
> >       uint32_t eax;
> >       uint32_t ecx;
> > 
> >       char *eax_filter;
> >       char *ebx_filter;
> >       char *ecx_filter;
> >       char *edx_filter;
> > }
> > 
> > could either translate in libxl or push the change down into libxc.
> Actually I consider this structure not a real interface, but more an 
> opaque kludge to transport the data from the configuration parsing to 
> domain creation.
>  If you want to change the data here, I'd like to see 
> the parse functions used. Actually I designed them such that one can 
> alter the policy at any time by chaining calls to these functions. This 
> is my plan to use in the upcoming multi-core patch, it would simply call 
> libxl_cpuid_parse_config(&b_info->cpuid, "proccount=4");
> to make it ultimately readable.
> Beside that I'd rather hide the dynamic array nature of it.
> 
> > Alternatively
> >    #define LIBXL_CPUID_INPUT_EAX 0
> >    #define LIBXL_CPUID_INPUT_ECX 1
> > 
> >    #define LIBXL_CPUID_FILTER_EAX 0
> >    #define LIBXL_CPUID_FILTER_EBX 1
> >    ...
> > would at least make the code (or at least the data structure) a bit more
> > obvious.
> I am not sure whether that would help. The interface is too error-prone 
> to be directly used by other functions than those parsers, so I'd like 
> not to promote it with defining macros (which I probably wouldn't use in 
> my own code, since I mostly either propagate the reg number or enumerate 
> over all registers).

OK, I think that's all very reasonable.

> If you like I could introduce a kind of low-level function, like:
> libxl_cpuid_set_policy(libxl_cpuid_policy_list *list, uint32_t leaf,
>                         int bit, char policy);
> That could be used by other parts of libxl as well and would care about 
> the string fiddling and allocation.
> Do we need this function?

I don't think we need to do this unless/until we have a user which
specifically requires it and we can always add it when such a thing
shows up.

> Shall I state the opaque nature of this structure in a comment?

If it is truly opaque to the users of libxl (and from your patches it
seems that it is) then even better would be to move struct
libxl_cpuid_policy to libxl_internal.h and rename it to struct
libxl__cpuid_policy. Then libxl.h simply contains public typedefs
        typedef struct libxl__cpuid_policy libxl_cpuid_policy;
        typedef libxl_cpuid_policy * libxl_cpuid_policy_list;

This is similar to how the libxl__device_model_starting type is handled.

Ian.


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.