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