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).
This commit is contained in:
Willy Tarreau 2023-07-11 18:24:20 +02:00
parent 8c524c7c9d
commit 8f72ce335a
2 changed files with 35 additions and 0 deletions

View File

@ -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

View File

@ -7,6 +7,8 @@
#include <haproxy/api.h>
#include <haproxy/cpuset.h>
#include <haproxy/cpu_topo.h>
#include <haproxy/global.h>
#include <haproxy/tools.h>
/* 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 <low>[-<high>][,...] */
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