• Srikar Dronamraju's avatar
    perf stat: Reset previous counts on repeat with interval · 5b67a472
    Srikar Dronamraju authored
    [ Upstream commit b63fd11c ]
    
    When using 'perf stat' with repeat and interval option, it shows wrong
    values for events.
    
    The wrong values will be shown for the first interval on the second and
    subsequent repetitions.
    
    Without the fix:
    
      # perf stat -r 3 -I 2000 -e faults -e sched:sched_switch -a sleep 5
    
         2.000282489                 53      faults
         2.000282489                513      sched:sched_switch
         4.005478208              3,721      faults
         4.005478208              2,666      sched:sched_switch
         5.025470933                395      faults
         5.025470933              1,307      sched:sched_switch
         2.009602825 1,84,46,74,40,73,70,95,47,520      faults 		<------
         2.009602825 1,84,46,74,40,73,70,95,49,568      sched:sched_switch  <------
         4.019612206              4,730      faults
         4.019612206              2,746      sched:sched_switch
         5.039615484              3,953      faults
         5.039615484              1,496      sched:sched_switch
         2.000274620 1,84,46,74,40,73,70,95,47,520      faults		<------
         2.000274620 1,84,46,74,40,73,70,95,47,520      sched:sched_switch	<------
         4.000480342              4,282      faults
         4.000480342              2,303      sched:sched_switch
         5.000916811              1,322      faults
         5.000916811              1,064      sched:sched_switch
      #
    
    prev_raw_counts is allocated when using intervals. This is used when
    calculating the difference in the counts of events when using interval.
    
    The current counts are stored in prev_raw_counts to calculate the
    differences in the next iteration.
    
    On the first interval of the second and subsequent repetitions,
    prev_raw_counts would be the values stored in the last interval of the
    previous repetitions, while the current counts will only be for the
    first interval of the current repetition.
    
    Hence there is a possibility of events showing up as big number.
    
    Fix this by resetting prev_raw_counts whenever perf stat repeats the
    command.
    
    With the fix:
    
      # perf stat -r 3 -I 2000 -e faults -e sched:sched_switch -a sleep 5
    
         2.019349347              2,597      faults
         2.019349347              2,753      sched:sched_switch
         4.019577372              3,098      faults
         4.019577372              2,532      sched:sched_switch
         5.019415481              1,879      faults
         5.019415481              1,356      sched:sched_switch
         2.000178813              8,468      faults
         2.000178813              2,254      sched:sched_switch
         4.000404621              7,440      faults
         4.000404621              1,266      sched:sched_switch
         5.040196079              2,458      faults
         5.040196079                556      sched:sched_switch
         2.000191939              6,870      faults
         2.000191939              1,170      sched:sched_switch
         4.000414103                541      faults
         4.000414103                902      sched:sched_switch
         5.000809863                450      faults
         5.000809863                364      sched:sched_switch
      #
    
    Committer notes:
    
    This was broken since the cset introducing the --interval feature, i.e.
    --repeat + --interval wasn't tested at that point, add the Fixes tag so
    that automatic scripts can pick this up.
    
    Fixes: 13370a9b ("perf stat: Add interval printing")
    Signed-off-by: default avatarSrikar Dronamraju <srikar@linux.vnet.ibm.com>
    Acked-by: default avatarJiri Olsa <jolsa@kernel.org>
    Tested-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    Tested-by: default avatarRavi Bangoria <ravi.bangoria@linux.ibm.com>
    Cc: Namhyung Kim <namhyung@kernel.org>
    Cc: Naveen N. Rao <naveen.n.rao@linux.vnet.ibm.com>
    Cc: Stephane Eranian <eranian@google.com>
    Cc: stable@vger.kernel.org # v3.9+
    Link: http://lore.kernel.org/lkml/20190904094738.9558-2-srikar@linux.vnet.ibm.com
    [ Fixed up conflicts with libperf, i.e. some perf_{evsel,evlist} lost the 'perf' prefix ]
    Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
    5b67a472
builtin-stat.c 77.2 KB