Messages in this thread Patch in this message | | | From | JinHui GUO <> | Subject | Re: [PATCH] [RFC] watchdog/softlockup: Fix softlockup_stop_all() hungtask bug | Date | Wed, 22 Sep 2021 10:49:05 +0800 |
| |
> x86_64 allnoconfig:
> ld: arch/x86/kernel/cpu/cacheinfo.o: in function `populate_cache_leaves': > cacheinfo.c:(.text+0xa27): undefined reference to `cpu_llc_shared_map' > ld: cacheinfo.c:(.text+0xa49): undefined reference to `cpu_llc_shared_map'
> Because the new for_each_cpu() now references `mask' and some code isn't > able to handle that change. There are probably other instances of this > across all our architectures and configs.
There is another bug in file arch/x86/include/asm/smp.h. The per-cpu value cpu_llc_shared_map is defined in file arch/x86/kernel/smpboot.c. But the file arch/x86/kernel/smpboot.c would not be compiled while CONFIG_SMP is not defined.
declared in file arch/x86/include/asm/smp.h: DECLARE_PER_CPU_READ_MOSTLY(cpumask_var_t, cpu_llc_shared_map);
defined in file arch/x86/kernel/smpboot.c: DEFINE_PER_CPU_READ_MOSTLY(cpumask_var_t, cpu_llc_shared_map);
the stack: cpu_llc_shared_map cpu_llc_shared_mask __cache_amd_cpumap_setup __cache_cpumap_setup populate_cache_leaves
CONFIG_SMP in makefile arch/x86/kernel/Makefile: obj-$(CONFIG_SMP) += smpboot.o
cpu_llc_shared_mask is just used in arch/x86/kernel/cpu/cacheinfo.c by for_each_cpu while CONFIG_SMP is not defined: ./arch/x86/kernel/cpu/cacheinfo.c:889: for_each_cpu(i, cpu_llc_shared_mask(cpu)) { ./arch/x86/kernel/cpu/cacheinfo.c:894: for_each_cpu(sibling, cpu_llc_shared_mask(cpu)) { ./arch/x86/include/asm/smp.h:22:static inline struct cpumask *cpu_llc_shared_mask(int cpu)
It can be fixed just as follow:
diff --git a/arch/x86/include/asm/smp.h b/arch/x86/include/asm/smp.h1 index 630ff08532be..f5d3ca5696b3 100644 --- a/arch/x86/include/asm/smp.h +++ b/arch/x86/include/asm/smp.h @@ -21,7 +21,12 @@ DECLARE_PER_CPU_READ_MOSTLY(int, cpu_number);
static inline struct cpumask *cpu_llc_shared_mask(int cpu) { +#ifdef CONFIG_SMP return per_cpu(cpu_llc_shared_map, cpu); +#else + /* cpu_llc_shared_map is not defined while !CONFIG_SMP */ + return cpu_all_mask; +#endif }
DECLARE_EARLY_PER_CPU_READ_MOSTLY(u16, x86_cpu_to_apicid);
| |