]> git.baikalelectronics.ru Git - kernel.git/commitdiff
perf: Add a counter for number of user access events in context
authorRob Herring <robh@kernel.org>
Wed, 8 Dec 2021 20:11:21 +0000 (14:11 -0600)
committerWill Deacon <will@kernel.org>
Tue, 14 Dec 2021 11:30:54 +0000 (11:30 +0000)
On arm64, user space counter access will be controlled differently
compared to x86. On x86, access in the strictest mode is enabled for all
tasks in an MM when any event is mmap'ed. For arm64, access is
explicitly requested for an event and only enabled when the event's
context is active. This avoids hooks into the arch context switch code
and gives better control of when access is enabled.

In order to configure user space access when the PMU is enabled, it is
necessary to know if any event (currently active or not) in the current
context has user space accessed enabled. Add a counter similar to other
counters in the context to avoid walking the event list every time.

Reviewed-by: Mark Rutland <mark.rutland@arm.com>
Reviewed-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Rob Herring <robh@kernel.org>
Link: https://lore.kernel.org/r/20211208201124.310740-3-robh@kernel.org
Signed-off-by: Will Deacon <will@kernel.org>
include/linux/perf_event.h
kernel/events/core.c

index ba9467972c091664b3348f8a599a9b8de805d14e..411e34210fbf4f754b0107b654392fee70943f53 100644 (file)
@@ -831,6 +831,7 @@ struct perf_event_context {
 
        int                             nr_events;
        int                             nr_active;
+       int                             nr_user;
        int                             is_active;
        int                             nr_stat;
        int                             nr_freq;
index 30d94f68c5bdbcd20694d511ebeb1a5ddeac45ab..1362b9b770d8c9a44b01f59f771f2063e8d8a6f4 100644 (file)
@@ -1808,6 +1808,8 @@ list_add_event(struct perf_event *event, struct perf_event_context *ctx)
 
        list_add_rcu(&event->event_entry, &ctx->event_list);
        ctx->nr_events++;
+       if (event->hw.flags & PERF_EVENT_FLAG_USER_READ_CNT)
+               ctx->nr_user++;
        if (event->attr.inherit_stat)
                ctx->nr_stat++;
 
@@ -1999,6 +2001,8 @@ list_del_event(struct perf_event *event, struct perf_event_context *ctx)
        event->attach_state &= ~PERF_ATTACH_CONTEXT;
 
        ctx->nr_events--;
+       if (event->hw.flags & PERF_EVENT_FLAG_USER_READ_CNT)
+               ctx->nr_user--;
        if (event->attr.inherit_stat)
                ctx->nr_stat--;