linux-kernel.vger.kernel.org archive mirror
 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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).