Thread (5 messages) flat view 5 messages, 2 authors, 2020-05-16

Re: [PATCH v4 2/2] powerpc/rtas: Implement reentrant rtas call

From: Leonardo Bras <hidden>
Date: 2020-05-16 04:08:46
Also in: lkml

Hello Nick,

On Fri, 2020-05-15 at 17:30 +1000, Nicholas Piggin wrote:
Excerpts from Leonardo Bras's message of May 15, 2020 9:51 am:
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 cpu doing such rtas call.
What about rtas_call_unlocked? Do the callers need to take the rtas 
lock?

Machine checks must call ibm,nmi-interlock too, which we really don't 
want to take a lock for either. Hopefully that's in a class of its own
and we can essentially ignore with respect to other rtas calls.

The spec is pretty vague too :(

"The ibm,get-xive call must be reentrant to the number of processors on 
the platform."

This suggests ibm,get-xive can be called concurrently by multiple
processors. It doesn't say anything about being re-entrant against any 
of the other re-entrant calls. Maybe that could be reasonably assumed,
but I don't know if it's reasonable to assume it can be called 
concurrently with a *non-reentrant* call, is it?
This was discussed on a previous version of the patchset:

https://lore.kernel.org/linuxppc-dev/875zcy2v8o.fsf@linux.ibm.com/ (local)

He checked with partition firmware development and these calls can be
used concurrently with arbitrary other RTAS calls.
quoted
For this, it was suggested to add the buffer (struct rtas_args)
in the PACA struct, so each cpu can have it's own buffer.
You can't do this, paca is not limited to RTAS_INSTANTIATE_MAX.
Which is good, because I didn't want you to add another 88 bytes to the 
paca :) Can you make it a pointer and allocate it separately? Check
the slb_shadow allocation, you could use a similar pattern.
Sure, I will send the next version with this change.
The other option would be to have just one more rtas args, and have the 
crashing CPU always that. That would skirt the re-entrancy issue -- the
concurrency is only ever a last resort. Would be a bit tricker though.
It seems a good idea, but I would like to try the previous alternative
first.
Thanks,
Nick
Thank you Nick! 
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help