aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/locking
diff options
context:
space:
mode:
authorGerald Schaefer <gerald.schaefer@de.ibm.com>2019-04-18 10:24:50 -0400
committerMartin Schwidefsky <schwidefsky@de.ibm.com>2019-04-29 04:47:10 -0400
commit7a5da02de8d6eafba99556f8c98e5313edebb449 (patch)
treea65d2d59ec15717701fdb00a82dafeb418726593 /kernel/locking
parentb2d24b97b2a9691351920e700bfda4368c177232 (diff)
locking/lockdep: check for freed initmem in static_obj()
The following warning occurred on s390: WARNING: CPU: 0 PID: 804 at kernel/locking/lockdep.c:1025 lockdep_register_key+0x30/0x150 This is because the check in static_obj() assumes that all memory within [_stext, _end] belongs to static objects, which at least for s390 isn't true. The init section is also part of this range, and freeing it allows the buddy allocator to allocate memory from it. We have virt == phys for the kernel on s390, so that such allocations would then have addresses within the range [_stext, _end]. To fix this, introduce arch_is_kernel_initmem_freed(), similar to arch_is_kernel_text/data(), and add it to the checks in static_obj(). This will always return 0 on architectures that do not define arch_is_kernel_initmem_freed. On s390, it will return 1 if initmem has been freed and the address is in the range [__init_begin, __init_end]. Signed-off-by: Gerald Schaefer <gerald.schaefer@de.ibm.com> Reviewed-by: Heiko Carstens <heiko.carstens@de.ibm.com> Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Diffstat (limited to 'kernel/locking')
-rw-r--r--kernel/locking/lockdep.c3
1 files changed, 3 insertions, 0 deletions
diff --git a/kernel/locking/lockdep.c b/kernel/locking/lockdep.c
index 34cdcbedda49..22a99530983e 100644
--- a/kernel/locking/lockdep.c
+++ b/kernel/locking/lockdep.c
@@ -649,6 +649,9 @@ static int static_obj(const void *obj)
649 end = (unsigned long) &_end, 649 end = (unsigned long) &_end,
650 addr = (unsigned long) obj; 650 addr = (unsigned long) obj;
651 651
652 if (arch_is_kernel_initmem_freed(addr))
653 return 0;
654
652 /* 655 /*
653 * static variable? 656 * static variable?
654 */ 657 */