• Mark Rutland's avatar
    arm64: perf: Avoid PMXEV* indirection · 0fdf1bb7
    Mark Rutland authored
    Currently we access the counter registers and their respective type
    registers indirectly. This requires us to write to PMSELR, issue an ISB,
    then access the relevant PMXEV* registers.
    
    This is unfortunate, because:
    
    * Under virtualization, accessing one register requires two traps to
      the hypervisor, even though we could access the register directly with
      a single trap.
    
    * We have to issue an ISB which we could otherwise avoid the cost of.
    
    * When we use NMIs, the NMI handler will have to save/restore the select
      register in case the code it preempted was attempting to access a
      counter or its type register.
    
    We can avoid these issues by directly accessing the relevant registers.
    This patch adds helpers to do so.
    
    In armv8pmu_enable_event() we still need the ISB to prevent the PE from
    reordering the write to PMINTENSET_EL1 register. If the interrupt is
    enabled before we disable the counter and the new event is configured,
    we might get an interrupt triggered by the previously programmed event
    overflowing, but which we wrongly attribute to the event that we are
    enabling. Execute an ISB after we disable the counter.
    
    In the process, remove the comment that refers to the ARMv7 PMU.
    
    [Julien T.: Don't inline read/write functions to avoid big code-size
    	increase, remove unused read_pmevtypern function,
    	fix counter index issue.]
    [Alexandru E.: Removed comment, removed trailing semicolons in macros,
    	added ISB]
    Signed-off-by: default avatarMark Rutland <mark.rutland@arm.com>
    Signed-off-by: default avatarJulien Thierry <julien.thierry@arm.com>
    Signed-off-by: default avatarAlexandru Elisei <alexandru.elisei@arm.com>
    Tested-by: Sumit Garg <sumit.garg@linaro.org> (Developerbox)
    Cc: Julien Thierry <julien.thierry.kdev@gmail.com>
    Cc: Will Deacon <will.deacon@arm.com>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Ingo Molnar <mingo@redhat.com>
    Cc: Arnaldo Carvalho de Melo <acme@kernel.org>
    Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
    Cc: Jiri Olsa <jolsa@redhat.com>
    Cc: Namhyung Kim <namhyung@kernel.org>
    Cc: Catalin Marinas <catalin.marinas@arm.com>
    Link: https://lore.kernel.org/r/20200924110706.254996-3-alexandru.elisei@arm.comSigned-off-by: default avatarWill Deacon <will@kernel.org>
    0fdf1bb7
perf_event.c 40.3 KB