All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] x86/debug: Handle warnings before the notifier chain
@ 2017-07-24 10:04 Alexander Shishkin
  2017-07-24 10:21 ` Peter Zijlstra
                   ` (2 more replies)
  0 siblings, 3 replies; 5+ messages in thread
From: Alexander Shishkin @ 2017-07-24 10:04 UTC (permalink / raw)
  To: Thomas Gleixner, Ingo Molnar, Peter Zijlstra
  Cc: Alexander Shishkin, Arjan van de Ven, Borislav Petkov,
	Richard Weinberger, Ingo Molnar, linux-kernel

Commit

  9a93848fe787 ("x86/debug: Implement __WARN() using UD0")

turned warnings into UD0, but the fixup code only runs after the
notify_die() chain. This is a problem, in particular, with kgdb,
which kicks in as if it was a BUG().

Fix this by running the fixup code before the notifier chain in
the invalid op handler path.

Signed-off-by: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Arjan van de Ven <arjan@linux.intel.com>
Cc: Borislav Petkov <bp@alien8.de>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Richard Weinberger <richard.weinberger@gmail.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: linux-kernel@vger.kernel.org
---
 arch/x86/kernel/traps.c | 10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)

diff --git a/arch/x86/kernel/traps.c b/arch/x86/kernel/traps.c
index bf54309b85..b2157d4a53 100644
--- a/arch/x86/kernel/traps.c
+++ b/arch/x86/kernel/traps.c
@@ -221,9 +221,6 @@ do_trap_no_signal(struct task_struct *tsk, int trapnr, char *str,
 		if (fixup_exception(regs, trapnr))
 			return 0;
 
-		if (fixup_bug(regs, trapnr))
-			return 0;
-
 		tsk->thread.error_code = error_code;
 		tsk->thread.trap_nr = trapnr;
 		die(str, regs, error_code);
@@ -304,6 +301,13 @@ static void do_error_trap(struct pt_regs *regs, long error_code, char *str,
 
 	RCU_LOCKDEP_WARN(!rcu_is_watching(), "entry code didn't wake RCU");
 
+	/*
+	 * WARN*()s end up here; fix them up before we call the
+	 * notifier chain.
+	 */
+	if (!user_mode(regs) && fixup_bug(regs, trapnr))
+		return;
+
 	if (notify_die(DIE_TRAP, str, regs, error_code, trapnr, signr) !=
 			NOTIFY_STOP) {
 		cond_local_irq_enable(regs);
-- 
2.13.2

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH] x86/debug: Handle warnings before the notifier chain
  2017-07-24 10:04 [PATCH] x86/debug: Handle warnings before the notifier chain Alexander Shishkin
@ 2017-07-24 10:21 ` Peter Zijlstra
  2017-08-29 11:53   ` Alexander Shishkin
  2017-11-10  6:33 ` [tip:x86/urgent] x86/debug: Handle warnings before the notifier chain, to fix KGDB crash tip-bot for Alexander Shishkin
  2017-11-10  9:41 ` tip-bot for Alexander Shishkin
  2 siblings, 1 reply; 5+ messages in thread
From: Peter Zijlstra @ 2017-07-24 10:21 UTC (permalink / raw)
  To: Alexander Shishkin
  Cc: Thomas Gleixner, Ingo Molnar, Arjan van de Ven, Borislav Petkov,
	Richard Weinberger, Ingo Molnar, linux-kernel, Jason Wessel

On Mon, Jul 24, 2017 at 01:04:28PM +0300, Alexander Shishkin wrote:
> Commit
> 
>   9a93848fe787 ("x86/debug: Implement __WARN() using UD0")
> 
> turned warnings into UD0, but the fixup code only runs after the
> notify_die() chain. This is a problem, in particular, with kgdb,
> which kicks in as if it was a BUG().
> 
> Fix this by running the fixup code before the notifier chain in
> the invalid op handler path.

So arguable it might be nice to have kgdb trap on a WARN, but it
treating it as a BUG is obviously undesirable.

Jason, what would you want kgdb to do here?

> Signed-off-by: Alexander Shishkin <alexander.shishkin@linux.intel.com>
> Cc: Arjan van de Ven <arjan@linux.intel.com>
> Cc: Borislav Petkov <bp@alien8.de>
> Cc: Peter Zijlstra <peterz@infradead.org>
> Cc: Richard Weinberger <richard.weinberger@gmail.com>
> Cc: Thomas Gleixner <tglx@linutronix.de>
> Cc: Ingo Molnar <mingo@kernel.org>
> Cc: linux-kernel@vger.kernel.org
> ---
>  arch/x86/kernel/traps.c | 10 +++++++---
>  1 file changed, 7 insertions(+), 3 deletions(-)
> 
> diff --git a/arch/x86/kernel/traps.c b/arch/x86/kernel/traps.c
> index bf54309b85..b2157d4a53 100644
> --- a/arch/x86/kernel/traps.c
> +++ b/arch/x86/kernel/traps.c
> @@ -221,9 +221,6 @@ do_trap_no_signal(struct task_struct *tsk, int trapnr, char *str,
>  		if (fixup_exception(regs, trapnr))
>  			return 0;
>  
> -		if (fixup_bug(regs, trapnr))
> -			return 0;
> -
>  		tsk->thread.error_code = error_code;
>  		tsk->thread.trap_nr = trapnr;
>  		die(str, regs, error_code);
> @@ -304,6 +301,13 @@ static void do_error_trap(struct pt_regs *regs, long error_code, char *str,
>  
>  	RCU_LOCKDEP_WARN(!rcu_is_watching(), "entry code didn't wake RCU");
>  
> +	/*
> +	 * WARN*()s end up here; fix them up before we call the
> +	 * notifier chain.
> +	 */
> +	if (!user_mode(regs) && fixup_bug(regs, trapnr))
> +		return;
> +
>  	if (notify_die(DIE_TRAP, str, regs, error_code, trapnr, signr) !=
>  			NOTIFY_STOP) {
>  		cond_local_irq_enable(regs);
> -- 
> 2.13.2
> 

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] x86/debug: Handle warnings before the notifier chain
  2017-07-24 10:21 ` Peter Zijlstra
@ 2017-08-29 11:53   ` Alexander Shishkin
  0 siblings, 0 replies; 5+ messages in thread
From: Alexander Shishkin @ 2017-08-29 11:53 UTC (permalink / raw)
  To: Peter Zijlstra
  Cc: Thomas Gleixner, Ingo Molnar, Arjan van de Ven, Borislav Petkov,
	Richard Weinberger, Ingo Molnar, linux-kernel, Jason Wessel

Peter Zijlstra <peterz@infradead.org> writes:

> On Mon, Jul 24, 2017 at 01:04:28PM +0300, Alexander Shishkin wrote:
>> Commit
>> 
>>   9a93848fe787 ("x86/debug: Implement __WARN() using UD0")
>> 
>> turned warnings into UD0, but the fixup code only runs after the
>> notify_die() chain. This is a problem, in particular, with kgdb,
>> which kicks in as if it was a BUG().
>> 
>> Fix this by running the fixup code before the notifier chain in
>> the invalid op handler path.
>
> So arguable it might be nice to have kgdb trap on a WARN, but it
> treating it as a BUG is obviously undesirable.
>
> Jason, what would you want kgdb to do here?

Ping.

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [tip:x86/urgent] x86/debug: Handle warnings before the notifier chain, to fix KGDB crash
  2017-07-24 10:04 [PATCH] x86/debug: Handle warnings before the notifier chain Alexander Shishkin
  2017-07-24 10:21 ` Peter Zijlstra
@ 2017-11-10  6:33 ` tip-bot for Alexander Shishkin
  2017-11-10  9:41 ` tip-bot for Alexander Shishkin
  2 siblings, 0 replies; 5+ messages in thread
From: tip-bot for Alexander Shishkin @ 2017-11-10  6:33 UTC (permalink / raw)
  To: linux-tip-commits
  Cc: hpa, mingo, daniel.thompson, peterz, idryomov, linux-kernel,
	arjan, bp, alexander.shishkin, torvalds, richard.weinberger,
	tglx, jason.wessel

Commit-ID:  a8d6c1bd62ffefb075c9d3570f07659e2a36ecb3
Gitweb:     https://git.kernel.org/tip/a8d6c1bd62ffefb075c9d3570f07659e2a36ecb3
Author:     Alexander Shishkin <alexander.shishkin@linux.intel.com>
AuthorDate: Mon, 24 Jul 2017 13:04:28 +0300
Committer:  Ingo Molnar <mingo@kernel.org>
CommitDate: Fri, 10 Nov 2017 07:16:23 +0100

x86/debug: Handle warnings before the notifier chain, to fix KGDB crash

Commit:

  9a93848fe787 ("x86/debug: Implement __WARN() using UD0")

turned warnings into UD0, but the fixup code only runs after the
notify_die() chain. This is a problem, in particular, with kgdb,
which kicks in as if it was a BUG().

Fix this by running the fixup code before the notifier chain in
the invalid op handler path.

Signed-off-by: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Tested-by: Ilya Dryomov <idryomov@gmail.com>
Acked-by: Daniel Thompson <daniel.thompson@linaro.org>
Cc: Jason Wessel <jason.wessel@windriver.com>
Cc: Arjan van de Ven <arjan@linux.intel.com>
Cc: Borislav Petkov <bp@alien8.de>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Richard Weinberger <richard.weinberger@gmail.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: <stable@vger.kernel.org> # v4.12+
Link: http://lkml.kernel.org/r/20170724100428.19173-1-alexander.shishkin@linux.intel.com
Signed-off-by: Ingo Molnar <mingo@kernel.org>
---
 arch/x86/kernel/traps.c | 10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)

diff --git a/arch/x86/kernel/traps.c b/arch/x86/kernel/traps.c
index 67db4f4..5a6b8f8 100644
--- a/arch/x86/kernel/traps.c
+++ b/arch/x86/kernel/traps.c
@@ -209,9 +209,6 @@ do_trap_no_signal(struct task_struct *tsk, int trapnr, char *str,
 		if (fixup_exception(regs, trapnr))
 			return 0;
 
-		if (fixup_bug(regs, trapnr))
-			return 0;
-
 		tsk->thread.error_code = error_code;
 		tsk->thread.trap_nr = trapnr;
 		die(str, regs, error_code);
@@ -292,6 +289,13 @@ static void do_error_trap(struct pt_regs *regs, long error_code, char *str,
 
 	RCU_LOCKDEP_WARN(!rcu_is_watching(), "entry code didn't wake RCU");
 
+	/*
+	 * WARN*()s end up here; fix them up before we call the
+	 * notifier chain.
+	 */
+	if (!user_mode(regs) && fixup_bug(regs, trapnr))
+		return;
+
 	if (notify_die(DIE_TRAP, str, regs, error_code, trapnr, signr) !=
 			NOTIFY_STOP) {
 		cond_local_irq_enable(regs);

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [tip:x86/urgent] x86/debug: Handle warnings before the notifier chain, to fix KGDB crash
  2017-07-24 10:04 [PATCH] x86/debug: Handle warnings before the notifier chain Alexander Shishkin
  2017-07-24 10:21 ` Peter Zijlstra
  2017-11-10  6:33 ` [tip:x86/urgent] x86/debug: Handle warnings before the notifier chain, to fix KGDB crash tip-bot for Alexander Shishkin
@ 2017-11-10  9:41 ` tip-bot for Alexander Shishkin
  2 siblings, 0 replies; 5+ messages in thread
From: tip-bot for Alexander Shishkin @ 2017-11-10  9:41 UTC (permalink / raw)
  To: linux-tip-commits
  Cc: arjan, linux-kernel, idryomov, mingo, alexander.shishkin, hpa,
	tglx, torvalds, daniel.thompson, richard.weinberger, peterz,
	jason.wessel, bp

Commit-ID:  b8347c2196492f4e1cccde3d92fda1cc2cc7de7e
Gitweb:     https://git.kernel.org/tip/b8347c2196492f4e1cccde3d92fda1cc2cc7de7e
Author:     Alexander Shishkin <alexander.shishkin@linux.intel.com>
AuthorDate: Mon, 24 Jul 2017 13:04:28 +0300
Committer:  Ingo Molnar <mingo@kernel.org>
CommitDate: Fri, 10 Nov 2017 08:04:19 +0100

x86/debug: Handle warnings before the notifier chain, to fix KGDB crash

Commit:

  9a93848fe787 ("x86/debug: Implement __WARN() using UD0")

turned warnings into UD0, but the fixup code only runs after the
notify_die() chain. This is a problem, in particular, with kgdb,
which kicks in as if it was a BUG().

Fix this by running the fixup code before the notifier chain in
the invalid op handler path.

Signed-off-by: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Tested-by: Ilya Dryomov <idryomov@gmail.com>
Acked-by: Daniel Thompson <daniel.thompson@linaro.org>
Acked-by: Thomas Gleixner <tglx@linutronix.de>
Cc: Jason Wessel <jason.wessel@windriver.com>
Cc: Arjan van de Ven <arjan@linux.intel.com>
Cc: Borislav Petkov <bp@alien8.de>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Richard Weinberger <richard.weinberger@gmail.com>
Cc: <stable@vger.kernel.org> # v4.12+
Link: http://lkml.kernel.org/r/20170724100428.19173-1-alexander.shishkin@linux.intel.com
Signed-off-by: Ingo Molnar <mingo@kernel.org>
---
 arch/x86/kernel/traps.c | 10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)

diff --git a/arch/x86/kernel/traps.c b/arch/x86/kernel/traps.c
index 67db4f4..5a6b8f8 100644
--- a/arch/x86/kernel/traps.c
+++ b/arch/x86/kernel/traps.c
@@ -209,9 +209,6 @@ do_trap_no_signal(struct task_struct *tsk, int trapnr, char *str,
 		if (fixup_exception(regs, trapnr))
 			return 0;
 
-		if (fixup_bug(regs, trapnr))
-			return 0;
-
 		tsk->thread.error_code = error_code;
 		tsk->thread.trap_nr = trapnr;
 		die(str, regs, error_code);
@@ -292,6 +289,13 @@ static void do_error_trap(struct pt_regs *regs, long error_code, char *str,
 
 	RCU_LOCKDEP_WARN(!rcu_is_watching(), "entry code didn't wake RCU");
 
+	/*
+	 * WARN*()s end up here; fix them up before we call the
+	 * notifier chain.
+	 */
+	if (!user_mode(regs) && fixup_bug(regs, trapnr))
+		return;
+
 	if (notify_die(DIE_TRAP, str, regs, error_code, trapnr, signr) !=
 			NOTIFY_STOP) {
 		cond_local_irq_enable(regs);

^ permalink raw reply related	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2017-11-10  9:46 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-07-24 10:04 [PATCH] x86/debug: Handle warnings before the notifier chain Alexander Shishkin
2017-07-24 10:21 ` Peter Zijlstra
2017-08-29 11:53   ` Alexander Shishkin
2017-11-10  6:33 ` [tip:x86/urgent] x86/debug: Handle warnings before the notifier chain, to fix KGDB crash tip-bot for Alexander Shishkin
2017-11-10  9:41 ` tip-bot for Alexander Shishkin

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.