4.1.42-rt50-rc1 stable review patch. If you have any objection to the inclusion of this patch, let me know. --- 8< --- 8< --- 8< --- From: Peter Zijlstra <peterz@xxxxxxxxxxxxx> Since commit 383776fa7527 ("locking/lockdep: Handle statically initialized PER_CPU locks properly") we try to collapse per-cpu locks into a single class by giving them all the same key. For this key we choose the canonical address of the per-cpu object, which would be the offset into the per-cpu area. This has two problems: - there is a case where we run !0 lock->key through static_obj() and expect this to pass; it doesn't for canonical pointers. - 0 is a valid canonical address. Cure both issues by redefining the canonical address as the address of the per-cpu variable on the boot CPU. Since I didn't want to rely on CPU0 being the boot-cpu, or even existing at all, track the boot CPU in a variable. Fixes: 383776fa7527 ("locking/lockdep: Handle statically initialized PER_CPU locks properly") Reported-by: kernel test robot <fengguang.wu@xxxxxxxxx> Signed-off-by: Peter Zijlstra (Intel) <peterz@xxxxxxxxxxxxx> Tested-by: Borislav Petkov <bp@xxxxxxx> Cc: Sebastian Andrzej Siewior <bigeasy@xxxxxxxxxxxxx> Cc: linux-mm@xxxxxxxxx Cc: wfg@xxxxxxxxxxxxxxx Cc: kernel test robot <fengguang.wu@xxxxxxxxx> Cc: LKP <lkp@xxxxxx> Link: http://lkml.kernel.org/r/20170320114108.kbvcsuepem45j5cr@xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx Signed-off-by: Thomas Gleixner <tglx@xxxxxxxxxxxxx> (cherry picked from commit c9fe9196079f738c89c3ffcdce3fbe142ac3f3c4) Signed-off-by: Julia Cartwright <julia@xxxxxx> --- include/linux/smp.h | 12 ++++++++++++ init/main.c | 8 ++++++++ kernel/module.c | 6 +++++- mm/percpu.c | 5 ++++- 4 files changed, 29 insertions(+), 2 deletions(-) diff --git a/include/linux/smp.h b/include/linux/smp.h index e6ab36aeaaab..cbf6836524dc 100644 --- a/include/linux/smp.h +++ b/include/linux/smp.h @@ -120,6 +120,13 @@ extern unsigned int setup_max_cpus; extern void __init setup_nr_cpu_ids(void); extern void __init smp_init(void); +extern int __boot_cpu_id; + +static inline int get_boot_cpu_id(void) +{ + return __boot_cpu_id; +} + #else /* !SMP */ static inline void smp_send_stop(void) { } @@ -158,6 +165,11 @@ static inline void smp_init(void) { up_late_init(); } static inline void smp_init(void) { } #endif +static inline int get_boot_cpu_id(void) +{ + return 0; +} + #endif /* !SMP */ /* diff --git a/init/main.c b/init/main.c index 0486a8e11fc0..e1bae15a2154 100644 --- a/init/main.c +++ b/init/main.c @@ -451,6 +451,10 @@ void __init parse_early_param(void) * Activate the first processor. */ +#ifdef CONFIG_SMP +int __boot_cpu_id; +#endif + static void __init boot_cpu_init(void) { int cpu = smp_processor_id(); @@ -459,6 +463,10 @@ static void __init boot_cpu_init(void) set_cpu_active(cpu, true); set_cpu_present(cpu, true); set_cpu_possible(cpu, true); + +#ifdef CONFIG_SMP + __boot_cpu_id = cpu; +#endif } void __init __weak smp_setup_processor_id(void) diff --git a/kernel/module.c b/kernel/module.c index a7ac858fd1a1..982c57b2c2a1 100644 --- a/kernel/module.c +++ b/kernel/module.c @@ -542,8 +542,12 @@ bool __is_module_percpu_address(unsigned long addr, unsigned long *can_addr) void *va = (void *)addr; if (va >= start && va < start + mod->percpu_size) { - if (can_addr) + if (can_addr) { *can_addr = (unsigned long) (va - start); + *can_addr += (unsigned long) + per_cpu_ptr(mod->percpu, + get_boot_cpu_id()); + } preempt_enable(); return true; } diff --git a/mm/percpu.c b/mm/percpu.c index 4146b00bfde7..b41c3960d5fb 100644 --- a/mm/percpu.c +++ b/mm/percpu.c @@ -1297,8 +1297,11 @@ bool __is_kernel_percpu_address(unsigned long addr, unsigned long *can_addr) void *va = (void *)addr; if (va >= start && va < start + static_size) { - if (can_addr) + if (can_addr) { *can_addr = (unsigned long) (va - start); + *can_addr += (unsigned long) + per_cpu_ptr(base, get_boot_cpu_id()); + } return true; } } -- 2.13.1 -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@xxxxxxxxx. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@xxxxxxxxx"> email@xxxxxxxxx </a>