On 05/02/2016 09:14 AM, Shivaprasad G Bhat wrote:
> On PPC64, the KVM_MAX_VCPUS is defined to be 1024 where as qemu has
> MAX_CPUMASK_BITS defined at 255 in include/sysemu/sysemu.h.
> 
> virsh domacapabilities and virsh maxvcpus --type kvm return different
> maxvcpus values and is confusing as to know what actually works.
> 
> Signed-off-by: Shivaprasad G Bhat <sb...@linux.vnet.ibm.com>
> ---
>  src/qemu/qemu_driver.c |   28 ++++++++++++++++++++++++++--
>  1 file changed, 26 insertions(+), 2 deletions(-)
> 
> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> index 3d0c7c8..d84fc47 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c
> @@ -1255,10 +1255,34 @@ static int qemuConnectIsAlive(virConnectPtr conn 
> ATTRIBUTE_UNUSED)
>  
>  
>  static int
> -kvmGetMaxVCPUs(void)
> +kvmGetMaxVCPUs(virConnectPtr conn)
>  {
>      int fd;
>      int ret;
> +    virArch arch = virArchFromHost();
> +    virQEMUCapsPtr qemuCaps = NULL;
> +    virQEMUDriverPtr driver = conn->privateData;
> +
> +    const char *machine;
> +
> +    if (ARCH_IS_PPC64(arch)) {
> +        if (!(qemuCaps = virQEMUCapsCacheLookupByArch(driver->qemuCapsCache,
> +                                                      arch))) {
> +            virReportError(VIR_ERR_INVALID_ARG,
> +                           _("unable to find any emulator to serve '%s' "
> +                             "architecture"), virArchToString(arch));
> +            return -1;
> +        }
> +
> +        if (!(machine = virQEMUCapsGetDefaultMachine(qemuCaps))) {
> +            virObjectUnref(qemuCaps);
> +            return -1;
> +        }
> +
> +        ret = virQEMUCapsGetMachineMaxCpus(qemuCaps, machine);
> +        virObjectUnref(qemuCaps);
> +        return ret;
> +    }
> 

I don't really like this.

The MaxVCPUs API sucks: it doesn't take enough parameters to give an accurate
picture of what the max VCPUs supported for your desired config is. And that's
basically unfixable.

Hacking in a one off fix for PPC64 here doesn't seem like a good idea. If you
really want to 'fix' this I'd suggest one or more of:

- Reflect /dev/kvm maxvcpus in the capabilities XML somehow
- Extend 'virsh maxvcpus' to take os_type+virt_type+emulator+machine_type,
look up the capabilities XML, correlate that with maxvcpus output/new
capabilities XML, and give a real value for the desired config
- Change the maxvcpus API to consistently to return capabilities output, or
cap the return value to the largest reported in capabilities output, and do it
consistently for all architectures

- Cole

>      if ((fd = open(KVM_DEVICE, O_RDONLY)) < 0) {
>          virReportSystemError(errno, _("Unable to open %s"), KVM_DEVICE);
> @@ -1323,7 +1347,7 @@ qemuConnectGetMaxVcpus(virConnectPtr conn 
> ATTRIBUTE_UNUSED, const char *type)
>          return 16;
>  
>      if (STRCASEEQ(type, "kvm"))
> -        return kvmGetMaxVCPUs();
> +        return kvmGetMaxVCPUs(conn);
>  
>      if (STRCASEEQ(type, "kqemu"))
>          return 1;
> 

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

Reply via email to