]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
perf/core: Merge struct pmu::pmu_disable_count into struct perf_cpu_pmu_context:...
authorPeter Zijlstra <peterz@infradead.org>
Mon, 4 Nov 2024 13:39:18 +0000 (14:39 +0100)
committerIngo Molnar <mingo@kernel.org>
Tue, 4 Mar 2025 08:42:47 +0000 (09:42 +0100)
Because it makes no sense to have two per-cpu allocations per pmu.

Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Reviewed-by: Ravi Bangoria <ravi.bangoria@amd.com>
Link: https://lore.kernel.org/r/20241104135518.518730578@infradead.org
include/linux/perf_event.h
kernel/events/core.c

index 8c0117bcbdb9f00477fd5cef5d992e351dd209e1..5f293e679ab6bf69f85432413d29bcce7650eae1 100644 (file)
@@ -343,7 +343,6 @@ struct pmu {
         */
        unsigned int                    scope;
 
-       int __percpu                    *pmu_disable_count;
        struct perf_cpu_pmu_context __percpu *cpu_pmu_context;
        atomic_t                        exclusive_cnt; /* < 0: cpu; > 0: tsk */
        int                             task_ctx_nr;
@@ -1031,6 +1030,7 @@ struct perf_cpu_pmu_context {
 
        int                             active_oncpu;
        int                             exclusive;
+       int                             pmu_disable_count;
 
        raw_spinlock_t                  hrtimer_lock;
        struct hrtimer                  hrtimer;
index 348a379d4f05102fddf1153286dc5aa7e4151a42..8321b719b6abf1a65274729168f9344f28e29ed7 100644 (file)
@@ -1219,21 +1219,22 @@ static int perf_mux_hrtimer_restart_ipi(void *arg)
 
 void perf_pmu_disable(struct pmu *pmu)
 {
-       int *count = this_cpu_ptr(pmu->pmu_disable_count);
+       int *count = &this_cpu_ptr(pmu->cpu_pmu_context)->pmu_disable_count;
        if (!(*count)++)
                pmu->pmu_disable(pmu);
 }
 
 void perf_pmu_enable(struct pmu *pmu)
 {
-       int *count = this_cpu_ptr(pmu->pmu_disable_count);
+       int *count = &this_cpu_ptr(pmu->cpu_pmu_context)->pmu_disable_count;
        if (!--(*count))
                pmu->pmu_enable(pmu);
 }
 
 static void perf_assert_pmu_disabled(struct pmu *pmu)
 {
-       WARN_ON_ONCE(*this_cpu_ptr(pmu->pmu_disable_count) == 0);
+       int *count = &this_cpu_ptr(pmu->cpu_pmu_context)->pmu_disable_count;
+       WARN_ON_ONCE(*count == 0);
 }
 
 static inline void perf_pmu_read(struct perf_event *event)
@@ -11906,7 +11907,6 @@ static bool idr_cmpxchg(struct idr *idr, unsigned long id, void *old, void *new)
 
 static void perf_pmu_free(struct pmu *pmu)
 {
-       free_percpu(pmu->pmu_disable_count);
        if (pmu_bus_running && pmu->dev && pmu->dev != PMU_NULL_DEV) {
                if (pmu->nr_addr_filters)
                        device_remove_file(pmu->dev, &dev_attr_nr_addr_filters);
@@ -11925,10 +11925,6 @@ int perf_pmu_register(struct pmu *_pmu, const char *name, int type)
        struct pmu *pmu __free(pmu_unregister) = _pmu;
        guard(mutex)(&pmus_lock);
 
-       pmu->pmu_disable_count = alloc_percpu(int);
-       if (!pmu->pmu_disable_count)
-               return -ENOMEM;
-
        if (WARN_ONCE(!name, "Can not register anonymous pmu.\n"))
                return -EINVAL;