Messages in this thread Patch in this message | | | From | Song Shuai <> | Subject | [PATCH V2] arch_topology: Clear LLC sibling when cacheinfo teardown | Date | Tue, 14 Mar 2023 15:53:45 +0800 |
| |
The teardown of CPUHP_AP_BASE_CACHEINFO_ONLINE now only invokes free_cache_attributes() to clear share_cpu_map of cacheinfo list. At the same time, clearing cpu_topology[].llc_sibling is called quite late at the teardown code in hotplug STARTING section.
To avoid the incorrect LLC sibling masks generated, move its clearing right after free_cache_attributes().
Link: https://lore.kernel.org/linux-kernel/20230313102752.1134472-1-suagrfillet@gmail.com/ Fixes: 3fcbf1c77d08 ("arch_topology: Fix cache attributes detection in the CPU hotplug path") Signed-off-by: Song Shuai <suagrfillet@gmail.com> --- changes from V1: - fix implicit declaration of clear_llc_topology --- drivers/base/arch_topology.c | 16 ++++++++++++++-- drivers/base/cacheinfo.c | 2 ++ include/linux/arch_topology.h | 3 +++ 3 files changed, 19 insertions(+), 2 deletions(-)
diff --git a/drivers/base/arch_topology.c b/drivers/base/arch_topology.c index b1c1dd38ab01..8681654d6c07 100644 --- a/drivers/base/arch_topology.c +++ b/drivers/base/arch_topology.c @@ -769,6 +769,20 @@ void update_siblings_masks(unsigned int cpuid) } } +void clear_llc_topology(unsigned int cpu) +{ + int sib; + + for_each_cpu(sib, topology_llc_cpumask(cpu)) { + if (sib == cpu) + continue; + if (last_level_cache_is_shared(cpu, sib)) { + cpumask_clear_cpu(cpu, topology_llc_cpumask(sib)); + cpumask_clear_cpu(sib, topology_llc_cpumask(cpu)); + } + } +} + static void clear_cpu_topology(int cpu) { struct cpu_topology *cpu_topo = &cpu_topology[cpu]; @@ -811,8 +825,6 @@ void remove_cpu_topology(unsigned int cpu) cpumask_clear_cpu(cpu, topology_sibling_cpumask(sibling)); for_each_cpu(sibling, topology_cluster_cpumask(cpu)) cpumask_clear_cpu(cpu, topology_cluster_cpumask(sibling)); - for_each_cpu(sibling, topology_llc_cpumask(cpu)) - cpumask_clear_cpu(cpu, topology_llc_cpumask(sibling)); clear_cpu_topology(cpu); } diff --git a/drivers/base/cacheinfo.c b/drivers/base/cacheinfo.c index f6573c335f4c..1c276b30fd5a 100644 --- a/drivers/base/cacheinfo.c +++ b/drivers/base/cacheinfo.c @@ -19,6 +19,7 @@ #include <linux/slab.h> #include <linux/smp.h> #include <linux/sysfs.h> +#include <linux/arch_topology.h> /* pointer to per cpu cacheinfo */ static DEFINE_PER_CPU(struct cpu_cacheinfo, ci_cpu_cacheinfo); @@ -814,6 +815,7 @@ static int cacheinfo_cpu_pre_down(unsigned int cpu) cpu_cache_sysfs_exit(cpu); free_cache_attributes(cpu); + clear_llc_topology(cpu); return 0; } diff --git a/include/linux/arch_topology.h b/include/linux/arch_topology.h index a07b510e7dc5..569e05607934 100644 --- a/include/linux/arch_topology.h +++ b/include/linux/arch_topology.h @@ -89,9 +89,12 @@ void store_cpu_topology(unsigned int cpuid); const struct cpumask *cpu_coregroup_mask(int cpu); const struct cpumask *cpu_clustergroup_mask(int cpu); void update_siblings_masks(unsigned int cpu); +void clear_llc_topology(unsigned int cpu); void remove_cpu_topology(unsigned int cpuid); void reset_cpu_topology(void); int parse_acpi_topology(void); +#else +static inline void clear_llc_topology(unsigned int cpu) { } #endif #endif /* _LINUX_ARCH_TOPOLOGY_H_ */ -- 2.20.1
| |