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
>>
>