• Michael Ellerman's avatar
    powerpc/powernv: Fix oops on P9 DD1 in cause_ipi() · 45b21cfe
    Michael Ellerman authored
    Recently we merged the native xive support for Power9, and then separately some
    reworks for doorbell IPI support. In isolation both series were OK, but the
    merged result had a bug in one case.
    
    On P9 DD1 we use pnv_p9_dd1_cause_ipi() which tries to use doorbells, and then
    falls back to the interrupt controller. However the fallback is implemented by
    calling icp_ops->cause_ipi. But now that xive support is merged we might be
    using xive, in which case icp_ops is not initialised, it's a xics specific
    structure. This leads to an oops such as:
    
      Unable to handle kernel paging request for data at address 0x00000028
      Oops: Kernel access of bad area, sig: 11 [#1]
      NIP pnv_p9_dd1_cause_ipi+0x74/0xe0
      LR smp_muxed_ipi_message_pass+0x54/0x70
    
    To fix it, rather than using icp_ops which might be NULL, have both xics and
    xive set smp_ops->cause_ipi, and then in the powernv code we save that as
    ic_cause_ipi before overriding smp_ops->cause_ipi. For paranoia add a WARN_ON()
    to check if somehow smp_ops->cause_ipi is NULL.
    
    Fixes: b866cc21 ("powerpc: Change the doorbell IPI calling convention")
    Tested-by: default avatarGautham R. Shenoy <ego@linux.vnet.ibm.com>
    Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
    45b21cfe
xics-common.c 11.6 KB