19 Oct, 2010

1 commit

  • The function start_func_tracer() was incorrectly added in the
    #ifdef CONFIG_FUNCTION_TRACER condition, but is still used even
    when function tracing is not enabled.

    The calls to register_ftrace_function() and register_ftrace_graph()
    become nops (and their arguments are even ignored), thus there is
    no reason to hide start_func_tracer() when function tracing is
    not enabled.

    Reported-by: Ingo Molnar
    Signed-off-by: Steven Rostedt

    Steven Rostedt
     

18 Oct, 2010

7 commits

  • Even though the parent is recorded with the normal function tracing
    of the latency tracers (irqsoff and wakeup), the function graph
    recording is bogus.

    This is due to the function graph messing with the return stack.
    The latency tracers pass in as the parent CALLER_ADDR0, which
    works fine for plain function tracing. But this causes bogus output
    with the graph tracer:

    3) -0 | d.s3. 0.000 us | return_to_handler();
    3) -0 | d.s3. 0.000 us | _raw_spin_unlock_irqrestore();
    3) -0 | d.s3. 0.000 us | return_to_handler();
    3) -0 | d.s3. 0.000 us | trace_hardirqs_on();

    The "return_to_handle()" call is the trampoline of the
    function graph tracer, and is meaningless in this context.

    Cc: Jiri Olsa
    Signed-off-by: Steven Rostedt

    Steven Rostedt
     
  • The preempt and irqsoff tracers have three types of function tracers.
    Normal function tracer, function graph entry, and function graph return.
    Each of these use a complex dance to prevent recursion and whether
    to trace the data or not (depending if interrupts are enabled or not).

    This patch moves the duplicate code into a single routine, to
    prevent future mistakes with modifying duplicate complex code.

    Cc: Jiri Olsa
    Signed-off-by: Steven Rostedt

    Steven Rostedt
     
  • The wakeup tracer has three types of function tracers. Normal
    function tracer, function graph entry, and function graph return.
    Each of these use a complex dance to prevent recursion and whether
    to trace the data or not (depending on the wake_task variable).

    This patch moves the duplicate code into a single routine, to
    prevent future mistakes with modifying duplicate complex code.

    Cc: Jiri Olsa
    Signed-off-by: Steven Rostedt

    Steven Rostedt
     
  • Add function graph support for wakeup latency tracer.
    The graph output is enabled by setting the 'display-graph'
    trace option.

    Signed-off-by: Jiri Olsa
    LKML-Reference:
    Signed-off-by: Steven Rostedt

    Jiri Olsa
     
  • Move trace_graph_function() and print_graph_headers_flags() functions
    to the trace_function_graph.c to be globaly available.

    Signed-off-by: Jiri Olsa
    LKML-Reference:
    Signed-off-by: Steven Rostedt

    Jiri Olsa
     
  • The check_irq_entry and check_irq_return could be called
    from graph event context. In such case there's no graph
    private data allocated. Adding checks to handle this case.

    Signed-off-by: Jiri Olsa
    LKML-Reference:

    [ Fixed some grammar in the comments ]

    Signed-off-by: Steven Rostedt

    Jiri Olsa
     
  • Unnecessary cast from void* in assignment.

    Signed-off-by: matt mooney
    Signed-off-by: Steven Rostedt

    matt mooney
     

15 Oct, 2010

3 commits


13 Oct, 2010

1 commit

  • Fix

    kernel/trace/trace_functions_graph.c: In function ‘trace_print_graph_duration’:
    kernel/trace/trace_functions_graph.c:652: warning: comparison of distinct pointer types lacks a cast

    when building 36-rc6 on a 32-bit due to the strict type check failing
    in the min() macro.

    Signed-off-by: Borislav Petkov
    Cc: Chase Douglas
    Cc: Steven Rostedt
    Cc: Ingo Molnar
    LKML-Reference:
    Signed-off-by: Frederic Weisbecker

    Borislav Petkov
     

23 Sep, 2010

1 commit


15 Sep, 2010

6 commits

  • …stedt/linux-2.6-trace into perf/core

    Ingo Molnar
     
  • The enums for FTRACE_ENABLE_MCOUNT and FTRACE_DISABLE_MCOUNT were
    used as commands to ftrace_run_update_code(). But these commands
    were used by the old nasty ftrace daemon that has long been slain.

    This is a clean up patch to remove the references to these enums
    and simplify the code a little.

    Reported-by: Wu Zhangjin
    Signed-off-by: Steven Rostedt

    Steven Rostedt
     
  • When the function graph tracer funcgraph-irq option is zero, disable
    tracing in IRQs. This makes the option have two effects.

    1) When reading the trace file, do not display the functions that
    happen in interrupt context (when detected)

    2) [*new*] When recording a trace, skip those that are detected
    to be in interrupt by the 'in_irq()' function

    Note, in_irq() is updated at irq_enter() and irq_exit(). There are
    still functions that are recorded by the function graph tracer that
    is in interrupt context but outside the irq_enter/exit() routines.

    Signed-off-by: Steven Rostedt

    Steven Rostedt
     
  • It's handy to be able to disable the irq related output
    and not to have to jump over each irq related code, when
    you have no interrest in it.

    The option is by default enabled, so there's no change to
    current behaviour. It affects only the final output, so all
    the irq related data stay in the ring buffer.

    Signed-off-by: Jiri Olsa
    LKML-Reference:
    Signed-off-by: Steven Rostedt

    Jiri Olsa
     
  • If we do:

    # cd /sys/kernel/debug
    # echo 'do_IRQ:traceon schedule:traceon sys_write:traceon' > \
    set_ftrace_filter
    # cat set_ftrace_filter

    We get the following output:

    #### all functions enabled ####
    sys_write:traceon:unlimited
    schedule:traceon:unlimited
    do_IRQ:traceon:unlimited

    This outputs two lists. One is the fact that all functions are
    currently enabled for function tracing, the other has three probed
    functions, which happen to have 'traceon' as their commands.

    Currently, when reading the first list (functions enabled) the
    seq_file code will receive a "NULL" from the t_next() function
    causing it to exit early. This makes "read()" from userspace stop
    reading the code at this boarder. Although read is allowed to do this,
    some (broken) applications might consider this an end of file and
    stop early.

    This patch adds the start of the second list to t_next() when it
    finishes the first list. It is a simple change and gives the
    set_ftrace_filter file nicer reading ability.

    Signed-off-by: Steven Rostedt

    Steven Rostedt
     
  • This patch keeps track of the index within the elements of
    set_ftrace_filter and if the position goes backwards, it nicely
    resets and starts from the beginning again.

    This allows for lseek and pread to work properly now.

    Signed-off-by: Steven Rostedt

    Steven Rostedt
     

14 Sep, 2010

2 commits

  • The set_ftrace_filter uses seq_file and reads from two lists. The
    pointer returned by t_next() can either be of type struct dyn_ftrace
    or struct ftrace_func_probe. If there is a bug (there was one)
    the wrong pointer may be used and the reference can cause an oops.

    This patch makes t_next() and friends only return the iterator structure
    which now has a pointer of type struct dyn_ftrace and struct
    ftrace_func_probe. The t_show() can now test if the pointer is NULL or
    not and if the pointer exists, it is guaranteed to be of the correct type.

    Now if there's a bug, only wrong data will be shown but not an oops.

    Cc: Chris Wright
    Signed-off-by: Steven Rostedt

    Steven Rostedt
     
  • After the filtered functions are read, the probed functions are read
    from the hash in set_ftrace_filter. When the hashed probed functions
    are read, the *pos passed in is reset. Instead of modifying the pos
    given to the read function, just record the pos where the filtered
    functions ended and subtract from that.

    Signed-off-by: Steven Rostedt

    Steven Rostedt
     

10 Sep, 2010

5 commits

  • …/git/tip/linux-2.6-tip

    * 'perf-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip:
    tracing: t_start: reset FTRACE_ITER_HASH in case of seek/pread
    perf symbols: Fix multiple initialization of symbol system
    perf: Fix CPU hotplug
    perf, trace: Fix module leak
    tracing/kprobe: Fix handling of C-unlike argument names
    tracing/kprobes: Fix handling of argument names
    perf probe: Fix handling of arguments names
    perf probe: Fix return probe support
    tracing/kprobe: Fix a memory leak in error case
    tracing: Do not allow llseek to set_ftrace_filter

    Linus Torvalds
     
  • Be sure to avoid entering t_show() with FTRACE_ITER_HASH set without
    having properly started the iterator to iterate the hash. This case is
    degenerate and, as discovered by Robert Swiecki, can cause t_hash_show()
    to misuse a pointer. This causes a NULL ptr deref with possible security
    implications. Tracked as CVE-2010-3079.

    Cc: Robert Swiecki
    Cc: Eugene Teo
    Cc:
    Signed-off-by: Chris Wright
    Signed-off-by: Steven Rostedt

    Chris Wright
     
  • Replace pmu::{enable,disable,start,stop,unthrottle} with
    pmu::{add,del,start,stop}, all of which take a flags argument.

    The new interface extends the capability to stop a counter while
    keeping it scheduled on the PMU. We replace the throttled state with
    the generic stopped state.

    This also allows us to efficiently stop/start counters over certain
    code paths (like IRQ handlers).

    It also allows scheduling a counter without it starting, allowing for
    a generic frozen state (useful for rotating stopped counters).

    The stopped state is implemented in two different ways, depending on
    how the architecture implemented the throttled state:

    1) We disable the counter:
    a) the pmu has per-counter enable bits, we flip that
    b) we program a NOP event, preserving the counter state

    2) We store the counter state and ignore all read/overflow events

    Signed-off-by: Peter Zijlstra
    Cc: paulus
    Cc: stephane eranian
    Cc: Robert Richter
    Cc: Will Deacon
    Cc: Paul Mundt
    Cc: Frederic Weisbecker
    Cc: Cyrill Gorcunov
    Cc: Lin Ming
    Cc: Yanmin
    Cc: Deng-Cheng Zhu
    Cc: David Miller
    Cc: Michael Cree
    LKML-Reference:
    Signed-off-by: Ingo Molnar

    Peter Zijlstra
     
  • Merge reason: Pick up pending fixes before applying dependent new changes.

    Signed-off-by: Ingo Molnar

    Ingo Molnar
     
  • Commit 1c024eca (perf, trace: Optimize tracepoints by using
    per-tracepoint-per-cpu hlist to track events) caused a module
    refcount leak.

    Reported-And-Tested-by: Avi Kivity
    Signed-off-by: Peter Zijlstra
    LKML-Reference:
    Signed-off-by: Ingo Molnar

    Li Zefan
     

09 Sep, 2010

2 commits

  • …/git/tip/linux-2.6-tip

    * 'core-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip:
    gcc-4.6: kernel/*: Fix unused but set warnings
    mutex: Fix annotations to include it in kernel-locking docbook
    pid: make setpgid() system call use RCU read-side critical section
    MAINTAINERS: Add RCU's public git tree

    Linus Torvalds
     
  • Reading the file set_ftrace_filter does three things.

    1) shows whether or not filters are set for the function tracer
    2) shows what functions are set for the function tracer
    3) shows what triggers are set on any functions

    3 is independent from 1 and 2.

    The way this file currently works is that it is a state machine,
    and as you read it, it may change state. But this assumption breaks
    when you use lseek() on the file. The state machine gets out of sync
    and the t_show() may use the wrong pointer and cause a kernel oops.

    Luckily, this will only kill the app that does the lseek, but the app
    dies while holding a mutex. This prevents anyone else from using the
    set_ftrace_filter file (or any other function tracing file for that matter).

    A real fix for this is to rewrite the code, but that is too much for
    a -rc release or stable. This patch simply disables llseek on the
    set_ftrace_filter() file for now, and we can do the proper fix for the
    next major release.

    Reported-by: Robert Swiecki
    Cc: Chris Wright
    Cc: Tavis Ormandy
    Cc: Eugene Teo
    Cc: vendor-sec@lst.de
    Cc:
    Signed-off-by: Steven Rostedt

    Steven Rostedt
     

08 Sep, 2010

3 commits

  • Check the argument name whether it is invalid (not C-like symbol name). This
    makes event format simple.

    Reported-by: Srikar Dronamraju
    Cc: Steven Rostedt
    Cc: Frederic Weisbecker
    Cc: Ingo Molnar
    Cc: Mathieu Desnoyers
    LKML-Reference:
    Signed-off-by: Masami Hiramatsu
    Signed-off-by: Arnaldo Carvalho de Melo

    Masami Hiramatsu
     
  • Set "argN" name for each argument automatically if it has no specified name.
    Since dynamic trace event(kprobe_events) accepts special characters for its
    argument, its format can show those special characters (e.g. '$', '%', '+').
    However, perf can't parse those format because of the character (especially
    '%') mess up the format. This sets "argX" name for those arguments if user
    omitted the argument names.

    E.g.
    # echo 'p do_fork %ax IP=%ip $stack' > tracing/kprobe_events
    # cat tracing/kprobe_events
    p:kprobes/p_do_fork_0 do_fork arg1=%ax IP=%ip arg3=$stack

    Reported-by: Srikar Dronamraju
    Cc: Steven Rostedt
    Cc: Frederic Weisbecker
    Cc: Ingo Molnar
    Cc: Mathieu Desnoyers
    LKML-Reference:
    Signed-off-by: Masami Hiramatsu
    Signed-off-by: Arnaldo Carvalho de Melo

    Masami Hiramatsu
     
  • Fix a memory leak which happens when a field name conflicts with others. In
    error case, free_trace_probe() will free all arguments until nr_args, so this
    increments nr_args the begining of the loop instead of the end.

    Cc: Steven Rostedt
    Cc: Frederic Weisbecker
    Cc: Ingo Molnar
    Cc: Mathieu Desnoyers
    LKML-Reference:
    Signed-off-by: Masami Hiramatsu
    Signed-off-by: Arnaldo Carvalho de Melo

    Masami Hiramatsu
     

05 Sep, 2010

1 commit


02 Sep, 2010

1 commit

  • While discussing the strictness of the 80 character limit on the
    Kernel Summit Discussion mailing list, I showed examples that I
    broke that limit slightly with some algorithms. In discussing with
    John Linville, what looked better, I realized that two of the
    80 char breaking culprits were an identical expression.

    As a clean up, this patch moves the identical expression into its
    own helper function and that is used instead. As a side effect,
    the offending code is now under the 80 character limit. :-)

    This clean up code also changes the expression from

    (A - B) - C to A - (B + C)

    This makes the code look a little nicer too.

    Cc: John W. Linville
    Signed-off-by: Steven Rostedt

    Steven Rostedt
     

01 Sep, 2010

1 commit

  • While we are reading trace_stat/functionX and someone just
    disabled function_profile at that time, we can trigger this:

    divide error: 0000 [#1] PREEMPT SMP
    ...
    EIP is at function_stat_show+0x90/0x230
    ...

    This fix just takes the ftrace_profile_lock and checks if
    rec->counter is 0. If it's 0, we know the profile buffer
    has been reset.

    Signed-off-by: Li Zefan
    Cc: stable@kernel.org
    LKML-Reference:
    Signed-off-by: Steven Rostedt

    Li Zefan
     

27 Aug, 2010

1 commit


25 Aug, 2010

1 commit

  • save_stack_trace() stores the instruction pointer, not the
    function descriptor. On ppc64 the trace stack code currently
    dereferences the instruction pointer and shows 8 bytes of
    instructions in our backtraces:

    # cat /sys/kernel/debug/tracing/stack_trace
    Depth Size Location (26 entries)
    ----- ---- --------
    0) 5424 112 0x6000000048000004
    1) 5312 160 0x60000000ebad01b0
    2) 5152 160 0x2c23000041c20030
    3) 4992 240 0x600000007c781b79
    4) 4752 160 0xe84100284800000c
    5) 4592 192 0x600000002fa30000
    6) 4400 256 0x7f1800347b7407e0
    7) 4144 208 0xe89f0108f87f0070
    8) 3936 272 0xe84100282fa30000

    Since we aren't dealing with function descriptors, use %pS
    instead of %pF to fix it:

    # cat /sys/kernel/debug/tracing/stack_trace
    Depth Size Location (26 entries)
    ----- ---- --------
    0) 5424 112 ftrace_call+0x4/0x8
    1) 5312 160 .current_io_context+0x28/0x74
    2) 5152 160 .get_io_context+0x48/0xa0
    3) 4992 240 .cfq_set_request+0x94/0x4c4
    4) 4752 160 .elv_set_request+0x60/0x84
    5) 4592 192 .get_request+0x2d4/0x468
    6) 4400 256 .get_request_wait+0x7c/0x258
    7) 4144 208 .__make_request+0x49c/0x610
    8) 3936 272 .generic_make_request+0x390/0x434

    Signed-off-by: Anton Blanchard
    Cc: rostedt@goodmis.org
    Cc: fweisbec@gmail.com
    LKML-Reference:
    Signed-off-by: Ingo Molnar

    Anton Blanchard
     

19 Aug, 2010

3 commits


18 Aug, 2010

1 commit