All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/2] sched/isolation: Isolate unbound kthreads
@ 2020-05-27 14:29 Frederic Weisbecker
  2020-05-27 14:29 ` [PATCH 1/2] kthread: Switch to cpu_possible_mask Frederic Weisbecker
                   ` (2 more replies)
  0 siblings, 3 replies; 6+ messages in thread
From: Frederic Weisbecker @ 2020-05-27 14:29 UTC (permalink / raw)
  To: Peter Zijlstra, Ingo Molnar
  Cc: LKML, Frederic Weisbecker, Thomas Gleixner, Andrew Morton,
	Christoph Lameter, Chris Friesen, Marcelo Tosatti,
	Jim Somerville

Kthreads are harder to affine and isolate than user tasks. They can't
be placed inside cgroups/cpusets and the affinity for any newly
created kthread is always overriden from the inherited kthreadd's
affinity to system wide. Take that into account for nohz_full.

git://git.kernel.org/pub/scm/linux/kernel/git/frederic/linux-dynticks.git
	sched/core

HEAD: 774258ad06e832e9fbdcf681225d2c29421a100f

Thanks,
	Frederic
---

Marcelo Tosatti (2):
      kthread: Switch to cpu_possible_mask
      isolcpus: Affine unbound kernel threads to housekeeping cpus


 include/linux/sched/isolation.h | 1 +
 kernel/kthread.c                | 6 ++++--
 kernel/sched/isolation.c        | 3 ++-
 3 files changed, 7 insertions(+), 3 deletions(-)

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH 1/2] kthread: Switch to cpu_possible_mask
  2020-05-27 14:29 [PATCH 0/2] sched/isolation: Isolate unbound kthreads Frederic Weisbecker
@ 2020-05-27 14:29 ` Frederic Weisbecker
  2020-06-16 12:21   ` [tip: sched/core] " tip-bot2 for Marcelo Tosatti
  2020-05-27 14:29 ` [PATCH 2/2] isolcpus: Affine unbound kernel threads to housekeeping cpus Frederic Weisbecker
  2020-06-04 13:16 ` [PATCH 0/2] sched/isolation: Isolate unbound kthreads Peter Zijlstra
  2 siblings, 1 reply; 6+ messages in thread
From: Frederic Weisbecker @ 2020-05-27 14:29 UTC (permalink / raw)
  To: Peter Zijlstra, Ingo Molnar
  Cc: LKML, Marcelo Tosatti, Frederic Weisbecker, Thomas Gleixner,
	Andrew Morton, Christoph Lameter, Chris Friesen, Jim Somerville

From: Marcelo Tosatti <mtosatti@redhat.com>

Next patch will switch unbound kernel threads mask to
housekeeping_cpumask(), a subset of cpu_possible_mask. So in order to
ease bisection, lets first switch kthreads default affinity from
cpu_all_mask to cpu_possible_mask.

It looks safe to do so as cpu_possible_mask seem to be initialized
at setup_arch() time, way before kthreadd is created.

Suggested-by: Frederic Weisbecker <frederic@kernel.org>
Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
Cc: Chris Friesen <chris.friesen@windriver.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Jim Somerville <Jim.Somerville@windriver.com>
Cc: Christoph Lameter <cl@linux.com>
Signed-off-by: Frederic Weisbecker <frederic@kernel.org>
---
 kernel/kthread.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/kernel/kthread.c b/kernel/kthread.c
index bfbfa481be3a..788bec94aca7 100644
--- a/kernel/kthread.c
+++ b/kernel/kthread.c
@@ -360,7 +360,7 @@ 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_all_mask);
+		set_cpus_allowed_ptr(task, cpu_possible_mask);
 	}
 	kfree(create);
 	return task;
@@ -585,7 +585,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_all_mask);
+	set_cpus_allowed_ptr(tsk, cpu_possible_mask);
 	set_mems_allowed(node_states[N_MEMORY]);
 
 	current->flags |= PF_NOFREEZE;
-- 
2.26.2


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH 2/2] isolcpus: Affine unbound kernel threads to housekeeping cpus
  2020-05-27 14:29 [PATCH 0/2] sched/isolation: Isolate unbound kthreads Frederic Weisbecker
  2020-05-27 14:29 ` [PATCH 1/2] kthread: Switch to cpu_possible_mask Frederic Weisbecker
@ 2020-05-27 14:29 ` Frederic Weisbecker
  2020-06-16 12:21   ` [tip: sched/core] " tip-bot2 for Marcelo Tosatti
  2020-06-04 13:16 ` [PATCH 0/2] sched/isolation: Isolate unbound kthreads Peter Zijlstra
  2 siblings, 1 reply; 6+ messages in thread
From: Frederic Weisbecker @ 2020-05-27 14:29 UTC (permalink / raw)
  To: Peter Zijlstra, Ingo Molnar
  Cc: LKML, Marcelo Tosatti, Frederic Weisbecker, Thomas Gleixner,
	Andrew Morton, Christoph Lameter, Chris Friesen, Jim Somerville

From: Marcelo Tosatti <mtosatti@redhat.com>

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: Marcelo Tosatti <mtosatti@redhat.com>
Cc: Chris Friesen <chris.friesen@windriver.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Jim Somerville <Jim.Somerville@windriver.com>
Cc: Christoph Lameter <cl@linux.com>
Signed-off-by: Frederic Weisbecker <frederic@kernel.org>
---
 include/linux/sched/isolation.h | 1 +
 kernel/kthread.c                | 6 ++++--
 kernel/sched/isolation.c        | 3 ++-
 3 files changed, 7 insertions(+), 3 deletions(-)

diff --git a/include/linux/sched/isolation.h b/include/linux/sched/isolation.h
index 0fbcbacd1b29..cc9f393e2a70 100644
--- a/include/linux/sched/isolation.h
+++ b/include/linux/sched/isolation.h
@@ -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
diff --git a/kernel/kthread.c b/kernel/kthread.c
index 788bec94aca7..eaeadefc0f8f 100644
--- a/kernel/kthread.c
+++ b/kernel/kthread.c
@@ -23,6 +23,7 @@
 #include <linux/ptrace.h>
 #include <linux/uaccess.h>
 #include <linux/numa.h>
+#include <linux/sched/isolation.h>
 #include <trace/events/sched.h>
 
 static DEFINE_SPINLOCK(kthread_create_lock);
@@ -360,7 +361,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;
@@ -585,7 +587,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;
diff --git a/kernel/sched/isolation.c b/kernel/sched/isolation.c
index 808244f3ddd9..5a6ea03f9882 100644
--- a/kernel/sched/isolation.c
+++ b/kernel/sched/isolation.c
@@ -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);
 }
-- 
2.26.2


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH 0/2] sched/isolation: Isolate unbound kthreads
  2020-05-27 14:29 [PATCH 0/2] sched/isolation: Isolate unbound kthreads Frederic Weisbecker
  2020-05-27 14:29 ` [PATCH 1/2] kthread: Switch to cpu_possible_mask Frederic Weisbecker
  2020-05-27 14:29 ` [PATCH 2/2] isolcpus: Affine unbound kernel threads to housekeeping cpus Frederic Weisbecker
@ 2020-06-04 13:16 ` Peter Zijlstra
  2 siblings, 0 replies; 6+ messages in thread
From: Peter Zijlstra @ 2020-06-04 13:16 UTC (permalink / raw)
  To: Frederic Weisbecker
  Cc: Ingo Molnar, LKML, Thomas Gleixner, Andrew Morton,
	Christoph Lameter, Chris Friesen, Marcelo Tosatti,
	Jim Somerville

On Wed, May 27, 2020 at 04:29:07PM +0200, Frederic Weisbecker wrote:
> Kthreads are harder to affine and isolate than user tasks. They can't
> be placed inside cgroups/cpusets and the affinity for any newly
> created kthread is always overriden from the inherited kthreadd's
> affinity to system wide. Take that into account for nohz_full.
> 

Thanks!

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [tip: sched/core] isolcpus: Affine unbound kernel threads to housekeeping cpus
  2020-05-27 14:29 ` [PATCH 2/2] isolcpus: Affine unbound kernel threads to housekeeping cpus Frederic Weisbecker
@ 2020-06-16 12:21   ` tip-bot2 for Marcelo Tosatti
  0 siblings, 0 replies; 6+ messages in thread
From: tip-bot2 for Marcelo Tosatti @ 2020-06-16 12:21 UTC (permalink / raw)
  To: linux-tip-commits
  Cc: Frederic Weisbecker, Marcelo Tosatti, Peter Zijlstra (Intel), x86, LKML

The following commit has been merged into the sched/core branch of tip:

Commit-ID:     9cc5b8656892a72438ee7deb5e80f5be47643b8b
Gitweb:        https://git.kernel.org/tip/9cc5b8656892a72438ee7deb5e80f5be47643b8b
Author:        Marcelo Tosatti <mtosatti@redhat.com>
AuthorDate:    Wed, 27 May 2020 16:29:09 +02:00
Committer:     Peter Zijlstra <peterz@infradead.org>
CommitterDate: Mon, 15 Jun 2020 14:10:03 +02:00

isolcpus: Affine unbound kernel threads to housekeeping cpus

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 | 1 +
 kernel/kthread.c                | 6 ++++--
 kernel/sched/isolation.c        | 3 ++-
 3 files changed, 7 insertions(+), 3 deletions(-)

diff --git a/include/linux/sched/isolation.h b/include/linux/sched/isolation.h
index 0fbcbac..cc9f393 100644
--- a/include/linux/sched/isolation.h
+++ b/include/linux/sched/isolation.h
@@ -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
diff --git a/kernel/kthread.c b/kernel/kthread.c
index b86d37c..032b610 100644
--- a/kernel/kthread.c
+++ b/kernel/kthread.c
@@ -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;
diff --git a/kernel/sched/isolation.c b/kernel/sched/isolation.c
index 808244f..5a6ea03 100644
--- a/kernel/sched/isolation.c
+++ b/kernel/sched/isolation.c
@@ -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);
 }

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [tip: sched/core] kthread: Switch to cpu_possible_mask
  2020-05-27 14:29 ` [PATCH 1/2] kthread: Switch to cpu_possible_mask Frederic Weisbecker
@ 2020-06-16 12:21   ` tip-bot2 for Marcelo Tosatti
  0 siblings, 0 replies; 6+ messages in thread
From: tip-bot2 for Marcelo Tosatti @ 2020-06-16 12:21 UTC (permalink / raw)
  To: linux-tip-commits
  Cc: Frederic Weisbecker, Marcelo Tosatti, Peter Zijlstra (Intel), x86, LKML

The following commit has been merged into the sched/core branch of tip:

Commit-ID:     043eb8e1051143a24811e6f35c276e35ae8247b6
Gitweb:        https://git.kernel.org/tip/043eb8e1051143a24811e6f35c276e35ae8247b6
Author:        Marcelo Tosatti <mtosatti@redhat.com>
AuthorDate:    Wed, 27 May 2020 16:29:08 +02:00
Committer:     Peter Zijlstra <peterz@infradead.org>
CommitterDate: Mon, 15 Jun 2020 14:10:03 +02:00

kthread: Switch to cpu_possible_mask

Next patch will switch unbound kernel threads mask to
housekeeping_cpumask(), a subset of cpu_possible_mask. So in order to
ease bisection, lets first switch kthreads default affinity from
cpu_all_mask to cpu_possible_mask.

It looks safe to do so as cpu_possible_mask seem to be initialized
at setup_arch() time, way before kthreadd is created.

Suggested-by: Frederic Weisbecker <frederic@kernel.org>
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-2-frederic@kernel.org
---
 kernel/kthread.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/kernel/kthread.c b/kernel/kthread.c
index 8e3d2d7..b86d37c 100644
--- a/kernel/kthread.c
+++ b/kernel/kthread.c
@@ -383,7 +383,7 @@ 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_all_mask);
+		set_cpus_allowed_ptr(task, cpu_possible_mask);
 	}
 	kfree(create);
 	return task;
@@ -608,7 +608,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_all_mask);
+	set_cpus_allowed_ptr(tsk, cpu_possible_mask);
 	set_mems_allowed(node_states[N_MEMORY]);
 
 	current->flags |= PF_NOFREEZE;

^ permalink raw reply related	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2020-06-16 12:23 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-05-27 14:29 [PATCH 0/2] sched/isolation: Isolate unbound kthreads Frederic Weisbecker
2020-05-27 14:29 ` [PATCH 1/2] kthread: Switch to cpu_possible_mask Frederic Weisbecker
2020-06-16 12:21   ` [tip: sched/core] " tip-bot2 for Marcelo Tosatti
2020-05-27 14:29 ` [PATCH 2/2] isolcpus: Affine unbound kernel threads to housekeeping cpus Frederic Weisbecker
2020-06-16 12:21   ` [tip: sched/core] " tip-bot2 for Marcelo Tosatti
2020-06-04 13:16 ` [PATCH 0/2] sched/isolation: Isolate unbound kthreads Peter Zijlstra

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.