From: Amaury Denoyelle Date: Wed, 14 Apr 2021 14:16:03 +0000 (+0200) Subject: MINOR: cfgparse: use hap_cpuset for parse_cpu_set X-Git-Tag: v2.4-dev17~16 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=c90932bc8ee97f100964e63cda773d10ed846579;p=thirdparty%2Fhaproxy.git MINOR: cfgparse: use hap_cpuset for parse_cpu_set 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. --- diff --git a/include/haproxy/cfgparse.h b/include/haproxy/cfgparse.h index 2d309f4a18..8af4e47cd1 100644 --- a/include/haproxy/cfgparse.h +++ b/include/haproxy/cfgparse.h @@ -26,6 +26,8 @@ #include #include +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); diff --git a/src/cfgparse-global.c b/src/cfgparse-global.c index c26c086d01..40f3018b3e 100644 --- a/src/cfgparse-global.c +++ b/src/cfgparse-global.c @@ -1,3 +1,4 @@ +#define _GNU_SOURCE /* for CPU_* from cpuset.h */ #include #include #include @@ -13,6 +14,7 @@ #include #include +#include #include #include #include @@ -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)) { diff --git a/src/cfgparse.c b/src/cfgparse.c index c6a93ee3c1..dd8a2c13cf 100644 --- a/src/cfgparse.c +++ b/src/cfgparse.c @@ -43,6 +43,7 @@ #include #include #include +#include #include #include #include @@ -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 - * 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 . */ -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++; }