26 Oct, 2012

3 commits

  • Otherwise they will be not written in an output file.

    Signed-off-by: Andrew Vagin
    Cc: Ingo Molnar
    Cc: Paul Mackerras
    Cc: Peter Zijlstra
    Link: http://lkml.kernel.org/r/1344344165-369636-5-git-send-email-avagin@openvz.org
    [ committer note: Fixed up wrt changes made in the immediate previous patches ]
    Signed-off-by: Arnaldo Carvalho de Melo

    Andrew Vagin
     
  • You may want to know where and how long a task is sleeping. A callchain
    may be found in sched_switch and a time slice in stat_iowait, so I add
    handler in perf inject for merging this events.

    My code saves sched_switch event for each process and when it meets
    stat_iowait, it reports the sched_switch event, because this event
    contains a correct callchain. By another words it replaces all
    stat_iowait events on proper sched_switch events.

    I use the next sequence of commands for testing:

    perf record -e sched:sched_stat_sleep -e sched:sched_switch \
    -e sched:sched_process_exit -g -o ~/perf.data.raw \
    ~/test-program
    perf inject -v -s -i ~/perf.data.raw -o ~/perf.data
    perf report --stdio -i ~/perf.data
    100.00% foo [kernel.kallsyms] [k] __schedule
    |
    --- __schedule
    schedule
    |
    |--79.75%-- schedule_hrtimeout_range_clock
    | schedule_hrtimeout_range
    | poll_schedule_timeout
    | do_select
    | core_sys_select
    | sys_select
    | system_call_fastpath
    | __select
    | __libc_start_main
    |
    --20.25%-- do_nanosleep
    hrtimer_nanosleep
    sys_nanosleep
    system_call_fastpath
    __GI___libc_nanosleep
    __libc_start_main

    And here is test-program.c:

    #include
    #include
    #include

    int main()
    {
    struct timespec ts1;
    struct timeval tv1;
    int i;
    long s;

    for (i = 0; i < 10; i++) {
    ts1.tv_sec = 0;
    ts1.tv_nsec = 10000000;
    nanosleep(&ts1, NULL);

    tv1.tv_sec = 0;
    tv1.tv_usec = 40000;
    select(0, NULL, NULL, NULL,&tv1);
    }
    return 1;
    }

    Signed-off-by: Andrew Vagin
    Acked-by: Frederic Weisbecker
    Cc: Ingo Molnar
    Cc: Paul Mackerras
    Cc: Peter Zijlstra
    Link: http://lkml.kernel.org/r/1344344165-369636-4-git-send-email-avagin@openvz.org
    [ committer note: Made it use evsel->handler ]
    Signed-off-by: Arnaldo Carvalho de Melo

    Andrew Vagin
     
  • Before this patch "perf inject" can only handle data from pipe.

    I want to use "perf inject" for reworking events. Look at my following patch.

    v2: add information about new options in tools/perf/Documentation/

    Signed-off-by: Andrew Vagin
    Acked-by: Frederic Weisbecker
    Cc: Ingo Molnar
    Cc: Paul Mackerras
    Cc: Peter Zijlstra
    Link: http://lkml.kernel.org/r/1344344165-369636-2-git-send-email-avagin@openvz.org
    [ committer note: fixed it up to cope with 5852a44, 5ded57a, 002439e & f62d3f0 ]
    Signed-off-by: Arnaldo Carvalho de Melo

    Andrew Vagin
     

07 Oct, 2012

1 commit

  • When we were processing a PERF_RECORD_EXIT event we first used
    machine__findnew_thread for both the thread exiting and for its parent,
    only to use just the thread struct associated with the one exiting, and
    to just delete it.

    If it existed, i.e. not created at this very moment in
    machine__findnew_thread, it will be moved to the machine->dead_threads
    linked list, because we may have hist_entries pointing to it, but if it
    was created just do be deleted, it will just sit there with no
    references at all.

    Use the new machine__find_thread() method so that if it is not there, we
    don't create it.

    As a bonus the parent thread will also not be created at this point.

    Create process_fork() and process_exit() helpers to use this and make
    the builtins use it instead of the generic process_task(), ditched by
    this patch.

    Cc: David Ahern
    Cc: Frederic Weisbecker
    Cc: Jiri Olsa
    Cc: Mike Galbraith
    Cc: Namhyung Kim
    Cc: Paul Mackerras
    Cc: Peter Zijlstra
    Cc: Stephane Eranian
    Link: http://lkml.kernel.org/n/tip-z7n2y98ebjyrvmytaope4vdl@git.kernel.org
    Signed-off-by: Arnaldo Carvalho de Melo

    Arnaldo Carvalho de Melo
     

03 Oct, 2012

3 commits

  • Some variables were global but used in just one function, so move it to
    where it belongs.

    Leftover from patch at the beggining of this series.

    Cc: David Ahern
    Cc: Frederic Weisbecker
    Cc: Jiri Olsa
    Cc: Mike Galbraith
    Cc: Namhyung Kim
    Cc: Paul Mackerras
    Cc: Peter Zijlstra
    Cc: Stephane Eranian
    Link: http://lkml.kernel.org/n/tip-9cer20zhw64wbxyb0zias82i@git.kernel.org
    Signed-off-by: Arnaldo Carvalho de Melo

    Arnaldo Carvalho de Melo
     
  • We want to reduce the impact that each of the builtins has on perf as a
    whole, so use the superclassing of perf_tool mechanizm to move its
    config knobs to the stack, so that only if we use that tool, its impact
    will be felt.

    In this case is more about consistency, as the impact of this tool is
    minimal.

    Cc: David Ahern
    Cc: Frederic Weisbecker
    Cc: Jiri Olsa
    Cc: Mike Galbraith
    Cc: Namhyung Kim
    Cc: Paul Mackerras
    Cc: Peter Zijlstra
    Cc: Stephane Eranian
    Link: http://lkml.kernel.org/n/tip-z2b3matvawihtenmez9hkcja@git.kernel.org
    Signed-off-by: Arnaldo Carvalho de Melo

    Arnaldo Carvalho de Melo
     
  • If we ever want to allow inject to work with something other than stdin,
    we can put it back, but so far it is completely unused, so ditch it.

    Cc: David Ahern
    Cc: Frederic Weisbecker
    Cc: Jiri Olsa
    Cc: Mike Galbraith
    Cc: Namhyung Kim
    Cc: Paul Mackerras
    Cc: Peter Zijlstra
    Cc: Stephane Eranian
    Link: http://lkml.kernel.org/n/tip-qmwpnktckhd43eynnkxgqfpm@git.kernel.org
    Signed-off-by: Arnaldo Carvalho de Melo

    Arnaldo Carvalho de Melo
     

29 Sep, 2012

1 commit

  • For building perf without libelf, we can set NO_LIBELF=1 as a argument
    of make. It then defines NO_LIBELF_SUPPORT macro for C code to do the
    proper handling. However it usually used in a negative semantics -
    e.g. #ifndef - so we saw double negations which can be misleading.
    Convert it to a positive form to make it more readable.

    Signed-off-by: Namhyung Kim
    Cc: Ingo Molnar
    Cc: Paul Mackerras
    Cc: Peter Zijlstra
    Link: http://lkml.kernel.org/r/1348824728-14025-4-git-send-email-namhyung@kernel.org
    Signed-off-by: Arnaldo Carvalho de Melo

    Namhyung Kim
     

11 Sep, 2012

1 commit

  • perf defines both __used and __unused variables to use for marking
    unused variables. The variable __used is defined to
    __attribute__((__unused__)), which contradicts the kernel definition to
    __attribute__((__used__)) for new gcc versions. On Android, __used is
    also defined in system headers and this leads to warnings like: warning:
    '__used__' attribute ignored

    __unused is not defined in the kernel and is not a standard definition.
    If __unused is included everywhere instead of __used, this leads to
    conflicts with glibc headers, since glibc has a variables with this name
    in its headers.

    The best approach is to use __maybe_unused, the definition used in the
    kernel for __attribute__((unused)). In this way there is only one
    definition in perf sources (instead of 2 definitions that point to the
    same thing: __used and __unused) and it works on both Linux and Android.
    This patch simply replaces all instances of __used and __unused with
    __maybe_unused.

    Signed-off-by: Irina Tirdea
    Acked-by: Pekka Enberg
    Cc: David Ahern
    Cc: Ingo Molnar
    Cc: Namhyung Kim
    Cc: Paul Mackerras
    Cc: Peter Zijlstra
    Cc: Steven Rostedt
    Link: http://lkml.kernel.org/r/1347315303-29906-7-git-send-email-irina.tirdea@intel.com
    [ committer note: fixed up conflict with a116e05 in builtin-sched.c ]
    Signed-off-by: Arnaldo Carvalho de Melo

    Irina Tirdea
     

10 Aug, 2012

1 commit

  • Now we have isolated all ELF-specific stuff, it's possible to build
    without libelf. The output binary can do most of jobs but lacks (user
    level) symbol information - kernel symbols are still accessable thanks
    to the kallsyms.

    To build perf without libelf (elfutils), give NO_LIBELF=1 to make.

    For now, only 'perf probe' command is removed since it depends on
    libelf/libdw heavily.

    Signed-off-by: Namhyung Kim
    Cc: Ingo Molnar
    Cc: Jiri Olsa
    Cc: Paul Mackerras
    Cc: Peter Zijlstra
    Link: http://lkml.kernel.org/r/1344228082-15569-4-git-send-email-namhyung@kernel.org
    Signed-off-by: Arnaldo Carvalho de Melo

    Namhyung Kim
     

22 May, 2012

1 commit

  • perf inject -b was broken. It would not inject any build_id into the
    stream. Furthermore, it would strip samples from the stream.

    The reason was a missing initialization of the event attribute
    structure. The perf_tool.tool.attr() callback was pointing to a simple
    repipe. But there was no initialization of the internal data structures
    to keep track of events and event ids. That later caused event id
    lookups to fail, and sample would get removed.

    The patch simply adds back the call to perf_event__process_attr() to
    initialize the evlist structure and now build_ids are again injected.

    Signed-off-by: Stephane Eranian
    Cc: David Ahern
    Cc: Ingo Molnar
    Cc: Peter Zijlstra
    Link: http://lkml.kernel.org/r/1337081295-10303-2-git-send-email-eranian@google.com
    Signed-off-by: Arnaldo Carvalho de Melo

    Stephane Eranian
     

28 Nov, 2011

4 commits

  • To better reflect that it became the base class for all tools, that must
    be in each tool struct and where common stuff will be put.

    Cc: David Ahern
    Cc: Frederic Weisbecker
    Cc: Mike Galbraith
    Cc: Paul Mackerras
    Cc: Peter Zijlstra
    Cc: Stephane Eranian
    Link: http://lkml.kernel.org/n/tip-qgpc4msetqlwr8y2k7537cxe@git.kernel.org
    Signed-off-by: Arnaldo Carvalho de Melo

    Arnaldo Carvalho de Melo
     
  • Reducing the exposure of perf_session further, so that we can use the
    classes in cases where no perf.data file is created.

    Cc: David Ahern
    Cc: Frederic Weisbecker
    Cc: Mike Galbraith
    Cc: Paul Mackerras
    Cc: Peter Zijlstra
    Cc: Stephane Eranian
    Link: http://lkml.kernel.org/n/tip-stua66dcscsezzrcdugvbmvd@git.kernel.org
    Signed-off-by: Arnaldo Carvalho de Melo

    Arnaldo Carvalho de Melo
     
  • So that we don't need to have that many globals.

    Next steps will remove the 'session' pointer, that in most cases is
    not needed.

    Then we can rename perf_event_ops to 'perf_tool' that better describes
    this class hierarchy.

    Cc: David Ahern
    Cc: Frederic Weisbecker
    Cc: Mike Galbraith
    Cc: Paul Mackerras
    Cc: Peter Zijlstra
    Cc: Stephane Eranian
    Link: http://lkml.kernel.org/n/tip-wp4djox7x6w1i2bab1pt4xxp@git.kernel.org
    Signed-off-by: Arnaldo Carvalho de Melo

    Arnaldo Carvalho de Melo
     
  • Removing another case where a perf_session is required when processing
    events.

    Cc: David Ahern
    Cc: Frederic Weisbecker
    Cc: Mike Galbraith
    Cc: Paul Mackerras
    Cc: Peter Zijlstra
    Cc: Stephane Eranian
    Link: http://lkml.kernel.org/n/tip-ug1wtjbnva4bxwknflkkrlrh@git.kernel.org
    Signed-off-by: Arnaldo Carvalho de Melo

    Arnaldo Carvalho de Melo
     

24 Mar, 2011

1 commit

  • Resolving the sample->id to an evsel since the most advanced tools,
    report and annotate, and the others will too when they evolve to
    properly support multi-event perf.data files.

    Good also because it does an extra validation, checking that the ID is
    valid when present. When that is not the case, the overhead is just a
    branch + function call (perf_evlist__id2evsel).

    Cc: Frederic Weisbecker
    Cc: Ingo Molnar
    Cc: Mike Galbraith
    Cc: Paul Mackerras
    Cc: Peter Zijlstra
    Cc: Stephane Eranian
    Cc: Tom Zanussi
    LKML-Reference:
    Signed-off-by: Arnaldo Carvalho de Melo

    Arnaldo Carvalho de Melo
     

30 Jan, 2011

2 commits


22 Dec, 2010

1 commit

  • If we are running the new perf on an old kernel without support for
    sample_id_all, we should fall back to the old unordered processing of
    events. If we didn't than we would *always* process events without
    timestamps out of order, whether or not we hit a reordering race. In
    other words, instead of there being a chance of not attributing samples
    correctly, we would guarantee that samples would not be attributed.

    While processing all events without timestamps before events with
    timestamps may seem like an intuitive solution, it falls down as
    PERF_RECORD_EXIT events would also be processed before any samples.
    Even with a workaround for that case, samples before/after an exec would
    not be attributed correctly.

    This patch allows commands to indicate whether they need to fall back to
    unordered processing, so that commands that do not care about timestamps
    on every event will not be affected. If we do fallback, this will print
    out a warning if report -D was invoked.

    This patch adds the test in perf_session__new so that we only need to
    test once per session. Commands that do not use an event_ops (such as
    record and top) can simply pass NULL in it's place.

    Acked-by: Thomas Gleixner
    Cc: Frederic Weisbecker
    Cc: Ingo Molnar
    Cc: Peter Zijlstra
    Cc: Thomas Gleixner
    LKML-Reference:
    Signed-off-by: Ian Munsie
    Signed-off-by: Arnaldo Carvalho de Melo

    Ian Munsie
     

05 Dec, 2010

1 commit

  • At perf_session__process_event, so that we reduce the number of lines in eache
    tool sample processing routine that now receives a sample_data pointer already
    parsed.

    This will also be useful in the next patch, where we'll allow sample the
    identity fields in MMAP, FORK, EXIT, etc, when it will be possible to see (cpu,
    timestamp) just after before every event.

    Also validate callchains in perf_session__process_event, i.e. as early as
    possible, and keep a counter of the number of events discarded due to invalid
    callchains, warning the user about it if it happens.

    There is an assumption that was kept that all events have the same sample_type,
    that will be dealt with in the future, when this preexisting limitation will be
    removed.

    Tested-by: Thomas Gleixner
    Reviewed-by: Thomas Gleixner
    Acked-by: Ian Munsie
    Acked-by: Thomas Gleixner
    Cc: Frédéric Weisbecker
    Cc: Ian Munsie
    Cc: Mike Galbraith
    Cc: Peter Zijlstra
    Cc: Paul Mackerras
    Cc: Stephane Eranian
    LKML-Reference:
    Signed-off-by: Arnaldo Carvalho de Melo

    Arnaldo Carvalho de Melo
     

04 May, 2010

1 commit

  • New commands need to have Documentation and be added to command-list.txt
    so that they can appear when 'perf' is called withouth any subcommand:

    [root@doppio linux-2.6-tip]# perf

    usage: perf [--version] [--help] COMMAND [ARGS]

    The most commonly used perf commands are:
    annotate Read perf.data (created by perf record) and display annotated code
    archive Create archive with object files with build-ids found in perf.data file
    bench General framework for benchmark suites
    buildid-cache Manage build-id cache.
    buildid-list List the buildids in a perf.data file
    diff Read two perf.data files and display the differential profile
    inject Filter to augment the events stream with additional information
    kmem Tool to trace/measure kernel memory(slab) properties
    kvm Tool to trace/measure kvm guest os
    list List all symbolic event types
    lock Analyze lock events
    probe Define new dynamic tracepoints
    record Run a command and record its profile into perf.data
    report Read perf.data (created by perf record) and display the profile
    sched Tool to trace/measure scheduler properties (latencies)
    stat Run a command and gather performance counter statistics
    test Runs sanity tests.
    timechart Tool to visualize total system behavior during a workload
    top System profiling tool.
    trace Read perf.data (created by perf record) and display trace output

    See 'perf help COMMAND' for more information on a specific command.

    [root@doppio linux-2.6-tip]#

    The new 'perf inject' command hadn't so it wasn't appearing on that list.

    Also fix the long option, that should have no spaces in it, rename the faulty one
    to be '--build-ids', instead of '--inject build-ids'.

    Reported-by: Ingo Molnar
    Cc: Frédéric Weisbecker
    Cc: Mike Galbraith
    Cc: Paul Mackerras
    Cc: Peter Zijlstra
    Cc: Tom Zanussi
    LKML-Reference:
    Signed-off-by: Arnaldo Carvalho de Melo

    Arnaldo Carvalho de Melo
     

03 May, 2010

2 commits

  • Into two functions, one that actually reads the build_id for the dso if
    it wasn't already read, and another taht will inject the event if the
    build_id is available.

    Cc: Frédéric Weisbecker
    Cc: Mike Galbraith
    Cc: Paul Mackerras
    Cc: Peter Zijlstra
    Cc: Tom Zanussi
    LKML-Reference:
    Signed-off-by: Arnaldo Carvalho de Melo

    Arnaldo Carvalho de Melo
     
  • Currently, perf 'live mode' writes build-ids at the end of the
    session, which isn't actually useful for processing live mode events.

    What would be better would be to have the build-ids sent before any of
    the samples that reference them, which can be done by processing the
    event stream and retrieving the build-ids on the first hit. Doing
    that in perf-record itself, however, is off-limits.

    This patch introduces perf-inject, which does the same job while
    leaving perf-record untouched. Normal mode perf still records the
    build-ids at the end of the session as it should, but for live mode,
    perf-inject can be injected in between the record and report steps
    e.g.:

    perf record -o - ./hackbench 10 | perf inject -v -b | perf report -v -i -

    perf-inject reads a perf-record event stream and repipes it to stdout.
    At any point the processing code can inject other events into the
    event stream - in this case build-ids (-b option) are read and
    injected as needed into the event stream.

    Build-ids are just the first user of perf-inject - potentially
    anything that needs userspace processing to augment the trace stream
    with additional information could make use of this facility.

    Cc: Ingo Molnar
    Cc: Steven Rostedt
    Cc: Frédéric Weisbecker
    LKML-Reference:
    Signed-off-by: Tom Zanussi
    Signed-off-by: Arnaldo Carvalho de Melo

    Tom Zanussi