vcpu properties gathered from query-hotpluggable cpus need to be passed back to qemu. As qemu did not use the node-id property until now and libvirt forgot to pass it back properly (it was parsed but not passed around) we did not honor this. This patch adds node-id to the structures where it was missing and passes it around as necessary. The test data was generated with a VM with following config: <numa> <cell id='0' cpus='0,2,4,6' memory='512000' unit='KiB'/> <cell id='1' cpus='1,3,5,7' memory='512000' unit='KiB'/> </numa> Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1452053 --- src/qemu/qemu_command.c | 4 + src/qemu/qemu_domain.c | 1 + src/qemu/qemu_domain.h | 1 + src/qemu/qemu_monitor.c | 2 + src/qemu/qemu_monitor.h | 1 + ...qemumonitorjson-cpuinfo-x86-node-full-cpus.json | 35 +++++++++ ...umonitorjson-cpuinfo-x86-node-full-hotplug.json | 87 ++++++++++++++++++++++ .../qemumonitorjson-cpuinfo-x86-node-full.data | 48 ++++++++++++ tests/qemumonitorjsontest.c | 3 + 9 files changed, 182 insertions(+) create mode 100644 tests/qemumonitorjsondata/qemumonitorjson-cpuinfo-x86-node-full-cpus.json create mode 100644 tests/qemumonitorjsondata/qemumonitorjson-cpuinfo-x86-node-full-hotplug.json create mode 100644 tests/qemumonitorjsondata/qemumonitorjson-cpuinfo-x86-node-full.data diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index c53ab97b9..3fe291863 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -10508,6 +10508,10 @@ qemuBuildHotpluggableCPUProps(const virDomainVcpuDef *vcpu) virJSONValueObjectAdd(ret, "i:thread-id", vcpupriv->thread_id, NULL) < 0) goto error; + if (vcpupriv->node_id != -1 && + virJSONValueObjectAdd(ret, "i:node-id", vcpupriv->node_id, NULL) < 0) + goto error; + return ret; error: diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 8e7404da6..0d9cd94b2 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -6986,6 +6986,7 @@ qemuDomainRefreshVcpuInfo(virQEMUDriverPtr driver, vcpupriv->socket_id = info[i].socket_id; vcpupriv->core_id = info[i].core_id; vcpupriv->thread_id = info[i].thread_id; + vcpupriv->node_id = info[i].node_id; vcpupriv->vcpus = info[i].vcpus; VIR_FREE(vcpupriv->type); VIR_STEAL_PTR(vcpupriv->type, info[i].type); diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h index aae322473..365b23c96 100644 --- a/src/qemu/qemu_domain.h +++ b/src/qemu/qemu_domain.h @@ -359,6 +359,7 @@ struct _qemuDomainVcpuPrivate { int socket_id; int core_id; int thread_id; + int node_id; int vcpus; }; diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c index 5c29b3763..2b0afcc21 100644 --- a/src/qemu/qemu_monitor.c +++ b/src/qemu/qemu_monitor.c @@ -1750,6 +1750,7 @@ qemuMonitorCPUInfoClear(qemuMonitorCPUInfoPtr cpus, cpus[i].socket_id = -1; cpus[i].core_id = -1; cpus[i].thread_id = -1; + cpus[i].node_id = -1; cpus[i].vcpus = 0; cpus[i].tid = 0; cpus[i].halted = false; @@ -1902,6 +1903,7 @@ qemuMonitorGetCPUInfoHotplug(struct qemuMonitorQueryHotpluggableCpusEntry *hotpl vcpus[mastervcpu].socket_id = hotplugvcpus[i].socket_id; vcpus[mastervcpu].core_id = hotplugvcpus[i].core_id; vcpus[mastervcpu].thread_id = hotplugvcpus[i].thread_id; + vcpus[mastervcpu].node_id = hotplugvcpus[i].node_id; vcpus[mastervcpu].vcpus = hotplugvcpus[i].vcpus; VIR_STEAL_PTR(vcpus[mastervcpu].qom_path, hotplugvcpus[i].qom_path); VIR_STEAL_PTR(vcpus[mastervcpu].alias, hotplugvcpus[i].alias); diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h index 8956bf929..1697db55c 100644 --- a/src/qemu/qemu_monitor.h +++ b/src/qemu/qemu_monitor.h @@ -483,6 +483,7 @@ struct _qemuMonitorCPUInfo { int socket_id; int core_id; int thread_id; + int node_id; unsigned int vcpus; /* number of vcpus added if given entry is hotplugged */ /* name of the qemu type to add in case of hotplug */ diff --git a/tests/qemumonitorjsondata/qemumonitorjson-cpuinfo-x86-node-full-cpus.json b/tests/qemumonitorjsondata/qemumonitorjson-cpuinfo-x86-node-full-cpus.json new file mode 100644 index 000000000..6b39efa69 --- /dev/null +++ b/tests/qemumonitorjsondata/qemumonitorjson-cpuinfo-x86-node-full-cpus.json @@ -0,0 +1,35 @@ +{ + "return": [ + { + "arch": "x86", + "current": true, + "props": { + "core-id": 0, + "thread-id": 0, + "node-id": 0, + "socket-id": 0 + }, + "CPU": 0, + "qom_path": "/machine/unattached/device[0]", + "pc": 1048956, + "halted": true, + "thread_id": 2033724 + }, + { + "arch": "x86", + "current": false, + "props": { + "core-id": 0, + "thread-id": 1, + "node-id": 1, + "socket-id": 0 + }, + "CPU": 1, + "qom_path": "/machine/unattached/device[2]", + "pc": 1037318, + "halted": true, + "thread_id": 2033725 + } + ], + "id": "libvirt-21" +} diff --git a/tests/qemumonitorjsondata/qemumonitorjson-cpuinfo-x86-node-full-hotplug.json b/tests/qemumonitorjsondata/qemumonitorjson-cpuinfo-x86-node-full-hotplug.json new file mode 100644 index 000000000..dfddd9632 --- /dev/null +++ b/tests/qemumonitorjsondata/qemumonitorjson-cpuinfo-x86-node-full-hotplug.json @@ -0,0 +1,87 @@ +{ + "return": [ + { + "props": { + "core-id": 1, + "thread-id": 1, + "node-id": 1, + "socket-id": 1 + }, + "vcpus-count": 1, + "type": "Broadwell-x86_64-cpu" + }, + { + "props": { + "core-id": 1, + "thread-id": 0, + "node-id": 0, + "socket-id": 1 + }, + "vcpus-count": 1, + "type": "Broadwell-x86_64-cpu" + }, + { + "props": { + "core-id": 0, + "thread-id": 1, + "node-id": 1, + "socket-id": 1 + }, + "vcpus-count": 1, + "type": "Broadwell-x86_64-cpu" + }, + { + "props": { + "core-id": 0, + "thread-id": 0, + "node-id": 0, + "socket-id": 1 + }, + "vcpus-count": 1, + "type": "Broadwell-x86_64-cpu" + }, + { + "props": { + "core-id": 1, + "thread-id": 1, + "node-id": 1, + "socket-id": 0 + }, + "vcpus-count": 1, + "type": "Broadwell-x86_64-cpu" + }, + { + "props": { + "core-id": 1, + "thread-id": 0, + "node-id": 0, + "socket-id": 0 + }, + "vcpus-count": 1, + "type": "Broadwell-x86_64-cpu" + }, + { + "props": { + "core-id": 0, + "thread-id": 1, + "node-id": 1, + "socket-id": 0 + }, + "vcpus-count": 1, + "qom-path": "/machine/unattached/device[2]", + "type": "Broadwell-x86_64-cpu" + }, + { + "props": { + "core-id": 0, + "thread-id": 0, + "node-id": 0, + "socket-id": 0 + }, + "vcpus-count": 1, + "qom-path": "/machine/unattached/device[0]", + "type": "Broadwell-x86_64-cpu" + } + ], + "id": "libvirt-20" +} diff --git a/tests/qemumonitorjsondata/qemumonitorjson-cpuinfo-x86-node-full.data b/tests/qemumonitorjsondata/qemumonitorjson-cpuinfo-x86-node-full.data new file mode 100644 index 000000000..070ea084e --- /dev/null +++ b/tests/qemumonitorjsondata/qemumonitorjson-cpuinfo-x86-node-full.data @@ -0,0 +1,48 @@ +[vcpu libvirt-id='0'] + online=yes + hotpluggable=no + thread-id='2033724' + enable-id='1' + query-cpus-id='0' + type='Broadwell-x86_64-cpu' + qom_path='/machine/unattached/device[0]' + topology: socket='0' core='0' thread='0' node='0' vcpus='1' +[vcpu libvirt-id='1'] + online=yes + hotpluggable=no + thread-id='2033725' + enable-id='2' + query-cpus-id='1' + type='Broadwell-x86_64-cpu' + qom_path='/machine/unattached/device[2]' + topology: socket='0' core='0' thread='1' node='1' vcpus='1' +[vcpu libvirt-id='2'] + online=no + hotpluggable=yes + type='Broadwell-x86_64-cpu' + topology: socket='0' core='1' thread='0' node='0' vcpus='1' +[vcpu libvirt-id='3'] + online=no + hotpluggable=yes + type='Broadwell-x86_64-cpu' + topology: socket='0' core='1' thread='1' node='1' vcpus='1' +[vcpu libvirt-id='4'] + online=no + hotpluggable=yes + type='Broadwell-x86_64-cpu' + topology: socket='1' core='0' thread='0' node='0' vcpus='1' +[vcpu libvirt-id='5'] + online=no + hotpluggable=yes + type='Broadwell-x86_64-cpu' + topology: socket='1' core='0' thread='1' node='1' vcpus='1' +[vcpu libvirt-id='6'] + online=no + hotpluggable=yes + type='Broadwell-x86_64-cpu' + topology: socket='1' core='1' thread='0' node='0' vcpus='1' +[vcpu libvirt-id='7'] + online=no + hotpluggable=yes + type='Broadwell-x86_64-cpu' + topology: socket='1' core='1' thread='1' node='1' vcpus='1' diff --git a/tests/qemumonitorjsontest.c b/tests/qemumonitorjsontest.c index e9f9d47b5..6da27f783 100644 --- a/tests/qemumonitorjsontest.c +++ b/tests/qemumonitorjsontest.c @@ -2604,6 +2604,8 @@ testQemuMonitorCPUInfoFormat(qemuMonitorCPUInfoPtr vcpus, virBufferAsprintf(&buf, " core='%d'", vcpu->core_id); if (vcpu->thread_id != -1) virBufferAsprintf(&buf, " thread='%d'", vcpu->thread_id); + if (vcpu->node_id != -1) + virBufferAsprintf(&buf, " node='%d'", vcpu->node_id); if (vcpu->vcpus != 0) virBufferAsprintf(&buf, " vcpus='%u'", vcpu->vcpus); virBufferAddLit(&buf, "\n"); @@ -2913,6 +2915,7 @@ mymain(void) DO_TEST_CPU_INFO("x86-basic-pluggable", 8); DO_TEST_CPU_INFO("x86-full", 11); + DO_TEST_CPU_INFO("x86-node-full", 8); DO_TEST_CPU_INFO("ppc64-basic", 24); DO_TEST_CPU_INFO("ppc64-hotplug-1", 24); -- 2.12.2 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list