[PATCH v3 1/2] powerpc/mce: remove nmi_enter/exit from real mode handler

Ganesh ganeshgr at linux.ibm.com
Fri Oct 9 17:33:58 AEDT 2020


On 10/1/20 11:21 PM, Ganesh Goudar wrote:

> Use of nmi_enter/exit in real mode handler causes the kernel to panic
> and reboot on injecting slb mutihit on pseries machine running in hash
> mmu mode, As these calls try to accesses memory outside RMO region in
> real mode handler where translation is disabled.
>
> Add check to not to use these calls on pseries machine running in hash
> mmu mode.
>
> Fixes: 116ac378bb3f ("powerpc/64s: machine check interrupt update NMI accounting")
> Signed-off-by: Ganesh Goudar <ganeshgr at linux.ibm.com>
> ---
>   arch/powerpc/kernel/mce.c | 10 ++++++----
>   1 file changed, 6 insertions(+), 4 deletions(-)
>
> diff --git a/arch/powerpc/kernel/mce.c b/arch/powerpc/kernel/mce.c
> index ada59f6c4298..3bf39dd5dd43 100644
> --- a/arch/powerpc/kernel/mce.c
> +++ b/arch/powerpc/kernel/mce.c
> @@ -591,12 +591,14 @@ EXPORT_SYMBOL_GPL(machine_check_print_event_info);
>   long notrace machine_check_early(struct pt_regs *regs)
>   {
>   	long handled = 0;
> -	bool nested = in_nmi();
> +	bool is_pseries_hpt_guest;
>   	u8 ftrace_enabled = this_cpu_get_ftrace_enabled();
>   
>   	this_cpu_set_ftrace_enabled(0);
> -
> -	if (!nested)
> +	is_pseries_hpt_guest = machine_is(pseries) &&
> +			       mmu_has_feature(MMU_FTR_HPTE_TABLE);
> +	/* Do not use nmi_enter/exit for pseries hpte guest */
> +	if (!is_pseries_hpt_guest)

In an offline discussion mpe suggested to use radix_enabled() to check if it is
radix or hash, as MMU_FTR_HPTE_TABLE may be true on radix machines also and use
of FW_FEATURE_LPAR better than machine_is(pseries), sending v4 with these changes.

>   		nmi_enter();
>   
>   	hv_nmi_check_nonrecoverable(regs);
> @@ -607,7 +609,7 @@ long notrace machine_check_early(struct pt_regs *regs)
>   	if (ppc_md.machine_check_early)
>   		handled = ppc_md.machine_check_early(regs);
>   
> -	if (!nested)
> +	if (!is_pseries_hpt_guest)
>   		nmi_exit();
>   
>   	this_cpu_set_ftrace_enabled(ftrace_enabled);


More information about the Linuxppc-dev mailing list