forked from luck/tmp_suning_uos_patched
symbols, stacktrace: look up init symbols after module symbols
Impact: fix incomplete stacktraces I noticed such weird stacktrace entries in lockdep dumps: [ 0.285956] {HARDIRQ-ON-W} state was registered at: [ 0.285956] [<ffffffff802bce90>] mark_irqflags+0xbe/0x125 [ 0.285956] [<ffffffff802bf2fd>] __lock_acquire+0x674/0x82d [ 0.285956] [<ffffffff802bf5b2>] lock_acquire+0xfc/0x128 [ 0.285956] [<ffffffff8135b636>] rt_spin_lock+0xc8/0xd0 [ 0.285956] [<ffffffffffffffff>] 0xffffffffffffffff The stacktrace entry is cut off after rt_spin_lock. After much debugging i found out that stacktrace entries that belong to init symbols dont get printed out, due to commit: a2da405: module: Don't report discarded init pages as kernel text. The reason is this check added to core_kernel_text(): - if (addr >= (unsigned long)_sinittext && + if (system_state == SYSTEM_BOOTING && + addr >= (unsigned long)_sinittext && addr <= (unsigned long)_einittext) return 1; This will discard inittext symbols even though their symbol table is still present and even though stacktraces done while the system was booting up might still be relevant. To not reintroduce the (not well-specified) bug addressed in that commit, first do a module symbols lookup, then a final init-symbols lookup. This will work fine on architectures that have separate address spaces for modules (such as x86) - and should not crash any other architectures either. Acked-by: Peter Zijlstra <peterz@infradead.org> Cc: Rusty Russell <rusty@rustcorp.com.au> LKML-Reference: <new-discussion> Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
parent
8144737def
commit
4a44bac1f9
|
@ -41,6 +41,14 @@ const struct exception_table_entry *search_exception_tables(unsigned long addr)
|
|||
return e;
|
||||
}
|
||||
|
||||
static inline int init_kernel_text(unsigned long addr)
|
||||
{
|
||||
if (addr >= (unsigned long)_sinittext &&
|
||||
addr <= (unsigned long)_einittext)
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
__notrace_funcgraph int core_kernel_text(unsigned long addr)
|
||||
{
|
||||
if (addr >= (unsigned long)_stext &&
|
||||
|
@ -48,8 +56,7 @@ __notrace_funcgraph int core_kernel_text(unsigned long addr)
|
|||
return 1;
|
||||
|
||||
if (system_state == SYSTEM_BOOTING &&
|
||||
addr >= (unsigned long)_sinittext &&
|
||||
addr <= (unsigned long)_einittext)
|
||||
init_kernel_text(addr))
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
|
@ -58,7 +65,19 @@ __notrace_funcgraph int __kernel_text_address(unsigned long addr)
|
|||
{
|
||||
if (core_kernel_text(addr))
|
||||
return 1;
|
||||
return __module_text_address(addr) != NULL;
|
||||
if (__module_text_address(addr))
|
||||
return 1;
|
||||
/*
|
||||
* There might be init symbols in saved stacktraces.
|
||||
* Give those symbols a chance to be printed in
|
||||
* backtraces (such as lockdep traces).
|
||||
*
|
||||
* Since we are after the module-symbols check, there's
|
||||
* no danger of address overlap:
|
||||
*/
|
||||
if (init_kernel_text(addr))
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int kernel_text_address(unsigned long addr)
|
||||
|
|
Loading…
Reference in New Issue
Block a user