extern int cpu_topo_lastcpu;
extern struct ha_cpu_topo *ha_cpu_topo;
+/* 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
+ * being allocated (e.g. trash).
+ */
+int cpu_detect_usable(void);
+
/* Dump the CPU topology <topo> for up to cpu_topo_maxcpus CPUs for
* debugging purposes. Offline CPUs are skipped.
*/
int cpu_topo_lastcpu = -1; // last supposed online CPU (no need to look beyond)
struct ha_cpu_topo *ha_cpu_topo = NULL;
+/* 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
+ * groups and CPUs.
+ *
+ * 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
+ * being allocated (e.g. trash).
+ */
+int cpu_detect_usable(void)
+{
+ struct hap_cpuset boot_set = { };
+ int cpu;
+
+ /* update the list with the CPUs currently bound to the current process */
+ ha_cpuset_detect_bound(&boot_set);
+
+ /* remove the known-excluded CPUs */
+ for (cpu = 0; cpu < cpu_topo_maxcpus; cpu++)
+ if (!ha_cpuset_isset(&boot_set, cpu))
+ ha_cpu_topo[cpu].st |= HA_CPU_F_EXCLUDED;
+
+ return 0;
+}
+
/* Dump the CPU topology <topo> for up to cpu_topo_maxcpus CPUs for
* debugging purposes. Offline CPUs are skipped.
*/
#include <haproxy/connection.h>
#ifdef USE_CPU_AFFINITY
#include <haproxy/cpuset.h>
+#include <haproxy/cpu_topo.h>
#endif
#include <haproxy/debug.h>
#include <haproxy/dns.h>
clock_adjust_now_offset();
ready_date = date;
+#ifdef USE_CPU_AFFINITY
+ /* we've already read the config and know what CPUs are expected
+ * to be used. Let's check which of these are usable.
+ */
+ cpu_detect_usable();
+#endif
/* Note: global.nbthread will be initialized as part of this call */
err_code |= check_config_validity();