On 7/27/26 12:42, Gou Hao wrote:
xive_smp_probe() currently assigns smp_ops->cause_ipi = xive_cause_ipi
before calling xive_init_ipis() and xive_setup_cpu_ipi().  If either
call fails, the platform probe handler returns early but cause_ipi
remains pointing to xive_cause_ipi -- which accesses per-cpu IPI data
(xc->ipi_data) that was never properly initialized, leading to
a WARN and a crash.

Move the cause_ipi assignment to after both calls succeed, so that
smp_ops->cause_ipi is only set when the IPI subsystem is fully
initialized.

Signed-off-by: Gou Hao <[email protected]>
Suggested-by: Cédric Le Goater <[email protected]>
Reviewed-by: jiazhenyuan <[email protected]>
---
  arch/powerpc/sysdev/xive/common.c | 10 +++++++---
  1 file changed, 7 insertions(+), 3 deletions(-)

diff --git a/arch/powerpc/sysdev/xive/common.c 
b/arch/powerpc/sysdev/xive/common.c
index bbe7c85274ea..8ae088632337 100644
--- a/arch/powerpc/sysdev/xive/common.c
+++ b/arch/powerpc/sysdev/xive/common.c
@@ -1269,15 +1269,19 @@ int __init xive_smp_probe(void)
  {
        int ret;
- smp_ops->cause_ipi = xive_cause_ipi;
-
        /* Register the IPI */
        ret = xive_init_ipis();
        if (ret < 0)
                return ret;
/* Allocate and setup IPI for the boot CPU */
-       return xive_setup_cpu_ipi(smp_processor_id());
+       ret = xive_setup_cpu_ipi(smp_processor_id());
+       if (ret < 0)
+               return ret;
+
+       smp_ops->cause_ipi = xive_cause_ipi;
+
+       return 0;
  }
#endif /* CONFIG_SMP */

Reviewed-by: Cédric Le Goater <[email protected]>

Thanks,

C.


Reply via email to