Re: [libvirt] [PATCH v4] qemu: Implement CPUs check against machine type's cpu-max

2013-06-26 Thread Martin Kletzander
On 06/25/2013 05:44 PM, Michal Novotny wrote:
 Implement check whether (maximum) vCPUs doesn't exceed machine
 type's cpu-max settings.
 
 Differences between v3 and v4 (this one):
  - Rebased to latest libvirt version
  - Capability XML output extended by maxCpus field
  - Extended caps-qemu-kvm.xml test by maxCpus for one of test emulators
 
 On older versions of QEMU the check is disabled.
 
 Signed-off-by: Michal Novotny minov...@redhat.com
 ---
  docs/schemas/capability.rng  |  5 
  src/conf/capabilities.c  |  4 +++
  src/conf/capabilities.h  |  1 +
  src/qemu/qemu_capabilities.c | 41 
 +++-
  src/qemu/qemu_capabilities.h |  3 +-
  src/qemu/qemu_monitor.h  |  1 +
  src/qemu/qemu_monitor_json.c |  6 
  src/qemu/qemu_process.c  | 27 ++
  tests/capabilityschemadata/caps-qemu-kvm.xml | 16 +--
  9 files changed, 94 insertions(+), 10 deletions(-)
 
[...]
 diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
[...]
 @@ -1789,9 +1801,11 @@ void virQEMUCapsDispose(void *obj)
  for (i = 0; i  qemuCaps-nmachineTypes; i++) {
  VIR_FREE(qemuCaps-machineTypes[i]);
  VIR_FREE(qemuCaps-machineAliases[i]);
 +qemuCaps-machineMaxCpus[i] = -1;

Pointless line.

  }
  VIR_FREE(qemuCaps-machineTypes);
  VIR_FREE(qemuCaps-machineAliases);
 +VIR_FREE(qemuCaps-machineMaxCpus);
  
  for (i = 0; i  qemuCaps-ncpuDefinitions; i++) {
  VIR_FREE(qemuCaps-cpuDefinitions[i]);
[...]
 diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h
 index 64a4b1d..7088747 100644
 --- a/src/qemu/qemu_capabilities.h
 +++ b/src/qemu/qemu_capabilities.h
 @@ -234,7 +234,8 @@ size_t virQEMUCapsGetMachineTypes(virQEMUCapsPtr qemuCaps,
char ***names);
  const char *virQEMUCapsGetCanonicalMachine(virQEMUCapsPtr qemuCaps,
 const char *name);
 -
 +int virQEMUCapsGetMachineMaxCpus(virQEMUCapsPtr qemuCaps,
 + const char *name);
  int virQEMUCapsGetMachineTypesCaps(virQEMUCapsPtr qemuCaps,
 size_t *nmachines,
 virCapsGuestMachinePtr **machines);
 diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h
 index 3d9afa3..06ae4c5 100644
 --- a/src/qemu/qemu_monitor.h
 +++ b/src/qemu/qemu_monitor.h
 @@ -654,6 +654,7 @@ struct _qemuMonitorMachineInfo {
  char *name;
  bool isDefault;
  char *alias;
 +int cpu_max;

This parameter should be unified to match the previous naming (maxCpus)
as cpu_max might be misunderstood as a maximum cpu number, not the
maximum number of cpus.

  };
  
  int qemuMonitorGetMachines(qemuMonitorPtr mon,
[...]
 diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
 index 5a0f18b..3146ce2 100644
 --- a/src/qemu/qemu_process.c
 +++ b/src/qemu/qemu_process.c
 @@ -3330,6 +3330,30 @@ error:
  }
  
  
 +static bool
 +qemuValidateCpuMax(virDomainDefPtr def, virQEMUCapsPtr qemuCaps)
 +{
 +int cpu_max;
 +
 +cpu_max = virQEMUCapsGetMachineMaxCpus(qemuCaps, def-os.machine);
 +if (!cpu_max)
 +return true;
 +
 +if (def-vcpus  cpu_max) {
 +virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
 +   %s, _(CPUs greater than specified machine type 
 limit));
 +return false;
 +}
 +

This check is pointless since it's guaranteed that vcpus = maxvcpus.

 +if (def-maxvcpus  cpu_max) {
 +virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
 +   %s, _(Maximum CPUs greater than specified machine 
 type limit));
 +return false;
 +}
 +
 +return true;
 +}
 +
  int qemuProcessStart(virConnectPtr conn,
   virQEMUDriverPtr driver,
   virDomainObjPtr vm,

Other that that the patch looks fine, but I'd wait with the push after
release.  If nobody is against that (and against the changes I
proposed), I'll push this after the release.

Martin

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


Re: [libvirt] [PATCH v4] qemu: Implement CPUs check against machine type's cpu-max

2013-06-26 Thread Michal Novotny

On 06/26/2013 04:17 PM, Martin Kletzander wrote:
 On 06/25/2013 05:44 PM, Michal Novotny wrote:
 Implement check whether (maximum) vCPUs doesn't exceed machine
 type's cpu-max settings.

 Differences between v3 and v4 (this one):
  - Rebased to latest libvirt version
  - Capability XML output extended by maxCpus field
  - Extended caps-qemu-kvm.xml test by maxCpus for one of test emulators

 On older versions of QEMU the check is disabled.

 Signed-off-by: Michal Novotny minov...@redhat.com
 ---
  docs/schemas/capability.rng  |  5 
  src/conf/capabilities.c  |  4 +++
  src/conf/capabilities.h  |  1 +
  src/qemu/qemu_capabilities.c | 41 
 +++-
  src/qemu/qemu_capabilities.h |  3 +-
  src/qemu/qemu_monitor.h  |  1 +
  src/qemu/qemu_monitor_json.c |  6 
  src/qemu/qemu_process.c  | 27 ++
  tests/capabilityschemadata/caps-qemu-kvm.xml | 16 +--
  9 files changed, 94 insertions(+), 10 deletions(-)

 [...]
 diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
 [...]
 @@ -1789,9 +1801,11 @@ void virQEMUCapsDispose(void *obj)
  for (i = 0; i  qemuCaps-nmachineTypes; i++) {
  VIR_FREE(qemuCaps-machineTypes[i]);
  VIR_FREE(qemuCaps-machineAliases[i]);
 +qemuCaps-machineMaxCpus[i] = -1;
 Pointless line.

  }
  VIR_FREE(qemuCaps-machineTypes);
  VIR_FREE(qemuCaps-machineAliases);
 +VIR_FREE(qemuCaps-machineMaxCpus);
  
  for (i = 0; i  qemuCaps-ncpuDefinitions; i++) {
  VIR_FREE(qemuCaps-cpuDefinitions[i]);
 [...]
 diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h
 index 64a4b1d..7088747 100644
 --- a/src/qemu/qemu_capabilities.h
 +++ b/src/qemu/qemu_capabilities.h
 @@ -234,7 +234,8 @@ size_t virQEMUCapsGetMachineTypes(virQEMUCapsPtr 
 qemuCaps,
char ***names);
  const char *virQEMUCapsGetCanonicalMachine(virQEMUCapsPtr qemuCaps,
 const char *name);
 -
 +int virQEMUCapsGetMachineMaxCpus(virQEMUCapsPtr qemuCaps,
 + const char *name);
  int virQEMUCapsGetMachineTypesCaps(virQEMUCapsPtr qemuCaps,
 size_t *nmachines,
 virCapsGuestMachinePtr **machines);
 diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h
 index 3d9afa3..06ae4c5 100644
 --- a/src/qemu/qemu_monitor.h
 +++ b/src/qemu/qemu_monitor.h
 @@ -654,6 +654,7 @@ struct _qemuMonitorMachineInfo {
  char *name;
  bool isDefault;
  char *alias;
 +int cpu_max;
 This parameter should be unified to match the previous naming (maxCpus)
 as cpu_max might be misunderstood as a maximum cpu number, not the
 maximum number of cpus.

  };
  
  int qemuMonitorGetMachines(qemuMonitorPtr mon,
 [...]
 diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
 index 5a0f18b..3146ce2 100644
 --- a/src/qemu/qemu_process.c
 +++ b/src/qemu/qemu_process.c
 @@ -3330,6 +3330,30 @@ error:
  }
  
  
 +static bool
 +qemuValidateCpuMax(virDomainDefPtr def, virQEMUCapsPtr qemuCaps)
 +{
 +int cpu_max;
 +
 +cpu_max = virQEMUCapsGetMachineMaxCpus(qemuCaps, def-os.machine);
 +if (!cpu_max)
 +return true;
 +
 +if (def-vcpus  cpu_max) {
 +virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
 +   %s, _(CPUs greater than specified machine type 
 limit));
 +return false;
 +}
 +
 This check is pointless since it's guaranteed that vcpus = maxvcpus.

 +if (def-maxvcpus  cpu_max) {
 +virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
 +   %s, _(Maximum CPUs greater than specified machine 
 type limit));
 +return false;
 +}
 +
 +return true;
 +}
 +
  int qemuProcessStart(virConnectPtr conn,
   virQEMUDriverPtr driver,
   virDomainObjPtr vm,
 Other that that the patch looks fine, but I'd wait with the push after
 release.  If nobody is against that (and against the changes I
 proposed), I'll push this after the release.

 Martin

Ok Martin, would you like me to do the changes you proposed or will you
refresh the patch yourself and no need to submit v5 ?

Thanks,
Michal

-- 
Michal Novotny minov...@redhat.com, RHCE, Red Hat
Virtualization | libvirt-php bindings | php-virt-control.org

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


Re: [libvirt] [PATCH v4] qemu: Implement CPUs check against machine type's cpu-max

2013-06-26 Thread Martin Kletzander
On 06/26/2013 04:20 PM, Michal Novotny wrote:
 
 On 06/26/2013 04:17 PM, Martin Kletzander wrote:
 On 06/25/2013 05:44 PM, Michal Novotny wrote:
 Implement check whether (maximum) vCPUs doesn't exceed machine
 type's cpu-max settings.

 Differences between v3 and v4 (this one):
  - Rebased to latest libvirt version
  - Capability XML output extended by maxCpus field
  - Extended caps-qemu-kvm.xml test by maxCpus for one of test emulators

 On older versions of QEMU the check is disabled.

 Signed-off-by: Michal Novotny minov...@redhat.com
 ---
  docs/schemas/capability.rng  |  5 
  src/conf/capabilities.c  |  4 +++
  src/conf/capabilities.h  |  1 +
  src/qemu/qemu_capabilities.c | 41 
 +++-
  src/qemu/qemu_capabilities.h |  3 +-
  src/qemu/qemu_monitor.h  |  1 +
  src/qemu/qemu_monitor_json.c |  6 
  src/qemu/qemu_process.c  | 27 ++
  tests/capabilityschemadata/caps-qemu-kvm.xml | 16 +--
  9 files changed, 94 insertions(+), 10 deletions(-)

 [...]
 diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
 [...]
 @@ -1789,9 +1801,11 @@ void virQEMUCapsDispose(void *obj)
  for (i = 0; i  qemuCaps-nmachineTypes; i++) {
  VIR_FREE(qemuCaps-machineTypes[i]);
  VIR_FREE(qemuCaps-machineAliases[i]);
 +qemuCaps-machineMaxCpus[i] = -1;
 Pointless line.

  }
  VIR_FREE(qemuCaps-machineTypes);
  VIR_FREE(qemuCaps-machineAliases);
 +VIR_FREE(qemuCaps-machineMaxCpus);
  
  for (i = 0; i  qemuCaps-ncpuDefinitions; i++) {
  VIR_FREE(qemuCaps-cpuDefinitions[i]);
 [...]
 diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h
 index 64a4b1d..7088747 100644
 --- a/src/qemu/qemu_capabilities.h
 +++ b/src/qemu/qemu_capabilities.h
 @@ -234,7 +234,8 @@ size_t virQEMUCapsGetMachineTypes(virQEMUCapsPtr 
 qemuCaps,
char ***names);
  const char *virQEMUCapsGetCanonicalMachine(virQEMUCapsPtr qemuCaps,
 const char *name);
 -
 +int virQEMUCapsGetMachineMaxCpus(virQEMUCapsPtr qemuCaps,
 + const char *name);
  int virQEMUCapsGetMachineTypesCaps(virQEMUCapsPtr qemuCaps,
 size_t *nmachines,
 virCapsGuestMachinePtr **machines);
 diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h
 index 3d9afa3..06ae4c5 100644
 --- a/src/qemu/qemu_monitor.h
 +++ b/src/qemu/qemu_monitor.h
 @@ -654,6 +654,7 @@ struct _qemuMonitorMachineInfo {
  char *name;
  bool isDefault;
  char *alias;
 +int cpu_max;
 This parameter should be unified to match the previous naming (maxCpus)
 as cpu_max might be misunderstood as a maximum cpu number, not the
 maximum number of cpus.

  };
  
  int qemuMonitorGetMachines(qemuMonitorPtr mon,
 [...]
 diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
 index 5a0f18b..3146ce2 100644
 --- a/src/qemu/qemu_process.c
 +++ b/src/qemu/qemu_process.c
 @@ -3330,6 +3330,30 @@ error:
  }
  
  
 +static bool
 +qemuValidateCpuMax(virDomainDefPtr def, virQEMUCapsPtr qemuCaps)
 +{
 +int cpu_max;
 +
 +cpu_max = virQEMUCapsGetMachineMaxCpus(qemuCaps, def-os.machine);
 +if (!cpu_max)
 +return true;
 +
 +if (def-vcpus  cpu_max) {
 +virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
 +   %s, _(CPUs greater than specified machine type 
 limit));
 +return false;
 +}
 +
 This check is pointless since it's guaranteed that vcpus = maxvcpus.

 +if (def-maxvcpus  cpu_max) {
 +virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
 +   %s, _(Maximum CPUs greater than specified 
 machine type limit));
 +return false;
 +}
 +
 +return true;
 +}
 +
  int qemuProcessStart(virConnectPtr conn,
   virQEMUDriverPtr driver,
   virDomainObjPtr vm,
 Other that that the patch looks fine, but I'd wait with the push after
 release.  If nobody is against that (and against the changes I
 proposed), I'll push this after the release.

 Martin
 
 Ok Martin, would you like me to do the changes you proposed or will you
 refresh the patch yourself and no need to submit v5 ?
 

If you'll make it with the v5 before the release, the added value will
be that everyone will be offered the look to how the final patch looks
like, but if you won't I'll push this one with the changes I proposed.

Martin

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


Re: [libvirt] [PATCH v4] qemu: Implement CPUs check against machine type's cpu-max

2013-06-26 Thread Michal Novotny

On 06/26/2013 04:29 PM, Martin Kletzander wrote:
 On 06/26/2013 04:20 PM, Michal Novotny wrote:
 On 06/26/2013 04:17 PM, Martin Kletzander wrote:
 On 06/25/2013 05:44 PM, Michal Novotny wrote:
 Implement check whether (maximum) vCPUs doesn't exceed machine
 type's cpu-max settings.

 Differences between v3 and v4 (this one):
  - Rebased to latest libvirt version
  - Capability XML output extended by maxCpus field
  - Extended caps-qemu-kvm.xml test by maxCpus for one of test emulators

 On older versions of QEMU the check is disabled.

 Signed-off-by: Michal Novotny minov...@redhat.com
 ---
  docs/schemas/capability.rng  |  5 
  src/conf/capabilities.c  |  4 +++
  src/conf/capabilities.h  |  1 +
  src/qemu/qemu_capabilities.c | 41 
 +++-
  src/qemu/qemu_capabilities.h |  3 +-
  src/qemu/qemu_monitor.h  |  1 +
  src/qemu/qemu_monitor_json.c |  6 
  src/qemu/qemu_process.c  | 27 ++
  tests/capabilityschemadata/caps-qemu-kvm.xml | 16 +--
  9 files changed, 94 insertions(+), 10 deletions(-)

 [...]
 diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
 [...]
 @@ -1789,9 +1801,11 @@ void virQEMUCapsDispose(void *obj)
  for (i = 0; i  qemuCaps-nmachineTypes; i++) {
  VIR_FREE(qemuCaps-machineTypes[i]);
  VIR_FREE(qemuCaps-machineAliases[i]);
 +qemuCaps-machineMaxCpus[i] = -1;
 Pointless line.

  }
  VIR_FREE(qemuCaps-machineTypes);
  VIR_FREE(qemuCaps-machineAliases);
 +VIR_FREE(qemuCaps-machineMaxCpus);
  
  for (i = 0; i  qemuCaps-ncpuDefinitions; i++) {
  VIR_FREE(qemuCaps-cpuDefinitions[i]);
 [...]
 diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h
 index 64a4b1d..7088747 100644
 --- a/src/qemu/qemu_capabilities.h
 +++ b/src/qemu/qemu_capabilities.h
 @@ -234,7 +234,8 @@ size_t virQEMUCapsGetMachineTypes(virQEMUCapsPtr 
 qemuCaps,
char ***names);
  const char *virQEMUCapsGetCanonicalMachine(virQEMUCapsPtr qemuCaps,
 const char *name);
 -
 +int virQEMUCapsGetMachineMaxCpus(virQEMUCapsPtr qemuCaps,
 + const char *name);
  int virQEMUCapsGetMachineTypesCaps(virQEMUCapsPtr qemuCaps,
 size_t *nmachines,
 virCapsGuestMachinePtr **machines);
 diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h
 index 3d9afa3..06ae4c5 100644
 --- a/src/qemu/qemu_monitor.h
 +++ b/src/qemu/qemu_monitor.h
 @@ -654,6 +654,7 @@ struct _qemuMonitorMachineInfo {
  char *name;
  bool isDefault;
  char *alias;
 +int cpu_max;
 This parameter should be unified to match the previous naming (maxCpus)
 as cpu_max might be misunderstood as a maximum cpu number, not the
 maximum number of cpus.

  };
  
  int qemuMonitorGetMachines(qemuMonitorPtr mon,
 [...]
 diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
 index 5a0f18b..3146ce2 100644
 --- a/src/qemu/qemu_process.c
 +++ b/src/qemu/qemu_process.c
 @@ -3330,6 +3330,30 @@ error:
  }
  
  
 +static bool
 +qemuValidateCpuMax(virDomainDefPtr def, virQEMUCapsPtr qemuCaps)
 +{
 +int cpu_max;
 +
 +cpu_max = virQEMUCapsGetMachineMaxCpus(qemuCaps, def-os.machine);
 +if (!cpu_max)
 +return true;
 +
 +if (def-vcpus  cpu_max) {
 +virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
 +   %s, _(CPUs greater than specified machine type 
 limit));
 +return false;
 +}
 +
 This check is pointless since it's guaranteed that vcpus = maxvcpus.

 +if (def-maxvcpus  cpu_max) {
 +virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
 +   %s, _(Maximum CPUs greater than specified 
 machine type limit));
 +return false;
 +}
 +
 +return true;
 +}
 +
  int qemuProcessStart(virConnectPtr conn,
   virQEMUDriverPtr driver,
   virDomainObjPtr vm,
 Other that that the patch looks fine, but I'd wait with the push after
 release.  If nobody is against that (and against the changes I
 proposed), I'll push this after the release.

 Martin
 Ok Martin, would you like me to do the changes you proposed or will you
 refresh the patch yourself and no need to submit v5 ?

 If you'll make it with the v5 before the release, the added value will
 be that everyone will be offered the look to how the final patch looks
 like, but if you won't I'll push this one with the changes I proposed.

 Martin


Feel free to push with changes you proposed, I need to take care of
other stuff ;-)

Thanks,
Michal

-- 
Michal Novotny minov...@redhat.com, RHCE, Red Hat
Virtualization | libvirt-php bindings | php-virt-control.org

--
libvir-list mailing list
libvir-list@redhat.com

[libvirt] [PATCH v4] qemu: Implement CPUs check against machine type's cpu-max

2013-06-25 Thread Michal Novotny
Implement check whether (maximum) vCPUs doesn't exceed machine
type's cpu-max settings.

Differences between v3 and v4 (this one):
 - Rebased to latest libvirt version
 - Capability XML output extended by maxCpus field
 - Extended caps-qemu-kvm.xml test by maxCpus for one of test emulators

On older versions of QEMU the check is disabled.

Signed-off-by: Michal Novotny minov...@redhat.com
---
 docs/schemas/capability.rng  |  5 
 src/conf/capabilities.c  |  4 +++
 src/conf/capabilities.h  |  1 +
 src/qemu/qemu_capabilities.c | 41 +++-
 src/qemu/qemu_capabilities.h |  3 +-
 src/qemu/qemu_monitor.h  |  1 +
 src/qemu/qemu_monitor_json.c |  6 
 src/qemu/qemu_process.c  | 27 ++
 tests/capabilityschemadata/caps-qemu-kvm.xml | 16 +--
 9 files changed, 94 insertions(+), 10 deletions(-)

diff --git a/docs/schemas/capability.rng b/docs/schemas/capability.rng
index 106ca73..65c7c72 100644
--- a/docs/schemas/capability.rng
+++ b/docs/schemas/capability.rng
@@ -290,6 +290,11 @@
   text/
 /attribute
   /optional
+  optional
+attribute name='maxCpus'
+  ref name='unsignedInt'/
+/attribute
+  /optional
   text/
 /element
   /define
diff --git a/src/conf/capabilities.c b/src/conf/capabilities.c
index da92c78..5aeb2ab 100644
--- a/src/conf/capabilities.c
+++ b/src/conf/capabilities.c
@@ -853,6 +853,8 @@ virCapabilitiesFormatXML(virCapsPtr caps)
 virBufferAddLit(xml,   machine);
 if (machine-canonical)
 virBufferAsprintf(xml,  canonical='%s', machine-canonical);
+if (machine-maxCpus  0)
+virBufferAsprintf(xml,  maxCpus='%d', machine-maxCpus);
 virBufferAsprintf(xml, %s/machine\n, machine-name);
 }
 
@@ -871,6 +873,8 @@ virCapabilitiesFormatXML(virCapsPtr caps)
 virBufferAddLit(xml, machine);
 if (machine-canonical)
 virBufferAsprintf(xml,  canonical='%s', 
machine-canonical);
+if (machine-maxCpus  0)
+virBufferAsprintf(xml,  maxCpus='%d', machine-maxCpus);
 virBufferAsprintf(xml, %s/machine\n, machine-name);
 }
 virBufferAddLit(xml,   /domain\n);
diff --git a/src/conf/capabilities.h b/src/conf/capabilities.h
index abcf6de..22b6fb6 100644
--- a/src/conf/capabilities.h
+++ b/src/conf/capabilities.h
@@ -46,6 +46,7 @@ typedef virCapsGuestMachine *virCapsGuestMachinePtr;
 struct _virCapsGuestMachine {
 char *name;
 char *canonical;
+int maxCpus;
 };
 
 typedef struct _virCapsGuestDomainInfo virCapsGuestDomainInfo;
diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
index c4e076a..89f41b8 100644
--- a/src/qemu/qemu_capabilities.c
+++ b/src/qemu/qemu_capabilities.c
@@ -256,6 +256,7 @@ struct _virQEMUCaps {
 size_t nmachineTypes;
 char **machineTypes;
 char **machineAliases;
+int *machineMaxCpus;
 };
 
 struct _virQEMUCapsCache {
@@ -335,6 +336,7 @@ virQEMUCapsSetDefaultMachine(virQEMUCapsPtr qemuCaps,
 {
 char *name = qemuCaps-machineTypes[defIdx];
 char *alias = qemuCaps-machineAliases[defIdx];
+int cpu_max = qemuCaps-machineMaxCpus[defIdx];
 
 memmove(qemuCaps-machineTypes + 1,
 qemuCaps-machineTypes,
@@ -342,8 +344,12 @@ virQEMUCapsSetDefaultMachine(virQEMUCapsPtr qemuCaps,
 memmove(qemuCaps-machineAliases + 1,
 qemuCaps-machineAliases,
 sizeof(qemuCaps-machineAliases[0]) * defIdx);
+memmove(qemuCaps-machineMaxCpus + 1,
+qemuCaps-machineMaxCpus,
+sizeof(qemuCaps-machineMaxCpus[0]) * defIdx);
 qemuCaps-machineTypes[0] = name;
 qemuCaps-machineAliases[0] = alias;
+qemuCaps-machineMaxCpus[0] = cpu_max;
 }
 
 /* Format is:
@@ -390,7 +396,8 @@ virQEMUCapsParseMachineTypesStr(const char *output,
 }
 
 if (VIR_REALLOC_N(qemuCaps-machineTypes, qemuCaps-nmachineTypes + 1) 
 0 ||
-VIR_REALLOC_N(qemuCaps-machineAliases, qemuCaps-nmachineTypes + 
1)  0) {
+VIR_REALLOC_N(qemuCaps-machineAliases, qemuCaps-nmachineTypes + 
1)  0 ||
+VIR_REALLOC_N(qemuCaps-machineMaxCpus, qemuCaps-nmachineTypes + 
1)  0) {
 VIR_FREE(name);
 VIR_FREE(canonical);
 virReportOOMError();
@@ -404,6 +411,8 @@ virQEMUCapsParseMachineTypesStr(const char *output,
 qemuCaps-machineTypes[qemuCaps-nmachineTypes-1] = name;
 qemuCaps-machineAliases[qemuCaps-nmachineTypes-1] = NULL;
 }
+/* Value 0 means unknown as it's not exposed by QEMU binary */
+qemuCaps-machineMaxCpus[qemuCaps-nmachineTypes-1] = 0;
 } while ((p = next));
 
 
@@ -1764,11 +1773,14 @@ virQEMUCapsPtr virQEMUCapsNewCopy(virQEMUCapsPtr 
qemuCaps)
   

Re: [libvirt] [PATCH v4] qemu: Implement CPUs check against machine type's cpu-max

2013-06-25 Thread Michal Novotny
It has been accidentally sent twice. Please ignore and review just one
version as both v4 are the same ;-)

Also, it has been `make check` and `make syntax-check` tested and passed :-)

Thanks,
Michal

On 06/25/2013 05:44 PM, Michal Novotny wrote:
 Implement check whether (maximum) vCPUs doesn't exceed machine
 type's cpu-max settings.

 Differences between v3 and v4 (this one):
  - Rebased to latest libvirt version
  - Capability XML output extended by maxCpus field
  - Extended caps-qemu-kvm.xml test by maxCpus for one of test emulators

 On older versions of QEMU the check is disabled.

 Signed-off-by: Michal Novotny minov...@redhat.com
 ---
  docs/schemas/capability.rng  |  5 
  src/conf/capabilities.c  |  4 +++
  src/conf/capabilities.h  |  1 +
  src/qemu/qemu_capabilities.c | 41 
 +++-
  src/qemu/qemu_capabilities.h |  3 +-
  src/qemu/qemu_monitor.h  |  1 +
  src/qemu/qemu_monitor_json.c |  6 
  src/qemu/qemu_process.c  | 27 ++
  tests/capabilityschemadata/caps-qemu-kvm.xml | 16 +--
  9 files changed, 94 insertions(+), 10 deletions(-)

 diff --git a/docs/schemas/capability.rng b/docs/schemas/capability.rng
 index 106ca73..65c7c72 100644
 --- a/docs/schemas/capability.rng
 +++ b/docs/schemas/capability.rng
 @@ -290,6 +290,11 @@
text/
  /attribute
/optional
 +  optional
 +attribute name='maxCpus'
 +  ref name='unsignedInt'/
 +/attribute
 +  /optional
text/
  /element
/define
 diff --git a/src/conf/capabilities.c b/src/conf/capabilities.c
 index da92c78..5aeb2ab 100644
 --- a/src/conf/capabilities.c
 +++ b/src/conf/capabilities.c
 @@ -853,6 +853,8 @@ virCapabilitiesFormatXML(virCapsPtr caps)
  virBufferAddLit(xml,   machine);
  if (machine-canonical)
  virBufferAsprintf(xml,  canonical='%s', 
 machine-canonical);
 +if (machine-maxCpus  0)
 +virBufferAsprintf(xml,  maxCpus='%d', machine-maxCpus);
  virBufferAsprintf(xml, %s/machine\n, machine-name);
  }
  
 @@ -871,6 +873,8 @@ virCapabilitiesFormatXML(virCapsPtr caps)
  virBufferAddLit(xml, machine);
  if (machine-canonical)
  virBufferAsprintf(xml,  canonical='%s', 
 machine-canonical);
 +if (machine-maxCpus  0)
 +virBufferAsprintf(xml,  maxCpus='%d', 
 machine-maxCpus);
  virBufferAsprintf(xml, %s/machine\n, machine-name);
  }
  virBufferAddLit(xml,   /domain\n);
 diff --git a/src/conf/capabilities.h b/src/conf/capabilities.h
 index abcf6de..22b6fb6 100644
 --- a/src/conf/capabilities.h
 +++ b/src/conf/capabilities.h
 @@ -46,6 +46,7 @@ typedef virCapsGuestMachine *virCapsGuestMachinePtr;
  struct _virCapsGuestMachine {
  char *name;
  char *canonical;
 +int maxCpus;
  };
  
  typedef struct _virCapsGuestDomainInfo virCapsGuestDomainInfo;
 diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
 index c4e076a..89f41b8 100644
 --- a/src/qemu/qemu_capabilities.c
 +++ b/src/qemu/qemu_capabilities.c
 @@ -256,6 +256,7 @@ struct _virQEMUCaps {
  size_t nmachineTypes;
  char **machineTypes;
  char **machineAliases;
 +int *machineMaxCpus;
  };
  
  struct _virQEMUCapsCache {
 @@ -335,6 +336,7 @@ virQEMUCapsSetDefaultMachine(virQEMUCapsPtr qemuCaps,
  {
  char *name = qemuCaps-machineTypes[defIdx];
  char *alias = qemuCaps-machineAliases[defIdx];
 +int cpu_max = qemuCaps-machineMaxCpus[defIdx];
  
  memmove(qemuCaps-machineTypes + 1,
  qemuCaps-machineTypes,
 @@ -342,8 +344,12 @@ virQEMUCapsSetDefaultMachine(virQEMUCapsPtr qemuCaps,
  memmove(qemuCaps-machineAliases + 1,
  qemuCaps-machineAliases,
  sizeof(qemuCaps-machineAliases[0]) * defIdx);
 +memmove(qemuCaps-machineMaxCpus + 1,
 +qemuCaps-machineMaxCpus,
 +sizeof(qemuCaps-machineMaxCpus[0]) * defIdx);
  qemuCaps-machineTypes[0] = name;
  qemuCaps-machineAliases[0] = alias;
 +qemuCaps-machineMaxCpus[0] = cpu_max;
  }
  
  /* Format is:
 @@ -390,7 +396,8 @@ virQEMUCapsParseMachineTypesStr(const char *output,
  }
  
  if (VIR_REALLOC_N(qemuCaps-machineTypes, qemuCaps-nmachineTypes + 
 1)  0 ||
 -VIR_REALLOC_N(qemuCaps-machineAliases, qemuCaps-nmachineTypes 
 + 1)  0) {
 +VIR_REALLOC_N(qemuCaps-machineAliases, qemuCaps-nmachineTypes 
 + 1)  0 ||
 +VIR_REALLOC_N(qemuCaps-machineMaxCpus, qemuCaps-nmachineTypes 
 + 1)  0) {
  VIR_FREE(name);
  VIR_FREE(canonical);
  virReportOOMError();
 @@ -404,6 +411,8 @@ virQEMUCapsParseMachineTypesStr(const char *output,