This is a kernel enhancement to configure the cpu affinity of kernel
threads via kernel boot option kthread_cpus=<cpulist>.
With kthread_cpus specified, the cpumask is immediately applied upon
thread launch. This does not affect kernel threads that specify cpu
and node.
This allows CPU isolation (that is not allowing certain threads
to execute on certain CPUs) without using the isolcpus= parameter,
making it possible to enable load balancing on such CPUs
during runtime.
Note-1: this is based off on MontaVista's patch at
https://github.com/starlingx-staging/stx-integ/blob/master/kernel/kernel-std/centos/patches/affine-compute-kernel-threads.patch
Difference being that this patch is limited to modifying
kernel thread cpumask: Behaviour of other threads can
be controlled via cgroups or sched_setaffinity.
+static struct cpumask user_cpu_kthread_mask __read_mostly;
+static int user_cpu_kthread_mask_valid __read_mostly;
+int __init init_kthread_cpumask(void)
+{
+ if (user_cpu_kthread_mask_valid == 1)
+ cpumask_copy(&__cpu_kthread_mask, &user_cpu_kthread_mask);
+ else
+ cpumask_copy(&__cpu_kthread_mask, cpu_all_mask);
+
+ return 0;
+}
+
+static int __init kthread_setup(char *str)
+{
+ cpulist_parse(str, &user_cpu_kthread_mask);
+ if (!cpumask_empty(&user_cpu_kthread_mask))
+ user_cpu_kthread_mask_valid = 1;
+
+ return 1;
+}