extern int cpu_topo_lastcpu;
extern struct ha_cpu_topo *ha_cpu_topo;
+/* non-zero if we're certain that taskset or similar was used to force CPUs */
+extern int cpu_mask_forced;
+
/* 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.
return _HA_ATOMIC_LOAD(&isolated_thread) == tid;
}
-/* Returns 1 if the cpu set is currently restricted for the process else 0.
- * Currently only implemented for the Linux platform.
- */
-int thread_cpu_mask_forced(void);
-
#if !defined(DEBUG_THREAD) && !defined(DEBUG_FULL)
/* Thread debugging is DISABLED, these are the regular locking functions */
{
int numa_cores = 0;
#if defined(USE_CPU_AFFINITY)
- if (global.numa_cpu_mapping && !thread_cpu_mask_forced() && !cpu_map_configured())
+ if (global.numa_cpu_mapping && !cpu_mask_forced && !cpu_map_configured())
numa_cores = numa_detect_topology();
#endif
global.nbthread = numa_cores ? numa_cores :
struct ha_cpu_topo *ha_cpu_topo = NULL;
struct cpu_map *cpu_map;
+/* non-zero if we're certain that taskset or similar was used to force CPUs */
+int cpu_mask_forced = 0;
/* 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
/* Update the list of currently offline CPUs. Normally it's a subset
* of the unbound ones, but we cannot infer anything if we don't have
- * the info so we only update what we know.
+ * the info so we only update what we know. We take this opportunity
+ * for detecting that some online CPUs are not bound, indicating that
+ * taskset or equivalent was used.
*/
if (ha_cpuset_detect_online(&boot_set)) {
for (cpu = 0; cpu < cpu_topo_maxcpus; cpu++) {
- if (!ha_cpuset_isset(&boot_set, cpu))
+ if (!ha_cpuset_isset(&boot_set, cpu)) {
ha_cpu_topo[cpu].st |= HA_CPU_F_OFFLINE;
- else
+ } else {
cpu_topo_lastcpu = cpu;
+ if (ha_cpu_topo[cpu].st & HA_CPU_F_EXCLUDED)
+ cpu_mask_forced = 1;
+ }
}
}
return ret;
}
-/* Returns 1 if the cpu set is currently restricted for the process else 0.
- * Currently only implemented for the Linux platform.
- */
-int thread_cpu_mask_forced()
-{
-#if defined(__linux__)
- const int cpus_avail = sysconf(_SC_NPROCESSORS_ONLN);
- return cpus_avail != thread_cpus_enabled();
-#else
- return 0;
-#endif
-}
-
/* Below come the lock-debugging functions */
#if defined(DEBUG_THREAD) || defined(DEBUG_FULL)