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

2018-08-14 Thread Marcos Paulo de Souza
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 :
> > 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 
> > ---
> >  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(,
> > +   
> > "capability.maxHostSupportedVcpus\0"
> > +   "capability.maxSupportedVcpus"
> > +  ) < 0 ||
> > +esxVI_LookupHostSystemProperties(priv->primary, propertyNameList,
> > +  ) < 0 ||
> > +esxVI_GetInt(hostSystem, "capability.maxHostSupportedVcpus",
> > +  , esxVI_Occurrence_RequiredItem) < 0 ||
> > +esxVI_GetInt(hostSystem, "capability.maxSupportedVcpus",
> > +  , 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();
> > +esxVI_ObjectContent_Free();
> > +esxVI_Int_Free();
> > +esxVI_Int_Free();
> > +
> > +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

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


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

2018-08-13 Thread Matthias Bolte
2018-08-10 5:56 GMT+02:00 Marcos Paulo de Souza :
> 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 
> ---
>  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(,
> +   
> "capability.maxHostSupportedVcpus\0"
> +   "capability.maxSupportedVcpus"
> +  ) < 0 ||
> +esxVI_LookupHostSystemProperties(priv->primary, propertyNameList,
> +  ) < 0 ||
> +esxVI_GetInt(hostSystem, "capability.maxHostSupportedVcpus",
> +  , esxVI_Occurrence_RequiredItem) < 0 ||
> +esxVI_GetInt(hostSystem, "capability.maxSupportedVcpus",
> +  , 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();
> +esxVI_ObjectContent_Free();
> +esxVI_Int_Free();
> +esxVI_Int_Free();
> +
> +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.

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

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


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

2018-08-09 Thread Marcos Paulo de Souza
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 
---
 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(,
+   "capability.maxHostSupportedVcpus\0"
+   "capability.maxSupportedVcpus"
+  ) < 0 ||
+esxVI_LookupHostSystemProperties(priv->primary, propertyNameList,
+  ) < 0 ||
+esxVI_GetInt(hostSystem, "capability.maxHostSupportedVcpus",
+  , esxVI_Occurrence_RequiredItem) < 0 ||
+esxVI_GetInt(hostSystem, "capability.maxSupportedVcpus",
+  , 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();
+esxVI_ObjectContent_Free();
+esxVI_Int_Free();
+esxVI_Int_Free();
+
+return priv->maxVcpus;
 }
 
 
-- 
2.17.1

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list