Tony Jones d2e0e0
From: Rob Herring <robh@kernel.org>
Tony Jones d2e0e0
Date: Wed, 8 Dec 2021 14:11:20 -0600
Tony Jones d2e0e0
Subject: x86: perf: Move RDPMC event flag to a common definition
Tony Jones d2e0e0
Git-commit: 369461ce8fb6c8156206c7110d7da48e9fbc41bb
Tony Jones d2e0e0
Patch-mainline: v5.17-rc1
Tony Jones d2e0e0
References: jsc#PED-1754 (dependent patch)
Tony Jones d2e0e0
Tony Jones d2e0e0
In preparation to enable user counter access on arm64 and to move some
Tony Jones d2e0e0
of the user access handling to perf core, create a common event flag for
Tony Jones d2e0e0
user counter access and convert x86 to use it.
Tony Jones d2e0e0
Tony Jones d2e0e0
Since the architecture specific flags start at the LSB, starting at the
Tony Jones d2e0e0
MSB for common flags.
Tony Jones d2e0e0
Tony Jones d2e0e0
Cc: Peter Zijlstra <peterz@infradead.org>
Tony Jones d2e0e0
Cc: Ingo Molnar <mingo@redhat.com>
Tony Jones d2e0e0
Cc: Arnaldo Carvalho de Melo <acme@kernel.org>
Tony Jones d2e0e0
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Tony Jones d2e0e0
Cc: Jiri Olsa <jolsa@redhat.com>
Tony Jones d2e0e0
Cc: Namhyung Kim <namhyung@kernel.org>
Tony Jones d2e0e0
Cc: Kan Liang <kan.liang@linux.intel.com>
Tony Jones d2e0e0
Cc: Thomas Gleixner <tglx@linutronix.de>
Tony Jones d2e0e0
Cc: Borislav Petkov <bp@alien8.de>
Tony Jones d2e0e0
Cc: x86@kernel.org
Tony Jones d2e0e0
Cc: "H. Peter Anvin" <hpa@zytor.com>
Tony Jones d2e0e0
Cc: linux-perf-users@vger.kernel.org
Tony Jones d2e0e0
Reviewed-by: Mark Rutland <mark.rutland@arm.com>
Tony Jones d2e0e0
Reviewed-by: Thomas Gleixner <tglx@linutronix.de>
Tony Jones d2e0e0
Signed-off-by: Rob Herring <robh@kernel.org>
Tony Jones d2e0e0
Link: https://lore.kernel.org/r/20211208201124.310740-2-robh@kernel.org
Tony Jones d2e0e0
Signed-off-by: Will Deacon <will@kernel.org>
Tony Jones d2e0e0
Signed-off-by: Tony Jones <tonyj@suse.de>
Tony Jones d2e0e0
---
Tony Jones d2e0e0
 arch/x86/events/core.c       | 10 +++++-----
Tony Jones d2e0e0
 arch/x86/events/perf_event.h |  2 +-
Tony Jones d2e0e0
 include/linux/perf_event.h   |  9 +++++++++
Tony Jones d2e0e0
 3 files changed, 15 insertions(+), 6 deletions(-)
Tony Jones d2e0e0
Tony Jones d2e0e0
diff --git a/arch/x86/events/core.c b/arch/x86/events/core.c
Tony Jones d2e0e0
index 38b2c779146f..68dea7ce6a22 100644
Tony Jones d2e0e0
--- a/arch/x86/events/core.c
Tony Jones d2e0e0
+++ b/arch/x86/events/core.c
Tony Jones d2e0e0
@@ -2476,7 +2476,7 @@ static int x86_pmu_event_init(struct perf_event *event)
Tony Jones d2e0e0
 
Tony Jones d2e0e0
 	if (READ_ONCE(x86_pmu.attr_rdpmc) &&
Tony Jones d2e0e0
 	    !(event->hw.flags & PERF_X86_EVENT_LARGE_PEBS))
Tony Jones d2e0e0
-		event->hw.flags |= PERF_X86_EVENT_RDPMC_ALLOWED;
Tony Jones d2e0e0
+		event->hw.flags |= PERF_EVENT_FLAG_USER_READ_CNT;
Tony Jones d2e0e0
 
Tony Jones d2e0e0
 	return err;
Tony Jones d2e0e0
 }
Tony Jones d2e0e0
@@ -2510,7 +2510,7 @@ void perf_clear_dirty_counters(void)
Tony Jones d2e0e0
 
Tony Jones d2e0e0
 static void x86_pmu_event_mapped(struct perf_event *event, struct mm_struct *mm)
Tony Jones d2e0e0
 {
Tony Jones d2e0e0
-	if (!(event->hw.flags & PERF_X86_EVENT_RDPMC_ALLOWED))
Tony Jones d2e0e0
+	if (!(event->hw.flags & PERF_EVENT_FLAG_USER_READ_CNT))
Tony Jones d2e0e0
 		return;
Tony Jones d2e0e0
 
Tony Jones d2e0e0
 	/*
Tony Jones d2e0e0
@@ -2531,7 +2531,7 @@ static void x86_pmu_event_mapped(struct perf_event *event, struct mm_struct *mm)
Tony Jones d2e0e0
 
Tony Jones d2e0e0
 static void x86_pmu_event_unmapped(struct perf_event *event, struct mm_struct *mm)
Tony Jones d2e0e0
 {
Tony Jones d2e0e0
-	if (!(event->hw.flags & PERF_X86_EVENT_RDPMC_ALLOWED))
Tony Jones d2e0e0
+	if (!(event->hw.flags & PERF_EVENT_FLAG_USER_READ_CNT))
Tony Jones d2e0e0
 		return;
Tony Jones d2e0e0
 
Tony Jones d2e0e0
 	if (atomic_dec_and_test(&mm->context.perf_rdpmc_allowed))
Tony Jones d2e0e0
@@ -2542,7 +2542,7 @@ static int x86_pmu_event_idx(struct perf_event *event)
Tony Jones d2e0e0
 {
Tony Jones d2e0e0
 	struct hw_perf_event *hwc = &event->hw;
Tony Jones d2e0e0
 
Tony Jones d2e0e0
-	if (!(hwc->flags & PERF_X86_EVENT_RDPMC_ALLOWED))
Tony Jones d2e0e0
+	if (!(hwc->flags & PERF_EVENT_FLAG_USER_READ_CNT))
Tony Jones d2e0e0
 		return 0;
Tony Jones d2e0e0
 
Tony Jones d2e0e0
 	if (is_metric_idx(hwc->idx))
Tony Jones d2e0e0
@@ -2725,7 +2725,7 @@ void arch_perf_update_userpage(struct perf_event *event,
Tony Jones d2e0e0
 	userpg->cap_user_time = 0;
Tony Jones d2e0e0
 	userpg->cap_user_time_zero = 0;
Tony Jones d2e0e0
 	userpg->cap_user_rdpmc =
Tony Jones d2e0e0
-		!!(event->hw.flags & PERF_X86_EVENT_RDPMC_ALLOWED);
Tony Jones d2e0e0
+		!!(event->hw.flags & PERF_EVENT_FLAG_USER_READ_CNT);
Tony Jones d2e0e0
 	userpg->pmc_width = x86_pmu.cntval_bits;
Tony Jones d2e0e0
 
Tony Jones d2e0e0
 	if (!using_native_sched_clock() || !sched_clock_stable())
Tony Jones d2e0e0
diff --git a/arch/x86/events/perf_event.h b/arch/x86/events/perf_event.h
Tony Jones d2e0e0
index 5480db242083..9d376e528dfc 100644
Tony Jones d2e0e0
--- a/arch/x86/events/perf_event.h
Tony Jones d2e0e0
+++ b/arch/x86/events/perf_event.h
Tony Jones d2e0e0
@@ -74,7 +74,7 @@ static inline bool constraint_match(struct event_constraint *c, u64 ecode)
Tony Jones d2e0e0
 #define PERF_X86_EVENT_PEBS_NA_HSW	0x0010 /* haswell style datala, unknown */
Tony Jones d2e0e0
 #define PERF_X86_EVENT_EXCL		0x0020 /* HT exclusivity on counter */
Tony Jones d2e0e0
 #define PERF_X86_EVENT_DYNAMIC		0x0040 /* dynamic alloc'd constraint */
Tony Jones d2e0e0
-#define PERF_X86_EVENT_RDPMC_ALLOWED	0x0080 /* grant rdpmc permission */
Tony Jones d2e0e0
+
Tony Jones d2e0e0
 #define PERF_X86_EVENT_EXCL_ACCT	0x0100 /* accounted EXCL event */
Tony Jones d2e0e0
 #define PERF_X86_EVENT_AUTO_RELOAD	0x0200 /* use PEBS auto-reload */
Tony Jones d2e0e0
 #define PERF_X86_EVENT_LARGE_PEBS	0x0400 /* use large PEBS */
Tony Jones d2e0e0
diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h
Tony Jones d2e0e0
index 0dcfd265beed..ba9467972c09 100644
Tony Jones d2e0e0
--- a/include/linux/perf_event.h
Tony Jones d2e0e0
+++ b/include/linux/perf_event.h
Tony Jones d2e0e0
@@ -129,6 +129,15 @@ struct hw_perf_event_extra {
Tony Jones d2e0e0
 	int		idx;	/* index in shared_regs->regs[] */
Tony Jones d2e0e0
 };
Tony Jones d2e0e0
 
Tony Jones d2e0e0
+/**
Tony Jones d2e0e0
+ * hw_perf_event::flag values
Tony Jones d2e0e0
+ *
Tony Jones d2e0e0
+ * PERF_EVENT_FLAG_ARCH bits are reserved for architecture-specific
Tony Jones d2e0e0
+ * usage.
Tony Jones d2e0e0
+ */
Tony Jones d2e0e0
+#define PERF_EVENT_FLAG_ARCH			0x0000ffff
Tony Jones d2e0e0
+#define PERF_EVENT_FLAG_USER_READ_CNT		0x80000000
Tony Jones d2e0e0
+
Tony Jones d2e0e0
 /**
Tony Jones d2e0e0
  * struct hw_perf_event - performance event hardware details:
Tony Jones d2e0e0
  */
Tony Jones d2e0e0