isolcpus: Affine unbound kernel threads to housekeeping cpus
authorMarcelo Tosatti <mtosatti@redhat.com>
Wed, 27 May 2020 14:29:09 +0000 (16:29 +0200)
committerPeter Zijlstra <peterz@infradead.org>
Mon, 15 Jun 2020 12:10:03 +0000 (14:10 +0200)
This is a kernel enhancement that configures the cpu affinity of kernel
threads via kernel boot option nohz_full=.

When this option is specified, the cpumask is immediately applied upon
kthread 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=domain parameter,
making it possible to enable load balancing on such CPUs
during runtime (see kernel-parameters.txt).

Note-1: this is based off on Wind River'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.

Note-2: Wind River's patch was based off Christoph Lameter's patch at
https://lwn.net/Articles/565932/ with the only difference being
the kernel parameter changed from kthread to kthread_cpus.

Signed-off-by: Frederic Weisbecker <frederic@kernel.org>
Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Link: https://lkml.kernel.org/r/20200527142909.23372-3-frederic@kernel.org
include/linux/sched/isolation.h
kernel/kthread.c
kernel/sched/isolation.c

index 0fbcbacd1b2900bae38fd90f7aea73c04f06572d..cc9f393e2a70603ed16974afeb60aa6569bcd26d 100644 (file)
@@ -14,6 +14,7 @@ enum hk_flags {
        HK_FLAG_DOMAIN          = (1 << 5),
        HK_FLAG_WQ              = (1 << 6),
        HK_FLAG_MANAGED_IRQ     = (1 << 7),
+       HK_FLAG_KTHREAD         = (1 << 8),
 };
 
 #ifdef CONFIG_CPU_ISOLATION
index b86d37cda10928050eb36a60a2cf83e033533de3..032b610912b09514c5564fba40b439f1ff05d556 100644 (file)
@@ -27,6 +27,7 @@
 #include <linux/ptrace.h>
 #include <linux/uaccess.h>
 #include <linux/numa.h>
+#include <linux/sched/isolation.h>
 #include <trace/events/sched.h>
 
 
@@ -383,7 +384,8 @@ struct task_struct *__kthread_create_on_node(int (*threadfn)(void *data),
                 * The kernel thread should not inherit these properties.
                 */
                sched_setscheduler_nocheck(task, SCHED_NORMAL, &param);
-               set_cpus_allowed_ptr(task, cpu_possible_mask);
+               set_cpus_allowed_ptr(task,
+                                    housekeeping_cpumask(HK_FLAG_KTHREAD));
        }
        kfree(create);
        return task;
@@ -608,7 +610,7 @@ int kthreadd(void *unused)
        /* Setup a clean context for our children to inherit. */
        set_task_comm(tsk, "kthreadd");
        ignore_signals(tsk);
-       set_cpus_allowed_ptr(tsk, cpu_possible_mask);
+       set_cpus_allowed_ptr(tsk, housekeeping_cpumask(HK_FLAG_KTHREAD));
        set_mems_allowed(node_states[N_MEMORY]);
 
        current->flags |= PF_NOFREEZE;
index 808244f3ddd9842d684503a493cd8a69092cff74..5a6ea03f9882d3bb068f1b10cf2da908fc492000 100644 (file)
@@ -140,7 +140,8 @@ static int __init housekeeping_nohz_full_setup(char *str)
 {
        unsigned int flags;
 
-       flags = HK_FLAG_TICK | HK_FLAG_WQ | HK_FLAG_TIMER | HK_FLAG_RCU | HK_FLAG_MISC;
+       flags = HK_FLAG_TICK | HK_FLAG_WQ | HK_FLAG_TIMER | HK_FLAG_RCU |
+               HK_FLAG_MISC | HK_FLAG_KTHREAD;
 
        return housekeeping_setup(str, flags);
 }