• Kajol Jain's avatar
    powerpc/perf/hv-gpci: Fix counter value parsing · f9addd85
    Kajol Jain authored
    H_GetPerformanceCounterInfo (0xF080) hcall returns the counter data in
    the result buffer. Result buffer has specific format defined in the PAPR
    specification. One of the fields is counter offset and width of the
    counter data returned.
    
    Counter data are returned in a unsigned char array in big endian byte
    order. To get the final counter data, the values must be left shifted
    byte at a time. But commit 220a0c60 ("powerpc/perf: Add support for
    the hv gpci (get performance counter info) interface") made the shifting
    bitwise and also assumed little endian order. Because of that, hcall
    counters values are reported incorrectly.
    
    In particular this can lead to counters go backwards which messes up the
    counter prev vs now calculation and leads to huge counter value
    reporting:
    
      #: perf stat -e hv_gpci/system_tlbie_count_and_time_tlbie_instructions_issued/
               -C 0 -I 1000
            time             counts unit events
         1.000078854 18,446,744,073,709,535,232      hv_gpci/system_tlbie_count_and_time_tlbie_instructions_issued/
         2.000213293                  0      hv_gpci/system_tlbie_count_and_time_tlbie_instructions_issued/
         3.000320107                  0      hv_gpci/system_tlbie_count_and_time_tlbie_instructions_issued/
         4.000428392                  0      hv_gpci/system_tlbie_count_and_time_tlbie_instructions_issued/
         5.000537864                  0      hv_gpci/system_tlbie_count_and_time_tlbie_instructions_issued/
         6.000649087                  0      hv_gpci/system_tlbie_count_and_time_tlbie_instructions_issued/
         7.000760312                  0      hv_gpci/system_tlbie_count_and_time_tlbie_instructions_issued/
         8.000865218             16,448      hv_gpci/system_tlbie_count_and_time_tlbie_instructions_issued/
         9.000978985 18,446,744,073,709,535,232      hv_gpci/system_tlbie_count_and_time_tlbie_instructions_issued/
        10.001088891             16,384      hv_gpci/system_tlbie_count_and_time_tlbie_instructions_issued/
        11.001201435                  0      hv_gpci/system_tlbie_count_and_time_tlbie_instructions_issued/
        12.001307937 18,446,744,073,709,535,232      hv_gpci/system_tlbie_count_and_time_tlbie_instructions_issued/
    
    Fix the shifting logic to correct match the format, ie. read bytes in
    big endian order.
    
    Fixes: e4f226b1 ("powerpc/perf/hv-gpci: Increase request buffer size")
    Cc: stable@vger.kernel.org # v4.6+
    Reported-by: Nageswara R Sastry<rnsastry@linux.ibm.com>
    Signed-off-by: default avatarKajol Jain <kjain@linux.ibm.com>
    Tested-by: Nageswara R Sastry<rnsastry@linux.ibm.com>
    Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
    Link: https://lore.kernel.org/r/20210813082158.429023-1-kjain@linux.ibm.com
    f9addd85
hv-gpci.c 8.7 KB