From 81492c989c3898d8492a8d6050a97eccf261107f Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Fri, 3 May 2019 09:41:23 +0200 Subject: [PATCH] MINOR: threads: flatten the per-thread cpu-map When we initially experimented with threads and processes support, we needed to implement arrays of threads per process for cpu-map, but this is not needed anymore since we support either threads or processes. Let's simply make the thread-based cpu-map per thread and not per thread and per process since that's not used anymore. Doing so reduces the global struct from 33kB to 1.5kB. --- include/types/global.h | 4 ++-- src/cfgparse-global.c | 23 ++++++++++++----------- src/haproxy.c | 6 +++--- 3 files changed, 17 insertions(+), 16 deletions(-) diff --git a/include/types/global.h b/include/types/global.h index ba3738bf25..b2e79693bb 100644 --- a/include/types/global.h +++ b/include/types/global.h @@ -179,8 +179,8 @@ struct global { struct vars vars; /* list of variables for the process scope. */ #ifdef USE_CPU_AFFINITY struct { - unsigned long proc[MAX_PROCS]; /* list of CPU masks for the 32/64 first processes */ - unsigned long thread[MAX_PROCS][MAX_THREADS]; /* list of CPU masks for the 32/64 first threads per process */ + unsigned long proc[MAX_PROCS]; /* list of CPU masks for the 32/64 first processes */ + unsigned long thread[MAX_THREADS]; /* list of CPU masks for the 32/64 first threads */ } cpu_map; #endif }; diff --git a/src/cfgparse-global.c b/src/cfgparse-global.c index 1633700ae9..f4037c2e7f 100644 --- a/src/cfgparse-global.c +++ b/src/cfgparse-global.c @@ -1009,33 +1009,34 @@ int cfg_parse_global(const char *file, int linenum, char **args, int kwm) goto out; } - for (i = n = 0; i < MAX_PROCS; i++) { - /* No mapping for this process */ - if (!(proc & (1UL << i))) - continue; - + if (atleast2(proc)) { /* Mapping at the process level */ - if (!thread) { + for (i = n = 0; i < MAX_PROCS; i++) { + /* No mapping for this process */ + if (!(proc & (1UL << i))) + continue; + if (!autoinc) global.cpu_map.proc[i] = cpus; else { n += my_ffsl(cpus >> n); global.cpu_map.proc[i] = (1UL << (n-1)); } - continue; } + } + if (atleast2(thread)) { /* Mapping at the thread level */ - for (j = 0; j < MAX_THREADS; j++) { - /* Np mapping for this thread */ + for (j = n = 0; j < MAX_THREADS; j++) { + /* No mapping for this thread */ if (!(thread & (1UL << j))) continue; if (!autoinc) - global.cpu_map.thread[i][j] = cpus; + global.cpu_map.thread[j] = cpus; else { n += my_ffsl(cpus >> n); - global.cpu_map.thread[i][j] = (1UL << (n-1)); + global.cpu_map.thread[j] = (1UL << (n-1)); } } } diff --git a/src/haproxy.c b/src/haproxy.c index 603f084cc8..1aeae9984b 100644 --- a/src/haproxy.c +++ b/src/haproxy.c @@ -3152,17 +3152,17 @@ int main(int argc, char **argv) /* Now the CPU affinity for all threads */ for (i = 0; i < global.nbthread; i++) { if (global.cpu_map.proc[relative_pid-1]) - global.cpu_map.thread[relative_pid-1][i] &= global.cpu_map.proc[relative_pid-1]; + global.cpu_map.thread[i] &= global.cpu_map.proc[relative_pid-1]; if (i < MAX_THREADS && /* only the first 32/64 threads may be pinned */ - global.cpu_map.thread[relative_pid-1][i]) {/* only do this if the thread has a THREAD map */ + global.cpu_map.thread[i]) {/* only do this if the thread has a THREAD map */ #if defined(__FreeBSD__) || defined(__NetBSD__) cpuset_t cpuset; #else cpu_set_t cpuset; #endif int j; - unsigned long cpu_map = global.cpu_map.thread[relative_pid-1][i]; + unsigned long cpu_map = global.cpu_map.thread[i]; CPU_ZERO(&cpuset); -- 2.39.5