Skip to content

Commit

Permalink
lockdep: fix static memory detection even more
Browse files Browse the repository at this point in the history
commit 0a6b58c upstream.

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 commit bac59d1 ("x86/setup: Fix static
memory detection").

Link: https://lkml.kernel.org/r/ZNqrLRaOi/3wPAdp@p100
Fixes: bac59d1 ("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>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
  • Loading branch information
hdeller authored and gregkh committed Sep 2, 2023
1 parent c8df256 commit 23520b4
Show file tree
Hide file tree
Showing 2 changed files with 14 additions and 40 deletions.
18 changes: 0 additions & 18 deletions arch/x86/include/asm/sections.h
Original file line number Diff line number Diff line change
Expand Up @@ -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>

Expand All @@ -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 */
36 changes: 14 additions & 22 deletions kernel/locking/lockdep.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;

/*
* keys are allowed in the __ro_after_init section.
*/
if (is_kernel_rodata(addr))
return 1;

/*
* static variable?
* in initdata section and used during bootup only?
* NOTE: On some platforms the initdata section is
* outside of the _stext ... _end range.
*/
if ((addr >= start) && (addr < end))
if (system_state < SYSTEM_FREEING_INITMEM &&
init_section_contains((void *)addr, 1))
return 1;

/*
Expand Down

0 comments on commit 23520b4

Please sign in to comment.