Просмотр исходного кода

arm64: perf: Count EL2 events if the kernel is running in HYP

When the kernel is running in HYP (with VHE), it is necessary to
include EL2 events if the user requests counting kernel or
hypervisor events.

Reviewed-by: Christoffer Dall <christoffer.dall@linaro.org>
Acked-by: Catalin Marinas <catalin.marinas@arm.com>
Acked-by: Will Deacon <will.deacon@arm.com>
Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
Marc Zyngier 10 лет назад
Родитель
Сommit
d98ecdaca2
1 измененных файлов с 5 добавлено и 1 удалено
  1. 5 1
      arch/arm64/kernel/perf_event.c

+ 5 - 1
arch/arm64/kernel/perf_event.c

@@ -20,6 +20,7 @@
  */
  */
 
 
 #include <asm/irq_regs.h>
 #include <asm/irq_regs.h>
+#include <asm/virt.h>
 
 
 #include <linux/of.h>
 #include <linux/of.h>
 #include <linux/perf/arm_pmu.h>
 #include <linux/perf/arm_pmu.h>
@@ -691,9 +692,12 @@ static int armv8pmu_set_event_filter(struct hw_perf_event *event,
 
 
 	if (attr->exclude_idle)
 	if (attr->exclude_idle)
 		return -EPERM;
 		return -EPERM;
+	if (is_kernel_in_hyp_mode() &&
+	    attr->exclude_kernel != attr->exclude_hv)
+		return -EINVAL;
 	if (attr->exclude_user)
 	if (attr->exclude_user)
 		config_base |= ARMV8_EXCLUDE_EL0;
 		config_base |= ARMV8_EXCLUDE_EL0;
-	if (attr->exclude_kernel)
+	if (!is_kernel_in_hyp_mode() && attr->exclude_kernel)
 		config_base |= ARMV8_EXCLUDE_EL1;
 		config_base |= ARMV8_EXCLUDE_EL1;
 	if (!attr->exclude_hv)
 	if (!attr->exclude_hv)
 		config_base |= ARMV8_INCLUDE_EL2;
 		config_base |= ARMV8_INCLUDE_EL2;