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

Michal Novotny minovotn at redhat.com
Wed Jun 26 14:31:21 UTC 2013


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 <minovotn at 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 <minovotn at redhat.com>, RHCE, Red Hat
Virtualization | libvirt-php bindings | php-virt-control.org




More information about the libvir-list mailing list