Re: [PATCH v3 3/5] powerpc/xive: propagate IPI init errors to prevent use-after-free
Cédric Le Goater <[email protected]> Wed, 29 Jul 2026 19:37:29 +0200
| Newsgroups | org.ozlabs.lists.linuxppc-dev,org.kernel.vger.linux-kernel |
|---|---|
| Message-ID | <[email protected]> |
On 7/28/26 04:47, Srikar Dronamraju wrote: > * Gou Hao <[email protected]> [2026-07-27 18:42:13]: > >> >> static void __init pnv_smp_probe(void) >> { >> - if (xive_enabled()) >> - xive_smp_probe(); >> - else >> + if (xive_enabled()) { >> + if (xive_smp_probe() < 0) >> + return; >> + } else { > > If xive_smp_probe() fails and we return from here, what is the IPI mechanism > that is going to be used? > > Before the patch, we were not configured for IPI and we would fail. > Now we have not configured IPI mechanism, so what are the consequences? > > Should we try disable xive_enabled() and try xics_smp_probe() instead? I am not sure we can do that anymore with OPAL. IIRC, the XICS-on-XIVE mode was dropped. C. > >> xics_smp_probe(); >> + } >> >> if (cpu_has_feature(CPU_FTR_DBELL)) { >> ic_cause_ipi = smp_ops->cause_ipi; >> diff --git a/arch/powerpc/platforms/pseries/smp.c b/arch/powerpc/platforms/pseries/smp.c >> index db99725e752b..14cd0634eeca 100644 >> --- a/arch/powerpc/platforms/pseries/smp.c >> +++ b/arch/powerpc/platforms/pseries/smp.c >> @@ -194,10 +194,12 @@ static int pseries_cause_nmi_ipi(int cpu) >> >> static __init void pSeries_smp_probe(void) >> { >> - if (xive_enabled()) >> - xive_smp_probe(); >> - else >> + if (xive_enabled()) { >> + if (xive_smp_probe() < 0) >> + return; >> + } else { >> xics_smp_probe(); >> + } >> >> /* No doorbell facility, must use the interrupt controller for IPIs */ >> if (!cpu_has_feature(CPU_FTR_DBELL)) >> diff --git a/arch/powerpc/sysdev/xive/common.c b/arch/powerpc/sysdev/xive/common.c >> index 9f80c16be23f..bbe7c85274ea 100644 >> --- a/arch/powerpc/sysdev/xive/common.c >> +++ b/arch/powerpc/sysdev/xive/common.c >> @@ -1267,15 +1267,17 @@ noinstr static void xive_cleanup_cpu_ipi(unsigned int cpu, struct xive_cpu *xc) >> >> int __init xive_smp_probe(void) >> { >> + int ret; >> + >> smp_ops->cause_ipi = xive_cause_ipi; >> >> /* Register the IPI */ >> - xive_init_ipis(); >> + ret = xive_init_ipis(); >> + if (ret < 0) >> + return ret; >> >> /* Allocate and setup IPI for the boot CPU */ >> - xive_setup_cpu_ipi(smp_processor_id()); >> - >> - return 0; >> + return xive_setup_cpu_ipi(smp_processor_id()); >> } >> >> #endif /* CONFIG_SMP */ >> -- >> 2.20.1 >> >