diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c index 38c8351de3a1825c06a2adaef4e9ac8ecb7ab136..ffe184b62fd680cd05fd6c5c83bba7fbb5795f11 100644 --- a/src/qemu/qemu_conf.c +++ b/src/qemu/qemu_conf.c @@ -3714,6 +3714,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) { @@ -3726,12 +3728,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 for older qemu */ 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; } @@ -6153,6 +6155,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; @@ -6180,12 +6183,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 4f9ec8454dc991b72e53c9176196ee726b799813..d941b0b56be5c13d76a495cac82302daa5559c10 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 0000000000000000000000000000000000000000..3ec8f1578914faa167a5b2e30672a321f073231c --- /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 92d5b18c9de533817f85d8a48d2a9957e0a4e230..551d6c46957c4ed2c1a6faede14154db94ff600d 100644 --- a/tests/qemuxml2argvtest.c +++ b/tests/qemuxml2argvtest.c @@ -385,6 +385,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 a33d435a11acd4e0200c71086725c50bef42e244..cdc4390a102161f930f10764ae7ffe7fe98c757e 100644 --- a/tests/qemuxml2xmltest.c +++ b/tests/qemuxml2xmltest.c @@ -180,6 +180,8 @@ mymain(int argc, char **argv) DO_TEST("encrypted-disk"); DO_TEST("memtune"); + DO_TEST("smp"); + /* These tests generate different XML */ DO_TEST_DIFFERENT("balloon-device-auto"); DO_TEST_DIFFERENT("channel-virtio-auto");