105 lines
3.5 KiB
Diff
105 lines
3.5 KiB
Diff
From 8e511697576aec1fc1baad499f64348fd169e093 Mon Sep 17 00:00:00 2001
|
|
Message-ID: <8e511697576aec1fc1baad499f64348fd169e093.1774699457.git.phrdina@redhat.com>
|
|
From: Pavel Hrdina <phrdina@redhat.com>
|
|
Date: Tue, 6 Jan 2026 10:31:29 +0000
|
|
Subject: [PATCH] util: Fix max socket calculation
|
|
MIME-Version: 1.0
|
|
Content-Type: text/plain; charset=UTF-8
|
|
Content-Transfer-Encoding: 8bit
|
|
|
|
From: Alexandr Semenikhin <alexandr2e78@gmail.com>
|
|
|
|
This patch changes how the maximum socket count is calculated.
|
|
|
|
On some systems (e.g. GB200), physical_package_id values are not
|
|
contiguous or zero-based. Instead of 0..N, they may contain large
|
|
arbitrary identifiers (e.g. 256123234). The previous implementation
|
|
assumed a 0..N range and used the maximum ID value directly.
|
|
|
|
This caused:
|
|
excessive memory allocation
|
|
extremely large loop bounds
|
|
OOM / DoS scenarios
|
|
unnecessary CPU time consumption
|
|
|
|
The new implementation computes the socket count as the number of unique
|
|
package IDs present on the node, rather than relying on the maximum numeric
|
|
value.
|
|
|
|
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
|
|
Tested-by: Daniel P. Berrangé <berrange@redhat.com>
|
|
Signed-off-by: Alexandr Semenikhin <alexandr2e78@gmail.com>
|
|
(cherry picked from commit a64367115015df58e0d82635a40d76df56144c60)
|
|
|
|
Resolves: https://redhat.atlassian.net/browse/VOYAGER-338
|
|
Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
|
|
---
|
|
src/util/virhostcpu.c | 32 +++++++++++++++++++++++++++++---
|
|
1 file changed, 29 insertions(+), 3 deletions(-)
|
|
|
|
diff --git a/src/util/virhostcpu.c b/src/util/virhostcpu.c
|
|
index 09395ddb04..113aa6881e 100644
|
|
--- a/src/util/virhostcpu.c
|
|
+++ b/src/util/virhostcpu.c
|
|
@@ -331,6 +331,8 @@ virHostCPUParseNode(const char *node,
|
|
int siblings;
|
|
unsigned int cpu;
|
|
int direrr;
|
|
+ g_autoptr(GHashTable) st = g_hash_table_new(g_direct_hash, g_direct_equal);
|
|
+ gpointer sock_resolved;
|
|
|
|
*threads = 0;
|
|
*cores = 0;
|
|
@@ -356,15 +358,29 @@ virHostCPUParseNode(const char *node,
|
|
if (virHostCPUGetSocket(cpu, &sock) < 0)
|
|
goto cleanup;
|
|
|
|
+ if (!g_hash_table_lookup_extended(st,
|
|
+ GUINT_TO_POINTER(sock),
|
|
+ NULL,
|
|
+ &sock_resolved)) {
|
|
+ g_hash_table_insert(st,
|
|
+ GUINT_TO_POINTER(sock),
|
|
+ GUINT_TO_POINTER(sock_max));
|
|
+ sock = sock_max;
|
|
+ sock_max++;
|
|
+ } else {
|
|
+ sock = GPOINTER_TO_UINT(sock_resolved);
|
|
+ }
|
|
+
|
|
virBitmapSetBitExpand(sockets_map, sock);
|
|
-
|
|
- if (sock > sock_max)
|
|
- sock_max = sock;
|
|
}
|
|
|
|
if (direrr < 0)
|
|
goto cleanup;
|
|
|
|
+ if (sock_max == 0) {
|
|
+ g_hash_table_insert(st, GUINT_TO_POINTER(0), GUINT_TO_POINTER(sock_max));
|
|
+ }
|
|
+
|
|
sock_max++;
|
|
|
|
/* allocate cores maps for each socket */
|
|
@@ -400,6 +416,16 @@ virHostCPUParseNode(const char *node,
|
|
|
|
if (virHostCPUGetSocket(cpu, &sock) < 0)
|
|
goto cleanup;
|
|
+
|
|
+ if (!g_hash_table_lookup_extended(st,
|
|
+ GUINT_TO_POINTER(sock),
|
|
+ NULL,
|
|
+ &sock_resolved)) {
|
|
+ goto cleanup;
|
|
+ }
|
|
+
|
|
+ sock = GPOINTER_TO_UINT(sock_resolved);
|
|
+
|
|
if (!virBitmapIsBitSet(sockets_map, sock)) {
|
|
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
|
_("CPU socket topology has changed"));
|
|
--
|
|
2.53.0
|