From 8a4466bd1527fd83af5cf6076dba8e875f3c8579 Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Wed, 19 Jul 2023 10:55:50 +0200 Subject: [PATCH] MEDIUM: cfgparse: assign NUMA affinity to cpu-maps Do not force affinity on the process, instead let's just apply it to cpu-map, it will automatically be used later in the init process. We can do this because we know that cpu-map was not set when we're using this detection code. This is much saner, as we don't need to manipulate the process' affinity at this point in time, and just update the info that the user omitted to set by themselves, which guarantees a better long-term consistency with the documented feature. --- src/cfgparse.c | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/src/cfgparse.c b/src/cfgparse.c index 661f5d980..b25812b3f 100644 --- a/src/cfgparse.c +++ b/src/cfgparse.c @@ -2627,6 +2627,7 @@ static int numa_detect_topology() const char *parse_cpu_set_args[2]; char cpumap_path[PATH_MAX]; char *err = NULL; + int grp, thr; /* node_cpu_set count is used as return value */ ha_cpuset_zero(&node_cpu_set); @@ -2675,12 +2676,9 @@ static int numa_detect_topology() } ha_diag_warning("Multi-socket cpu detected, automatically binding on active CPUs of '%s' (%u active cpu(s))\n", node, ha_cpuset_count(&node_cpu_set)); - if (sched_setaffinity(getpid(), sizeof(node_cpu_set.cpuset), &node_cpu_set.cpuset) == -1) { - ha_warning("Cannot set the cpu affinity for this multi-cpu machine\n"); - - /* clear the cpuset used as return value */ - ha_cpuset_zero(&node_cpu_set); - } + for (grp = 0; grp < MAX_TGROUPS; grp++) + for (thr = 0; thr < MAX_THREADS_PER_GROUP; thr++) + ha_cpuset_assign(&cpu_map[grp].thread[thr], &node_cpu_set); free(node_dirlist[node_dirlist_size]); break; @@ -2700,6 +2698,7 @@ static int numa_detect_topology() struct hap_cpuset node_cpu_set; int ndomains = 0, i; size_t len = sizeof(ndomains); + int grp, thr; if (sysctlbyname("vm.ndomains", &ndomains, &len, NULL, 0) == -1) { ha_notice("Cannot assess the number of CPUs domains\n"); @@ -2729,12 +2728,9 @@ static int numa_detect_topology() ha_cpuset_assign(&node_cpu_set, &dom); ha_diag_warning("Multi-socket cpu detected, automatically binding on active CPUs of '%d' (%u active cpu(s))\n", i, ha_cpuset_count(&node_cpu_set)); - if (cpuset_setaffinity(CPU_LEVEL_WHICH, CPU_WHICH_PID, -1, sizeof(node_cpu_set.cpuset), &node_cpu_set.cpuset) == -1) { - ha_warning("Cannot set the cpu affinity for this multi-cpu machine\n"); - - /* clear the cpuset used as return value */ - ha_cpuset_zero(&node_cpu_set); - } + for (grp = 0; grp < MAX_TGROUPS; grp++) + for (thr = 0; thr < MAX_THREADS_PER_GROUP; thr++) + ha_cpuset_assign(&cpu_map[grp].thread[thr], &node_cpu_set); break; } leave: