sprint_symbol(): use less stack

sprint_symbol(), itself used when dumping stacks, has been wasting 128
bytes of stack: lookup the symbol directly into the buffer supplied by the
caller, instead of using a locally declared namebuf.

I believe the name != buffer strcpy() is obsolete: the design here dates
from when module symbol lookup pointed into a supposedly const but sadly
volatile table; nowadays it copies, but an uncalled strcpy() looks better
here than the risk of a recursive BUG_ON().

Signed-off-by: Hugh Dickins <hugh@veritas.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
Hugh Dickins 2008-11-19 15:36:36 -08:00 committed by Linus Torvalds
parent 3fa59dfbc3
commit 966c8c12dc
1 changed files with 12 additions and 5 deletions

View File

@ -304,17 +304,24 @@ int sprint_symbol(char *buffer, unsigned long address)
char *modname; char *modname;
const char *name; const char *name;
unsigned long offset, size; unsigned long offset, size;
char namebuf[KSYM_NAME_LEN]; int len;
name = kallsyms_lookup(address, &size, &offset, &modname, namebuf); name = kallsyms_lookup(address, &size, &offset, &modname, buffer);
if (!name) if (!name)
return sprintf(buffer, "0x%lx", address); return sprintf(buffer, "0x%lx", address);
if (name != buffer)
strcpy(buffer, name);
len = strlen(buffer);
buffer += len;
if (modname) if (modname)
return sprintf(buffer, "%s+%#lx/%#lx [%s]", name, offset, len += sprintf(buffer, "+%#lx/%#lx [%s]",
size, modname); offset, size, modname);
else else
return sprintf(buffer, "%s+%#lx/%#lx", name, offset, size); len += sprintf(buffer, "+%#lx/%#lx", offset, size);
return len;
} }
/* Look up a kernel symbol and print it to the kernel messages. */ /* Look up a kernel symbol and print it to the kernel messages. */