From 15b2ac591a1c024ecf92a7e40d22eed6e59684b8 Mon Sep 17 00:00:00 2001 Message-Id: <15b2ac591a1c024ecf92a7e40d22eed6e59684b8@dist-git> From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= Date: Mon, 3 Feb 2020 18:07:25 +0000 Subject: [PATCH] hostcpu: add support for reporting die_id in NUMA topology MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Update the host CPU code to report the die_id in the NUMA topology capabilities. On systems with multiple dies, this fixes the bug where CPU cores can't be distinguished: Notice how core_id is repeated within the scope of the same socket_id. It now reports So core_id is now unique within a (socket_id, die_id) pair. Reviewed-by: Daniel Henrique Barboza Reviewed-by: Jiri Denemark Signed-off-by: Daniel P. Berrangé (cherry picked from commit 7b79ee2f78bbf2af76df2f6466919e19ae05aeeb) BZ: https://bugzilla.redhat.com/show_bug.cgi?id=1785211 Message-Id: <20200203180726.2203691-5-berrange@redhat.com> Reviewed-by: Jiri Denemark --- docs/schemas/capability.rng | 3 ++ src/conf/capabilities.c | 5 ++- src/conf/capabilities.h | 1 + src/libvirt_linux.syms | 1 + src/util/virhostcpu.c | 16 ++++++++++ src/util/virhostcpu.h | 1 + .../vircaps2xmldata/vircaps-aarch64-basic.xml | 32 +++++++++---------- .../vircaps2xmldata/vircaps-x86_64-basic.xml | 32 +++++++++---------- .../vircaps2xmldata/vircaps-x86_64-caches.xml | 16 +++++----- .../vircaps-x86_64-resctrl-cdp.xml | 24 +++++++------- .../vircaps-x86_64-resctrl-cmt.xml | 24 +++++++------- .../vircaps-x86_64-resctrl-fake-feature.xml | 24 +++++++------- .../vircaps-x86_64-resctrl-skx-twocaches.xml | 2 +- .../vircaps-x86_64-resctrl-skx.xml | 2 +- .../vircaps-x86_64-resctrl.xml | 24 +++++++------- 15 files changed, 116 insertions(+), 91 deletions(-) diff --git a/docs/schemas/capability.rng b/docs/schemas/capability.rng index 91ee523116..031c55bf20 100644 --- a/docs/schemas/capability.rng +++ b/docs/schemas/capability.rng @@ -265,6 +265,9 @@ + + + diff --git a/src/conf/capabilities.c b/src/conf/capabilities.c index bf1d9936ed..4bbc79334e 100644 --- a/src/conf/capabilities.c +++ b/src/conf/capabilities.c @@ -874,8 +874,9 @@ virCapabilitiesHostNUMAFormat(virCapsHostNUMAPtr caps, return -1; virBufferAsprintf(buf, - " socket_id='%d' core_id='%d' siblings='%s'", + " socket_id='%d' die_id='%d' core_id='%d' siblings='%s'", cell->cpus[j].socket_id, + cell->cpus[j].die_id, cell->cpus[j].core_id, siblings); VIR_FREE(siblings); @@ -1463,6 +1464,7 @@ virCapabilitiesFillCPUInfo(int cpu_id G_GNUC_UNUSED, cpu->id = cpu_id; if (virHostCPUGetSocket(cpu_id, &cpu->socket_id) < 0 || + virHostCPUGetDie(cpu_id, &cpu->die_id) < 0 || virHostCPUGetCore(cpu_id, &cpu->core_id) < 0) return -1; @@ -1591,6 +1593,7 @@ virCapabilitiesHostNUMAInitFake(virCapsHostNUMAPtr caps) goto error; if (tmp) { cpus[cid].id = id; + cpus[cid].die_id = 0; cpus[cid].socket_id = s; cpus[cid].core_id = c; if (!(cpus[cid].siblings = virBitmapNew(ncpus))) diff --git a/src/conf/capabilities.h b/src/conf/capabilities.h index 4a49e94aa5..75f29666c9 100644 --- a/src/conf/capabilities.h +++ b/src/conf/capabilities.h @@ -88,6 +88,7 @@ struct _virCapsGuest { struct _virCapsHostNUMACellCPU { unsigned int id; unsigned int socket_id; + unsigned int die_id; unsigned int core_id; virBitmapPtr siblings; }; diff --git a/src/libvirt_linux.syms b/src/libvirt_linux.syms index 5fa2c790ef..55649ae39c 100644 --- a/src/libvirt_linux.syms +++ b/src/libvirt_linux.syms @@ -4,6 +4,7 @@ # util/virhostcpu.h virHostCPUGetCore; +virHostCPUGetDie; virHostCPUGetInfoPopulateLinux; virHostCPUGetSiblingsList; virHostCPUGetSocket; diff --git a/src/util/virhostcpu.c b/src/util/virhostcpu.c index 256976cce1..09c959cd25 100644 --- a/src/util/virhostcpu.c +++ b/src/util/virhostcpu.c @@ -218,6 +218,22 @@ virHostCPUGetSocket(unsigned int cpu, unsigned int *socket) return 0; } +int +virHostCPUGetDie(unsigned int cpu, unsigned int *die) +{ + int ret = virFileReadValueUint(die, + "%s/cpu/cpu%u/topology/die_id", + SYSFS_SYSTEM_PATH, cpu); + + /* If the file is not there, it's 0 */ + if (ret == -2) + *die = 0; + else if (ret < 0) + return -1; + + return 0; +} + int virHostCPUGetCore(unsigned int cpu, unsigned int *core) { diff --git a/src/util/virhostcpu.h b/src/util/virhostcpu.h index d95d380d4a..9be2e51a38 100644 --- a/src/util/virhostcpu.h +++ b/src/util/virhostcpu.h @@ -65,6 +65,7 @@ int virHostCPUStatsAssign(virNodeCPUStatsPtr param, #ifdef __linux__ int virHostCPUGetSocket(unsigned int cpu, unsigned int *socket); +int virHostCPUGetDie(unsigned int cpu, unsigned int *die); int virHostCPUGetCore(unsigned int cpu, unsigned int *core); virBitmapPtr virHostCPUGetSiblingsList(unsigned int cpu); diff --git a/tests/vircaps2xmldata/vircaps-aarch64-basic.xml b/tests/vircaps2xmldata/vircaps-aarch64-basic.xml index 50466f9162..0a04052c40 100644 --- a/tests/vircaps2xmldata/vircaps-aarch64-basic.xml +++ b/tests/vircaps2xmldata/vircaps-aarch64-basic.xml @@ -16,10 +16,10 @@ 4096 6144 - - - - + + + + @@ -28,10 +28,10 @@ 6144 8192 - - - - + + + + @@ -40,10 +40,10 @@ 8192 10240 - - - - + + + + @@ -52,10 +52,10 @@ 10240 12288 - - - - + + + + diff --git a/tests/vircaps2xmldata/vircaps-x86_64-basic.xml b/tests/vircaps2xmldata/vircaps-x86_64-basic.xml index e7be6def3e..4da09f889c 100644 --- a/tests/vircaps2xmldata/vircaps-x86_64-basic.xml +++ b/tests/vircaps2xmldata/vircaps-x86_64-basic.xml @@ -14,10 +14,10 @@ 4096 6144 - - - - + + + + @@ -26,10 +26,10 @@ 6144 8192 - - - - + + + + @@ -38,10 +38,10 @@ 8192 10240 - - - - + + + + @@ -50,10 +50,10 @@ 10240 12288 - - - - + + + + diff --git a/tests/vircaps2xmldata/vircaps-x86_64-caches.xml b/tests/vircaps2xmldata/vircaps-x86_64-caches.xml index ca671a1640..28f00c0a90 100644 --- a/tests/vircaps2xmldata/vircaps-x86_64-caches.xml +++ b/tests/vircaps2xmldata/vircaps-x86_64-caches.xml @@ -17,14 +17,14 @@ 4096 6144 - - - - - - - - + + + + + + + + diff --git a/tests/vircaps2xmldata/vircaps-x86_64-resctrl-cdp.xml b/tests/vircaps2xmldata/vircaps-x86_64-resctrl-cdp.xml index 1d3df318c5..ee26fe9464 100644 --- a/tests/vircaps2xmldata/vircaps-x86_64-resctrl-cdp.xml +++ b/tests/vircaps2xmldata/vircaps-x86_64-resctrl-cdp.xml @@ -17,12 +17,12 @@ 4096 6144 - - - - - - + + + + + + @@ -31,12 +31,12 @@ 6144 8192 - - - - - - + + + + + + diff --git a/tests/vircaps2xmldata/vircaps-x86_64-resctrl-cmt.xml b/tests/vircaps2xmldata/vircaps-x86_64-resctrl-cmt.xml index 6a8cd0e909..acdd97ec58 100644 --- a/tests/vircaps2xmldata/vircaps-x86_64-resctrl-cmt.xml +++ b/tests/vircaps2xmldata/vircaps-x86_64-resctrl-cmt.xml @@ -17,12 +17,12 @@ 4096 6144 - - - - - - + + + + + + @@ -31,12 +31,12 @@ 6144 8192 - - - - - - + + + + + + diff --git a/tests/vircaps2xmldata/vircaps-x86_64-resctrl-fake-feature.xml b/tests/vircaps2xmldata/vircaps-x86_64-resctrl-fake-feature.xml index 4e46ead616..5f3678e072 100644 --- a/tests/vircaps2xmldata/vircaps-x86_64-resctrl-fake-feature.xml +++ b/tests/vircaps2xmldata/vircaps-x86_64-resctrl-fake-feature.xml @@ -17,12 +17,12 @@ 4096 6144 - - - - - - + + + + + + @@ -31,12 +31,12 @@ 6144 8192 - - - - - - + + + + + + diff --git a/tests/vircaps2xmldata/vircaps-x86_64-resctrl-skx-twocaches.xml b/tests/vircaps2xmldata/vircaps-x86_64-resctrl-skx-twocaches.xml index 44c1042afe..6769bd0591 100644 --- a/tests/vircaps2xmldata/vircaps-x86_64-resctrl-skx-twocaches.xml +++ b/tests/vircaps2xmldata/vircaps-x86_64-resctrl-skx-twocaches.xml @@ -17,7 +17,7 @@ 4096 6144 - + diff --git a/tests/vircaps2xmldata/vircaps-x86_64-resctrl-skx.xml b/tests/vircaps2xmldata/vircaps-x86_64-resctrl-skx.xml index 8382a26c7a..bc52480905 100644 --- a/tests/vircaps2xmldata/vircaps-x86_64-resctrl-skx.xml +++ b/tests/vircaps2xmldata/vircaps-x86_64-resctrl-skx.xml @@ -17,7 +17,7 @@ 4096 6144 - + diff --git a/tests/vircaps2xmldata/vircaps-x86_64-resctrl.xml b/tests/vircaps2xmldata/vircaps-x86_64-resctrl.xml index a27b3e247e..c386edd4b0 100644 --- a/tests/vircaps2xmldata/vircaps-x86_64-resctrl.xml +++ b/tests/vircaps2xmldata/vircaps-x86_64-resctrl.xml @@ -17,12 +17,12 @@ 4096 6144 - - - - - - + + + + + + @@ -31,12 +31,12 @@ 6144 8192 - - - - - - + + + + + + -- 2.25.0