Hi Lorenzo, On 10/09/2025 17:06, Lorenzo Pieralisi wrote: > On Fri, Aug 22, 2025 at 03:30:21PM +0000, James Morse wrote: >> MPAM identifies CPUs by the cache_id in the PPTT cache structure. >> >> The driver needs to know which CPUs are associated with the cache, >> the CPUs may not all be online, so cacheinfo does not have the >> information. >> >> Add a helper to pull this information out of the PPTT. >> diff --git a/drivers/acpi/pptt.c b/drivers/acpi/pptt.c >> index 660457644a5b..cb93a9a7f9b6 100644 >> --- a/drivers/acpi/pptt.c >> +++ b/drivers/acpi/pptt.c >> @@ -971,3 +971,65 @@ int find_acpi_cache_level_from_id(u32 cache_id) >> >> return -ENOENT; >> } >> + >> +/** >> + * acpi_pptt_get_cpumask_from_cache_id() - Get the cpus associated with the >> + * specified cache >> + * @cache_id: The id field of the unified cache >> + * @cpus: Where to build the cpumask >> + * >> + * Determine which CPUs are below this cache in the PPTT. This allows the property >> + * to be found even if the CPUs are offline. >> + * >> + * The PPTT table must be rev 3 or later, >> + * >> + * Return: -ENOENT if the PPTT doesn't exist, or the cache cannot be found. >> + * Otherwise returns 0 and sets the cpus in the provided cpumask. >> + */ >> +int acpi_pptt_get_cpumask_from_cache_id(u32 cache_id, cpumask_t *cpus) >> +{ >> + u32 acpi_cpu_id; >> + int level, cpu, num_levels; >> + struct acpi_pptt_cache *cache; >> + struct acpi_pptt_cache_v1 *cache_v1; >> + struct acpi_pptt_processor *cpu_node; >> + struct acpi_table_header *table __free(acpi_table) = acpi_get_table_ret(ACPI_SIG_PPTT, 0); >> + >> + cpumask_clear(cpus); >> + >> + if (IS_ERR(table)) >> + return -ENOENT; >> + >> + if (table->revision < 3) >> + return -ENOENT; >> + >> + /* >> + * If we found the cache first, we'd still need to walk from each cpu. >> + */ >> + for_each_possible_cpu(cpu) { >> + acpi_cpu_id = get_acpi_id_for_cpu(cpu); >> + cpu_node = acpi_find_processor_node(table, acpi_cpu_id); >> + if (!cpu_node) >> + return 0; > > If for a possible cpu you don't get an acpi_pptt_processor node we return 0, > is that correct ? Should not the loop continue ? Forgive me if that's a > dumb question. That looks like me throwing my hands up in the air and bailing out! Yes, the loop continue-ing would be better as only possible CPUs that are missing a PPTT description (...and cache hierarchy...) would be missing form the bitmap. It's probably worth a WARN_ON_ONCE() too. Thanks for spotting that! >> + num_levels = acpi_count_levels(table, cpu_node, NULL); >> + >> + /* Start at 1 for L1 */ >> + for (level = 1; level <= num_levels; level++) { >> + cache = acpi_find_cache_node(table, acpi_cpu_id, >> + ACPI_PPTT_CACHE_TYPE_UNIFIED, >> + level, &cpu_node); >> + if (!cache) >> + continue; >> + >> + cache_v1 = ACPI_ADD_PTR(struct acpi_pptt_cache_v1, >> + cache, >> + sizeof(struct acpi_pptt_cache)); >> + >> + if (cache->flags & ACPI_PPTT_CACHE_ID_VALID && >> + cache_v1->cache_id == cache_id) >> + cpumask_set_cpu(cpu, cpus); >> + } >> + } >> + >> + return 0; >> +} >> diff --git a/include/linux/acpi.h b/include/linux/acpi.h >> index 30c10b1dcdb2..4ad08f5f1d83 100644 >> --- a/include/linux/acpi.h >> +++ b/include/linux/acpi.h >> @@ -1555,6 +1555,7 @@ int find_acpi_cpu_topology_package(unsigned int cpu); >> @@ -1582,6 +1583,11 @@ static inline int find_acpi_cache_level_from_id(u32 cache_id) >> { >> return -EINVAL; >> } >> +static inline int acpi_pptt_get_cpumask_from_cache_id(u32 cache_id, >> + cpumask_t *cpus) >> +{ >> + return -EINVAL; > > Nit: You might want the return value here to be coherent with what the function > documentation states (ie return -ENOENT;) Makes sense, > Other than that: > > Reviewed-by: Lorenzo Pieralisi <lpieralisi@xxxxxxxxxx> Thanks! James