The MPAM driver needs to know the size of a cache associated with a
particular CPU. The DT/ACPI agnostic way of doing this is to ask cacheinfo.
Add a helper to do this.
Signed-off-by: James Morse <james.morse@arm.com>
---
include/linux/cacheinfo.h | 20 ++++++++++++++++++++
1 file changed, 20 insertions(+)
diff --git a/include/linux/cacheinfo.h b/include/linux/cacheinfo.h
index 9c959caf8af8..3f1b6b2e25b5 100644
--- a/include/linux/cacheinfo.h
+++ b/include/linux/cacheinfo.h
@@ -148,6 +148,26 @@ static inline int get_cpu_cacheinfo_id(int cpu, int level)
return ci ? ci->id : -1;
}
+/*
+ * Get the size of the cache associated with @cpu at level @level.
+ * cpuhp lock must be held.
+ */
+static inline unsigned int get_cpu_cacheinfo_size(int cpu, int level)
+{
+ struct cpu_cacheinfo *ci = get_cpu_cacheinfo(cpu);
+ int i;
+
+ if (!ci->info_list)
+ return 0;
+
+ for (i = 0; i < ci->num_leaves; i++) {
+ if (ci->info_list[i].level == level)
+ return ci->info_list[i].size;
+ }
+
+ return 0;
+}
+
#if defined(CONFIG_ARM64) || defined(CONFIG_ARM)
#define use_arch_cache_info() (true)
#else
--
2.39.5
On Fri, 13 Jun 2025 13:03:56 +0000 James Morse <james.morse@arm.com> wrote: > The MPAM driver needs to know the size of a cache associated with a > particular CPU. The DT/ACPI agnostic way of doing this is to ask cacheinfo. > > Add a helper to do this. > > Signed-off-by: James Morse <james.morse@arm.com> > --- > include/linux/cacheinfo.h | 20 ++++++++++++++++++++ > 1 file changed, 20 insertions(+) > > diff --git a/include/linux/cacheinfo.h b/include/linux/cacheinfo.h > index 9c959caf8af8..3f1b6b2e25b5 100644 > --- a/include/linux/cacheinfo.h > +++ b/include/linux/cacheinfo.h > @@ -148,6 +148,26 @@ static inline int get_cpu_cacheinfo_id(int cpu, int level) > return ci ? ci->id : -1; > } > > +/* > + * Get the size of the cache associated with @cpu at level @level. > + * cpuhp lock must be held. To me kernel-doc would be appropriate. Particularly the return 0 thing. However there isn't any for existing cacheinfo interfaces so maybe fair enough to 'follow local style' on that. > + */ > +static inline unsigned int get_cpu_cacheinfo_size(int cpu, int level) > +{ > + struct cpu_cacheinfo *ci = get_cpu_cacheinfo(cpu); > + int i; > + > + if (!ci->info_list) > + return 0; > + > + for (i = 0; i < ci->num_leaves; i++) { > + if (ci->info_list[i].level == level) > + return ci->info_list[i].size; > + } > + > + return 0; > +} > + Why not static inline unsigned int get_cpu_cacheinfo_size(int cpu, int level) { struct cpu_cachinfo *ci = get_cpu_cacheinfo_level(cpu, lev); return ci ? ci->size; 0; } Like existing get_cpu_cacheinfo_id()? > #if defined(CONFIG_ARM64) || defined(CONFIG_ARM) > #define use_arch_cache_info() (true) > #else
Hi Jonathan, On 17/06/2025 17:28, Jonathan Cameron wrote: > On Fri, 13 Jun 2025 13:03:56 +0000 > James Morse <james.morse@arm.com> wrote: > >> The MPAM driver needs to know the size of a cache associated with a >> particular CPU. The DT/ACPI agnostic way of doing this is to ask cacheinfo. >> >> Add a helper to do this. >> diff --git a/include/linux/cacheinfo.h b/include/linux/cacheinfo.h >> index 9c959caf8af8..3f1b6b2e25b5 100644 >> --- a/include/linux/cacheinfo.h >> +++ b/include/linux/cacheinfo.h >> @@ -148,6 +148,26 @@ static inline int get_cpu_cacheinfo_id(int cpu, int level) >> return ci ? ci->id : -1; >> } >> >> +/* >> + * Get the size of the cache associated with @cpu at level @level. >> + * cpuhp lock must be held. > To me kernel-doc would be appropriate. Particularly the return 0 thing. > However there isn't any for existing cacheinfo interfaces so maybe > fair enough to 'follow local style' on that. Documentation should be the direction of travel right? I'll change this. >> + */ >> +static inline unsigned int get_cpu_cacheinfo_size(int cpu, int level) >> +{ >> + struct cpu_cacheinfo *ci = get_cpu_cacheinfo(cpu); >> + int i; >> + >> + if (!ci->info_list) >> + return 0; >> + >> + for (i = 0; i < ci->num_leaves; i++) { >> + if (ci->info_list[i].level == level) >> + return ci->info_list[i].size; >> + } >> + >> + return 0; >> +} >> + > Why not > > static inline unsigned int get_cpu_cacheinfo_size(int cpu, int level) > { > struct cpu_cachinfo *ci = get_cpu_cacheinfo_level(cpu, lev); > > return ci ? ci->size; 0; > } > > Like existing get_cpu_cacheinfo_id()? I've been dragging this around for years. Fixed. Thanks! James
© 2016 - 2025 Red Hat, Inc.