All of lore.kernel.org
 help / color / mirror / Atom feed
From: Peter Zijlstra <peterz@infradead.org>
To: Stefan Bader <stefan.bader@canonical.com>
Cc: "Toralf Förster" <toralf.foerster@gmx.de>,
	"Michele Ballabio" <barra_cuda@katamail.com>,
	linux-kernel@vger.kernel.org, fweisbec@gmail.com,
	mingo@kernel.org, "Steven Rostedt" <rostedt@goodmis.org>,
	"David Cohen" <david.a.cohen@linux.intel.com>,
	"Paolo Bonzini" <pbonzini@redhat.com>,
	"Borislav Petkov" <bp@alien8.de>,
	"Linus Torvalds" <torvalds@linux-foundation.org>,
	"Greg KH" <greg@kroah.com>
Subject: [PATCH -stable] x86,preempt: Fix preemption for i386
Date: Wed, 9 Apr 2014 16:24:47 +0200	[thread overview]
Message-ID: <20140409142447.GD13658@twins.programming.kicks-ass.net> (raw)
In-Reply-To: <20140409094515.GR11096@twins.programming.kicks-ass.net>

Greg, Linus,

I'm not entirely clear on how acceptable it is to propose a different
patch for -stable than what we have upstream.

The below Changelog explain, but in short, we should either backport 4
rather invasive patches to .13-stable and .14-stable or do the small
patch provided.

The 4 patches by Steven are the right thing to do, but I feel they might
be too invasive to propose for -stable, therefore the alternative
approach.

---
Subject: x86,preempt: Fix preemption for i386
From: Peter Zijlstra <peterz@infradead.org>
Date: Tue, 8 Apr 2014 14:21:28 +0200

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 <rostedt@goodmis.org>
Cc: David Cohen <david.a.cohen@linux.intel.com>
Cc: Paolo Bonzini <pbonzini@redhat.com>
Cc: Borislav Petkov <bp@alien8.de>
Tested-by: Stefan Bader <stefan.bader@canonical.com>
Tested-by: Toralf Förster <toralf.foerster@gmx.de>
Tested-by: Michele Ballabio <barra_cuda@katamail.com>
Signed-off-by: Peter Zijlstra <peterz@infradead.org>
---
 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 <asm/percpu.h>
 #include <linux/thread_info.h>
 
+#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 <asm/preempt.h>
 
+#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

  reply	other threads:[~2014-04-09 14:25 UTC|newest]

Thread overview: 23+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-04-06 15:19 Bisected KVM hang on x86-32 between v3.12 and v3.13 Michele Ballabio
2014-04-06 15:52 ` Toralf Förster
2014-04-06 17:40   ` Michele Ballabio
2014-04-07 15:03 ` Peter Zijlstra
2014-04-07 15:07   ` Peter Zijlstra
2014-04-07 18:16     ` Toralf Förster
2014-04-07 18:56       ` Peter Zijlstra
2014-04-08 12:21         ` Peter Zijlstra
2014-04-08 19:14           ` Michele Ballabio
2014-04-08 19:51             ` Michele Ballabio
2014-04-08 20:28           ` Toralf Förster
2014-04-09  9:14           ` Stefan Bader
2014-04-09  9:45             ` Peter Zijlstra
2014-04-09 14:24               ` Peter Zijlstra [this message]
2014-04-09 14:36                 ` [PATCH -stable] x86,preempt: Fix preemption for i386 Linus Torvalds
2014-04-09 19:19                   ` Greg KH
2014-04-09 19:38                     ` Peter Zijlstra
2014-04-09 19:57                       ` Greg KH
2014-05-13 23:56                       ` Greg KH
2014-04-07 18:59       ` Bisected KVM hang on x86-32 between v3.12 and v3.13 Frederic Weisbecker
2014-04-07 19:57         ` Toralf Förster
2014-04-07 22:43           ` Frederic Weisbecker
2014-04-07 19:49     ` Michele Ballabio

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20140409142447.GD13658@twins.programming.kicks-ass.net \
    --to=peterz@infradead.org \
    --cc=barra_cuda@katamail.com \
    --cc=bp@alien8.de \
    --cc=david.a.cohen@linux.intel.com \
    --cc=fweisbec@gmail.com \
    --cc=greg@kroah.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@kernel.org \
    --cc=pbonzini@redhat.com \
    --cc=rostedt@goodmis.org \
    --cc=stefan.bader@canonical.com \
    --cc=toralf.foerster@gmx.de \
    --cc=torvalds@linux-foundation.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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.