qemu: Fix retrieval of maximum number of vCPUs on KVM hosts

The detection of the maximum number of cpus used incorrect ioctl
argument value. This flaw caused that on kvm hosts this returns always
"160" as the maximum. This is just a recommended maximum value. The real
value is higher than that.

This patch tweaks the detection function to behave as described by the
kernel docs:

https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/Documentation/virtual/kvm/api.txt?id=refs/tags/v3.9-rc2#n199
This commit is contained in:
Peter Krempa 2013-03-11 14:50:54 +01:00
parent 5c86ace1e7
commit 1715c83b5f

View File

@ -1103,23 +1103,32 @@ static int qemuIsAlive(virConnectPtr conn ATTRIBUTE_UNUSED)
} }
static int kvmGetMaxVCPUs(void) { static int
int maxvcpus = 1; kvmGetMaxVCPUs(void) {
int fd;
int ret;
int r, fd; if ((fd = open(KVM_DEVICE, O_RDONLY)) < 0) {
fd = open(KVM_DEVICE, O_RDONLY);
if (fd < 0) {
virReportSystemError(errno, _("Unable to open %s"), KVM_DEVICE); virReportSystemError(errno, _("Unable to open %s"), KVM_DEVICE);
return -1; return -1;
} }
r = ioctl(fd, KVM_CHECK_EXTENSION, KVM_CAP_NR_VCPUS); /* at first try KVM_CAP_MAX_VCPUS to determine the maximum count */
if (r > 0) if ((ret = ioctl(fd, KVM_CHECK_EXTENSION, KVM_CAP_MAX_VCPUS)) > 0)
maxvcpus = r; goto cleanup;
/* as a fallback get KVM_CAP_NR_VCPUS (the recommended maximum number of
* vcpus). Note that on most machines this is set to 160. */
if ((ret = ioctl(fd, KVM_CHECK_EXTENSION, KVM_CAP_NR_VCPUS)) > 0)
goto cleanup;
/* if KVM_CAP_NR_VCPUS doesn't exist either, kernel documentation states
* that 4 should be used as the maximum number of cpus */
ret = 4;
cleanup:
VIR_FORCE_CLOSE(fd); VIR_FORCE_CLOSE(fd);
return maxvcpus; return ret;
} }