diff options
Diffstat (limited to 'kernel/trace/ftrace.c')
| -rw-r--r-- | kernel/trace/ftrace.c | 19 | 
1 files changed, 12 insertions, 7 deletions
| diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c index 33236241f236..8e842f68b9a5 100644 --- a/kernel/trace/ftrace.c +++ b/kernel/trace/ftrace.c @@ -2488,14 +2488,13 @@ ftrace_add_rec_direct(unsigned long ip, unsigned long addr,  static void call_direct_funcs(unsigned long ip, unsigned long pip,  			      struct ftrace_ops *ops, struct ftrace_regs *fregs)  { -	struct pt_regs *regs = ftrace_get_regs(fregs);  	unsigned long addr;  	addr = ftrace_find_rec_direct(ip);  	if (!addr)  		return; -	arch_ftrace_set_direct_caller(regs, addr); +	arch_ftrace_set_direct_caller(fregs, addr);  }  struct ftrace_ops direct_ops = { @@ -8258,6 +8257,10 @@ struct kallsyms_data {  	size_t found;  }; +/* This function gets called for all kernel and module symbols + * and returns 1 in case we resolved all the requested symbols, + * 0 otherwise. + */  static int kallsyms_callback(void *data, const char *name,  			     struct module *mod, unsigned long addr)  { @@ -8300,17 +8303,19 @@ static int kallsyms_callback(void *data, const char *name,  int ftrace_lookup_symbols(const char **sorted_syms, size_t cnt, unsigned long *addrs)  {  	struct kallsyms_data args; -	int err; +	int found_all;  	memset(addrs, 0, sizeof(*addrs) * cnt);  	args.addrs = addrs;  	args.syms = sorted_syms;  	args.cnt = cnt;  	args.found = 0; -	err = kallsyms_on_each_symbol(kallsyms_callback, &args); -	if (err < 0) -		return err; -	return args.found == args.cnt ? 0 : -ESRCH; + +	found_all = kallsyms_on_each_symbol(kallsyms_callback, &args); +	if (found_all) +		return 0; +	found_all = module_kallsyms_on_each_symbol(kallsyms_callback, &args); +	return found_all ? 0 : -ESRCH;  }  #ifdef CONFIG_SYSCTL |