mirror of
https://github.com/torvalds/linux.git
synced 2024-11-21 19:41:42 +00:00
lockdep: fix static memory detection even more
On the parisc architecture, lockdep reports for all static objects which are in the __initdata section (e.g. "setup_done" in devtmpfs, "kthreadd_done" in init/main.c) this warning: INFO: trying to register non-static key. The warning itself is wrong, because those objects are in the __initdata section, but the section itself is on parisc outside of range from _stext to _end, which is why the static_obj() functions returns a wrong answer. While fixing this issue, I noticed that the whole existing check can be simplified a lot. Instead of checking against the _stext and _end symbols (which include code areas too) just check for the .data and .bss segments (since we check a data object). This can be done with the existing is_kernel_core_data() macro. In addition objects in the __initdata section can be checked with init_section_contains(), and is_kernel_rodata() allows keys to be in the _ro_after_init section. This partly reverts and simplifies commitbac59d18c7
("x86/setup: Fix static memory detection"). Link: https://lkml.kernel.org/r/ZNqrLRaOi/3wPAdp@p100 Fixes:bac59d18c7
("x86/setup: Fix static memory detection") Signed-off-by: Helge Deller <deller@gmx.de> Cc: Borislav Petkov <bp@suse.de> Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Cc: Guenter Roeck <linux@roeck-us.net> Cc: Peter Zijlstra <peterz@infradead.org> Cc: "Rafael J. Wysocki" <rafael@kernel.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
This commit is contained in:
parent
6655360923
commit
0a6b58c5cd
@ -2,8 +2,6 @@
|
||||
#ifndef _ASM_X86_SECTIONS_H
|
||||
#define _ASM_X86_SECTIONS_H
|
||||
|
||||
#define arch_is_kernel_initmem_freed arch_is_kernel_initmem_freed
|
||||
|
||||
#include <asm-generic/sections.h>
|
||||
#include <asm/extable.h>
|
||||
|
||||
@ -18,20 +16,4 @@ extern char __end_of_kernel_reserve[];
|
||||
|
||||
extern unsigned long _brk_start, _brk_end;
|
||||
|
||||
static inline bool arch_is_kernel_initmem_freed(unsigned long addr)
|
||||
{
|
||||
/*
|
||||
* If _brk_start has not been cleared, brk allocation is incomplete,
|
||||
* and we can not make assumptions about its use.
|
||||
*/
|
||||
if (_brk_start)
|
||||
return 0;
|
||||
|
||||
/*
|
||||
* After brk allocation is complete, space between _brk_end and _end
|
||||
* is available for allocation.
|
||||
*/
|
||||
return addr >= _brk_end && addr < (unsigned long)&_end;
|
||||
}
|
||||
|
||||
#endif /* _ASM_X86_SECTIONS_H */
|
||||
|
@ -819,34 +819,26 @@ static int very_verbose(struct lock_class *class)
|
||||
* Is this the address of a static object:
|
||||
*/
|
||||
#ifdef __KERNEL__
|
||||
/*
|
||||
* Check if an address is part of freed initmem. After initmem is freed,
|
||||
* memory can be allocated from it, and such allocations would then have
|
||||
* addresses within the range [_stext, _end].
|
||||
*/
|
||||
#ifndef arch_is_kernel_initmem_freed
|
||||
static int arch_is_kernel_initmem_freed(unsigned long addr)
|
||||
{
|
||||
if (system_state < SYSTEM_FREEING_INITMEM)
|
||||
return 0;
|
||||
|
||||
return init_section_contains((void *)addr, 1);
|
||||
}
|
||||
#endif
|
||||
|
||||
static int static_obj(const void *obj)
|
||||
{
|
||||
unsigned long start = (unsigned long) &_stext,
|
||||
end = (unsigned long) &_end,
|
||||
addr = (unsigned long) obj;
|
||||
unsigned long addr = (unsigned long) obj;
|
||||
|
||||
if (arch_is_kernel_initmem_freed(addr))
|
||||
return 0;
|
||||
if (is_kernel_core_data(addr))
|
||||
return 1;
|
||||
|
||||
/*
|
||||
* static variable?
|
||||
* keys are allowed in the __ro_after_init section.
|
||||
*/
|
||||
if ((addr >= start) && (addr < end))
|
||||
if (is_kernel_rodata(addr))
|
||||
return 1;
|
||||
|
||||
/*
|
||||
* in initdata section and used during bootup only?
|
||||
* NOTE: On some platforms the initdata section is
|
||||
* outside of the _stext ... _end range.
|
||||
*/
|
||||
if (system_state < SYSTEM_FREEING_INITMEM &&
|
||||
init_section_contains((void *)addr, 1))
|
||||
return 1;
|
||||
|
||||
/*
|
||||
|
Loading…
Reference in New Issue
Block a user