21 Aug, 2012

1 commit

  • …/acme/linux into perf/core

    Pull perf/core improvements and fixes from Arnaldo Carvalho de Melo:

    * Fix include order for bison/flex-generated C files, from Ben Hutchings

    * Build fixes and documentation corrections from David Ahern

    * Group parsing support, from Jiri Olsa

    * UI/gtk refactorings and improvements from Namhyung Kim

    * NULL deref fix for perf script, from Namhyung Kim

    * Assorted cleanups from Robert Richter

    * Let O= makes handle relative paths, from Steven Rostedt

    * perf script python fixes, from Feng Tang.

    * Improve 'perf lock' error message when the needed tracepoints
    are not present, from David Ahern.

    * Initial bash completion support, from Frederic Weisbecker

    * Allow building without libelf, from Namhyung Kim.

    * Support DWARF CFI based unwind to have callchains when %bp
    based unwinding is not possible, from Jiri Olsa.

    * Symbol resolution fixes, while fixing support PPC64 files with an .opt ELF
    section was the end goal, several fixes for code that handles all
    architectures and cleanups are included, from Cody Schafer.

    * Add a description for the JIT interface, from Andi Kleen.

    * Assorted fixes for Documentation and build in 32 bit, from Robert Richter

    * Add support for non-tracepoint events in perf script python, from Feng Tang

    * Cache the libtraceevent event_format associated to each evsel early, so that we
    avoid relookups, i.e. calling pevent_find_event repeatedly when processing
    tracepoint events.

    [ This is to reduce the surface contact with libtraceevents and make clear what
    is that the perf tools needs from that lib: so far parsing the common and per
    event fields. ]

    Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
    Signed-off-by: Ingo Molnar <mingo@kernel.org>

    Ingo Molnar
     

31 Jul, 2012

1 commit

  • A few events are interesting not only for a current task.
    For example, sched_stat_* events are interesting for a task
    which wakes up. For this reason, it will be good if such
    events will be delivered to a target task too.

    Now a target task can be set by using __perf_task().

    The original idea and a draft patch belongs to Peter Zijlstra.

    I need these events for profiling sleep times. sched_switch is used for
    getting callchains and sched_stat_* is used for getting time periods.
    These events are combined in user space, then it can be analyzed by
    perf tools.

    Inspired-by: Peter Zijlstra
    Cc: Steven Rostedt
    Cc: Paul Mackerras
    Cc: Arnaldo Carvalho de Melo
    Cc: Steven Rostedt
    Cc: Arun Sharma
    Signed-off-by: Andrew Vagin
    Signed-off-by: Peter Zijlstra
    Link: http://lkml.kernel.org/r/1342016098-213063-1-git-send-email-avagin@openvz.org
    Signed-off-by: Ingo Molnar

    Andrew Vagin
     

20 Jul, 2012

2 commits

  • Return as the 4th paramater to the function tracer callback the pt_regs.

    Later patches that implement regs passing for the architectures will require
    having the ftrace_ops set the SAVE_REGS flag, which will tell the arch
    to take the time to pass a full set of pt_regs to the ftrace_ops callback
    function. If the arch does not support it then it should pass NULL.

    If an arch can pass full regs, then it should define:
    ARCH_SUPPORTS_FTRACE_SAVE_REGS to 1

    Link: http://lkml.kernel.org/r/20120702201821.019966811@goodmis.org

    Reviewed-by: Masami Hiramatsu
    Signed-off-by: Steven Rostedt

    Steven Rostedt
     
  • Currently the function trace callback receives only the ip and parent_ip
    of the function that it traced. It would be more powerful to also return
    the ops that registered the function as well. This allows the same function
    to act differently depending on what ftrace_ops registered it.

    Link: http://lkml.kernel.org/r/20120612225424.267254552@goodmis.org

    Reviewed-by: Masami Hiramatsu
    Signed-off-by: Steven Rostedt

    Steven Rostedt
     

22 Feb, 2012

4 commits

  • Adding support to filter function trace event via perf
    interface. It is now possible to use filter interface
    in the perf tool like:

    perf record -e ftrace:function --filter="(ip == mm_*)" ls

    The filter syntax is restricted to the the 'ip' field only,
    and following operators are accepted '==' '!=' '||', ending
    up with the filter strings like:

    ip == f1[, ]f2 ... || ip != f3[, ]f4 ...

    with comma ',' or space ' ' as a function separator. If the
    space ' ' is used as a separator, the right side of the
    assignment needs to be enclosed in double quotes '"', e.g.:

    perf record -e ftrace:function --filter '(ip == do_execve,sys_*,ext*)' ls
    perf record -e ftrace:function --filter '(ip == "do_execve,sys_*,ext*")' ls
    perf record -e ftrace:function --filter '(ip == "do_execve sys_* ext*")' ls

    The '==' operator adds trace filter with same effect as would
    be added via set_ftrace_filter file.

    The '!=' operator adds trace filter with same effect as would
    be added via set_ftrace_notrace file.

    The right side of the '!=', '==' operators is list of functions
    or regexp. to be added to filter separated by space.

    The '||' operator is used for connecting multiple filter definitions
    together. It is possible to have more than one '==' and '!='
    operators within one filter string.

    Link: http://lkml.kernel.org/r/1329317514-8131-8-git-send-email-jolsa@redhat.com

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

    Jiri Olsa
     
  • Adding perf registration support for the ftrace function event,
    so it is now possible to register it via perf interface.

    The perf_event struct statically contains ftrace_ops as a handle
    for function tracer. The function tracer is registered/unregistered
    in open/close actions.

    To be efficient, we enable/disable ftrace_ops each time the traced
    process is scheduled in/out (via TRACE_REG_PERF_(ADD|DELL) handlers).
    This way tracing is enabled only when the process is running.
    Intentionally using this way instead of the event's hw state
    PERF_HES_STOPPED, which would not disable the ftrace_ops.

    It is now possible to use function trace within perf commands
    like:

    perf record -e ftrace:function ls
    perf stat -e ftrace:function ls

    Allowed only for root.

    Link: http://lkml.kernel.org/r/1329317514-8131-6-git-send-email-jolsa@redhat.com

    Acked-by: Frederic Weisbecker
    Signed-off-by: Jiri Olsa
    Signed-off-by: Steven Rostedt

    Jiri Olsa
     
  • Adding TRACE_REG_PERF_ADD and TRACE_REG_PERF_DEL to handle
    perf event schedule in/out actions.

    The add action is invoked for when the perf event is scheduled in,
    while the del action is invoked when the event is scheduled out.

    Link: http://lkml.kernel.org/r/1329317514-8131-4-git-send-email-jolsa@redhat.com

    Acked-by: Frederic Weisbecker
    Signed-off-by: Jiri Olsa
    Signed-off-by: Steven Rostedt

    Jiri Olsa
     
  • Adding TRACE_REG_PERF_OPEN and TRACE_REG_PERF_CLOSE to differentiate
    register/unregister from open/close actions.

    The register/unregister actions are invoked for the first/last
    tracepoint user when opening/closing the event.

    The open/close actions are invoked for each tracepoint user when
    opening/closing the event.

    Link: http://lkml.kernel.org/r/1329317514-8131-3-git-send-email-jolsa@redhat.com

    Acked-by: Frederic Weisbecker
    Signed-off-by: Jiri Olsa
    Signed-off-by: Steven Rostedt

    Jiri Olsa
     

18 Nov, 2010

1 commit

  • This adds a new trace event internal flag that allows them to be
    used in perf by non privileged users in case of task bound tracing.

    This is desired for syscalls tracepoint because they don't leak
    global system informations, like some other tracepoints.

    Signed-off-by: Frederic Weisbecker
    Cc: Ingo Molnar
    Cc: Peter Zijlstra
    Cc: Arnaldo Carvalho de Melo
    Cc: Thomas Gleixner
    Cc: Steven Rostedt
    Cc: Li Zefan
    Cc: Jason Baron

    Frederic Weisbecker
     

10 Sep, 2010

3 commits

  • 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
     

19 Aug, 2010

2 commits

  • ftrace_event_call->perf_events, perf_trace_buf,
    fgraph_data->cpu_data and some local variables are percpu pointers
    missing __percpu markups. Add them.

    Signed-off-by: Namhyung Kim
    Acked-by: Tejun Heo
    Cc: Steven Rostedt
    Cc: Ingo Molnar
    Cc: Peter Zijlstra
    Cc: Arnaldo Carvalho de Melo
    Cc: Paul Mackerras
    Cc: Stephane Eranian
    LKML-Reference:
    Signed-off-by: Frederic Weisbecker

    Namhyung Kim
     
  • Instead of hardcoding the number of contexts for the recursions
    barriers, define a cpp constant to make the code more
    self-explanatory.

    Signed-off-by: Frederic Weisbecker
    Cc: Ingo Molnar
    Cc: Peter Zijlstra
    Cc: Arnaldo Carvalho de Melo
    Cc: Paul Mackerras
    Cc: Stephane Eranian

    Frederic Weisbecker
     

02 Aug, 2010

1 commit


29 Jun, 2010

2 commits

  • Because kprobes and syscalls need special processing to register
    events, the class->reg() method was created to handle the differences.

    But instead of creating a default ->reg for perf and ftrace events,
    the code was scattered with:

    if (class->reg)
    class->reg();
    else
    default_reg();

    This is messy and can also lead to bugs.

    This patch cleans up this code and creates a default reg() entry for
    the events allowing for the code to directly call the class->reg()
    without the condition.

    Reported-by: Peter Zijlstra
    Acked-by: Peter Zijlstra
    Signed-off-by: Steven Rostedt

    Steven Rostedt
     
  • Reason: Further changes conflict with upstream fixes

    Signed-off-by: Thomas Gleixner

    Thomas Gleixner
     

11 Jun, 2010

1 commit

  • With the addition of the code to shrink the kernel tracepoint
    infrastructure, we lost kprobes being traced by perf. The reason
    is that I tested if the "tp_event->class->perf_probe" existed before
    enabling it. This prevents "ftrace only" events (like the function
    trace events) from being enabled by perf.

    Unfortunately, kprobe events do not use perf_probe. This causes
    kprobes to be missed by perf. To fix this, we add the test to
    see if "tp_event->class->reg" exists as well as perf_probe.

    Normal trace events have only "perf_probe" but no "reg" function,
    and kprobes and syscalls have the "reg" but no "perf_probe".
    The ftrace unique events do not have either, so this is a valid
    test. If a kprobe or syscall is not to be probed by perf, the
    "reg" function is called anyway, and will return a failure and
    prevent perf from probing it.

    Reported-by: Srikar Dronamraju
    Tested-by: Srikar Dronamraju
    Acked-by: Peter Zijlstra
    Signed-off-by: Steven Rostedt

    Steven Rostedt
     

10 Jun, 2010

1 commit


09 Jun, 2010

1 commit

  • Drop this argument now that we always want to rewind only to the
    state of the first caller.
    It means frame pointers are not necessary anymore to reliably get
    the source of an event. But this also means we need this helper
    to be a macro now, as an inline function is not an option since
    we need to know when to provide a default implentation.

    Signed-off-by: Frederic Weisbecker
    Signed-off-by: Paul Mackerras
    Cc: David Miller
    Cc: Ingo Molnar
    Cc: Peter Zijlstra
    Cc: Arnaldo Carvalho de Melo

    Frederic Weisbecker
     

31 May, 2010

2 commits


25 May, 2010

1 commit

  • Patch b7e2ecef92 (perf, trace: Optimize tracepoints by removing
    IRQ-disable from perf/tracepoint interaction) made the
    unfortunate mistake of assuming the world is x86 only, correct
    this.

    The problem was that perf_fetch_caller_regs() did
    local_save_flags() into regs->flags, and I re-used that to
    remove another local_save_flags(), forgetting !x86 doesn't have
    regs->flags.

    Do the reverse, remove the local_save_flags() from
    perf_fetch_caller_regs() and let the ftrace site do the
    local_save_flags() instead.

    Signed-off-by: Peter Zijlstra
    Acked-by: Paul Mackerras
    Cc: acme@redhat.com
    Cc: efault@gmx.de
    Cc: fweisbec@gmail.com
    Cc: rostedt@goodmis.org
    LKML-Reference:
    Signed-off-by: Ingo Molnar

    Peter Zijlstra
     

21 May, 2010

3 commits


19 May, 2010

1 commit


15 May, 2010

2 commits

  • Now that the trace_event structure is embedded in the ftrace_event_call
    structure, there is no need for the ftrace_event_call id field.
    The id field is the same as the trace_event type field.

    Removing the id and re-arranging the structure brings down the tracepoint
    footprint by another 5K.

    text data bss dec hex filename
    4913961 1088356 861512 6863829 68bbd5 vmlinux.orig
    4895024 1023812 861512 6780348 6775bc vmlinux.print
    4894944 1018052 861512 6774508 675eec vmlinux.id

    Acked-by: Mathieu Desnoyers
    Acked-by: Masami Hiramatsu
    Acked-by: Frederic Weisbecker
    Signed-off-by: Steven Rostedt

    Steven Rostedt
     
  • This patch removes the register functions of TRACE_EVENT() to enable
    and disable tracepoints. The registering of a event is now down
    directly in the trace_events.c file. The tracepoint_probe_register()
    is now called directly.

    The prototypes are no longer type checked, but this should not be
    an issue since the tracepoints are created automatically by the
    macros. If a prototype is incorrect in the TRACE_EVENT() macro, then
    other macros will catch it.

    The trace_event_class structure now holds the probes to be called
    by the callbacks. This removes needing to have each event have
    a separate pointer for the probe.

    To handle kprobes and syscalls, since they register probes in a
    different manner, a "reg" field is added to the ftrace_event_class
    structure. If the "reg" field is assigned, then it will be called for
    enabling and disabling of the probe for either ftrace or perf. To let
    the reg function know what is happening, a new enum (trace_reg) is
    created that has the type of control that is needed.

    With this new rework, the 82 kernel events and 618 syscall events
    has their footprint dramatically lowered:

    text data bss dec hex filename
    4913961 1088356 861512 6863829 68bbd5 vmlinux.orig
    4914025 1088868 861512 6864405 68be15 vmlinux.class
    4918492 1084612 861512 6864616 68bee8 vmlinux.tracepoint
    4900252 1057412 861512 6819176 680d68 vmlinux.regs

    The size went from 6863829 to 6819176, that's a total of 44K
    in savings. With tracepoints being continuously added, this is
    critical that the footprint becomes minimal.

    v5: Added #ifdef CONFIG_PERF_EVENTS around a reference to perf
    specific structure in trace_events.c.

    v4: Fixed trace self tests to check probe because regfunc no longer
    exists.

    v3: Updated to handle void *data in beginning of probe parameters.
    Also added the tracepoint: check_trace_callback_type_##call().

    v2: Changed the callback probes to pass void * and typecast the
    value within the function.

    Acked-by: Mathieu Desnoyers
    Acked-by: Masami Hiramatsu
    Acked-by: Frederic Weisbecker
    Signed-off-by: Steven Rostedt

    Steven Rostedt
     

01 Apr, 2010

1 commit

  • The trace event buffer used by perf to record raw sample events
    is typed as an array of char and may then not be aligned to 8
    by alloc_percpu().

    But we need it to be aligned to 8 in sparc64 because we cast
    this buffer into a random structure type built by the TRACE_EVENT()
    macro to store the traces. So if a random 64 bits field is accessed
    inside, it may be not under an expected good alignment.

    Use an array of long instead to force the appropriate alignment, and
    perform a compile time check to ensure the size in byte of the buffer
    is a multiple of sizeof(long) so that its actual size doesn't get
    shrinked under us.

    This fixes unaligned accesses reported while using perf lock
    in sparc 64.

    Suggested-by: David Miller
    Suggested-by: Tejun Heo
    Signed-off-by: Frederic Weisbecker
    Cc: Peter Zijlstra
    Cc: Arnaldo Carvalho de Melo
    Cc: Paul Mackerras
    Cc: Ingo Molnar
    Cc: David Miller
    Cc: Steven Rostedt

    Frederic Weisbecker
     

19 Mar, 2010

1 commit

  • …/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: (35 commits)
    perf: Fix unexported generic perf_arch_fetch_caller_regs
    perf record: Don't try to find buildids in a zero sized file
    perf: export perf_trace_regs and perf_arch_fetch_caller_regs
    perf, x86: Fix hw_perf_enable() event assignment
    perf, ppc: Fix compile error due to new cpu notifiers
    perf: Make the install relative to DESTDIR if specified
    kprobes: Calculate the index correctly when freeing the out-of-line execution slot
    perf tools: Fix sparse CPU numbering related bugs
    perf_event: Fix oops triggered by cpu offline/online
    perf: Drop the obsolete profile naming for trace events
    perf: Take a hot regs snapshot for trace events
    perf: Introduce new perf_fetch_caller_regs() for hot regs snapshot
    perf/x86-64: Use frame pointer to walk on irq and process stacks
    lockdep: Move lock events under lockdep recursion protection
    perf report: Print the map table just after samples for which no map was found
    perf report: Add multiple event support
    perf session: Change perf_session post processing functions to take histogram tree
    perf session: Add storage for seperating event types in report
    perf session: Change add_hist_entry to take the tree root instead of session
    perf record: Add ID and to recorded event data when recording multiple events
    ...

    Linus Torvalds
     

17 Mar, 2010

1 commit

  • perf_arch_fetch_caller_regs() is exported for the overriden x86
    version, but not for the generic weak version.

    As a general rule, weak functions should not have their symbol
    exported in the same file they are defined.

    So let's export it on trace_event_perf.c as it is used by trace
    events only.

    This fixes:

    ERROR: ".perf_arch_fetch_caller_regs" [fs/xfs/xfs.ko] undefined!
    ERROR: ".perf_arch_fetch_caller_regs" [arch/powerpc/platforms/cell/spufs/spufs.ko] undefined!

    -v2: And also only build it if trace events are enabled.
    -v3: Fix changelog mistake

    Reported-by: Stephen Rothwell
    Signed-off-by: Frederic Weisbecker
    Cc: Peter Zijlstra
    Cc: Xiao Guangrong
    Cc: Paul Mackerras
    LKML-Reference:
    Signed-off-by: Ingo Molnar

    Frederic Weisbecker
     

11 Mar, 2010

1 commit


10 Mar, 2010

1 commit