diff options
| -rw-r--r-- | kernel/extable.c | 25 | 
1 files changed, 22 insertions, 3 deletions
| diff --git a/kernel/extable.c b/kernel/extable.c index e136ed8d82ba..c46da6a47036 100644 --- a/kernel/extable.c +++ b/kernel/extable.c @@ -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) | 

