Re: [PATCH 1/1] powerpc/rtas: Implement reentrant rtas call
From: Leonardo Bras <hidden>
Date: 2020-05-13 04:32:21
Also in:
lkml
Hello Nathan, thanks for the feedback! On Fri, 2020-04-10 at 14:28 -0500, Nathan Lynch wrote:
Leonardo Bras [off-list ref] writes:quoted
Implement rtas_call_reentrant() for reentrant rtas-calls: "ibm,int-on", "ibm,int-off",ibm,get-xive" and "ibm,set-xive". On LoPAPR Version 1.1 (March 24, 2016), from 7.3.10.1 to 7.3.10.4, items 2 and 3 say: 2 - For the PowerPC External Interrupt option: The * call must be reentrant to the number of processors on the platform. 3 - For the PowerPC External Interrupt option: The * argument call buffer for each simultaneous call must be physically unique. So, these rtas-calls can be called in a lockless way, if using a different buffer for each call.
From the language in the spec it's clear that these calls are intended to be reentrant with respect to themselves, but it's less clear to me that they are safe to call simultaneously with respect to each other or arbitrary other RTAS methods.
In my viewpoint, being reentrant to themselves, without being reentrant to others would be very difficult to do, considering the way the rtas_call is crafted to work. I mean, I have no experience in rtas code, it's my viewpoint. In my thoughts there is something like this: common_path -> selects function by token -> reentrant function |-> non-reentrant function If there is one function that is reentrant, it means the common_path and function selection by token would need to be reentrant too.
quoted
This can be useful to avoid deadlocks in crashing, where rtas-calls are needed, but some other thread crashed holding the rtas.lock.Are these calls commonly used in the crash-handling path? Is this addressing a real issue you've seen?
Yes, I noticed deadlocks during crashes, like this one: #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 On ics_rtas_mask_real_irq() we have both ibm_int_off and ibm_set_xive, so it makes sense to also add ibm_int_on and ibm_get_xive as reentrant too. Full discussion available on this thread: http://patchwork.ozlabs.org/project/linuxppc-dev/patch/20200401000020.590447-1-leonardo@linux.ibm.com/
quoted
+/* + * Used for reentrant rtas calls. + * According to LoPAR documentation, only "ibm,int-on", "ibm,int-off", + * "ibm,get-xive" and "ibm,set-xive" are currently reentrant. + * Reentrant calls need their own rtas_args buffer, so not using rtas.args. + */Please use kernel-doc format in new code.
Sure, v2 is going to be fixed.
quoted
+int rtas_call_reentrant(int token, int nargs, int nret, int *outputs, ...) +{ + va_list list; + struct rtas_args rtas_args; + + if (!rtas.entry || token == RTAS_UNKNOWN_SERVICE) + return -1; + + va_start(list, outputs); + va_rtas_call_unlocked(&rtas_args, token, nargs, nret, list); + va_end(list);No, I don't think you can place the RTAS argument buffer on the stack: 7.2.7, Software Implementation Note: | The OS must be aware that the effective address range for RTAS is 4 | GB when instantiated in 32-bit mode and the OS should not pass RTAS | addresses or blocks of data which might fall outside of this range.
Agree, moved to PACA. I will send a v2 soon, it will be a 2-patch patchset. Best regards, Leonardo Bras
Attachments
- signature.asc [application/pgp-signature] 833 bytes