[libvirt] [PATCH 2/2] esx:Fix esxDomainGetMaxVcpus to return correct vcpus

Marcos Paulo de Souza marcos.souza.org at gmail.com
Tue Aug 14 22:25:41 UTC 2018


On Mon, Aug 13, 2018 at 11:21:05PM +0200, Matthias Bolte wrote:
> 2018-08-10 5:56 GMT+02:00 Marcos Paulo de Souza <marcos.souza.org at gmail.com>:
> > Before this change, esxDomainGetMaxVcpus returned -1, which in turn
> > fails in libvirt. This commit reimplements esxDomainGetMaxVcpus instead
> > of calling esxDomainGetVcpusFlags. The implementation checks for
> > capability.maxSupportedVcpus, but as this one can be ommited in ESXi, we
> > also check for capability.maxHostSupportedVcpus. With this change,
> > virDomainSetVcpus, virDomainGetMaxVcpus and virDomainGetVcpusFlags and
> > returning correct values.
> >
> > Signed-off-by: Marcos Paulo de Souza <marcos.souza.org at gmail.com>
> > ---
> >  src/esx/esx_driver.c | 36 ++++++++++++++++++++++++++++++++++--
> >  1 file changed, 34 insertions(+), 2 deletions(-)
> >
> > diff --git a/src/esx/esx_driver.c b/src/esx/esx_driver.c
> > index d5e8a7b4eb..3169314fa4 100644
> > --- a/src/esx/esx_driver.c
> > +++ b/src/esx/esx_driver.c
> > @@ -2581,8 +2581,40 @@ esxDomainGetVcpusFlags(virDomainPtr domain, unsigned int flags)
> >  static int
> >  esxDomainGetMaxVcpus(virDomainPtr domain)
> >  {
> > -    return esxDomainGetVcpusFlags(domain, (VIR_DOMAIN_AFFECT_LIVE |
> > -                                           VIR_DOMAIN_VCPU_MAXIMUM));
> > +    esxPrivate *priv = domain->conn->privateData;
> > +    esxVI_String *propertyNameList = NULL;
> > +    esxVI_ObjectContent *hostSystem = NULL;
> > +    esxVI_Int *supportedVcpus = NULL;
> > +    esxVI_Int *hostVcpus = NULL;
> > +
> > +    if (esxVI_EnsureSession(priv->primary) < 0)
> > +        return -1;
> > +
> > +    priv->maxVcpus = -1;
> > +
> > +    if (esxVI_String_AppendValueToList(&propertyNameList,
> > +                                           "capability.maxHostSupportedVcpus\0"
> > +                                           "capability.maxSupportedVcpus"
> > +                                          ) < 0 ||
> > +        esxVI_LookupHostSystemProperties(priv->primary, propertyNameList,
> > +                                          &hostSystem) < 0 ||
> > +        esxVI_GetInt(hostSystem, "capability.maxHostSupportedVcpus",
> > +                      &hostVcpus, esxVI_Occurrence_RequiredItem) < 0 ||
> > +        esxVI_GetInt(hostSystem, "capability.maxSupportedVcpus",
> > +                      &supportedVcpus, esxVI_Occurrence_OptionalItem) < 0)
> > +
> > +        goto cleanup;
> > +
> > +    /* as maxSupportedVcpus is optional, check also for maxHostSupportedVcpus */
> > +    priv->maxVcpus = supportedVcpus ? supportedVcpus->value : hostVcpus->value;
> > +
> > + cleanup:
> > +    esxVI_String_Free(&propertyNameList);
> > +    esxVI_ObjectContent_Free(&hostSystem);
> > +    esxVI_Int_Free(&supportedVcpus);
> > +    esxVI_Int_Free(&hostVcpus);
> > +
> > +    return priv->maxVcpus;
> >  }
> 
> This is the wrong way to fix the situation. The correct way ist to
> make esxDomainGetVcpusFlags handle the VIR_DOMAIN_VCPU_MAXIMUM flag
> properly.

Thanks for the suggestions, I will send a v2 soon.

> 
> -- 
> Matthias Bolte
> http://photron.blogspot.com

-- 
Thanks,
	Marcos




More information about the libvir-list mailing list