lkml.org 
[lkml]   [2019]   [Oct]   [16]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.9 28/92] perf stat: Fix a segmentation fault when using repeat forever
    Date
    From: Srikar Dronamraju <srikar@linux.vnet.ibm.com>

    [ Upstream commit 443f2d5ba13d65ccfd879460f77941875159d154 ]

    Observe a segmentation fault when 'perf stat' is asked to repeat forever
    with the interval option.

    Without fix:

    # perf stat -r 0 -I 5000 -e cycles -a sleep 10
    # time counts unit events
    5.000211692 3,13,89,82,34,157 cycles
    10.000380119 1,53,98,52,22,294 cycles
    10.040467280 17,16,79,265 cycles
    Segmentation fault

    This problem was only observed when we use forever option aka -r 0 and
    works with limited repeats. Calling print_counter with ts being set to
    NULL, is not a correct option when interval is set. Hence avoid
    print_counter(NULL,..) if interval is set.

    With fix:

    # perf stat -r 0 -I 5000 -e cycles -a sleep 10
    # time counts unit events
    5.019866622 3,15,14,43,08,697 cycles
    10.039865756 3,15,16,31,95,261 cycles
    10.059950628 1,26,05,47,158 cycles
    5.009902655 3,14,52,62,33,932 cycles
    10.019880228 3,14,52,22,89,154 cycles
    10.030543876 66,90,18,333 cycles
    5.009848281 3,14,51,98,25,437 cycles
    10.029854402 3,15,14,93,04,918 cycles
    5.009834177 3,14,51,95,92,316 cycles

    Committer notes:

    Did the 'git bisect' to find the cset introducing the problem to add the
    Fixes tag below, and at that time the problem reproduced as:

    (gdb) run stat -r0 -I500 sleep 1
    <SNIP>
    Program received signal SIGSEGV, Segmentation fault.
    print_interval (prefix=prefix@entry=0x7fffffffc8d0 "", ts=ts@entry=0x0) at builtin-stat.c:866
    866 sprintf(prefix, "%6lu.%09lu%s", ts->tv_sec, ts->tv_nsec, csv_sep);
    (gdb) bt
    #0 print_interval (prefix=prefix@entry=0x7fffffffc8d0 "", ts=ts@entry=0x0) at builtin-stat.c:866
    #1 0x000000000041860a in print_counters (ts=ts@entry=0x0, argc=argc@entry=2, argv=argv@entry=0x7fffffffd640) at builtin-stat.c:938
    #2 0x0000000000419a7f in cmd_stat (argc=2, argv=0x7fffffffd640, prefix=<optimized out>) at builtin-stat.c:1411
    #3 0x000000000045c65a in run_builtin (p=p@entry=0x6291b8 <commands+216>, argc=argc@entry=5, argv=argv@entry=0x7fffffffd640) at perf.c:370
    #4 0x000000000045c893 in handle_internal_command (argc=5, argv=0x7fffffffd640) at perf.c:429
    #5 0x000000000045c8f1 in run_argv (argcp=argcp@entry=0x7fffffffd4ac, argv=argv@entry=0x7fffffffd4a0) at perf.c:473
    #6 0x000000000045cac9 in main (argc=<optimized out>, argv=<optimized out>) at perf.c:588
    (gdb)

    Mostly the same as just before this patch:

    Program received signal SIGSEGV, Segmentation fault.
    0x00000000005874a7 in print_interval (config=0xa1f2a0 <stat_config>, evlist=0xbc9b90, prefix=0x7fffffffd1c0 "`", ts=0x0) at util/stat-display.c:964
    964 sprintf(prefix, "%6lu.%09lu%s", ts->tv_sec, ts->tv_nsec, config->csv_sep);
    (gdb) bt
    #0 0x00000000005874a7 in print_interval (config=0xa1f2a0 <stat_config>, evlist=0xbc9b90, prefix=0x7fffffffd1c0 "`", ts=0x0) at util/stat-display.c:964
    #1 0x0000000000588047 in perf_evlist__print_counters (evlist=0xbc9b90, config=0xa1f2a0 <stat_config>, _target=0xa1f0c0 <target>, ts=0x0, argc=2, argv=0x7fffffffd670)
    at util/stat-display.c:1172
    #2 0x000000000045390f in print_counters (ts=0x0, argc=2, argv=0x7fffffffd670) at builtin-stat.c:656
    #3 0x0000000000456bb5 in cmd_stat (argc=2, argv=0x7fffffffd670) at builtin-stat.c:1960
    #4 0x00000000004dd2e0 in run_builtin (p=0xa30e00 <commands+288>, argc=5, argv=0x7fffffffd670) at perf.c:310
    #5 0x00000000004dd54d in handle_internal_command (argc=5, argv=0x7fffffffd670) at perf.c:362
    #6 0x00000000004dd694 in run_argv (argcp=0x7fffffffd4cc, argv=0x7fffffffd4c0) at perf.c:406
    #7 0x00000000004dda11 in main (argc=5, argv=0x7fffffffd670) at perf.c:531
    (gdb)

    Fixes: d4f63a4741a8 ("perf stat: Introduce print_counters function")
    Signed-off-by: Srikar Dronamraju <srikar@linux.vnet.ibm.com>
    Acked-by: Jiri Olsa <jolsa@kernel.org>
    Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com>
    Tested-by: Ravi Bangoria <ravi.bangoria@linux.ibm.com>
    Cc: Namhyung Kim <namhyung@kernel.org>
    Cc: Naveen N. Rao <naveen.n.rao@linux.vnet.ibm.com>
    Cc: stable@vger.kernel.org # v4.2+
    Link: http://lore.kernel.org/lkml/20190904094738.9558-3-srikar@linux.vnet.ibm.com
    Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    tools/perf/builtin-stat.c | 2 +-
    1 file changed, 1 insertion(+), 1 deletion(-)

    diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c
    index 43d5f35e90747..e55dbceadad6c 100644
    --- a/tools/perf/builtin-stat.c
    +++ b/tools/perf/builtin-stat.c
    @@ -2565,7 +2565,7 @@ int cmd_stat(int argc, const char **argv, const char *prefix __maybe_unused)
    run_idx + 1);

    status = run_perf_stat(argc, argv);
    - if (forever && status != -1) {
    + if (forever && status != -1 && !interval) {
    print_counters(NULL, argc, argv);
    perf_stat__reset_stats();
    }
    --
    2.20.1


    \
     
     \ /
      Last update: 2019-10-17 00:19    [W:4.073 / U:0.152 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site