During performance monitor interrupt handling, the regs are setup using
perf_read_regs function. Here some of the pt_regs fields is overloaded.
Samples Instruction Event Register (SIER) is loaded into pt_regs,
overloading regs->dar. And regs->dsisr to store MMCRA (Monitor Mode
Control Register A) so that we only need to read these once on each
interrupt.

Update the isa207_get_mem_data_src function to use regs->dar instead of
reading from SPRN_SIER again. Also use regs->dsisr to read the mmcra
value

Reported-by: Disha Goel <disg...@linux.vnet.ibm.com>
Signed-off-by: Athira Rajeev <atraj...@linux.vnet.ibm.com>
---
 arch/powerpc/perf/isa207-common.c | 14 ++++++++++++--
 1 file changed, 12 insertions(+), 2 deletions(-)

diff --git a/arch/powerpc/perf/isa207-common.c 
b/arch/powerpc/perf/isa207-common.c
index 031a2b63c171..2b3547fdba4a 100644
--- a/arch/powerpc/perf/isa207-common.c
+++ b/arch/powerpc/perf/isa207-common.c
@@ -319,7 +319,13 @@ void isa207_get_mem_data_src(union perf_mem_data_src 
*dsrc, u32 flags,
                return;
        }
 
-       sier = mfspr(SPRN_SIER);
+       /*
+        * Use regs-dar for SPRN_SIER which is saved
+        * during perf_read_regs at the beginning
+        * of the PMU interrupt handler to avoid multiple
+        * reads of SPRN_SIER
+        */
+       sier = regs->dar;
        val = (sier & ISA207_SIER_TYPE_MASK) >> ISA207_SIER_TYPE_SHIFT;
        if (val != 1 && val != 2 && !(val == 7 && 
cpu_has_feature(CPU_FTR_ARCH_31))) {
                dsrc->val = 0;
@@ -340,8 +346,12 @@ void isa207_get_mem_data_src(union perf_mem_data_src 
*dsrc, u32 flags,
                 * to determine the exact instruction type. If the sampling
                 * criteria is neither load or store, set the type as default
                 * to NA.
+                *
+                * Use regs->dsisr for MMCRA which is saved during 
perf_read_regs
+                * at the beginning of the PMU interrupt handler to avoid
+                * multiple reads of SPRN_MMCRA
                 */
-               mmcra = mfspr(SPRN_MMCRA);
+               mmcra = regs->dsisr;
 
                op_type = (mmcra >> MMCRA_SAMP_ELIG_SHIFT) & 
MMCRA_SAMP_ELIG_MASK;
                switch (op_type) {
-- 
2.43.5


Reply via email to