]> xenbits.xensource.com Git - libvirt.git/commitdiff
qemu: check the kvm host cpu max limits in virConnectGetDomainCapabilities
authorShivaprasad G Bhat <sbhat@linux.vnet.ibm.com>
Fri, 24 Jun 2016 15:04:13 +0000 (20:34 +0530)
committerAndrea Bolognani <abologna@redhat.com>
Fri, 24 Jun 2016 17:14:43 +0000 (19:14 +0200)
The qemu limit and host limit both should be considered for
the domain vcpu max limits.

Signed-off-by: Shivaprasad G Bhat <sbhat@linux.vnet.ibm.com>
src/qemu/qemu_capabilities.c
src/qemu/qemu_capabilities.h
src/qemu/qemu_driver.c
tests/domaincapstest.c

index 01466fcfe1fac5b44ebffccf6e971b4a76bd2938..28d5321bdc847fc81a22ab41c196093ba7835341 100644 (file)
@@ -38,6 +38,7 @@
 #include "virbitmap.h"
 #include "virnodesuspend.h"
 #include "virnuma.h"
+#include "virhostcpu.h"
 #include "qemu_monitor.h"
 #include "virstring.h"
 #include "qemu_hostdev.h"
@@ -4336,16 +4337,22 @@ int
 virQEMUCapsFillDomainCaps(virDomainCapsPtr domCaps,
                           virQEMUCapsPtr qemuCaps,
                           virFirmwarePtr *firmwares,
-                          size_t nfirmwares)
+                          size_t nfirmwares,
+                          virDomainVirtType virttype)
 {
     virDomainCapsOSPtr os = &domCaps->os;
     virDomainCapsDeviceDiskPtr disk = &domCaps->disk;
     virDomainCapsDeviceHostdevPtr hostdev = &domCaps->hostdev;
     virDomainCapsDeviceGraphicsPtr graphics = &domCaps->graphics;
     virDomainCapsDeviceVideoPtr video = &domCaps->video;
-    int maxvcpus = virQEMUCapsGetMachineMaxCpus(qemuCaps, domCaps->machine);
 
-    domCaps->maxvcpus = maxvcpus;
+    domCaps->maxvcpus = virQEMUCapsGetMachineMaxCpus(qemuCaps,
+                                                     domCaps->machine);
+    if (virttype == VIR_DOMAIN_VIRT_KVM) {
+        int hostmaxvcpus = virHostCPUGetKVMMaxVCPUs();
+        if (hostmaxvcpus >= 0)
+            domCaps->maxvcpus = MIN(domCaps->maxvcpus, hostmaxvcpus);
+    }
 
     if (virQEMUCapsFillDomainOSCaps(os, firmwares, nfirmwares) < 0 ||
         virQEMUCapsFillDomainDeviceDiskCaps(qemuCaps,
index affb639d96baca9b97b4c054d76e81ae1432ed83..9d891c842d642ee86cf37924d73bb5749a325238 100644 (file)
@@ -492,6 +492,7 @@ int virQEMUCapsInitGuestFromBinary(virCapsPtr caps,
 int virQEMUCapsFillDomainCaps(virDomainCapsPtr domCaps,
                               virQEMUCapsPtr qemuCaps,
                               virFirmwarePtr *firmwares,
-                              size_t nfirmwares);
+                              size_t nfirmwares,
+                              virDomainVirtType virttype);
 
 #endif /* __QEMU_CAPABILITIES_H__*/
index 4e6e4c952cc59035d7970ed5cd991d1ca31702d1..59b657b4e5fbf7075d679417a89c9fbf1a28e975 100644 (file)
@@ -18475,7 +18475,7 @@ qemuConnectGetDomainCapabilities(virConnectPtr conn,
         goto cleanup;
 
     if (virQEMUCapsFillDomainCaps(domCaps, qemuCaps,
-                                  cfg->firmwares, cfg->nfirmwares) < 0)
+                                  cfg->firmwares, cfg->nfirmwares, virttype) < 0)
         goto cleanup;
 
     ret = virDomainCapsFormat(domCaps);
index ae311464d6e936d78bcbaff9cea1c19f574af2b5..01ebfcc313862128f6de3f488d07272a836d4b36 100644 (file)
@@ -129,7 +129,8 @@ fillQemuCaps(virDomainCapsPtr domCaps,
 
     if (virQEMUCapsFillDomainCaps(domCaps, qemuCaps,
                                   cfg->firmwares,
-                                  cfg->nfirmwares) < 0)
+                                  cfg->nfirmwares,
+                                  VIR_DOMAIN_VIRT_QEMU) < 0)
         goto cleanup;
 
     /* The function above tries to query host's KVM & VFIO capabilities by