Right now the `config_bhrb` PMU specific call happens after write_mmcr0
which actually enables the PMU for event counting and interrupt. So
there is a small window of time where the PMU and BHRB runs without the
required HW branch filter (if any) enabled in BHRB. This can cause some
of the branch samples to be collected through BHRB without any filter
being applied and hence affecting the correctness of the results. This
patch moves the BHRB config function call before enabling the interrupts.

Here are some data points captured via trace prints which depicts how we
could get PMU interrupts with BHRB filter NOT enabled with a standard
perf record command line (asking for branch record information as well).

        perf record -j any_call ls

Before the patch:-

              ls-1962  [003] d...  2065.299590: .perf_event_interrupt: MMCRA: 
40000000000
              ls-1962  [003] d...  2065.299603: .perf_event_interrupt: MMCRA: 
40000000000
              ls-1962  [003] d...  2065.299611: .perf_event_interrupt: MMCRA: 
40000000000
              ls-1962  [003] d...  2065.299618: .perf_event_interrupt: MMCRA: 
40000000000
              ls-1962  [003] d...  2065.299625: .perf_event_interrupt: MMCRA: 
40000000000
              ls-1962  [003] d...  2065.299632: .perf_event_interrupt: MMCRA: 
40000000000
              ls-1962  [003] d...  2065.299639: .perf_event_interrupt: MMCRA: 
40000000000

              --> All the PMU interrupts before this point did not have the
              --> requested HW branch filter enabled in the MMCRA.

              ls-1962  [003] d...  2065.299647: .perf_event_interrupt: MMCRA: 
40040000000
              ls-1962  [003] d...  2065.299662: .perf_event_interrupt: MMCRA: 
40040000000
              ls-1962  [003] d...  2065.299700: .perf_event_interrupt: MMCRA: 
40040000000
              ls-1962  [003] d...  2065.299798: .perf_event_interrupt: MMCRA: 
40040000000
              ls-1962  [003] d...  2065.299956: .perf_event_interrupt: MMCRA: 
40040000000
              ls-1962  [003] d...  2065.300145: .perf_event_interrupt: MMCRA: 
40040000000
              ls-1962  [003] d...  2065.300347: .perf_event_interrupt: MMCRA: 
40040000000
              ls-1962  [003] d...  2065.300556: .perf_event_interrupt: MMCRA: 
40040000000
              ls-1962  [003] d...  2065.300771: .perf_event_interrupt: MMCRA: 
40040000000

After the patch:-

              ls-1850  [008] d...   190.311828: .perf_event_interrupt: MMCRA: 
40040000000
              ls-1850  [008] d...   190.311848: .perf_event_interrupt: MMCRA: 
40040000000
              ls-1850  [008] d...   190.311856: .perf_event_interrupt: MMCRA: 
40040000000
              ls-1850  [008] d...   190.311863: .perf_event_interrupt: MMCRA: 
40040000000
              ls-1850  [008] d...   190.311869: .perf_event_interrupt: MMCRA: 
40040000000
              ls-1850  [008] d...   190.311876: .perf_event_interrupt: MMCRA: 
40040000000
              ls-1850  [008] d...   190.311884: .perf_event_interrupt: MMCRA: 
40040000000
              ls-1850  [008] d...   190.311892: .perf_event_interrupt: MMCRA: 
40040000000
              ls-1850  [008] d...   190.311907: .perf_event_interrupt: MMCRA: 
40040000000
              ls-1850  [008] d...   190.311945: .perf_event_interrupt: MMCRA: 
40040000000
              ls-1850  [008] d...   190.312044: .perf_event_interrupt: MMCRA: 
40040000000
              ls-1850  [008] d...   190.312206: .perf_event_interrupt: MMCRA: 
40040000000
              ls-1850  [008] d...   190.312397: .perf_event_interrupt: MMCRA: 
40040000000
              ls-1850  [008] d..2   190.312626: .perf_event_interrupt: MMCRA: 
40040000000
              ls-1850  [008] d...   190.312814: .perf_event_interrupt: MMCRA: 
40040000000
              ls-1850  [008] d...   190.313004: .perf_event_interrupt: MMCRA: 
40040000000

              --> All the PMU interrupts have the requested
              --> HW BHRB branch filter enabled in MMCRA.

Signed-off-by: Anshuman Khandual <khand...@linux.vnet.ibm.com>
---
 arch/powerpc/perf/core-book3s.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/arch/powerpc/perf/core-book3s.c b/arch/powerpc/perf/core-book3s.c
index 29b89e8..7d2f13c 100644
--- a/arch/powerpc/perf/core-book3s.c
+++ b/arch/powerpc/perf/core-book3s.c
@@ -1147,6 +1147,9 @@ static void power_pmu_enable(struct pmu *pmu)
        mmcr0 = ebb_switch_in(ebb, cpuhw->mmcr[0]);
 
        mb();
+       if (cpuhw->bhrb_users)
+               ppmu->config_bhrb(cpuhw->bhrb_filter);
+       
        write_mmcr0(cpuhw, mmcr0);
 
        /*
@@ -1158,8 +1161,6 @@ static void power_pmu_enable(struct pmu *pmu)
        }
 
  out:
-       if (cpuhw->bhrb_users)
-               ppmu->config_bhrb(cpuhw->bhrb_filter);
 
        local_irq_restore(flags);
 }
-- 
1.7.11.7

_______________________________________________
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev

Reply via email to