[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

[libvirt] [PATCH 10/12] vcpu: improve vcpu support in qemu command line



* src/qemu/qemu_conf.c (qemuParseCommandLineSmp): Distinguish
between vcpus and maxvcpus, for new enough qemu.
* tests/qemuargv2xmltest.c (mymain): Add new test.
* tests/qemuxml2argvtest.c (mymain): Likewise.
* tests/qemuxml2xmltest.c (mymain): Likewise.
* tests/qemuxml2argvdata/qemuxml2argv-smp.args: New file.
---

This manages just the command-line aspects needed for qemu 0.12+;
so far, I haven't done anything about 0.11 or earlier (on those
versions of qemu, maxvcpus and vcpus must always be equal).

 src/qemu/qemu_conf.c                         |   13 +++++++++----
 tests/qemuargv2xmltest.c                     |    2 ++
 tests/qemuxml2argvdata/qemuxml2argv-smp.args |    1 +
 tests/qemuxml2argvtest.c                     |    2 ++
 tests/qemuxml2xmltest.c                      |    2 ++
 5 files changed, 16 insertions(+), 4 deletions(-)
 create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-smp.args

diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c
index 5169e3c..f387a5d 100644
--- a/src/qemu/qemu_conf.c
+++ b/src/qemu/qemu_conf.c
@@ -3616,6 +3616,8 @@ qemuBuildSmpArgStr(const virDomainDefPtr def,
     virBufferVSprintf(&buf, "%u", def->vcpus);

     if ((qemuCmdFlags & QEMUD_CMD_FLAG_SMP_TOPOLOGY)) {
+        if (def->vcpus != def->maxvcpus)
+            virBufferVSprintf(&buf, ",maxcpus=%u", def->maxvcpus);
         /* sockets, cores, and threads are either all zero
          * or all non-zero, thus checking one of them is enough */
         if (def->cpu && def->cpu->sockets) {
@@ -3628,12 +3630,12 @@ qemuBuildSmpArgStr(const virDomainDefPtr def,
             virBufferVSprintf(&buf, ",cores=%u", 1);
             virBufferVSprintf(&buf, ",threads=%u", 1);
         }
-    }
-    if (def->vcpus != def->maxvcpus) {
+    } else if (def->vcpus != def->maxvcpus) {
         virBufferFreeAndReset(&buf);
+        // FIXME - consider hot-unplugging cpus after boot
         qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
                         _("setting current vcpu count less than maximum is "
-                          "not supported yet"));
+                          "not supported with this QEMU binary"));
         return NULL;
     }

@@ -6026,6 +6028,7 @@ qemuParseCommandLineSmp(virDomainDefPtr dom,
     unsigned int sockets = 0;
     unsigned int cores = 0;
     unsigned int threads = 0;
+    unsigned int maxcpus = 0;
     int i;
     int nkws;
     char **kws;
@@ -6053,12 +6056,14 @@ qemuParseCommandLineSmp(virDomainDefPtr dom,
                 cores = n;
             else if (STREQ(kws[i], "threads"))
                 threads = n;
+            else if (STREQ(kws[i], "maxcpus"))
+                maxcpus = n;
             else
                 goto syntax;
         }
     }

-    dom->maxvcpus = dom->vcpus;
+    dom->maxvcpus = maxcpus ? maxcpus : dom->vcpus;

     if (sockets && cores && threads) {
         virCPUDefPtr cpu;
diff --git a/tests/qemuargv2xmltest.c b/tests/qemuargv2xmltest.c
index 4f9ec84..d941b0b 100644
--- a/tests/qemuargv2xmltest.c
+++ b/tests/qemuargv2xmltest.c
@@ -221,6 +221,8 @@ mymain(int argc, char **argv)

     DO_TEST("hostdev-pci-address");

+    DO_TEST("smp");
+
     DO_TEST_FULL("restore-v1", 0, "stdio");
     DO_TEST_FULL("restore-v2", 0, "stdio");
     DO_TEST_FULL("restore-v2", 0, "exec:cat");
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-smp.args b/tests/qemuxml2argvdata/qemuxml2argv-smp.args
new file mode 100644
index 0000000..3ec8f15
--- /dev/null
+++ b/tests/qemuxml2argvdata/qemuxml2argv-smp.args
@@ -0,0 +1 @@
+LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test /usr/bin/qemu -S -M pc -m 214 -smp 1,maxcpus=2,sockets=2,cores=1,threads=1 -nographic -monitor unix:/tmp/test-monitor,server,nowait -no-acpi -boot c -hda /dev/HostVG/QEMUGuest1 -net none -serial none -parallel none -usb
diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c
index 7b9df09..5f1e55a 100644
--- a/tests/qemuxml2argvtest.c
+++ b/tests/qemuxml2argvtest.c
@@ -383,6 +383,8 @@ mymain(int argc, char **argv)

     DO_TEST("qemu-ns", 0);

+    DO_TEST("smp", QEMUD_CMD_FLAG_SMP_TOPOLOGY);
+
     free(driver.stateDir);
     virCapabilitiesFree(driver.caps);

diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c
index 904183c..48d9b7a 100644
--- a/tests/qemuxml2xmltest.c
+++ b/tests/qemuxml2xmltest.c
@@ -179,6 +179,8 @@ mymain(int argc, char **argv)

     DO_TEST("encrypted-disk");

+    DO_TEST("smp");
+
     /* These tests generate different XML */
     DO_TEST_DIFFERENT("balloon-device-auto");
     DO_TEST_DIFFERENT("channel-virtio-auto");
-- 
1.7.2.3


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]