• Athira Rajeev's avatar
    powerpc/perf: Fix power10 event alternatives · c6cc9a85
    Athira Rajeev authored
    When scheduling a group of events, there are constraint checks done to
    make sure all events can go in a group. Example, one of the criteria is
    that events in a group cannot use the same PMC. But platform specific
    PMU supports alternative event for some of the event codes. During
    perf_event_open(), if any event group doesn't match constraint check
    criteria, further lookup is done to find alternative event.
    
    By current design, the array of alternatives events in PMU code is
    expected to be sorted by column 0. This is because in
    find_alternative() the return criteria is based on event code
    comparison. ie. "event < ev_alt[i][0])". This optimisation is there
    since find_alternative() can be called multiple times. In power10 PMU
    code, the alternative event array is not sorted properly and hence there
    is breakage in finding alternative event.
    
    To work with existing logic, fix the alternative event array to be
    sorted by column 0 for power10-pmu.c
    
    Results:
    
    In case where an alternative event is not chosen when we could, events
    will be multiplexed. ie, time sliced where it could actually run
    concurrently.
    
    Example, in power10 PM_INST_CMPL_ALT(0x00002) has alternative event,
    PM_INST_CMPL(0x500fa). Without the fix, if a group of events with PMC1
    to PMC4 is used along with PM_INST_CMPL_ALT, it will be time sliced
    since all programmable PMC's are consumed already. But with the fix,
    when it picks alternative event on PMC5, all events will run
    concurrently.
    
    Before:
    
     # perf stat -e r00002,r100fc,r200fa,r300fc,r400fc
    
     Performance counter stats for 'system wide':
    
             328668935      r00002               (79.94%)
              56501024      r100fc               (79.95%)
              49564238      r200fa               (79.95%)
                   376      r300fc               (80.19%)
                   660      r400fc               (79.97%)
    
           4.039150522 seconds time elapsed
    
    With the fix, since alternative event is chosen to run on PMC6, events
    will be run concurrently.
    
    After:
    
     # perf stat -e r00002,r100fc,r200fa,r300fc,r400fc
    
     Performance counter stats for 'system wide':
    
              23596607      r00002
               4907738      r100fc
               2283608      r200fa
                   135      r300fc
                   248      r400fc
    
           1.664671390 seconds time elapsed
    
    Fixes: a64e697c ("powerpc/perf: power10 Performance Monitoring support")
    Signed-off-by: default avatarAthira Rajeev <atrajeev@linux.vnet.ibm.com>
    Reviewed-by: default avatarMadhavan Srinivasan <maddy@linux.vnet.ibm.com>
    Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
    Link: https://lore.kernel.org/r/20220419114828.89843-2-atrajeev@linux.vnet.ibm.com
    c6cc9a85
power10-pmu.c 17.1 KB