Thread (78 messages) 78 messages, 4 authors, 2018-02-09

[PATCH v2 16/20] arm64: Handle shared capability entries

From: Dave.Martin@arm.com (Dave Martin)
Date: 2018-02-09 10:05:22
Also in: lkml

On Thu, Feb 08, 2018 at 12:32:56PM +0000, Robin Murphy wrote:
On 08/02/18 12:01, Dave Martin wrote:
quoted
On Thu, Feb 08, 2018 at 10:53:52AM +0000, Suzuki K Poulose wrote:
quoted
On 07/02/18 10:39, Dave Martin wrote:
quoted
On Wed, Jan 31, 2018 at 06:28:03PM +0000, Suzuki K Poulose wrote:
quoted
Some capabilities have different criteria for detection and associated
actions based on the matching criteria, even though they all share the
same capability bit. So far we have used multiple entries with the same
capability bit to handle this. This is prone to errors, as the
cpu_enable is invoked for each entry, irrespective of whether the
detection rule applies to the CPU or not. And also this complicates
other helpers, e.g, __this_cpu_has_cap.

This patch adds a wrapper entry to cover all the possible variations
of a capability and ensures :
 1) The capabilitiy is set when at least one of the entry detects
 2) Action is only taken for the entries that detects.
I guess this means that where we have a single cpu_enable() method
but complex match criteria that require multiple entries, then that
cpu_enable() method might get called multiple times on a given CPU.
A CPU executes cpu_enable() only for the "matching" entries in the list,
unlike earlier. So as long as there is a single entry "matching" the given
CPU, the cpu_enable() will not be duplicated. May be we *should* mandate
that a CPU cannot be matched by multiple entries.
quoted
Could be worth a comment if cpu_enable() methods must be robust
against this.
Could we say something like:

"Where a single capability has multiple entries, mutiple cpu_enable()
methods may be called if more than one entry matches.  Where this is
not desired, care should be taken to ensure that the entries are
mutually exclusive: for example, two entries for a single capability
that match on MIDR should be configured to match MIDR ranges that do
not overlap."

This is more verbose than I would like however.  Maybe there's a simpler
way to say it.
If we're not also talking about a capability having mutually exclusive
enable methods (it doesn't seem so, but I'm not necessarily 100% clear), how
about:

"If a cpu_enable() method is associated with multiple matches for a single
capability, care should be taken that either the match criteria are mutually
exclusive, or that the method is robust against being called multiple
times."
This is one reason why I wondered if we could pull cpu_enable() out of
the match criteria struct so that we don't duplicate it: in that case
there's no chance of multiple incompatible cpu_enable() methods.

But Suzuki is right that this would be a somewhat invasive change at
this point, and I think it's sufficient to warn about the possibility
of incompatible cpu_enable()s in a comment.

Otherwise, your text sounds good.

Cheers
---Dave
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help