summaryrefslogtreecommitdiff
path: root/sys-process/numad/files
diff options
context:
space:
mode:
authorV3n3RiX <venerix@koprulu.sector>2023-01-15 23:56:06 +0000
committerV3n3RiX <venerix@koprulu.sector>2023-01-15 23:56:06 +0000
commit038c98389fa5a5efb22cffaa35ecdddfc9a38036 (patch)
tree04bae6b07cc56a603b9bb571367fda8181244b2b /sys-process/numad/files
parent3392d5e937023e57811edc670b0ed7d3aba55c6d (diff)
gentoo auto-resync : 15:01:2023 - 23:56:06
Diffstat (limited to 'sys-process/numad/files')
-rw-r--r--sys-process/numad/files/numad-0.5-fix-sparse-node-ids.patch53
1 files changed, 53 insertions, 0 deletions
diff --git a/sys-process/numad/files/numad-0.5-fix-sparse-node-ids.patch b/sys-process/numad/files/numad-0.5-fix-sparse-node-ids.patch
new file mode 100644
index 000000000000..d7d438457826
--- /dev/null
+++ b/sys-process/numad/files/numad-0.5-fix-sparse-node-ids.patch
@@ -0,0 +1,53 @@
+From ab79ec5b6389507b4970d68862abb95d0b2b94c9 Mon Sep 17 00:00:00 2001
+From: Christian Ehrhardt <christian.ehrhardt@canonical.com>
+Date: Jun 17 2019 10:37:48 +0000
+Subject: fix sparse node ids
+
+
+CPU-ids can be sparse due to disabling a subset of CPUs.
+On ppc64le this even will make the node_ids sparse, this is actually pretty
+common on ppc64 when SMT is disabled.
+
+Numad has the assumption of cpu/node-ids always being linear and due to that
+accesses the 'node' array out of bounds. That triggers crashes like the
+following:
+
+ Thread 1 "numad" received signal SIGSEGV, Segmentation fault.
+ #0 0x00000fb6cd2779f4 in bind_process_and_migrate_memory (p=0xfb6fc1e0f70)
+ at numad.c:998
+ #1 0x00000fb6cd27d148 in manage_loads () at numad.c:2225
+ #2 0x00000fb6cd2734dc in main (argc=<optimized out>, argv=<optimized out>)
+ at numad.c:2654
+
+Instead of directly indexing with node_id we need to detect which array
+element has the matching node_id and use that.
+
+Signed-off-by: Christian Ehrhardt <christian.ehrhardt@canonical.com>
+
+---
+
+diff --git a/numad.c b/numad.c
+index a6a7a5d..524bf61 100644
+--- a/numad.c
++++ b/numad.c
+@@ -995,7 +995,18 @@ int bind_process_and_migrate_memory(process_data_p p) {
+ int node_id = 0;
+ while (nodes) {
+ if (ID_IS_IN_LIST(node_id, p->node_list_p)) {
+- OR_LISTS(cpu_bind_list_p, cpu_bind_list_p, node[node_id].cpu_list_p);
++ int id = -1;
++ for (int node_ix = 0; (node_ix < num_nodes); node_ix++) {
++ if (node[node_ix].node_id == node_id) {
++ id = node_ix;
++ break;
++ }
++ }
++ if (id == -1) {
++ numad_log(LOG_CRIT, "Node %d is requested, but unknown\n", node_id);
++ exit(EXIT_FAILURE);
++ }
++ OR_LISTS(cpu_bind_list_p, cpu_bind_list_p, node[id].cpu_list_p);
+ nodes -= 1;
+ }
+ node_id += 1;
+