[libvirt] [PATCH 00/16] Hyper-V: Improve 2008, Introduce 2012

John Ferlan jferlan at redhat.com
Thu Sep 15 21:56:51 UTC 2016



On 08/09/2016 08:39 AM, Jason Miesionczek wrote:
> The following patches include work originally done by Yves Vinter back
> in 2014. The last patch introduces support for Hyper-V 2012, while still
> supporting 2008. I am not sure that the method I used to include the 2012
> support is the best approach, mainly due to code duplication, but I am
> open to suggestions on how to do this better.
> 
> Jason Miesionczek (16):
>   hyperv: additional server 2008 wmi classes
>   hyperv: add cim types support to code generator
>   hyperv: add get capabilities
>   hyperv: implement connectGetVersion
>   hyperv: implement vcpu functions
>   hyperv: implement nodeGetFreeMemory
>   hyperv: implement ability to send xml soap requests
>   hyperv: introduce basic network driver
>   hyperv: add domain shutdown function
>   hyperv: add get scheduler functions
>   hyperv: add set memory functions
>   hyperv: set vpcu functions
>   hyperv: domain undefine functions
>   hyperv: domain define and associated functions
>   hyperv: network list functions
>   hyperv: introduce 2012 support
> 
>  src/Makefile.am                       |    2 +
>  src/hyperv/hyperv_driver.c            | 1989 ++++++++++++++++++++++++++++++++-
>  src/hyperv/hyperv_driver_2012.c       |  299 +++++
>  src/hyperv/hyperv_driver_2012.h       |   55 +
>  src/hyperv/hyperv_network_driver.c    |  280 +++++
>  src/hyperv/hyperv_network_driver.h    |   30 +
>  src/hyperv/hyperv_private.h           |    8 +
>  src/hyperv/hyperv_wmi.c               |  709 +++++++++++-
>  src/hyperv/hyperv_wmi.h               |   78 ++
>  src/hyperv/hyperv_wmi_generator.input |  518 ++++++++-
>  src/hyperv/hyperv_wmi_generator.py    |   68 +-
>  src/hyperv/openwsman.h                |    4 +
>  12 files changed, 3989 insertions(+), 51 deletions(-)
>  create mode 100644 src/hyperv/hyperv_driver_2012.c
>  create mode 100644 src/hyperv/hyperv_driver_2012.h
>  create mode 100644 src/hyperv/hyperv_network_driver.c
>  create mode 100644 src/hyperv/hyperv_network_driver.h
> 

That concludes my first adventure into the hyperv driver... Don't be too
discouraged - there's a long list of changes that need to be done, it's
not impossible.

It's very important to work from top of the upstream git tree and to be
sure to "make check syntax-check" *before* posting patches - that'll
clear out a lot of repetitive stuff.

I think though you need to consider posting in smaller chunks. It'll be
a marathon, not a sprint. The bandwidth for reviews isn't very wide
either.

FWIW: So that you can consider this earlier...

Eventually I realized the query strings that you're formulating that
start with "associators of" - well I think you might be better of
creating a "generic function" rather than cut-n-paste a similar sequence
in every function.

So here's my suggestion create a common function now, then modify the
existing code to call/use that function.  Then modify each of the
subsequent patches to do the same for example:

(NOTE: Rename param1-4 to something better, it's my shorthand)

static Msvm_VirtualSystemSettingData *
hypervBuildQueryBuffer(const char *param1, const char *param2,
                       const char *param3, const char *param4)
{
    virBuffer query = VIR_BUFFER_INITIALIZER;

    virBufferAddLit(&query, "associators of ");
    virBufferAsprintf(&query, "{%s=\"%s\"} ", param1, param2);
    virBufferAsprintf(&query, "where AssocClass = %s ", param3);
    virBufferAsprintf(&query, "ResultClass = %s", param4);

    if (virBufferCheckError(&query) < 0)
        return NULL;

    return query;
}

...
Then also create constant shortcuts, such as:

#define WIN32_CS_NAME "Win32_ComputerSystem.Name"
#define WIN32_CSP "Win32_ComputerSystemProcessor"
#define WIN32_PROC "Win32_Processor"

So that calling would be (for example from existing source)

  if (!(query = hypervBuildQueryBuffer(WIN32_CS_NAME,
                                       computerSystem->data->Name,
                                       WIN32_CSP,
                                       WIN32_PROC)))
     goto cleanup/error
...

The rest I'll leave up to you, but doing some #define string
concatenation will make things look better. The painful looking on is
the "Msvm_ComputerSystem.CreationClassName=..."

*Anywhere* that it's possible to reuse code or reduce the cut-copy-paste
should be considered.

You may even want to consider making some sort of static struct to
"predefine" the lookup function to be called and the parameter,
considering the following a start:

typedef int (*hypervListFunc)(hypervPrivate *priv, virBufferPtr query,
                              void **list);
struct _hypervList {
    int type;
    hypervListFunc func;
};
static const _hypervList hypervListTable[] = {

    { .type = HYPERV_LIST_WIN32_PROCESSORS,
      .func = hypervGetWin32ProcessorList,
    },
    { .type = HYPERV_LIST_MSVM_VSSD,
      .func = hypervGetMsvmVirtualSystemSettingDataList,
    },
...
};

Then the above QueryBuffer gets "expanded" a bit to pass in a "type" and
"void" which we can reference into the table in order to get the .func
to call.  My brain cannot handle (right now) how to have variable types
of data to return...  It has to be possible it's just a matter of
working through it in order to find the magic incantation or someone
else's working example.

John




More information about the libvir-list mailing list