[PATCH 4/5] cacheinfo: Expose the code to generate a cache-id from a device_node

Shaopeng Tan (Fujitsu) tan.shaopeng at fujitsu.com
Thu Jun 26 22:54:30 PDT 2025


Hello James

> On Fri, 13 Jun 2025 13:03:55 +0000
> James Morse <james.morse at arm.com> wrote:
> 
> > The MPAM driver identifies caches by id for use with resctrl. It needs
> > to know the cache-id when probe-ing, but the value isn't set in
> > cacheinfo until the corresponding CPU comes online.
> >
> > Expose the code that generates the cache-id. This allows the MPAM
> > driver to determine the properties of the caches without waiting for
> > all CPUs to come online.
> >
> > Signed-off-by: James Morse <james.morse at arm.com>
> Feels to me like this needs to come with the user.
> The earlier patches at least expose it via existing infrastructure this isn't used
> at all yet...
> 
> > ---
> >  drivers/base/cacheinfo.c  | 15 +++++++++++----
> > include/linux/cacheinfo.h |  1 +
> >  2 files changed, 12 insertions(+), 4 deletions(-)
> >
> > diff --git a/drivers/base/cacheinfo.c b/drivers/base/cacheinfo.c index
> > d8e5b4c7156c..6316d80abab8 100644
> > --- a/drivers/base/cacheinfo.c
> > +++ b/drivers/base/cacheinfo.c
> > @@ -188,7 +188,7 @@ static bool cache_node_is_unified(struct cacheinfo
> *this_leaf,
> >  #define arch_compact_of_hwid(_x)	(_x)
> >  #endif
> >
> > -static void cache_of_set_id(struct cacheinfo *this_leaf, struct
> > device_node *np)
> > +unsigned long cache_of_get_id(struct device_node *np)
> Bit confusing to have cache_of_set_id() call cache_of_get_id() like this because
> they are in no way mirrors of each other.   Rename?
> (and naturally I'm providing no suggestions :)
> 
> >  {
> >  	struct device_node *cpu;
> >  	u32 min_id = ~0;
> > @@ -200,7 +200,7 @@ static void cache_of_set_id(struct cacheinfo *this_leaf,
> struct device_node *np)
> >  		id = arch_compact_of_hwid(id);
> >  		if (FIELD_GET(GENMASK_ULL(63, 32), id)) {
Since "id" was compressed into 32bits by the function arch_compact_of_hwid(),
is this required?

Best regards,
Shaopeng TAN

> >  			of_node_put(cpu);
> > -			return;
> > +			return ~0UL;
> >  		}
> >  		while (1) {
> >  			if (!cache_node)
> > @@ -214,8 +214,15 @@ static void cache_of_set_id(struct cacheinfo
> *this_leaf, struct device_node *np)
> >  		}
> >  	}
> >
> > -	if (min_id != ~0) {
> > -		this_leaf->id = min_id;
> > +	return min_id;
> > +}
> > +
> > +static void cache_of_set_id(struct cacheinfo *this_leaf, struct
> > +device_node *np) {
> > +	unsigned long id = cache_of_get_id(np);
> > +
> > +	if (id != ~0UL) {
> > +		this_leaf->id = id;
> >  		this_leaf->attributes |= CACHE_ID;
> >  	}
> >  }
> > diff --git a/include/linux/cacheinfo.h b/include/linux/cacheinfo.h
> > index c8f4f0a0b874..9c959caf8af8 100644
> > --- a/include/linux/cacheinfo.h
> > +++ b/include/linux/cacheinfo.h
> > @@ -112,6 +112,7 @@ int acpi_get_cache_info(unsigned int cpu,  #endif
> >
> >  const struct attribute_group *cache_get_priv_group(struct cacheinfo
> > *this_leaf);
> > +unsigned long cache_of_get_id(struct device_node *np);
> >
> >  /*
> >   * Get the cacheinfo structure for the cache associated with @cpu at
> 
> 




More information about the linux-arm-kernel mailing list