Commit ffb45122 authored by Alexey Dobriyan's avatar Alexey Dobriyan Committed by Linus Torvalds

Simplify kallsyms_lookup()

Several kallsyms_lookup() pass dummy arguments but only need, say, module's
name.  Make kallsyms_lookup() accept NULLs where possible.

Also, makes picture clearer about what interfaces are needed for all symbol
resolving business.
Signed-off-by: default avatarAlexey Dobriyan <adobriyan@sw.ru>
Cc: Rusty Russell <rusty@rustcorp.com.au>
Acked-by: default avatarIngo Molnar <mingo@elte.hu>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent ea07890a
...@@ -216,11 +216,8 @@ static void unwind_frame_regs(struct unwind_frame_info *info) ...@@ -216,11 +216,8 @@ static void unwind_frame_regs(struct unwind_frame_info *info)
/* Handle some frequent special cases.... */ /* Handle some frequent special cases.... */
{ {
char symname[KSYM_NAME_LEN+1]; char symname[KSYM_NAME_LEN+1];
char *modname;
unsigned long symsize, offset;
kallsyms_lookup(info->ip, &symsize, &offset, kallsyms_lookup(info->ip, NULL, NULL, NULL, symname);
&modname, symname);
dbg("info->ip = 0x%lx, name = %s\n", info->ip, symname); dbg("info->ip = 0x%lx, name = %s\n", info->ip, symname);
......
...@@ -1217,7 +1217,6 @@ static void get_function_bounds(unsigned long pc, unsigned long *startp, ...@@ -1217,7 +1217,6 @@ static void get_function_bounds(unsigned long pc, unsigned long *startp,
{ {
unsigned long size, offset; unsigned long size, offset;
const char *name; const char *name;
char *modname;
*startp = *endp = 0; *startp = *endp = 0;
if (pc == 0) if (pc == 0)
...@@ -1225,7 +1224,7 @@ static void get_function_bounds(unsigned long pc, unsigned long *startp, ...@@ -1225,7 +1224,7 @@ static void get_function_bounds(unsigned long pc, unsigned long *startp,
if (setjmp(bus_error_jmp) == 0) { if (setjmp(bus_error_jmp) == 0) {
catch_memory_errors = 1; catch_memory_errors = 1;
sync(); sync();
name = kallsyms_lookup(pc, &size, &offset, &modname, tmpstr); name = kallsyms_lookup(pc, &size, &offset, NULL, tmpstr);
if (name != NULL) { if (name != NULL) {
*startp = pc - offset; *startp = pc - offset;
*endp = pc - offset + size; *endp = pc - offset + size;
......
...@@ -46,15 +46,15 @@ static int lookup_prev_stack_frame(unsigned long fp, unsigned long pc, ...@@ -46,15 +46,15 @@ static int lookup_prev_stack_frame(unsigned long fp, unsigned long pc,
struct pt_regs *regs) struct pt_regs *regs)
{ {
const char *sym; const char *sym;
char *modname, namebuf[128]; char namebuf[128];
unsigned long offset, size; unsigned long offset;
unsigned long prologue = 0; unsigned long prologue = 0;
unsigned long fp_displacement = 0; unsigned long fp_displacement = 0;
unsigned long fp_prev = 0; unsigned long fp_prev = 0;
unsigned long offset_r14 = 0, offset_r18 = 0; unsigned long offset_r14 = 0, offset_r18 = 0;
int i, found_prologue_end = 0; int i, found_prologue_end = 0;
sym = kallsyms_lookup(pc, &size, &offset, &modname, namebuf); sym = kallsyms_lookup(pc, NULL, &offset, NULL, namebuf);
if (!sym) if (!sym)
return -EINVAL; return -EINVAL;
......
...@@ -278,14 +278,13 @@ static int proc_pid_auxv(struct task_struct *task, char *buffer) ...@@ -278,14 +278,13 @@ static int proc_pid_auxv(struct task_struct *task, char *buffer)
*/ */
static int proc_pid_wchan(struct task_struct *task, char *buffer) static int proc_pid_wchan(struct task_struct *task, char *buffer)
{ {
char *modname;
const char *sym_name; const char *sym_name;
unsigned long wchan, size, offset; unsigned long wchan;
char namebuf[KSYM_NAME_LEN+1]; char namebuf[KSYM_NAME_LEN+1];
wchan = get_wchan(task); wchan = get_wchan(task);
sym_name = kallsyms_lookup(wchan, &size, &offset, &modname, namebuf); sym_name = kallsyms_lookup(wchan, NULL, NULL, NULL, namebuf);
if (sym_name) if (sym_name)
return sprintf(buffer, "%s", sym_name); return sprintf(buffer, "%s", sym_name);
return sprintf(buffer, "%lu", wchan); return sprintf(buffer, "%lu", wchan);
......
...@@ -214,8 +214,10 @@ static unsigned long get_symbol_pos(unsigned long addr, ...@@ -214,8 +214,10 @@ static unsigned long get_symbol_pos(unsigned long addr,
symbol_end = (unsigned long)_etext; symbol_end = (unsigned long)_etext;
} }
*symbolsize = symbol_end - symbol_start; if (symbolsize)
*offset = addr - symbol_start; *symbolsize = symbol_end - symbol_start;
if (offset)
*offset = addr - symbol_start;
return low; return low;
} }
......
...@@ -868,13 +868,13 @@ static int __kprobes show_kprobe_addr(struct seq_file *pi, void *v) ...@@ -868,13 +868,13 @@ static int __kprobes show_kprobe_addr(struct seq_file *pi, void *v)
struct kprobe *p, *kp; struct kprobe *p, *kp;
const char *sym = NULL; const char *sym = NULL;
unsigned int i = *(loff_t *) v; unsigned int i = *(loff_t *) v;
unsigned long size, offset = 0; unsigned long offset = 0;
char *modname, namebuf[128]; char *modname, namebuf[128];
head = &kprobe_table[i]; head = &kprobe_table[i];
preempt_disable(); preempt_disable();
hlist_for_each_entry_rcu(p, node, head, hlist) { hlist_for_each_entry_rcu(p, node, head, hlist) {
sym = kallsyms_lookup((unsigned long)p->addr, &size, sym = kallsyms_lookup((unsigned long)p->addr, NULL,
&offset, &modname, namebuf); &offset, &modname, namebuf);
if (p->pre_handler == aggr_pre_handler) { if (p->pre_handler == aggr_pre_handler) {
list_for_each_entry_rcu(kp, &p->list, list) list_for_each_entry_rcu(kp, &p->list, list)
......
...@@ -340,10 +340,7 @@ static const char *usage_str[] = ...@@ -340,10 +340,7 @@ static const char *usage_str[] =
const char * __get_key_name(struct lockdep_subclass_key *key, char *str) const char * __get_key_name(struct lockdep_subclass_key *key, char *str)
{ {
unsigned long offs, size; return kallsyms_lookup((unsigned long)key, NULL, NULL, NULL, str);
char *modname;
return kallsyms_lookup((unsigned long)key, &size, &offs, &modname, str);
} }
void void
......
...@@ -2098,8 +2098,10 @@ static const char *get_ksymbol(struct module *mod, ...@@ -2098,8 +2098,10 @@ static const char *get_ksymbol(struct module *mod,
if (!best) if (!best)
return NULL; return NULL;
*size = nextval - mod->symtab[best].st_value; if (size)
*offset = addr - mod->symtab[best].st_value; *size = nextval - mod->symtab[best].st_value;
if (offset)
*offset = addr - mod->symtab[best].st_value;
return mod->strtab + mod->symtab[best].st_name; return mod->strtab + mod->symtab[best].st_name;
} }
......
...@@ -40,11 +40,9 @@ static void print_name_offset(struct seq_file *m, void *sym) ...@@ -40,11 +40,9 @@ static void print_name_offset(struct seq_file *m, void *sym)
{ {
unsigned long addr = (unsigned long)sym; unsigned long addr = (unsigned long)sym;
char namebuf[KSYM_NAME_LEN+1]; char namebuf[KSYM_NAME_LEN+1];
unsigned long size, offset;
const char *sym_name; const char *sym_name;
char *modname;
sym_name = kallsyms_lookup(addr, &size, &offset, &modname, namebuf); sym_name = kallsyms_lookup(addr, NULL, NULL, NULL, namebuf);
if (sym_name) if (sym_name)
SEQ_printf(m, "%s", sym_name); SEQ_printf(m, "%s", sym_name);
else else
......
...@@ -258,11 +258,9 @@ void timer_stats_update_stats(void *timer, pid_t pid, void *startf, ...@@ -258,11 +258,9 @@ void timer_stats_update_stats(void *timer, pid_t pid, void *startf,
static void print_name_offset(struct seq_file *m, unsigned long addr) static void print_name_offset(struct seq_file *m, unsigned long addr)
{ {
char namebuf[KSYM_NAME_LEN+1]; char namebuf[KSYM_NAME_LEN+1];
unsigned long size, offset;
const char *sym_name; const char *sym_name;
char *modname;
sym_name = kallsyms_lookup(addr, &size, &offset, &modname, namebuf); sym_name = kallsyms_lookup(addr, NULL, NULL, NULL, namebuf);
if (sym_name) if (sym_name)
seq_printf(m, "%s", sym_name); seq_printf(m, "%s", sym_name);
else else
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment