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