• S
    powerpc/perf: Use pmc_overflow() to detect rolled back events · 81331211
    Sukadev Bhattiprolu 提交于
    For certain speculative events on Power7, 'perf stat' reports far higher
    event count than 'perf record' for the same event.
    
    As described in following commit, a performance monitor exception is raised
    even when the the performance events are rolled back.
    
            commit 0837e324
            Author: Anton Blanchard <anton@samba.org>
            Date:   Wed Mar 9 14:38:42 2011 +1100
    
    perf_event_interrupt() records an event only when an overflow occurs. But
    this check for overflow is a simple 'if (val < 0)'.
    
    Because the events are rolled back, this check for overflow fails and the
    event is not recorded. perf_event_interrupt() later uses pmc_overflow() to
    detect the overflow and resets the counters and the events are lost completely.
    
    To properly detect the overflow of rolled back events, use pmc_overflow()
    even when recording events.
    
    To reproduce:
            $ cat strcpy.c
            #include <stdio.h>
            #include <string.h>
            main()
            {
                    char buf[256];
    
                    alarm(5);
                    while(1)
                            strcpy(buf, "string1");
            }
    
            $ perf record -e r20014 ./strcpy
            $ perf report -n > report.1
            $ perf stat -e r20014 > report.2
            # Compare report.1 and report.2
    Reported-by: NMaynard Johnson <mpjohn@us.ibm.com>
    Signed-off-by: NSukadev Bhattiprolu <sukadev@linux.vnet.ibm.com>
    Signed-off-by: NBenjamin Herrenschmidt <benh@kernel.crashing.org>
    81331211
core-book3s.c 36.5 KB