Patch "x86/entry/traps: Don't force in_interrupt() to return true in IST handlers" has been added to the 4.4-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
x86/entry/traps: Don't force in_interrupt() to return true in IST handlers
to the 4.4-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
x86-entry-traps-don-t-force-in_interrupt-to-return-true-in-ist-handlers.patch
and it can be found in the queue-4.4 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
aaee8c3c5cce2d9107310dd9f3026b4f901d441cMon Sep 17 00:00:00 2001
From: Andy Lutomirski <[email protected]>
Date: Tue, 24 May 2016 15:54:04 -0700
Subject: x86/entry/traps: Don't force in_interrupt() to return true in IST handlers
From: Andy Lutomirski <[email protected]>
commit aaee8c3c5cce2d9107310dd9f3026b4f901d441c upstream.
Forcing in_interrupt() to return true if we're not in a bona fide interrupt confuses the softirq code. This fixes warnings like:
NOHZ: local_softirq_pending 282
... which can happen when running things like selftests/x86.
This will change perf's static percpu buffer usage in IST context. I think this is okay, and it's changing the behavior to match historical (pre-4.0) behavior.
--- arch/x86/kernel/traps.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-)
arch/x86/kernel/traps.c +10 -10
@@ -109,6 +109,12 @@ static inline void preempt_conditional_cpreempt_count_dec (); } +/* +* In IST context, we explicitly disable preemption. This serves two +* purposes: it makes it much less likely that we would accidentally +* schedule in IST context and it will force a warning if we somehow +* manage to schedule by accident. +*/ void ist_enter (struct pt_regs *regs) {if (user_mode (regs)) {
@@ -123,13 +129,7 @@ void ist_enter(struct pt_regs *regs)rcu_nmi_enter (); } -/* -* We are atomic because we're on the IST stack; or we're on -* x86_32, in which case we still shouldn't schedule; or we're -* on x86_64 and entered from user mode, in which case we're -* still atomic unless ist_begin_non_atomic is called. -*/ -preempt_count_add (HARDIRQ_OFFSET ); +preempt_disable ();/* This code is a bit fragile. Test it. */ RCU_LOCKDEP_WARN (!rcu_is_watching (),"ist_enter didn't work" );
@@ -137,7 +137,7 @@ void ist_enter(struct pt_regs *regs)void ist_exit (struct pt_regs *regs) { -preempt_count_sub (HARDIRQ_OFFSET ); +preempt_enable_no_resched ();if (!user_mode (regs))rcu_nmi_exit ();
@@ -168,7 +168,7 @@ void ist_begin_non_atomic(struct pt_regsBUG_ON ((unsigned long )(current_top_of_stack () -current_stack_pointer ()) >=THREAD_SIZE ); -preempt_count_sub (HARDIRQ_OFFSET ); +preempt_enable_no_resched (); }/**
@@ -178,7 +178,7 @@ void ist_begin_non_atomic(struct pt_regs*/ void ist_end_non_atomic (void ) { -preempt_count_add (HARDIRQ_OFFSET ); +preempt_disable (); }static nokprobe_inline int
Patches currently in stable-queue which might be from [email protected] are
queue-4.4/x86-entry-traps-don-t-force-in_interrupt-to-return-true-in-ist-handlers.patch