All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v3 0/4] preempt: PREEMPT vs PREEMPT_DYNAMIC configs fixup
@ 2021-11-12 18:51 Valentin Schneider
  2021-11-12 18:52 ` [PATCH v3 1/4] preempt: Restore preemption model selection configs Valentin Schneider
                   ` (4 more replies)
  0 siblings, 5 replies; 10+ messages in thread
From: Valentin Schneider @ 2021-11-12 18:51 UTC (permalink / raw)
  To: linux-kernel, kasan-dev, linux-kbuild
  Cc: Peter Zijlstra, Ingo Molnar, Frederic Weisbecker, Mike Galbraith,
	Marco Elver, Dmitry Vyukov, Steven Rostedt, Masahiro Yamada,
	Michal Marek, Nick Desaulniers

Hi folks,

This v3 is mostly about the naming problem - get your paintbrushes ready!

Patches
=======

o Patch 1 is the meat of the topic - note that it's now in tip/sched/urgent
o Patch 2 introduces helpers for the dynamic preempt state
o Patches 3-4 make use of said accessors where relevant.

Testing
=======

Briefly tested the dynamic part on an x86 kernel + QEMU.
Compile-tested the kcsan test thingie as a module.

Revisions
=========

v1: http://lore.kernel.org/r/20211105104035.3112162-1-valentin.schneider@arm.com
v1.5: http://lore.kernel.org/r/20211109151057.3489223-1-valentin.schneider@arm.com

v2 -> v3
++++++++

o Turned is_preempt_*() into preempt_model_*() (Frederic)
  It breaks my rule of "booleans must answer a yes/no question" but is the best
  I could come with using a "preempt_" prefix
  
o Added preempt_model_preemptible() (Marco)
  Now used in kcsan_test.c
  
o Dropped powerpc changes

Cheers,
Valentin


Valentin Schneider (4):
  preempt: Restore preemption model selection configs
  preempt/dynamic: Introduce preemption model accessors
  kcsan: Use preemption model accessors
  ftrace: Use preemption model accessors for trace header printout

 include/linux/kernel.h    |  2 +-
 include/linux/sched.h     | 41 ++++++++++++++++++++++++++++++++++++++
 include/linux/vermagic.h  |  2 +-
 init/Makefile             |  2 +-
 kernel/Kconfig.preempt    | 42 +++++++++++++++++++--------------------
 kernel/kcsan/kcsan_test.c |  5 +++--
 kernel/sched/core.c       | 18 ++++++++++++++---
 kernel/trace/trace.c      | 14 ++++---------
 8 files changed, 87 insertions(+), 39 deletions(-)

--
2.25.1


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

* [PATCH v3 1/4] preempt: Restore preemption model selection configs
  2021-11-12 18:51 [PATCH v3 0/4] preempt: PREEMPT vs PREEMPT_DYNAMIC configs fixup Valentin Schneider
@ 2021-11-12 18:52 ` Valentin Schneider
  2021-11-12 18:52 ` [PATCH v3 2/4] preempt/dynamic: Introduce preemption model accessors Valentin Schneider
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 10+ messages in thread
From: Valentin Schneider @ 2021-11-12 18:52 UTC (permalink / raw)
  To: linux-kernel, kasan-dev, linux-kbuild
  Cc: Marco Elver, Peter Zijlstra, Ingo Molnar, Frederic Weisbecker,
	Mike Galbraith, Dmitry Vyukov, Steven Rostedt, Masahiro Yamada,
	Michal Marek, Nick Desaulniers

Commit c597bfddc9e9 ("sched: Provide Kconfig support for default dynamic
preempt mode") changed the selectable config names for the preemption
model. This means a config file must now select

  CONFIG_PREEMPT_BEHAVIOUR=y

rather than

  CONFIG_PREEMPT=y

to get a preemptible kernel. This means all arch config files would need to
be updated - right now they'll all end up with the default
CONFIG_PREEMPT_NONE_BEHAVIOUR.

Rather than touch a good hundred of config files, restore usage of
CONFIG_PREEMPT{_NONE, _VOLUNTARY}. Make them configure:
o The build-time preemption model when !PREEMPT_DYNAMIC
o The default boot-time preemption model when PREEMPT_DYNAMIC

Add siblings of those configs with the _BUILD suffix to unconditionally
designate the build-time preemption model (PREEMPT_DYNAMIC is built with
the "highest" preemption model it supports, aka PREEMPT). Downstream
configs should by now all be depending / selected by CONFIG_PREEMPTION
rather than CONFIG_PREEMPT, so only a few sites need patching up.

Signed-off-by: Valentin Schneider <valentin.schneider@arm.com>
Acked-by: Marco Elver <elver@google.com>
---
 include/linux/kernel.h   |  2 +-
 include/linux/vermagic.h |  2 +-
 init/Makefile            |  2 +-
 kernel/Kconfig.preempt   | 42 ++++++++++++++++++++--------------------
 kernel/sched/core.c      |  6 +++---
 5 files changed, 27 insertions(+), 27 deletions(-)

diff --git a/include/linux/kernel.h b/include/linux/kernel.h
index 2776423a587e..9c7d774ef809 100644
--- a/include/linux/kernel.h
+++ b/include/linux/kernel.h
@@ -88,7 +88,7 @@
 struct completion;
 struct user;
 
-#ifdef CONFIG_PREEMPT_VOLUNTARY
+#ifdef CONFIG_PREEMPT_VOLUNTARY_BUILD
 
 extern int __cond_resched(void);
 # define might_resched() __cond_resched()
diff --git a/include/linux/vermagic.h b/include/linux/vermagic.h
index 1eaaa93c37bf..329d63babaeb 100644
--- a/include/linux/vermagic.h
+++ b/include/linux/vermagic.h
@@ -15,7 +15,7 @@
 #else
 #define MODULE_VERMAGIC_SMP ""
 #endif
-#ifdef CONFIG_PREEMPT
+#ifdef CONFIG_PREEMPT_BUILD
 #define MODULE_VERMAGIC_PREEMPT "preempt "
 #elif defined(CONFIG_PREEMPT_RT)
 #define MODULE_VERMAGIC_PREEMPT "preempt_rt "
diff --git a/init/Makefile b/init/Makefile
index 2846113677ee..04eeee12c076 100644
--- a/init/Makefile
+++ b/init/Makefile
@@ -30,7 +30,7 @@ $(obj)/version.o: include/generated/compile.h
 quiet_cmd_compile.h = CHK     $@
       cmd_compile.h = \
 	$(CONFIG_SHELL) $(srctree)/scripts/mkcompile_h $@	\
-	"$(UTS_MACHINE)" "$(CONFIG_SMP)" "$(CONFIG_PREEMPT)"	\
+	"$(UTS_MACHINE)" "$(CONFIG_SMP)" "$(CONFIG_PREEMPT_BUILD)"	\
 	"$(CONFIG_PREEMPT_RT)" $(CONFIG_CC_VERSION_TEXT) "$(LD)"
 
 include/generated/compile.h: FORCE
diff --git a/kernel/Kconfig.preempt b/kernel/Kconfig.preempt
index 60f1bfc3c7b2..ce77f0265660 100644
--- a/kernel/Kconfig.preempt
+++ b/kernel/Kconfig.preempt
@@ -1,12 +1,23 @@
 # SPDX-License-Identifier: GPL-2.0-only
 
+config PREEMPT_NONE_BUILD
+	bool
+
+config PREEMPT_VOLUNTARY_BUILD
+	bool
+
+config PREEMPT_BUILD
+	bool
+	select PREEMPTION
+	select UNINLINE_SPIN_UNLOCK if !ARCH_INLINE_SPIN_UNLOCK
+
 choice
 	prompt "Preemption Model"
-	default PREEMPT_NONE_BEHAVIOUR
+	default PREEMPT_NONE
 
-config PREEMPT_NONE_BEHAVIOUR
+config PREEMPT_NONE
 	bool "No Forced Preemption (Server)"
-	select PREEMPT_NONE if !PREEMPT_DYNAMIC
+	select PREEMPT_NONE_BUILD if !PREEMPT_DYNAMIC
 	help
 	  This is the traditional Linux preemption model, geared towards
 	  throughput. It will still provide good latencies most of the
@@ -18,10 +29,10 @@ config PREEMPT_NONE_BEHAVIOUR
 	  raw processing power of the kernel, irrespective of scheduling
 	  latencies.
 
-config PREEMPT_VOLUNTARY_BEHAVIOUR
+config PREEMPT_VOLUNTARY
 	bool "Voluntary Kernel Preemption (Desktop)"
 	depends on !ARCH_NO_PREEMPT
-	select PREEMPT_VOLUNTARY if !PREEMPT_DYNAMIC
+	select PREEMPT_VOLUNTARY_BUILD if !PREEMPT_DYNAMIC
 	help
 	  This option reduces the latency of the kernel by adding more
 	  "explicit preemption points" to the kernel code. These new
@@ -37,10 +48,10 @@ config PREEMPT_VOLUNTARY_BEHAVIOUR
 
 	  Select this if you are building a kernel for a desktop system.
 
-config PREEMPT_BEHAVIOUR
+config PREEMPT
 	bool "Preemptible Kernel (Low-Latency Desktop)"
 	depends on !ARCH_NO_PREEMPT
-	select PREEMPT
+	select PREEMPT_BUILD
 	help
 	  This option reduces the latency of the kernel by making
 	  all kernel code (that is not executing in a critical section)
@@ -58,7 +69,7 @@ config PREEMPT_BEHAVIOUR
 
 config PREEMPT_RT
 	bool "Fully Preemptible Kernel (Real-Time)"
-	depends on EXPERT && ARCH_SUPPORTS_RT && !PREEMPT_DYNAMIC
+	depends on EXPERT && ARCH_SUPPORTS_RT
 	select PREEMPTION
 	help
 	  This option turns the kernel into a real-time kernel by replacing
@@ -75,17 +86,6 @@ config PREEMPT_RT
 
 endchoice
 
-config PREEMPT_NONE
-	bool
-
-config PREEMPT_VOLUNTARY
-	bool
-
-config PREEMPT
-	bool
-	select PREEMPTION
-	select UNINLINE_SPIN_UNLOCK if !ARCH_INLINE_SPIN_UNLOCK
-
 config PREEMPT_COUNT
        bool
 
@@ -95,8 +95,8 @@ config PREEMPTION
 
 config PREEMPT_DYNAMIC
 	bool "Preemption behaviour defined on boot"
-	depends on HAVE_PREEMPT_DYNAMIC
-	select PREEMPT
+	depends on HAVE_PREEMPT_DYNAMIC && !PREEMPT_RT
+	select PREEMPT_BUILD
 	default y
 	help
 	  This option allows to define the preemption model on the kernel
diff --git a/kernel/sched/core.c b/kernel/sched/core.c
index f2611b9cf503..97047aa7b6c2 100644
--- a/kernel/sched/core.c
+++ b/kernel/sched/core.c
@@ -6625,13 +6625,13 @@ __setup("preempt=", setup_preempt_mode);
 static void __init preempt_dynamic_init(void)
 {
 	if (preempt_dynamic_mode == preempt_dynamic_undefined) {
-		if (IS_ENABLED(CONFIG_PREEMPT_NONE_BEHAVIOUR)) {
+		if (IS_ENABLED(CONFIG_PREEMPT_NONE)) {
 			sched_dynamic_update(preempt_dynamic_none);
-		} else if (IS_ENABLED(CONFIG_PREEMPT_VOLUNTARY_BEHAVIOUR)) {
+		} else if (IS_ENABLED(CONFIG_PREEMPT_VOLUNTARY)) {
 			sched_dynamic_update(preempt_dynamic_voluntary);
 		} else {
 			/* Default static call setting, nothing to do */
-			WARN_ON_ONCE(!IS_ENABLED(CONFIG_PREEMPT_BEHAVIOUR));
+			WARN_ON_ONCE(!IS_ENABLED(CONFIG_PREEMPT));
 			preempt_dynamic_mode = preempt_dynamic_full;
 			pr_info("Dynamic Preempt: full\n");
 		}
-- 
2.25.1


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

* [PATCH v3 2/4] preempt/dynamic: Introduce preemption model accessors
  2021-11-12 18:51 [PATCH v3 0/4] preempt: PREEMPT vs PREEMPT_DYNAMIC configs fixup Valentin Schneider
  2021-11-12 18:52 ` [PATCH v3 1/4] preempt: Restore preemption model selection configs Valentin Schneider
@ 2021-11-12 18:52 ` Valentin Schneider
  2021-11-15  7:00   ` Marco Elver
  2022-04-05  8:29   ` [tip: sched/core] " tip-bot2 for Valentin Schneider
  2021-11-12 18:52 ` [PATCH v3 3/4] kcsan: Use " Valentin Schneider
                   ` (2 subsequent siblings)
  4 siblings, 2 replies; 10+ messages in thread
From: Valentin Schneider @ 2021-11-12 18:52 UTC (permalink / raw)
  To: linux-kernel, kasan-dev, linux-kbuild
  Cc: Marco Elver, Peter Zijlstra, Ingo Molnar, Frederic Weisbecker,
	Mike Galbraith, Dmitry Vyukov, Steven Rostedt, Masahiro Yamada,
	Michal Marek, Nick Desaulniers

CONFIG_PREEMPT{_NONE, _VOLUNTARY} designate either:
o The build-time preemption model when !PREEMPT_DYNAMIC
o The default boot-time preemption model when PREEMPT_DYNAMIC

IOW, using those on PREEMPT_DYNAMIC kernels is meaningless - the actual
model could have been set to something else by the "preempt=foo" cmdline
parameter. Same problem applies to CONFIG_PREEMPTION.

Introduce a set of helpers to determine the actual preemption model used by
the live kernel.

Suggested-by: Marco Elver <elver@google.com>
Signed-off-by: Valentin Schneider <valentin.schneider@arm.com>
---
 include/linux/sched.h | 41 +++++++++++++++++++++++++++++++++++++++++
 kernel/sched/core.c   | 12 ++++++++++++
 2 files changed, 53 insertions(+)

diff --git a/include/linux/sched.h b/include/linux/sched.h
index 5f8db54226af..e8e884ee6e8b 100644
--- a/include/linux/sched.h
+++ b/include/linux/sched.h
@@ -2073,6 +2073,47 @@ static inline void cond_resched_rcu(void)
 #endif
 }
 
+#ifdef CONFIG_PREEMPT_DYNAMIC
+
+extern bool preempt_model_none(void);
+extern bool preempt_model_voluntary(void);
+extern bool preempt_model_full(void);
+
+#else
+
+static inline bool preempt_model_none(void)
+{
+	return IS_ENABLED(CONFIG_PREEMPT_NONE);
+}
+static inline bool preempt_model_voluntary(void)
+{
+	return IS_ENABLED(CONFIG_PREEMPT_VOLUNTARY);
+}
+static inline bool preempt_model_full(void)
+{
+	return IS_ENABLED(CONFIG_PREEMPT);
+}
+
+#endif
+
+static inline bool preempt_model_rt(void)
+{
+	return IS_ENABLED(CONFIG_PREEMPT_RT);
+}
+
+/*
+ * Does the preemption model allow non-cooperative preemption?
+ *
+ * For !CONFIG_PREEMPT_DYNAMIC kernels this is an exact match with
+ * CONFIG_PREEMPTION; for CONFIG_PREEMPT_DYNAMIC this doesn't work as the
+ * kernel is *built* with CONFIG_PREEMPTION=y but may run with e.g. the
+ * PREEMPT_NONE model.
+ */
+static inline bool preempt_model_preemptible(void)
+{
+	return preempt_model_full() || preempt_model_rt();
+}
+
 /*
  * Does a critical section need to be broken due to another
  * task waiting?: (technically does not depend on CONFIG_PREEMPTION,
diff --git a/kernel/sched/core.c b/kernel/sched/core.c
index 97047aa7b6c2..e2502b8643b4 100644
--- a/kernel/sched/core.c
+++ b/kernel/sched/core.c
@@ -6638,6 +6638,18 @@ static void __init preempt_dynamic_init(void)
 	}
 }
 
+#define PREEMPT_MODEL_ACCESSOR(mode) \
+	bool preempt_model_##mode(void)						 \
+	{									 \
+		WARN_ON_ONCE(preempt_dynamic_mode == preempt_dynamic_undefined); \
+		return preempt_dynamic_mode == preempt_dynamic_##mode;		 \
+	}									 \
+	EXPORT_SYMBOL_GPL(preempt_model_##mode)
+
+PREEMPT_MODEL_ACCESSOR(none);
+PREEMPT_MODEL_ACCESSOR(voluntary);
+PREEMPT_MODEL_ACCESSOR(full);
+
 #else /* !CONFIG_PREEMPT_DYNAMIC */
 
 static inline void preempt_dynamic_init(void) { }
-- 
2.25.1


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

* [PATCH v3 3/4] kcsan: Use preemption model accessors
  2021-11-12 18:51 [PATCH v3 0/4] preempt: PREEMPT vs PREEMPT_DYNAMIC configs fixup Valentin Schneider
  2021-11-12 18:52 ` [PATCH v3 1/4] preempt: Restore preemption model selection configs Valentin Schneider
  2021-11-12 18:52 ` [PATCH v3 2/4] preempt/dynamic: Introduce preemption model accessors Valentin Schneider
@ 2021-11-12 18:52 ` Valentin Schneider
  2022-04-05  8:29   ` [tip: sched/core] " tip-bot2 for Valentin Schneider
  2021-11-12 18:52 ` [PATCH v3 4/4] ftrace: Use preemption model accessors for trace header printout Valentin Schneider
  2022-03-14 22:42 ` [PATCH v3 0/4] preempt: PREEMPT vs PREEMPT_DYNAMIC configs fixup Frederic Weisbecker
  4 siblings, 1 reply; 10+ messages in thread
From: Valentin Schneider @ 2021-11-12 18:52 UTC (permalink / raw)
  To: linux-kernel, kasan-dev, linux-kbuild
  Cc: Marco Elver, Peter Zijlstra, Ingo Molnar, Frederic Weisbecker,
	Mike Galbraith, Dmitry Vyukov, Steven Rostedt, Masahiro Yamada,
	Michal Marek, Nick Desaulniers

Per PREEMPT_DYNAMIC, checking CONFIG_PREEMPT doesn't tell you the actual
preemption model of the live kernel. Use the newly-introduced accessors
instead.

Signed-off-by: Valentin Schneider <valentin.schneider@arm.com>
Reviewed-by: Marco Elver <elver@google.com>
---
 kernel/kcsan/kcsan_test.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/kernel/kcsan/kcsan_test.c b/kernel/kcsan/kcsan_test.c
index dc55fd5a36fc..97cf1efce36a 100644
--- a/kernel/kcsan/kcsan_test.c
+++ b/kernel/kcsan/kcsan_test.c
@@ -1005,13 +1005,14 @@ static const void *nthreads_gen_params(const void *prev, char *desc)
 	else
 		nthreads *= 2;
 
-	if (!IS_ENABLED(CONFIG_PREEMPT) || !IS_ENABLED(CONFIG_KCSAN_INTERRUPT_WATCHER)) {
+	if (!preempt_model_preemptible() ||
+	    !IS_ENABLED(CONFIG_KCSAN_INTERRUPT_WATCHER)) {
 		/*
 		 * Without any preemption, keep 2 CPUs free for other tasks, one
 		 * of which is the main test case function checking for
 		 * completion or failure.
 		 */
-		const long min_unused_cpus = IS_ENABLED(CONFIG_PREEMPT_NONE) ? 2 : 0;
+		const long min_unused_cpus = preempt_model_none() ? 2 : 0;
 		const long min_required_cpus = 2 + min_unused_cpus;
 
 		if (num_online_cpus() < min_required_cpus) {
-- 
2.25.1


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

* [PATCH v3 4/4] ftrace: Use preemption model accessors for trace header printout
  2021-11-12 18:51 [PATCH v3 0/4] preempt: PREEMPT vs PREEMPT_DYNAMIC configs fixup Valentin Schneider
                   ` (2 preceding siblings ...)
  2021-11-12 18:52 ` [PATCH v3 3/4] kcsan: Use " Valentin Schneider
@ 2021-11-12 18:52 ` Valentin Schneider
  2022-04-05  8:29   ` [tip: sched/core] " tip-bot2 for Valentin Schneider
  2022-03-14 22:42 ` [PATCH v3 0/4] preempt: PREEMPT vs PREEMPT_DYNAMIC configs fixup Frederic Weisbecker
  4 siblings, 1 reply; 10+ messages in thread
From: Valentin Schneider @ 2021-11-12 18:52 UTC (permalink / raw)
  To: linux-kernel, kasan-dev, linux-kbuild
  Cc: Steven Rostedt, Peter Zijlstra, Ingo Molnar, Frederic Weisbecker,
	Mike Galbraith, Marco Elver, Dmitry Vyukov, Masahiro Yamada,
	Michal Marek, Nick Desaulniers

Per PREEMPT_DYNAMIC, checking CONFIG_PREEMPT doesn't tell you the actual
preemption model of the live kernel. Use the newly-introduced accessors
instead.

Signed-off-by: Valentin Schneider <valentin.schneider@arm.com>
Reviewed-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
---
 kernel/trace/trace.c | 14 ++++----------
 1 file changed, 4 insertions(+), 10 deletions(-)

diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c
index 7896d30d90f7..749f66f96cee 100644
--- a/kernel/trace/trace.c
+++ b/kernel/trace/trace.c
@@ -4271,17 +4271,11 @@ print_trace_header(struct seq_file *m, struct trace_iterator *iter)
 		   entries,
 		   total,
 		   buf->cpu,
-#if defined(CONFIG_PREEMPT_NONE)
-		   "server",
-#elif defined(CONFIG_PREEMPT_VOLUNTARY)
-		   "desktop",
-#elif defined(CONFIG_PREEMPT)
-		   "preempt",
-#elif defined(CONFIG_PREEMPT_RT)
-		   "preempt_rt",
-#else
+		   preempt_model_none()      ? "server" :
+		   preempt_model_voluntary() ? "desktop" :
+		   preempt_model_full()      ? "preempt" :
+		   preempt_model_rt()        ? "preempt_rt" :
 		   "unknown",
-#endif
 		   /* These are reserved for later use */
 		   0, 0, 0, 0);
 #ifdef CONFIG_SMP
-- 
2.25.1


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

* Re: [PATCH v3 2/4] preempt/dynamic: Introduce preemption model accessors
  2021-11-12 18:52 ` [PATCH v3 2/4] preempt/dynamic: Introduce preemption model accessors Valentin Schneider
@ 2021-11-15  7:00   ` Marco Elver
  2022-04-05  8:29   ` [tip: sched/core] " tip-bot2 for Valentin Schneider
  1 sibling, 0 replies; 10+ messages in thread
From: Marco Elver @ 2021-11-15  7:00 UTC (permalink / raw)
  To: Valentin Schneider
  Cc: linux-kernel, kasan-dev, linux-kbuild, Peter Zijlstra,
	Ingo Molnar, Frederic Weisbecker, Mike Galbraith, Dmitry Vyukov,
	Steven Rostedt, Masahiro Yamada, Michal Marek, Nick Desaulniers

On Fri, 12 Nov 2021 at 19:52, Valentin Schneider
<valentin.schneider@arm.com> wrote:
>
> CONFIG_PREEMPT{_NONE, _VOLUNTARY} designate either:
> o The build-time preemption model when !PREEMPT_DYNAMIC
> o The default boot-time preemption model when PREEMPT_DYNAMIC
>
> IOW, using those on PREEMPT_DYNAMIC kernels is meaningless - the actual
> model could have been set to something else by the "preempt=foo" cmdline
> parameter. Same problem applies to CONFIG_PREEMPTION.
>
> Introduce a set of helpers to determine the actual preemption model used by
> the live kernel.
>
> Suggested-by: Marco Elver <elver@google.com>
> Signed-off-by: Valentin Schneider <valentin.schneider@arm.com>

Looks sane.

Reviewed-by: Marco Elver <elver@google.com>

> ---
>  include/linux/sched.h | 41 +++++++++++++++++++++++++++++++++++++++++
>  kernel/sched/core.c   | 12 ++++++++++++
>  2 files changed, 53 insertions(+)
>
> diff --git a/include/linux/sched.h b/include/linux/sched.h
> index 5f8db54226af..e8e884ee6e8b 100644
> --- a/include/linux/sched.h
> +++ b/include/linux/sched.h
> @@ -2073,6 +2073,47 @@ static inline void cond_resched_rcu(void)
>  #endif
>  }
>
> +#ifdef CONFIG_PREEMPT_DYNAMIC
> +
> +extern bool preempt_model_none(void);
> +extern bool preempt_model_voluntary(void);
> +extern bool preempt_model_full(void);
> +
> +#else
> +
> +static inline bool preempt_model_none(void)
> +{
> +       return IS_ENABLED(CONFIG_PREEMPT_NONE);
> +}
> +static inline bool preempt_model_voluntary(void)
> +{
> +       return IS_ENABLED(CONFIG_PREEMPT_VOLUNTARY);
> +}
> +static inline bool preempt_model_full(void)
> +{
> +       return IS_ENABLED(CONFIG_PREEMPT);
> +}
> +
> +#endif
> +
> +static inline bool preempt_model_rt(void)
> +{
> +       return IS_ENABLED(CONFIG_PREEMPT_RT);
> +}
> +
> +/*
> + * Does the preemption model allow non-cooperative preemption?
> + *
> + * For !CONFIG_PREEMPT_DYNAMIC kernels this is an exact match with
> + * CONFIG_PREEMPTION; for CONFIG_PREEMPT_DYNAMIC this doesn't work as the
> + * kernel is *built* with CONFIG_PREEMPTION=y but may run with e.g. the
> + * PREEMPT_NONE model.
> + */
> +static inline bool preempt_model_preemptible(void)
> +{
> +       return preempt_model_full() || preempt_model_rt();
> +}
> +
>  /*
>   * Does a critical section need to be broken due to another
>   * task waiting?: (technically does not depend on CONFIG_PREEMPTION,
> diff --git a/kernel/sched/core.c b/kernel/sched/core.c
> index 97047aa7b6c2..e2502b8643b4 100644
> --- a/kernel/sched/core.c
> +++ b/kernel/sched/core.c
> @@ -6638,6 +6638,18 @@ static void __init preempt_dynamic_init(void)
>         }
>  }
>
> +#define PREEMPT_MODEL_ACCESSOR(mode) \
> +       bool preempt_model_##mode(void)                                          \
> +       {                                                                        \
> +               WARN_ON_ONCE(preempt_dynamic_mode == preempt_dynamic_undefined); \
> +               return preempt_dynamic_mode == preempt_dynamic_##mode;           \
> +       }                                                                        \
> +       EXPORT_SYMBOL_GPL(preempt_model_##mode)
> +
> +PREEMPT_MODEL_ACCESSOR(none);
> +PREEMPT_MODEL_ACCESSOR(voluntary);
> +PREEMPT_MODEL_ACCESSOR(full);
> +
>  #else /* !CONFIG_PREEMPT_DYNAMIC */
>
>  static inline void preempt_dynamic_init(void) { }
> --
> 2.25.1
>

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

* Re: [PATCH v3 0/4] preempt: PREEMPT vs PREEMPT_DYNAMIC configs fixup
  2021-11-12 18:51 [PATCH v3 0/4] preempt: PREEMPT vs PREEMPT_DYNAMIC configs fixup Valentin Schneider
                   ` (3 preceding siblings ...)
  2021-11-12 18:52 ` [PATCH v3 4/4] ftrace: Use preemption model accessors for trace header printout Valentin Schneider
@ 2022-03-14 22:42 ` Frederic Weisbecker
  4 siblings, 0 replies; 10+ messages in thread
From: Frederic Weisbecker @ 2022-03-14 22:42 UTC (permalink / raw)
  To: Valentin Schneider
  Cc: linux-kernel, kasan-dev, linux-kbuild, Peter Zijlstra,
	Ingo Molnar, Mike Galbraith, Marco Elver, Dmitry Vyukov,
	Steven Rostedt, Masahiro Yamada, Michal Marek, Nick Desaulniers

On Fri, Nov 12, 2021 at 06:51:59PM +0000, Valentin Schneider wrote:
> Hi folks,
> 
> This v3 is mostly about the naming problem - get your paintbrushes ready!
> 
> Patches
> =======
> 
> o Patch 1 is the meat of the topic - note that it's now in tip/sched/urgent
> o Patch 2 introduces helpers for the dynamic preempt state
> o Patches 3-4 make use of said accessors where relevant.
> 
> Testing
> =======
> 
> Briefly tested the dynamic part on an x86 kernel + QEMU.
> Compile-tested the kcsan test thingie as a module.
> 
> Revisions
> =========
> 
> v1: http://lore.kernel.org/r/20211105104035.3112162-1-valentin.schneider@arm.com
> v1.5: http://lore.kernel.org/r/20211109151057.3489223-1-valentin.schneider@arm.com
> 
> v2 -> v3
> ++++++++
> 
> o Turned is_preempt_*() into preempt_model_*() (Frederic)
>   It breaks my rule of "booleans must answer a yes/no question" but is the best
>   I could come with using a "preempt_" prefix
>   
> o Added preempt_model_preemptible() (Marco)
>   Now used in kcsan_test.c
>   
> o Dropped powerpc changes
> 
> Cheers,
> Valentin
> 
> 
> Valentin Schneider (4):
>   preempt: Restore preemption model selection configs

Seems like this one has been applied from the previous series.

>   preempt/dynamic: Introduce preemption model accessors
>   kcsan: Use preemption model accessors
>   ftrace: Use preemption model accessors for trace header printout

So for the rest:

Acked-by: Frederic Weisbecker <frederic@kernel.org>

Thanks!

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

* [tip: sched/core] ftrace: Use preemption model accessors for trace header printout
  2021-11-12 18:52 ` [PATCH v3 4/4] ftrace: Use preemption model accessors for trace header printout Valentin Schneider
@ 2022-04-05  8:29   ` tip-bot2 for Valentin Schneider
  0 siblings, 0 replies; 10+ messages in thread
From: tip-bot2 for Valentin Schneider @ 2022-04-05  8:29 UTC (permalink / raw)
  To: linux-tip-commits
  Cc: Valentin Schneider, Peter Zijlstra (Intel),
	Steven Rostedt (VMware),
	Frederic Weisbecker, x86, linux-kernel

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

Commit-ID:     089c02ae2771a14af2928c59c56abfb9b885a8d7
Gitweb:        https://git.kernel.org/tip/089c02ae2771a14af2928c59c56abfb9b885a8d7
Author:        Valentin Schneider <valentin.schneider@arm.com>
AuthorDate:    Fri, 12 Nov 2021 18:52:03 
Committer:     Peter Zijlstra <peterz@infradead.org>
CommitterDate: Tue, 05 Apr 2022 10:24:42 +02:00

ftrace: Use preemption model accessors for trace header printout

Per PREEMPT_DYNAMIC, checking CONFIG_PREEMPT doesn't tell you the actual
preemption model of the live kernel. Use the newly-introduced accessors
instead.

Signed-off-by: Valentin Schneider <valentin.schneider@arm.com>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Reviewed-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
Acked-by: Frederic Weisbecker <frederic@kernel.org>
Link: https://lore.kernel.org/r/20211112185203.280040-5-valentin.schneider@arm.com
---
 kernel/trace/trace.c | 14 ++++----------
 1 file changed, 4 insertions(+), 10 deletions(-)

diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c
index f4de111..124f189 100644
--- a/kernel/trace/trace.c
+++ b/kernel/trace/trace.c
@@ -4289,17 +4289,11 @@ print_trace_header(struct seq_file *m, struct trace_iterator *iter)
 		   entries,
 		   total,
 		   buf->cpu,
-#if defined(CONFIG_PREEMPT_NONE)
-		   "server",
-#elif defined(CONFIG_PREEMPT_VOLUNTARY)
-		   "desktop",
-#elif defined(CONFIG_PREEMPT)
-		   "preempt",
-#elif defined(CONFIG_PREEMPT_RT)
-		   "preempt_rt",
-#else
+		   preempt_model_none()      ? "server" :
+		   preempt_model_voluntary() ? "desktop" :
+		   preempt_model_full()      ? "preempt" :
+		   preempt_model_rt()        ? "preempt_rt" :
 		   "unknown",
-#endif
 		   /* These are reserved for later use */
 		   0, 0, 0, 0);
 #ifdef CONFIG_SMP

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

* [tip: sched/core] kcsan: Use preemption model accessors
  2021-11-12 18:52 ` [PATCH v3 3/4] kcsan: Use " Valentin Schneider
@ 2022-04-05  8:29   ` tip-bot2 for Valentin Schneider
  0 siblings, 0 replies; 10+ messages in thread
From: tip-bot2 for Valentin Schneider @ 2022-04-05  8:29 UTC (permalink / raw)
  To: linux-tip-commits
  Cc: Valentin Schneider, Peter Zijlstra (Intel),
	Marco Elver, Frederic Weisbecker, x86, linux-kernel

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

Commit-ID:     5693fa74f98afed5421ac0165e9e9291bde7d9e1
Gitweb:        https://git.kernel.org/tip/5693fa74f98afed5421ac0165e9e9291bde7d9e1
Author:        Valentin Schneider <valentin.schneider@arm.com>
AuthorDate:    Fri, 12 Nov 2021 18:52:02 
Committer:     Peter Zijlstra <peterz@infradead.org>
CommitterDate: Tue, 05 Apr 2022 10:24:42 +02:00

kcsan: Use preemption model accessors

Per PREEMPT_DYNAMIC, checking CONFIG_PREEMPT doesn't tell you the actual
preemption model of the live kernel. Use the newly-introduced accessors
instead.

Signed-off-by: Valentin Schneider <valentin.schneider@arm.com>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Reviewed-by: Marco Elver <elver@google.com>
Acked-by: Frederic Weisbecker <frederic@kernel.org>
Link: https://lore.kernel.org/r/20211112185203.280040-4-valentin.schneider@arm.com
---
 kernel/kcsan/kcsan_test.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/kernel/kcsan/kcsan_test.c b/kernel/kcsan/kcsan_test.c
index a36fca0..767dfac 100644
--- a/kernel/kcsan/kcsan_test.c
+++ b/kernel/kcsan/kcsan_test.c
@@ -1380,13 +1380,14 @@ static const void *nthreads_gen_params(const void *prev, char *desc)
 	else
 		nthreads *= 2;
 
-	if (!IS_ENABLED(CONFIG_PREEMPT) || !IS_ENABLED(CONFIG_KCSAN_INTERRUPT_WATCHER)) {
+	if (!preempt_model_preemptible() ||
+	    !IS_ENABLED(CONFIG_KCSAN_INTERRUPT_WATCHER)) {
 		/*
 		 * Without any preemption, keep 2 CPUs free for other tasks, one
 		 * of which is the main test case function checking for
 		 * completion or failure.
 		 */
-		const long min_unused_cpus = IS_ENABLED(CONFIG_PREEMPT_NONE) ? 2 : 0;
+		const long min_unused_cpus = preempt_model_none() ? 2 : 0;
 		const long min_required_cpus = 2 + min_unused_cpus;
 
 		if (num_online_cpus() < min_required_cpus) {

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

* [tip: sched/core] preempt/dynamic: Introduce preemption model accessors
  2021-11-12 18:52 ` [PATCH v3 2/4] preempt/dynamic: Introduce preemption model accessors Valentin Schneider
  2021-11-15  7:00   ` Marco Elver
@ 2022-04-05  8:29   ` tip-bot2 for Valentin Schneider
  1 sibling, 0 replies; 10+ messages in thread
From: tip-bot2 for Valentin Schneider @ 2022-04-05  8:29 UTC (permalink / raw)
  To: linux-tip-commits
  Cc: Marco Elver, Valentin Schneider, Peter Zijlstra (Intel),
	Frederic Weisbecker, x86, linux-kernel

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

Commit-ID:     cfe43f478b79ba45573ca22d52d0d8823be068fa
Gitweb:        https://git.kernel.org/tip/cfe43f478b79ba45573ca22d52d0d8823be068fa
Author:        Valentin Schneider <valentin.schneider@arm.com>
AuthorDate:    Fri, 12 Nov 2021 18:52:01 
Committer:     Peter Zijlstra <peterz@infradead.org>
CommitterDate: Tue, 05 Apr 2022 10:24:42 +02:00

preempt/dynamic: Introduce preemption model accessors

CONFIG_PREEMPT{_NONE, _VOLUNTARY} designate either:
o The build-time preemption model when !PREEMPT_DYNAMIC
o The default boot-time preemption model when PREEMPT_DYNAMIC

IOW, using those on PREEMPT_DYNAMIC kernels is meaningless - the actual
model could have been set to something else by the "preempt=foo" cmdline
parameter. Same problem applies to CONFIG_PREEMPTION.

Introduce a set of helpers to determine the actual preemption model used by
the live kernel.

Suggested-by: Marco Elver <elver@google.com>
Signed-off-by: Valentin Schneider <valentin.schneider@arm.com>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Reviewed-by: Marco Elver <elver@google.com>
Acked-by: Frederic Weisbecker <frederic@kernel.org>
Link: https://lore.kernel.org/r/20211112185203.280040-3-valentin.schneider@arm.com
---
 include/linux/sched.h | 41 +++++++++++++++++++++++++++++++++++++++++
 kernel/sched/core.c   | 12 ++++++++++++
 2 files changed, 53 insertions(+)

diff --git a/include/linux/sched.h b/include/linux/sched.h
index d5e3c00..67f06f7 100644
--- a/include/linux/sched.h
+++ b/include/linux/sched.h
@@ -2117,6 +2117,47 @@ static inline void cond_resched_rcu(void)
 #endif
 }
 
+#ifdef CONFIG_PREEMPT_DYNAMIC
+
+extern bool preempt_model_none(void);
+extern bool preempt_model_voluntary(void);
+extern bool preempt_model_full(void);
+
+#else
+
+static inline bool preempt_model_none(void)
+{
+	return IS_ENABLED(CONFIG_PREEMPT_NONE);
+}
+static inline bool preempt_model_voluntary(void)
+{
+	return IS_ENABLED(CONFIG_PREEMPT_VOLUNTARY);
+}
+static inline bool preempt_model_full(void)
+{
+	return IS_ENABLED(CONFIG_PREEMPT);
+}
+
+#endif
+
+static inline bool preempt_model_rt(void)
+{
+	return IS_ENABLED(CONFIG_PREEMPT_RT);
+}
+
+/*
+ * Does the preemption model allow non-cooperative preemption?
+ *
+ * For !CONFIG_PREEMPT_DYNAMIC kernels this is an exact match with
+ * CONFIG_PREEMPTION; for CONFIG_PREEMPT_DYNAMIC this doesn't work as the
+ * kernel is *built* with CONFIG_PREEMPTION=y but may run with e.g. the
+ * PREEMPT_NONE model.
+ */
+static inline bool preempt_model_preemptible(void)
+{
+	return preempt_model_full() || preempt_model_rt();
+}
+
 /*
  * Does a critical section need to be broken due to another
  * task waiting?: (technically does not depend on CONFIG_PREEMPTION,
diff --git a/kernel/sched/core.c b/kernel/sched/core.c
index d575b49..068c088 100644
--- a/kernel/sched/core.c
+++ b/kernel/sched/core.c
@@ -8409,6 +8409,18 @@ static void __init preempt_dynamic_init(void)
 	}
 }
 
+#define PREEMPT_MODEL_ACCESSOR(mode) \
+	bool preempt_model_##mode(void)						 \
+	{									 \
+		WARN_ON_ONCE(preempt_dynamic_mode == preempt_dynamic_undefined); \
+		return preempt_dynamic_mode == preempt_dynamic_##mode;		 \
+	}									 \
+	EXPORT_SYMBOL_GPL(preempt_model_##mode)
+
+PREEMPT_MODEL_ACCESSOR(none);
+PREEMPT_MODEL_ACCESSOR(voluntary);
+PREEMPT_MODEL_ACCESSOR(full);
+
 #else /* !CONFIG_PREEMPT_DYNAMIC */
 
 static inline void preempt_dynamic_init(void) { }

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

end of thread, other threads:[~2022-04-05 10:50 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-11-12 18:51 [PATCH v3 0/4] preempt: PREEMPT vs PREEMPT_DYNAMIC configs fixup Valentin Schneider
2021-11-12 18:52 ` [PATCH v3 1/4] preempt: Restore preemption model selection configs Valentin Schneider
2021-11-12 18:52 ` [PATCH v3 2/4] preempt/dynamic: Introduce preemption model accessors Valentin Schneider
2021-11-15  7:00   ` Marco Elver
2022-04-05  8:29   ` [tip: sched/core] " tip-bot2 for Valentin Schneider
2021-11-12 18:52 ` [PATCH v3 3/4] kcsan: Use " Valentin Schneider
2022-04-05  8:29   ` [tip: sched/core] " tip-bot2 for Valentin Schneider
2021-11-12 18:52 ` [PATCH v3 4/4] ftrace: Use preemption model accessors for trace header printout Valentin Schneider
2022-04-05  8:29   ` [tip: sched/core] " tip-bot2 for Valentin Schneider
2022-03-14 22:42 ` [PATCH v3 0/4] preempt: PREEMPT vs PREEMPT_DYNAMIC configs fixup Frederic Weisbecker

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.