lkml.org 
[lkml]   [2013]   [Jul]   [26]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[ 42/45] tracing: Fix irqs-off tag display in syscall tracing
    Date
    3.0-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: "zhangwei(Jovi)" <jovi.zhangwei@huawei.com>

    commit 11034ae9c20f4057a6127fc965906417978e69b2 upstream.

    All syscall tracing irqs-off tags are wrong, the syscall enter entry doesn't
    disable irqs.

    [root@jovi tracing]#echo "syscalls:sys_enter_open" > set_event
    [root@jovi tracing]# cat trace
    # tracer: nop
    #
    # entries-in-buffer/entries-written: 13/13 #P:2
    #
    # _-----=> irqs-off
    # / _----=> need-resched
    # | / _---=> hardirq/softirq
    # || / _--=> preempt-depth
    # ||| / delay
    # TASK-PID CPU# |||| TIMESTAMP FUNCTION
    # | | | |||| | |
    irqbalance-513 [000] d... 56115.496766: sys_open(filename: 804e1a6, flags: 0, mode: 1b6)
    irqbalance-513 [000] d... 56115.497008: sys_open(filename: 804e1bb, flags: 0, mode: 1b6)
    sendmail-771 [000] d... 56115.827982: sys_open(filename: b770e6d1, flags: 0, mode: 1b6)

    The reason is syscall tracing doesn't record irq_flags into buffer.
    The proper display is:

    [root@jovi tracing]#echo "syscalls:sys_enter_open" > set_event
    [root@jovi tracing]# cat trace
    # tracer: nop
    #
    # entries-in-buffer/entries-written: 14/14 #P:2
    #
    # _-----=> irqs-off
    # / _----=> need-resched
    # | / _---=> hardirq/softirq
    # || / _--=> preempt-depth
    # ||| / delay
    # TASK-PID CPU# |||| TIMESTAMP FUNCTION
    # | | | |||| | |
    irqbalance-514 [001] .... 46.213921: sys_open(filename: 804e1a6, flags: 0, mode: 1b6)
    irqbalance-514 [001] .... 46.214160: sys_open(filename: 804e1bb, flags: 0, mode: 1b6)
    <...>-920 [001] .... 47.307260: sys_open(filename: 4e82a0c5, flags: 80000, mode: 0)

    Link: http://lkml.kernel.org/r/1365564393-10972-3-git-send-email-jovi.zhangwei@huawei.com

    Cc: stable@vger.kernel.org # 2.6.35
    Signed-off-by: zhangwei(Jovi) <jovi.zhangwei@huawei.com>
    Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    kernel/trace/trace_syscalls.c | 18 ++++++++++++++----
    1 file changed, 14 insertions(+), 4 deletions(-)

    --- a/kernel/trace/trace_syscalls.c
    +++ b/kernel/trace/trace_syscalls.c
    @@ -304,6 +304,8 @@ void ftrace_syscall_enter(void *ignore,
    struct ring_buffer *buffer;
    int size;
    int syscall_nr;
    + unsigned long irq_flags;
    + int pc;

    syscall_nr = syscall_get_nr(current, regs);
    if (syscall_nr < 0)
    @@ -317,8 +319,11 @@ void ftrace_syscall_enter(void *ignore,

    size = sizeof(*entry) + sizeof(unsigned long) * sys_data->nb_args;

    + local_save_flags(irq_flags);
    + pc = preempt_count();
    +
    event = trace_current_buffer_lock_reserve(&buffer,
    - sys_data->enter_event->event.type, size, 0, 0);
    + sys_data->enter_event->event.type, size, irq_flags, pc);
    if (!event)
    return;

    @@ -328,7 +333,8 @@ void ftrace_syscall_enter(void *ignore,

    if (!filter_current_check_discard(buffer, sys_data->enter_event,
    entry, event))
    - trace_current_buffer_unlock_commit(buffer, event, 0, 0);
    + trace_current_buffer_unlock_commit(buffer, event,
    + irq_flags, pc);
    }

    void ftrace_syscall_exit(void *ignore, struct pt_regs *regs, long ret)
    @@ -338,6 +344,8 @@ void ftrace_syscall_exit(void *ignore, s
    struct ring_buffer_event *event;
    struct ring_buffer *buffer;
    int syscall_nr;
    + unsigned long irq_flags;
    + int pc;

    syscall_nr = syscall_get_nr(current, regs);
    if (syscall_nr < 0)
    @@ -350,7 +358,8 @@ void ftrace_syscall_exit(void *ignore, s
    return;

    event = trace_current_buffer_lock_reserve(&buffer,
    - sys_data->exit_event->event.type, sizeof(*entry), 0, 0);
    + sys_data->exit_event->event.type, sizeof(*entry),
    + irq_flags, pc);
    if (!event)
    return;

    @@ -360,7 +369,8 @@ void ftrace_syscall_exit(void *ignore, s

    if (!filter_current_check_discard(buffer, sys_data->exit_event,
    entry, event))
    - trace_current_buffer_unlock_commit(buffer, event, 0, 0);
    + trace_current_buffer_unlock_commit(buffer, event,
    + irq_flags, pc);
    }

    int reg_event_syscall_enter(struct ftrace_event_call *call)



    \
     
     \ /
      Last update: 2013-07-26 23:21    [W:4.033 / U:0.184 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site