Messages in this thread Patch in this message | | | Date | Fri, 14 Nov 2008 02:30:55 +0000 (GMT) | From | Hugh Dickins <> | Subject | [PATCH 2.6.28?] 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> --- Perhaps this is too late for 2.6.28: your decision.
kernel/kallsyms.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-)
--- 2.6.28-rc4/kernel/kallsyms.c 2008-10-24 09:28:25.000000000 +0100 +++ linux/kernel/kallsyms.c 2008-11-12 11:52:44.000000000 +0000 @@ -304,17 +304,24 @@ int sprint_symbol(char *buffer, unsigned char *modname; const char *name; 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) return sprintf(buffer, "0x%lx", address); + if (name != buffer) + strcpy(buffer, name); + len = strlen(buffer); + buffer += len; + if (modname) - return sprintf(buffer, "%s+%#lx/%#lx [%s]", name, offset, - size, modname); + len += sprintf(buffer, "+%#lx/%#lx [%s]", + offset, size, modname); 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. */
| |