lkml.org 
[lkml]   [2011]   [Feb]   [17]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[tip:perf/core] tracing/syscalls: Allow arch specific syscall symbol matching
    Commit-ID:  b2d55496818d64310b9f5486d4eea76ea614d7f8
    Gitweb: http://git.kernel.org/tip/b2d55496818d64310b9f5486d4eea76ea614d7f8
    Author: Ian Munsie <imunsie@au1.ibm.com>
    AuthorDate: Thu, 3 Feb 2011 14:27:23 +1100
    Committer: Steven Rostedt <rostedt@goodmis.org>
    CommitDate: Mon, 7 Feb 2011 21:29:03 -0500

    tracing/syscalls: Allow arch specific syscall symbol matching

    Some architectures have unusual symbol names and the generic code to
    match the symbol name with the function name for the syscall metadata
    will fail. For example, symbols on PPC64 start with a period and the
    generic code will fail to match them.

    This patch moves the match logic out into a separate function which an
    arch can override by defining ARCH_HAS_SYSCALL_MATCH_SYM_NAME in
    asm/ftrace.h and implementing arch_syscall_match_sym_name.

    Signed-off-by: Ian Munsie <imunsie@au1.ibm.com>
    LKML-Reference: <1296703645-18718-5-git-send-email-imunsie@au1.ibm.com>
    Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
    ---
    Documentation/trace/ftrace-design.txt | 4 ++++
    kernel/trace/trace_syscalls.c | 21 ++++++++++++++-------
    2 files changed, 18 insertions(+), 7 deletions(-)

    diff --git a/Documentation/trace/ftrace-design.txt b/Documentation/trace/ftrace-design.txt
    index 6fca17b..79fcafc 100644
    --- a/Documentation/trace/ftrace-design.txt
    +++ b/Documentation/trace/ftrace-design.txt
    @@ -250,6 +250,10 @@ You need very few things to get the syscalls tracing in an arch.
    - If the system call table on this arch is more complicated than a simple array
    of addresses of the system calls, implement an arch_syscall_addr to return
    the address of a given system call.
    +- If the symbol names of the system calls do not match the function names on
    + this arch, define ARCH_HAS_SYSCALL_MATCH_SYM_NAME in asm/ftrace.h and
    + implement arch_syscall_match_sym_name with the appropriate logic to return
    + true if the function name corresponds with the symbol name.
    - Tag this arch as HAVE_SYSCALL_TRACEPOINTS.


    diff --git a/kernel/trace/trace_syscalls.c b/kernel/trace/trace_syscalls.c
    index af83154..86a23e7 100644
    --- a/kernel/trace/trace_syscalls.c
    +++ b/kernel/trace/trace_syscalls.c
    @@ -60,6 +60,19 @@ extern struct syscall_metadata *__stop_syscalls_metadata[];

    static struct syscall_metadata **syscalls_metadata;

    +#ifndef ARCH_HAS_SYSCALL_MATCH_SYM_NAME
    +static inline bool arch_syscall_match_sym_name(const char *sym, const char *name)
    +{
    + /*
    + * Only compare after the "sys" prefix. Archs that use
    + * syscall wrappers may have syscalls symbols aliases prefixed
    + * with "SyS" instead of "sys", leading to an unwanted
    + * mismatch.
    + */
    + return !strcmp(sym + 3, name + 3);
    +}
    +#endif
    +
    static __init struct syscall_metadata *
    find_syscall_meta(unsigned long syscall)
    {
    @@ -73,13 +86,7 @@ find_syscall_meta(unsigned long syscall)
    kallsyms_lookup(syscall, NULL, NULL, NULL, str);

    for ( ; start < stop; start++) {
    - /*
    - * Only compare after the "sys" prefix. Archs that use
    - * syscall wrappers may have syscalls symbols aliases prefixed
    - * with "SyS" instead of "sys", leading to an unwanted
    - * mismatch.
    - */
    - if ((*start)->name && !strcmp((*start)->name + 3, str + 3))
    + if ((*start)->name && arch_syscall_match_sym_name(str, (*start)->name))
    return *start;
    }
    return NULL;

    \
     
     \ /
      Last update: 2011-02-17 16:03    [W:0.027 / U:60.724 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site