From 0bc8a3e56d1367d8863ed7ad6961025c7bbda8ef Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Tue, 13 May 2014 16:57:10 -0700 Subject: [PATCH] 3.14-stable patches added patches: x86-preempt-fix-preemption-for-i386.patch --- queue-3.14/series | 1 + .../x86-preempt-fix-preemption-for-i386.patch | 101 ++++++++++++++++++ 2 files changed, 102 insertions(+) create mode 100644 queue-3.14/x86-preempt-fix-preemption-for-i386.patch diff --git a/queue-3.14/series b/queue-3.14/series index 7d01f708991..3317296caa2 100644 --- a/queue-3.14/series +++ b/queue-3.14/series @@ -10,3 +10,4 @@ netfilter-nf_conntrack-reserve-two-bytes-for-nf_ct_ext-len.patch blktrace-fix-accounting-of-partially-completed-requests.patch netfilter-can-t-fail-and-free-after-table-replacement.patch netfilter-nf_tables-set-names-cannot-be-larger-than-15-bytes.patch +x86-preempt-fix-preemption-for-i386.patch diff --git a/queue-3.14/x86-preempt-fix-preemption-for-i386.patch b/queue-3.14/x86-preempt-fix-preemption-for-i386.patch new file mode 100644 index 00000000000..aff4206f59f --- /dev/null +++ b/queue-3.14/x86-preempt-fix-preemption-for-i386.patch @@ -0,0 +1,101 @@ +From peterz@infradead.org Tue May 13 16:56:21 2014 +From: Peter Zijlstra +Date: Wed, 9 Apr 2014 16:24:47 +0200 +Subject: x86,preempt: Fix preemption for i386 +To: Stefan Bader +Cc: Toralf Förster , Michele Ballabio , linux-kernel@vger.kernel.org, fweisbec@gmail.com, mingo@kernel.org, Steven Rostedt , David Cohen , Paolo Bonzini , Borislav Petkov , Linus Torvalds , Greg KH +Message-ID: <20140409142447.GD13658@twins.programming.kicks-ass.net> +Content-Disposition: inline + + +From: Peter Zijlstra + +Many people reported preemption/reschedule problems with i386 kernels +for .13 and .14. After Michele bisected this to a combination of + + 3e8e42c69bb ("sched: Revert need_resched() to look at TIF_NEED_RESCHED") + ded79754754 ("irq: Force hardirq exit's softirq processing on its own stack") + +it finally dawned on me that i386's current_thread_info() was to +blame. + +When we are on interrupt/exception stacks, we fail to observe the +right TIF_NEED_RESCHED bit and therefore the PREEMPT_NEED_RESCHED +folding malfunctions. + +Current upstream fixes this by making i386 behave the same as x86_64 +already did: + + 2432e1364bbe ("x86: Nuke the supervisor_stack field in i386 thread_info") + b807902a88c4 ("x86: Nuke GET_THREAD_INFO_WITH_ESP() macro for i386") + 0788aa6a23cb ("x86: Prepare removal of previous_esp from i386 thread_info structure") + 198d208df437 ("x86: Keep thread_info on thread stack in x86_32") + +However, that is far too much to stuff into -stable. Therefore I +propose we merge the below patch which uses task_thread_info(current) +for tif_need_resched() instead of the ESP based current_thread_info(). + +This makes sure we always observe the one true TIF_NEED_RESCHED bit +and things will work as expected again. + +Cc: fweisbec@gmail.com +Cc: mingo@kernel.org +Cc: Steven Rostedt +Cc: David Cohen +Cc: Paolo Bonzini +Cc: Borislav Petkov +Tested-by: Stefan Bader +Tested-by: Toralf Förster +Tested-by: Michele Ballabio +Signed-off-by: Peter Zijlstra +Signed-off-by: Greg Kroah-Hartman +--- + arch/x86/include/asm/preempt.h | 11 +++++++++++ + include/linux/preempt.h | 4 ++++ + include/linux/thread_info.h | 2 -- + 3 files changed, 15 insertions(+), 2 deletions(-) + +--- a/arch/x86/include/asm/preempt.h ++++ b/arch/x86/include/asm/preempt.h +@@ -5,6 +5,17 @@ + #include + #include + ++#ifdef CONFIG_X86_32 ++/* ++ * i386's current_thread_info() depends on ESP and for interrupt/exception ++ * stacks this doesn't yield the actual task thread_info. ++ * ++ * We hard rely on the fact that all the TIF_NEED_RESCHED bits are ++ * the same, therefore use the slightly more expensive version below. ++ */ ++#define tif_need_resched() test_tsk_thread_flag(current, TIF_NEED_RESCHED) ++#endif ++ + DECLARE_PER_CPU(int, __preempt_count); + + /* +--- a/include/linux/preempt.h ++++ b/include/linux/preempt.h +@@ -17,6 +17,10 @@ + + #include + ++#ifndef tif_need_resched ++#define tif_need_resched() test_thread_flag(TIF_NEED_RESCHED) ++#endif ++ + #if defined(CONFIG_DEBUG_PREEMPT) || defined(CONFIG_PREEMPT_TRACER) + extern void preempt_count_add(int val); + extern void preempt_count_sub(int val); +--- a/include/linux/thread_info.h ++++ b/include/linux/thread_info.h +@@ -118,8 +118,6 @@ static inline __deprecated void set_need + */ + } + +-#define tif_need_resched() test_thread_flag(TIF_NEED_RESCHED) +- + #if defined TIF_RESTORE_SIGMASK && !defined HAVE_SET_RESTORE_SIGMASK + /* + * An arch can define its own version of set_restore_sigmask() to get the -- 2.47.3