MINOR: cpuset: 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 3a0e03bd4c
commit 6bef0d7298
2 changed files with 33 additions and 0 deletions

View File

@ -54,6 +54,12 @@ int ha_cpuset_size(void);
*/
int ha_cpuset_detect_bound(struct hap_cpuset *set);
/* 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

@ -4,6 +4,7 @@
#include <haproxy/api.h>
#include <haproxy/cpuset.h>
#include <haproxy/global.h>
#include <haproxy/intops.h>
#include <haproxy/tools.h>
@ -176,6 +177,32 @@ int ha_cpuset_detect_bound(struct hap_cpuset *set)
return ha_cpuset_count(set);
}
/* 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