lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening linux-cve-announce PHC | |
Open Source and information security mailing list archives
| ||
|
Date: Wed, 22 Sep 2021 10:49:05 +0800 From: JinHui GUO <guojinhui@...wei.com> To: <akpm@...ux-foundation.org> CC: <guojinhui@...wei.com>, <linux-kernel@...r.kernel.org>, <peterz@...radead.org>, <pmladek@...e.com>, <valentin.schneider@....com> Subject: Re: [PATCH] [RFC] watchdog/softlockup: Fix softlockup_stop_all() hungtask bug > 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);
Powered by blists - more mailing lists