[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <1589525800.2asfsw2zlu.astroid@bobo.none>
Date: Fri, 15 May 2020 17:30:09 +1000
From: Nicholas Piggin <npiggin@...il.com>
To: Allison Randal <allison@...utok.net>,
Benjamin Herrenschmidt <benh@...nel.crashing.org>,
"Gautham R. Shenoy" <ego@...ux.vnet.ibm.com>,
Greg Kroah-Hartman <gregkh@...uxfoundation.org>,
Leonardo Bras <leobras.c@...il.com>,
Michael Ellerman <mpe@...erman.id.au>,
Nadav Amit <namit@...are.com>,
Nathan Lynch <nathanl@...ux.ibm.com>,
Paul Mackerras <paulus@...ba.org>,
Thomas Gleixner <tglx@...utronix.de>
Cc: linux-kernel@...r.kernel.org, linuxppc-dev@...ts.ozlabs.org
Subject: Re: [PATCH v4 2/2] powerpc/rtas: Implement reentrant rtas call
Excerpts from Leonardo Bras's message of May 15, 2020 9:51 am:
> 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?
> 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.
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.
Thanks,
Nick
Powered by blists - more mailing lists