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(a)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(a)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.
--
Thanks,
Marcos