]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MINOR: threads: flatten the per-thread cpu-map
authorWilly Tarreau <w@1wt.eu>
Fri, 3 May 2019 07:41:23 +0000 (09:41 +0200)
committerWilly Tarreau <w@1wt.eu>
Fri, 3 May 2019 07:46:45 +0000 (09:46 +0200)
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
src/cfgparse-global.c
src/haproxy.c

index ba3738bf2525946793f222f98f776ed1fc9907f3..b2e79693bbae38adb00d647fd98a5a665e9f8e65 100644 (file)
@@ -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
 };
index 1633700ae9d2b1b25b8bbee96544c99fd4a18f39..f4037c2e7f04b44c571c23abc91f3ec9ddd112f1 100644 (file)
@@ -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));
                                }
                        }
                }
index 603f084cc8eff4b2e04aac765a6cf7536c5c8ddd..1aeae9984bcbf55b2e37526218e3b622f7ce3e42 100644 (file)
@@ -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);