Message ID | 20200518234245.200672-1-leobras.c@gmail.com (mailing list archive) |
---|---|
Headers | show |
Series | Implement reentrant rtas call | expand |
On Mon, 18 May 2020 20:42:43 -0300, Leonardo Bras wrote: > Patch 2 implement rtas_call_reentrant() for reentrant rtas-calls: > "ibm,int-on", "ibm,int-off",ibm,get-xive" and "ibm,set-xive", > according to LoPAPR Version 1.1 (March 24, 2016). > > For that, it's necessary that every call uses a different > rtas buffer (rtas_args). Paul Mackerras suggested using the PACA > structure for creating a per-cpu buffer for these calls. > > [...] Applied to powerpc/next. [1/2] powerpc/rtas: Move type/struct definitions from rtas.h into rtas-types.h https://git.kernel.org/powerpc/c/783a015b747f606e803b798eb8b50c73c548691d [2/2] powerpc/rtas: Implement reentrant rtas call https://git.kernel.org/powerpc/c/b664db8e3f976d9233cc9ea5e3f8a8c0bcabeb48 cheers
Patch 2 implement rtas_call_reentrant() for reentrant rtas-calls: "ibm,int-on", "ibm,int-off",ibm,get-xive" and "ibm,set-xive", according to LoPAPR Version 1.1 (March 24, 2016). For that, it's necessary that every call uses a different rtas buffer (rtas_args). Paul Mackerras suggested using the PACA structure for creating a per-cpu buffer for these calls. Patch 1 was necessary to make PACA have a 'struct rtas_args' member. Reentrant rtas calls can be useful to avoid deadlocks in crashing, where rtas-calls are needed, but some other thread crashed holding the rtas.lock. This is a backtrace of a deadlock from a kdump testing environment: #0 arch_spin_lock #1 lock_rtas () #2 rtas_call (token=8204, nargs=1, nret=1, outputs=0x0) #3 ics_rtas_mask_real_irq (hw_irq=4100) #4 machine_kexec_mask_interrupts #5 default_machine_crash_shutdown #6 machine_crash_shutdown #7 __crash_kexec #8 crash_kexec #9 oops_end Signed-off-by: Leonardo Bras <leobras.c@gmail.com> Special thanks to Nick Piggin, who have been helping me a lot with this series! --- Changes since v5: - Renames new paca member from reentrant_args to rtas_args_reentrant - Compile out rtas_args_reentrant if CONFIG_PPC_RTAS=n - new_rtas_args() is skipped (returns NULL) if CPU_FTR_HVMODE Changes since v4: - Insted of having the full buffer on PACA, adds only a pointer and allocate it during allocate_paca(), making sure it's in a memory range available for RTAS (32-bit). (Thanks Nick Piggin!) Changes since v3: - Adds protection from preemption and interruption Changes since v2: - Fixed build failure from ppc64e, by including spinlock_types.h on rtas-types.h - Improved commit messages Changes since v1: - Moved buffer from stack to PACA (as suggested by Paul Mackerras) - Added missing output bits - Improve documentation following kernel-doc format (as suggested by Nathan Lynch) Leonardo Bras (2): powerpc/rtas: Move type/struct definitions from rtas.h into rtas-types.h powerpc/rtas: Implement reentrant rtas call arch/powerpc/include/asm/paca.h | 2 + arch/powerpc/include/asm/rtas-types.h | 126 ++++++++++++++++++++++++++ arch/powerpc/include/asm/rtas.h | 119 +----------------------- arch/powerpc/kernel/rtas.c | 42 +++++++++ arch/powerpc/sysdev/xics/ics-rtas.c | 22 ++--- 5 files changed, 183 insertions(+), 128 deletions(-) create mode 100644 arch/powerpc/include/asm/rtas-types.h