From: Willy Tarreau Date: Tue, 11 Jul 2023 14:51:22 +0000 (+0200) Subject: MINOR: cpuset: centralize a reliable bound cpu detection X-Git-Tag: v2.9-dev5~56 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e65f54cf96725eeb2bc757cde6bd053152a3eef5;p=thirdparty%2Fhaproxy.git MINOR: cpuset: centralize a reliable bound cpu detection Till now the CPUs that were bound were only retrieved in thread_cpus_enabled() in order to count the number of CPUs allowed, and it relied on arch-specific code. Let's slightly arrange this into ha_cpuset_detect_bound() that reuses the ha_cpuset struct and the accompanying code. This makes the code much clearer without having to carry along some arch-specific stuff out of this area. Note that the macos-specific code used in thread.c to only count online CPUs but not retrieve a mask, so for now we can't infer anything from it and can't implement it. In addition and more importantly, this function is reliable in that it will only return a value when the detection is accurate, and will not return incomplete sets on operating systems where we don't have an exact list, such as online CPUs. --- diff --git a/include/haproxy/cpuset.h b/include/haproxy/cpuset.h index 2d1b5d3759..78c4df2707 100644 --- a/include/haproxy/cpuset.h +++ b/include/haproxy/cpuset.h @@ -48,6 +48,11 @@ void ha_cpuset_assign(struct hap_cpuset *dst, struct hap_cpuset *src); */ int ha_cpuset_size(void); +/* Detects CPUs that are bound to the current process. Returns the number of + * CPUs detected or 0 if the detection failed. + */ +int ha_cpuset_detect_bound(struct hap_cpuset *set); + /* Returns true if at least one cpu-map directive was configured, otherwise * false. */ diff --git a/src/cpuset.c b/src/cpuset.c index 42daca463a..73b97b9759 100644 --- a/src/cpuset.c +++ b/src/cpuset.c @@ -147,6 +147,30 @@ int ha_cpuset_size() #endif } +/* Detects CPUs that are bound to the current process. Returns the number of + * CPUs detected or 0 if the detection failed. + */ +int ha_cpuset_detect_bound(struct hap_cpuset *set) +{ + ha_cpuset_zero(set); + + /* detect bound CPUs depending on the OS's API */ + if (0 +#if defined(__linux__) + || sched_getaffinity(0, sizeof(set->cpuset), &set->cpuset) != 0 +#elif defined(__FreeBSD__) + || cpuset_getaffinity(CPU_LEVEL_CPUSET, CPU_WHICH_PID, -1, sizeof(set->cpuset), &set->cpuset) != 0 +#else + || 1 // unhandled platform +#endif + ) { + /* detection failed */ + return 0; + } + + return ha_cpuset_count(set); +} + /* Returns true if at least one cpu-map directive was configured, otherwise * false. */