use_current_cpuset() function does: /* * After this function is called, affinity_mask is the intersection of * the user supplied affinity mask and the affinity mask from the run * time environment */ static void use_current_cpuset(int max_cpus, struct bitmask *cpumask) However, when using isolcpus kernel command line option, the CPUs specificied at isolcpus= are not part of the run time environment cpumask. This causes "cyclictest -a isolatedcpus" to fail with: WARN: Couldn't setaffinity in main thread: Invalid argument FATAL: No allowable cpus to run on # /dev/cpu_dma_latency set to 0us To fix this, add an environment variable IGNORE_RUNTIME_CPU_AFFINITY_MASK that when set to a value other than 0, will override the runtime cpu affinity mask (retrieved with numa_sched_getaffinity) with a bit set for each CPU in numa_num_configured_cpus: numa_num_configured_cpus() returns the number of cpus in the system. This count includes any cpus that are currently disabled. This count is derived from the cpu numbers in /sys/devices/system/cpu. If the kernel is configured without /sys (CONFIG_SYSFS=n) then it falls back to using the number of online cpus. Signed-off-by: Marcelo Tosatti <mtosatti@xxxxxxxxxx> diff --git a/src/lib/rt-numa.c b/src/lib/rt-numa.c index ee5ab99..3106f1e 100644 --- a/src/lib/rt-numa.c +++ b/src/lib/rt-numa.c @@ -9,6 +9,7 @@ #include <errno.h> #include <sched.h> #include <pthread.h> +#include <stdlib.h> #include "rt-error.h" #include "rt-numa.h" @@ -99,11 +100,20 @@ int cpu_for_thread_ua(int thread_num, int max_cpus) static void use_current_cpuset(int max_cpus, struct bitmask *cpumask) { struct bitmask *curmask; + char *ignore_affinity_mask; int i; curmask = numa_allocate_cpumask(); numa_sched_getaffinity(getpid(), curmask); + ignore_affinity_mask = getenv("IGNORE_RUNTIME_CPU_AFFINITY_MASK"); + if (ignore_affinity_mask && *ignore_affinity_mask != '0') { + int conf_cpus = numa_num_configured_cpus(); + + for (i = 0; i < conf_cpus; i++) + numa_bitmask_setbit(curmask, i); + } + /* * Clear bits that are not set in both the cpuset from the * environment, and in the user specified affinity.