]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MINOR: cfgparse: use hap_cpuset for parse_cpu_set
authorAmaury Denoyelle <adenoyelle@haproxy.com>
Wed, 14 Apr 2021 14:16:03 +0000 (16:16 +0200)
committerAmaury Denoyelle <adenoyelle@haproxy.com>
Fri, 23 Apr 2021 14:06:49 +0000 (16:06 +0200)
Replace the unsigned long parameter by a hap_cpuset. This allows to
address CPU with index greater than LONGBITS.

This function is used to parse the 'cpu-map' statement. However at the
moment, the result is casted back to a long to store it in the global
structure. The next step is to replace ulong in in cpu_map in the
global structure with hap_cpuset.

include/haproxy/cfgparse.h
src/cfgparse-global.c
src/cfgparse.c

index 2d309f4a1899e9db6d0965408d271376a99b43b5..8af4e47cd11f7526f76379106cbef7bbb11afdfa 100644 (file)
@@ -26,6 +26,8 @@
 #include <haproxy/errors.h>
 #include <haproxy/proxy.h>
 
+struct hap_cpuset;
+
 /* configuration sections */
 #define CFG_NONE       0
 #define CFG_GLOBAL     1
@@ -112,7 +114,7 @@ int too_many_args(int maxarg, char **args, char **msg, int *err_code);
 int alertif_too_many_args_idx(int maxarg, int index, const char *file, int linenum, char **args, int *err_code);
 int alertif_too_many_args(int maxarg, const char *file, int linenum, char **args, int *err_code);
 int parse_process_number(const char *arg, unsigned long *proc, int max, int *autoinc, char **err);
-unsigned long parse_cpu_set(const char **args, unsigned long *cpu_set, char **err);
+unsigned long parse_cpu_set(const char **args, struct hap_cpuset *cpu_set, char **err);
 void free_email_alert(struct proxy *p);
 const char *cfg_find_best_match(const char *word, const struct list *list, int section, const char **extra);
 
index c26c086d01559cc98e853843c7d6b9617fa8d0b2..40f3018b3e21c1fa880f9d1d77f0f3d353097b72 100644 (file)
@@ -1,3 +1,4 @@
+#define _GNU_SOURCE  /* for CPU_* from cpuset.h */
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -13,6 +14,7 @@
 
 #include <haproxy/buf.h>
 #include <haproxy/cfgparse.h>
+#include <haproxy/cpuset.h>
 #include <haproxy/compression.h>
 #include <haproxy/global.h>
 #include <haproxy/log.h>
@@ -1027,7 +1029,8 @@ int cfg_parse_global(const char *file, int linenum, char **args, int kwm)
 #ifdef USE_CPU_AFFINITY
                char *slash;
                unsigned long proc = 0, thread = 0, cpus;
-               int i, j, n, autoinc;
+               int i, j, n, k, autoinc;
+               struct hap_cpuset cpuset;
 
                if (!*args[1] || !*args[2]) {
                        ha_alert("parsing [%s:%d] : %s expects a process number "
@@ -1068,12 +1071,23 @@ int cfg_parse_global(const char *file, int linenum, char **args, int kwm)
                        }
                }
 
-               if (parse_cpu_set((const char **)args+2, &cpus, &errmsg)) {
+               if (parse_cpu_set((const char **)args+2, &cpuset, &errmsg)) {
                        ha_alert("parsing [%s:%d] : %s : %s\n", file, linenum, args[0], errmsg);
                        err_code |= ERR_ALERT | ERR_FATAL;
                        goto out;
                }
-
+#if defined(CPUSET_USE_CPUSET)
+               k = 0;
+               while (CPU_COUNT(&cpuset.cpuset)) {
+                       while (!CPU_ISSET(k, &cpuset.cpuset))
+                               ++k;
+                       cpus |= 1 << k;
+                       CPU_CLR(k, &cpuset.cpuset);
+                       ++k;
+               }
+#elif defined(CPUSET_USE_ULONG)
+               cpus = cpuset.cpuset;
+#endif
                if (autoinc &&
                    my_popcountl(proc)  != my_popcountl(cpus) &&
                    my_popcountl(thread) != my_popcountl(cpus)) {
index c6a93ee3c1bca2ab9b69930bcf1eb4e207935081..dd8a2c13cf2e0413451340985a9ca4ddf1a22d31 100644 (file)
@@ -43,6 +43,7 @@
 #include <haproxy/channel.h>
 #include <haproxy/check.h>
 #include <haproxy/chunk.h>
+#include <haproxy/cpuset.h>
 #include <haproxy/connection.h>
 #include <haproxy/errors.h>
 #include <haproxy/filters.h>
@@ -460,27 +461,28 @@ int parse_process_number(const char *arg, unsigned long *proc, int max, int *aut
 
 #ifdef USE_CPU_AFFINITY
 /* Parse cpu sets. Each CPU set is either a unique number between 0 and
- * <LONGBITS> or a range with two such numbers delimited by a dash
+ * ha_cpuset_size() - 1 or a range with two such numbers delimited by a dash
  * ('-'). Multiple CPU numbers or ranges may be specified. On success, it
  * returns 0. otherwise it returns 1 with an error message in <err>.
  */
-unsigned long parse_cpu_set(const char **args, unsigned long *cpu_set, char **err)
+unsigned long parse_cpu_set(const char **args, struct hap_cpuset *cpu_set, char **err)
 {
        int cur_arg = 0;
 
-       *cpu_set = 0;
+       ha_cpuset_zero(cpu_set);
+
        while (*args[cur_arg]) {
                char        *dash;
                unsigned int low, high;
 
                if (!isdigit((unsigned char)*args[cur_arg])) {
-                       memprintf(err, "'%s' is not a CPU range.\n", args[cur_arg]);
+                       memprintf(err, "'%s' is not a CPU range.", args[cur_arg]);
                        return -1;
                }
 
                low = high = str2uic(args[cur_arg]);
                if ((dash = strchr(args[cur_arg], '-')) != NULL)
-                       high = ((!*(dash+1)) ? LONGBITS-1 : str2uic(dash + 1));
+                       high = *(dash+1) ? str2uic(dash + 1) : ha_cpuset_size() - 1;
 
                if (high < low) {
                        unsigned int swap = low;
@@ -488,13 +490,14 @@ unsigned long parse_cpu_set(const char **args, unsigned long *cpu_set, char **er
                        high = swap;
                }
 
-               if (high >= LONGBITS) {
-                       memprintf(err, "supports CPU numbers from 0 to %d.\n", LONGBITS - 1);
+               if (high >= ha_cpuset_size()) {
+                       memprintf(err, "supports CPU numbers from 0 to %d.",
+                                 ha_cpuset_size() - 1);
                        return 1;
                }
 
                while (low <= high)
-                       *cpu_set |= 1UL << low++;
+                       ha_cpuset_set(cpu_set, low++);
 
                cur_arg++;
        }