diff mbox series

powerpc/traps: fix recoverability of machine check handling on book3s/32

Message ID 1c804764d38fb084b420b12ca13e8c1b2dea075e.1548166189.git.christophe.leroy@c-s.fr (mailing list archive)
State Accepted
Commit 0bbea75c476b77fa7d7811d6be911cc7583e640f
Headers show
Series powerpc/traps: fix recoverability of machine check handling on book3s/32 | expand

Checks

Context Check Description
snowpatch_ozlabs/apply_patch success next/apply_patch Successfully applied
snowpatch_ozlabs/build-ppc64le success build succeeded & removed 0 sparse warning(s)
snowpatch_ozlabs/build-ppc64be success build succeeded & removed 0 sparse warning(s)
snowpatch_ozlabs/build-ppc64e success build succeeded & removed 0 sparse warning(s)
snowpatch_ozlabs/build-pmac32 success build succeeded & removed 0 sparse warning(s)
snowpatch_ozlabs/checkpatch success total: 0 errors, 0 warnings, 0 checks, 19 lines checked

Commit Message

Christophe Leroy Jan. 22, 2019, 2:11 p.m. UTC
Looks like book3s/32 doesn't set RI on machine check, so
checking RI before calling die() will always be fatal
allthought this is not an issue in most cases.

Fixes: b96672dd840f ("powerpc: Machine check interrupt is a non-maskable interrupt")
Fixes: daf00ae71dad ("powerpc/traps: restore recoverability of machine_check interrupts")
Signed-off-by: Christophe Leroy <christophe.leroy@c-s.fr>
Cc: stable@vger.kernel.org
---
 arch/powerpc/kernel/traps.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

Comments

Nicholas Piggin Jan. 23, 2019, 8:56 a.m. UTC | #1
Christophe Leroy's on January 23, 2019 12:11 am:
> Looks like book3s/32 doesn't set RI on machine check, so
> checking RI before calling die() will always be fatal
> allthought this is not an issue in most cases.

Oh good catch, this is a fix for powerpc/64 as well. I think actually 
the panic was supposed to go in the bail: path, it's missing from
there.

But you may have a point, I don't know if we need to panic the box if 
we have !RI in process context... Possible we might be able to remove
those panics and just turn them into die.

Thanks,
Nick
Michal Suchánek Sept. 11, 2020, 9:15 a.m. UTC | #2
Hello,

does this logic apply to "Unrecoverable System Reset" as well?

Thanks

Michal

On Tue, Jan 22, 2019 at 02:11:24PM +0000, Christophe Leroy wrote:
> Looks like book3s/32 doesn't set RI on machine check, so
> checking RI before calling die() will always be fatal
> allthought this is not an issue in most cases.
> 
> Fixes: b96672dd840f ("powerpc: Machine check interrupt is a non-maskable interrupt")
> Fixes: daf00ae71dad ("powerpc/traps: restore recoverability of machine_check interrupts")
> Signed-off-by: Christophe Leroy <christophe.leroy@c-s.fr>
> Cc: stable@vger.kernel.org
> ---
>  arch/powerpc/kernel/traps.c | 8 ++++----
>  1 file changed, 4 insertions(+), 4 deletions(-)
> 
> diff --git a/arch/powerpc/kernel/traps.c b/arch/powerpc/kernel/traps.c
> index 64936b60d521..c740f8bfccc9 100644
> --- a/arch/powerpc/kernel/traps.c
> +++ b/arch/powerpc/kernel/traps.c
> @@ -763,15 +763,15 @@ void machine_check_exception(struct pt_regs *regs)
>  	if (check_io_access(regs))
>  		goto bail;
>  
> -	/* Must die if the interrupt is not recoverable */
> -	if (!(regs->msr & MSR_RI))
> -		nmi_panic(regs, "Unrecoverable Machine check");
> -
>  	if (!nested)
>  		nmi_exit();
>  
>  	die("Machine check", regs, SIGBUS);
>  
> +	/* Must die if the interrupt is not recoverable */
> +	if (!(regs->msr & MSR_RI))
> +		nmi_panic(regs, "Unrecoverable Machine check");
> +
>  	return;
>  
>  bail:
> -- 
> 2.13.3
>
Christophe Leroy Sept. 11, 2020, 9:54 a.m. UTC | #3
Hello,

Le 11/09/2020 à 11:15, Michal Suchánek a écrit :
> Hello,
> 
> does this logic apply to "Unrecoverable System Reset" as well?

I don't know, I don't think I have any way the generate a System Reset 
on my board to check it.

Christophe

> 
> Thanks
> 
> Michal
> 
> On Tue, Jan 22, 2019 at 02:11:24PM +0000, Christophe Leroy wrote:
>> Looks like book3s/32 doesn't set RI on machine check, so
>> checking RI before calling die() will always be fatal
>> allthought this is not an issue in most cases.
>>
>> Fixes: b96672dd840f ("powerpc: Machine check interrupt is a non-maskable interrupt")
>> Fixes: daf00ae71dad ("powerpc/traps: restore recoverability of machine_check interrupts")
>> Signed-off-by: Christophe Leroy <christophe.leroy@c-s.fr>
>> Cc: stable@vger.kernel.org
>> ---
>>   arch/powerpc/kernel/traps.c | 8 ++++----
>>   1 file changed, 4 insertions(+), 4 deletions(-)
>>
>> diff --git a/arch/powerpc/kernel/traps.c b/arch/powerpc/kernel/traps.c
>> index 64936b60d521..c740f8bfccc9 100644
>> --- a/arch/powerpc/kernel/traps.c
>> +++ b/arch/powerpc/kernel/traps.c
>> @@ -763,15 +763,15 @@ void machine_check_exception(struct pt_regs *regs)
>>   	if (check_io_access(regs))
>>   		goto bail;
>>   
>> -	/* Must die if the interrupt is not recoverable */
>> -	if (!(regs->msr & MSR_RI))
>> -		nmi_panic(regs, "Unrecoverable Machine check");
>> -
>>   	if (!nested)
>>   		nmi_exit();
>>   
>>   	die("Machine check", regs, SIGBUS);
>>   
>> +	/* Must die if the interrupt is not recoverable */
>> +	if (!(regs->msr & MSR_RI))
>> +		nmi_panic(regs, "Unrecoverable Machine check");
>> +
>>   	return;
>>   
>>   bail:
>> -- 
>> 2.13.3
>>
Michael Ellerman Sept. 11, 2020, 1:23 p.m. UTC | #4
Michal Suchánek <msuchanek@suse.de> writes:
> Hello,
>
> does this logic apply to "Unrecoverable System Reset" as well?

Which logic do you mean?

We do call die() before checking MSR_RI in system_reset_exception():

  	/*
  	 * No debugger or crash dump registered, print logs then
  	 * panic.
  	 */
  	die("System Reset", regs, SIGABRT);
  
  	mdelay(2*MSEC_PER_SEC); /* Wait a little while for others to print */
  	add_taint(TAINT_DIE, LOCKDEP_NOW_UNRELIABLE);
  	nmi_panic(regs, "System Reset");
  
  out:
  #ifdef CONFIG_PPC_BOOK3S_64
  	BUG_ON(get_paca()->in_nmi == 0);
  	if (get_paca()->in_nmi > 1)
  		die("Unrecoverable nested System Reset", regs, SIGABRT);
  #endif
  	/* Must die if the interrupt is not recoverable */
  	if (!(regs->msr & MSR_RI))
  		die("Unrecoverable System Reset", regs, SIGABRT);


So you should see the output from die("System Reset", ...) even if
MSR[RI] was clear when you took the system reset.

cheers

> On Tue, Jan 22, 2019 at 02:11:24PM +0000, Christophe Leroy wrote:
>> Looks like book3s/32 doesn't set RI on machine check, so
>> checking RI before calling die() will always be fatal
>> allthought this is not an issue in most cases.
>> 
>> Fixes: b96672dd840f ("powerpc: Machine check interrupt is a non-maskable interrupt")
>> Fixes: daf00ae71dad ("powerpc/traps: restore recoverability of machine_check interrupts")
>> Signed-off-by: Christophe Leroy <christophe.leroy@c-s.fr>
>> Cc: stable@vger.kernel.org
>> ---
>>  arch/powerpc/kernel/traps.c | 8 ++++----
>>  1 file changed, 4 insertions(+), 4 deletions(-)
>> 
>> diff --git a/arch/powerpc/kernel/traps.c b/arch/powerpc/kernel/traps.c
>> index 64936b60d521..c740f8bfccc9 100644
>> --- a/arch/powerpc/kernel/traps.c
>> +++ b/arch/powerpc/kernel/traps.c
>> @@ -763,15 +763,15 @@ void machine_check_exception(struct pt_regs *regs)
>>  	if (check_io_access(regs))
>>  		goto bail;
>>  
>> -	/* Must die if the interrupt is not recoverable */
>> -	if (!(regs->msr & MSR_RI))
>> -		nmi_panic(regs, "Unrecoverable Machine check");
>> -
>>  	if (!nested)
>>  		nmi_exit();
>>  
>>  	die("Machine check", regs, SIGBUS);
>>  
>> +	/* Must die if the interrupt is not recoverable */
>> +	if (!(regs->msr & MSR_RI))
>> +		nmi_panic(regs, "Unrecoverable Machine check");
>> +
>>  	return;
>>  
>>  bail:
>> -- 
>> 2.13.3
>>
Michal Suchánek Sept. 14, 2020, 12:46 p.m. UTC | #5
On Fri, Sep 11, 2020 at 11:23:57PM +1000, Michael Ellerman wrote:
> Michal Suchánek <msuchanek@suse.de> writes:
> > Hello,
> >
> > does this logic apply to "Unrecoverable System Reset" as well?
> 
> Which logic do you mean?
> 
> We do call die() before checking MSR_RI in system_reset_exception():
> 
>   	/*
>   	 * No debugger or crash dump registered, print logs then
>   	 * panic.
>   	 */
>   	die("System Reset", regs, SIGABRT);
>   
>   	mdelay(2*MSEC_PER_SEC); /* Wait a little while for others to print */
>   	add_taint(TAINT_DIE, LOCKDEP_NOW_UNRELIABLE);
>   	nmi_panic(regs, "System Reset");
>   
>   out:
>   #ifdef CONFIG_PPC_BOOK3S_64
>   	BUG_ON(get_paca()->in_nmi == 0);
>   	if (get_paca()->in_nmi > 1)
>   		die("Unrecoverable nested System Reset", regs, SIGABRT);
>   #endif
>   	/* Must die if the interrupt is not recoverable */
>   	if (!(regs->msr & MSR_RI))
>   		die("Unrecoverable System Reset", regs, SIGABRT);
> 
> 
> So you should see the output from die("System Reset", ...) even if
> MSR[RI] was clear when you took the system reset.

Indeed, replied to the wrong patch. I was looking at daf00ae71dad
("powerpc/traps: restore recoverability of machine_check interrupts")
which has very similar commit message.

Sorry about the confusion.

Thanks

Michal

> 
> cheers
> 
> > On Tue, Jan 22, 2019 at 02:11:24PM +0000, Christophe Leroy wrote:
> >> Looks like book3s/32 doesn't set RI on machine check, so
> >> checking RI before calling die() will always be fatal
> >> allthought this is not an issue in most cases.
> >> 
> >> Fixes: b96672dd840f ("powerpc: Machine check interrupt is a non-maskable interrupt")
> >> Fixes: daf00ae71dad ("powerpc/traps: restore recoverability of machine_check interrupts")
> >> Signed-off-by: Christophe Leroy <christophe.leroy@c-s.fr>
> >> Cc: stable@vger.kernel.org
> >> ---
> >>  arch/powerpc/kernel/traps.c | 8 ++++----
> >>  1 file changed, 4 insertions(+), 4 deletions(-)
> >> 
> >> diff --git a/arch/powerpc/kernel/traps.c b/arch/powerpc/kernel/traps.c
> >> index 64936b60d521..c740f8bfccc9 100644
> >> --- a/arch/powerpc/kernel/traps.c
> >> +++ b/arch/powerpc/kernel/traps.c
> >> @@ -763,15 +763,15 @@ void machine_check_exception(struct pt_regs *regs)
> >>  	if (check_io_access(regs))
> >>  		goto bail;
> >>  
> >> -	/* Must die if the interrupt is not recoverable */
> >> -	if (!(regs->msr & MSR_RI))
> >> -		nmi_panic(regs, "Unrecoverable Machine check");
> >> -
> >>  	if (!nested)
> >>  		nmi_exit();
> >>  
> >>  	die("Machine check", regs, SIGBUS);
> >>  
> >> +	/* Must die if the interrupt is not recoverable */
> >> +	if (!(regs->msr & MSR_RI))
> >> +		nmi_panic(regs, "Unrecoverable Machine check");
> >> +
> >>  	return;
> >>  
> >>  bail:
> >> -- 
> >> 2.13.3
> >>
diff mbox series

Patch

diff --git a/arch/powerpc/kernel/traps.c b/arch/powerpc/kernel/traps.c
index 64936b60d521..c740f8bfccc9 100644
--- a/arch/powerpc/kernel/traps.c
+++ b/arch/powerpc/kernel/traps.c
@@ -763,15 +763,15 @@  void machine_check_exception(struct pt_regs *regs)
 	if (check_io_access(regs))
 		goto bail;
 
-	/* Must die if the interrupt is not recoverable */
-	if (!(regs->msr & MSR_RI))
-		nmi_panic(regs, "Unrecoverable Machine check");
-
 	if (!nested)
 		nmi_exit();
 
 	die("Machine check", regs, SIGBUS);
 
+	/* Must die if the interrupt is not recoverable */
+	if (!(regs->msr & MSR_RI))
+		nmi_panic(regs, "Unrecoverable Machine check");
+
 	return;
 
 bail: