From: Willy Tarreau Date: Tue, 11 Jul 2023 16:24:20 +0000 (+0200) Subject: MINOR: cpu-topo: add detection of online CPUs on Linux X-Git-Tag: v3.2-dev8~85 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=8f72ce335a2b000e621fec0e22bd3b55d88d6069;p=thirdparty%2Fhaproxy.git MINOR: cpu-topo: add detection of online CPUs on Linux This adds a generic function ha_cpuset_detect_online() which for now only supports linux via /sys. It fills a cpuset with the list of online CPUs that were detected (or returns a failure). --- diff --git a/include/haproxy/cpu_topo.h b/include/haproxy/cpu_topo.h index bf7d98f71..74a7e70d2 100644 --- a/include/haproxy/cpu_topo.h +++ b/include/haproxy/cpu_topo.h @@ -9,6 +9,12 @@ extern int cpu_topo_maxcpus; extern int cpu_topo_lastcpu; extern struct ha_cpu_topo *ha_cpu_topo; +/* Detects CPUs that are online on the system. It may rely on FS access (e.g. + * /sys on Linux). Returns the number of CPUs detected or 0 if the detection + * failed. + */ +int ha_cpuset_detect_online(struct hap_cpuset *set); + /* Detects the CPUs that will be used based on the ones the process is bound to. * Returns non-zero on success, zero on failure. Note that it may not be * performed in the function above because some calls may rely on other items diff --git a/src/cpu_topo.c b/src/cpu_topo.c index 1f3495683..ddf45e6ff 100644 --- a/src/cpu_topo.c +++ b/src/cpu_topo.c @@ -7,6 +7,8 @@ #include #include #include +#include +#include /* CPU topology information, ha_cpuset_size() entries, allocated at boot */ int cpu_topo_maxcpus = -1; // max number of CPUs supported by OS/haproxy @@ -14,6 +16,33 @@ int cpu_topo_lastcpu = -1; // last supposed online CPU (no need to look beyond struct ha_cpu_topo *ha_cpu_topo = NULL; struct cpu_map *cpu_map; + +/* Detects CPUs that are online on the system. It may rely on FS access (e.g. + * /sys on Linux). Returns the number of CPUs detected or 0 if the detection + * failed. + */ +int ha_cpuset_detect_online(struct hap_cpuset *set) +{ +#if defined(__linux__) + + ha_cpuset_zero(set); + + /* contains a list of CPUs in the format [-][,...] */ + if (read_line_to_trash("%s/cpu/online", NUMA_DETECT_SYSTEM_SYSFS_PATH) >= 0) { + const char *parse_cpu_set_args[2] = { trash.area, "\0" }; + + if (parse_cpu_set(parse_cpu_set_args, set, NULL) != 0) + ha_cpuset_zero(set); + } + +#else // !__linux__ + + ha_cpuset_zero(set); + +#endif + return ha_cpuset_count(set); +} + /* Detects the CPUs that will be used based on the ones the process is bound to * at boot. The principle is the following: all CPUs from the boot cpuset will * be used since we don't know upfront how individual threads will be mapped to