[PATCH] sched: Make preempt_enable_no_resched() behave like preempt_enable() on PREEMPT_RT

Sebastian Andrzej Siewior posted 1 patch 4 years, 3 months ago
include/linux/preempt.h | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
[PATCH] sched: Make preempt_enable_no_resched() behave like preempt_enable() on PREEMPT_RT
Posted by Sebastian Andrzej Siewior 4 years, 3 months ago
From: Thomas Gleixner <tglx@linutronix.de>

Use the distinction that has been made earlier between
preempt_enable_no_resched() and sched_preempt_enable_no_resched().
sched_preempt_enable_no_resched() is used within the scheduler where an
immediate schedule() follows. preempt_enable_no_resched() is used
outside of the scheduler and an immediate schedule() invocation may not
follow for other reasons.

The lack of an immediate schedule() invocation matters on PREEMPT_RT
where it will introduce latencies while the scheduler expects a context
switch.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
---
 include/linux/preempt.h | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/include/linux/preempt.h b/include/linux/preempt.h
index b4381f255a5ca..582e43856a532 100644
--- a/include/linux/preempt.h
+++ b/include/linux/preempt.h
@@ -210,7 +210,11 @@ do { \
 	preempt_count_dec(); \
 } while (0)
 
-#define preempt_enable_no_resched() sched_preempt_enable_no_resched()
+#ifdef CONFIG_PREEMPT_RT
+# define preempt_enable_no_resched() preempt_enable()
+#else
+# define preempt_enable_no_resched() sched_preempt_enable_no_resched()
+#endif
 
 #define preemptible()	(preempt_count() == 0 && !irqs_disabled())
 
-- 
2.35.1
Re: [PATCH] sched: Make preempt_enable_no_resched() behave like preempt_enable() on PREEMPT_RT
Posted by Peter Zijlstra 4 years, 3 months ago
On Tue, Mar 01, 2022 at 07:30:32PM +0100, Sebastian Andrzej Siewior wrote:
> From: Thomas Gleixner <tglx@linutronix.de>
> 
> Use the distinction that has been made earlier between
> preempt_enable_no_resched() and sched_preempt_enable_no_resched().
> sched_preempt_enable_no_resched() is used within the scheduler where an
> immediate schedule() follows. preempt_enable_no_resched() is used
> outside of the scheduler and an immediate schedule() invocation may not
> follow for other reasons.
> 
> The lack of an immediate schedule() invocation matters on PREEMPT_RT
> where it will introduce latencies while the scheduler expects a context
> switch.
> 
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
> Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
> ---
>  include/linux/preempt.h | 6 +++++-
>  1 file changed, 5 insertions(+), 1 deletion(-)
> 
> diff --git a/include/linux/preempt.h b/include/linux/preempt.h
> index b4381f255a5ca..582e43856a532 100644
> --- a/include/linux/preempt.h
> +++ b/include/linux/preempt.h
> @@ -210,7 +210,11 @@ do { \
>  	preempt_count_dec(); \
>  } while (0)
>  
> -#define preempt_enable_no_resched() sched_preempt_enable_no_resched()
> +#ifdef CONFIG_PREEMPT_RT
> +# define preempt_enable_no_resched() preempt_enable()
> +#else
> +# define preempt_enable_no_resched() sched_preempt_enable_no_resched()
> +#endif

Ignoring !x86 for a moment:

arch/x86/mm/kmmio.c:    preempt_enable_no_resched();
arch/x86/mm/kmmio.c:    preempt_enable_no_resched();
include/linux/preempt.h:#define sched_preempt_enable_no_resched() \
include/linux/preempt.h:#define preempt_enable_no_resched() sched_preempt_enable_no_resched()
include/linux/preempt.h:#define preempt_enable_no_resched_notrace() \
include/linux/preempt.h:#define sched_preempt_enable_no_resched()       barrier()
include/linux/preempt.h:#define preempt_enable_no_resched()             barrier()
include/linux/preempt.h:#define preempt_enable_no_resched_notrace()     barrier()
include/linux/preempt.h:#undef sched_preempt_enable_no_resched
include/linux/preempt.h:#undef preempt_enable_no_resched
include/linux/preempt.h:#undef preempt_enable_no_resched_notrace
kernel/sched/core.c:            preempt_enable_no_resched();
kernel/sched/core.c:                    preempt_enable_no_resched();
kernel/sched/core.c:            sched_preempt_enable_no_resched();
kernel/sched/core.c:    sched_preempt_enable_no_resched();
kernel/sched/core.c:            sched_preempt_enable_no_resched();
kernel/sched/core.c:            preempt_enable_no_resched_notrace();
kernel/sched/core.c:            preempt_enable_no_resched_notrace();
kernel/sched/core.c:            sched_preempt_enable_no_resched();
kernel/sched/core.c:    sched_preempt_enable_no_resched();
kernel/signal.c:                preempt_enable_no_resched();
kernel/smpboot.c:                       preempt_enable_no_resched();
lib/smp_processor_id.c: preempt_enable_no_resched_notrace();


Surely we can audit that... At a glance the proposed patch does more
harm than good. Only the kmmio case looks obviousl fail, but then IIRC
kmmio had worse problems.
Re: [PATCH] sched: Make preempt_enable_no_resched() behave like preempt_enable() on PREEMPT_RT
Posted by Sebastian Andrzej Siewior 4 years, 3 months ago
On 2022-03-01 21:14:32 [+0100], Peter Zijlstra wrote:
> Ignoring !x86 for a moment:
> 
> arch/x86/mm/kmmio.c:    preempt_enable_no_resched();
> arch/x86/mm/kmmio.c:    preempt_enable_no_resched();
> include/linux/preempt.h:#define sched_preempt_enable_no_resched() \
> include/linux/preempt.h:#define preempt_enable_no_resched() sched_preempt_enable_no_resched()
> include/linux/preempt.h:#define preempt_enable_no_resched_notrace() \
> include/linux/preempt.h:#define sched_preempt_enable_no_resched()       barrier()
> include/linux/preempt.h:#define preempt_enable_no_resched()             barrier()
> include/linux/preempt.h:#define preempt_enable_no_resched_notrace()     barrier()
> include/linux/preempt.h:#undef sched_preempt_enable_no_resched
> include/linux/preempt.h:#undef preempt_enable_no_resched
> include/linux/preempt.h:#undef preempt_enable_no_resched_notrace
> kernel/sched/core.c:            preempt_enable_no_resched();
> kernel/sched/core.c:                    preempt_enable_no_resched();
> kernel/sched/core.c:            sched_preempt_enable_no_resched();
> kernel/sched/core.c:    sched_preempt_enable_no_resched();
> kernel/sched/core.c:            sched_preempt_enable_no_resched();
> kernel/sched/core.c:            preempt_enable_no_resched_notrace();
> kernel/sched/core.c:            preempt_enable_no_resched_notrace();
> kernel/sched/core.c:            sched_preempt_enable_no_resched();
> kernel/sched/core.c:    sched_preempt_enable_no_resched();
> kernel/signal.c:                preempt_enable_no_resched();
> kernel/smpboot.c:                       preempt_enable_no_resched();
> lib/smp_processor_id.c: preempt_enable_no_resched_notrace();
> 
> 
> Surely we can audit that... At a glance the proposed patch does more
> harm than good. Only the kmmio case looks obviousl fail, but then IIRC
> kmmio had worse problems.

I was looking at the same before posting it. The majority of it
disappeared over time after certain someone made it worthless for
modules. So I'm dropping it then.
Does it make sense to keep sched_preempt_enable_no_resched() or should I
move everything to preempt_enable_no_resched()?

Sebastian