diff options
author | Suzuki K Poulose <suzuki.poulose@arm.com> | 2018-07-10 09:58:01 +0100 |
---|---|---|
committer | Will Deacon <will.deacon@arm.com> | 2018-07-10 18:19:02 +0100 |
commit | 7dfc8db1d117ae08c649266d5459ac8b10800d6e (patch) | |
tree | c505fcfe33f8c4ab61cb2ee4baf385a465f51458 /drivers/perf/arm_pmu.c | |
parent | e2da97d328d4951d25f6634eda7213f7257417b6 (diff) | |
download | linux-7dfc8db1d117ae08c649266d5459ac8b10800d6e.tar.gz linux-7dfc8db1d117ae08c649266d5459ac8b10800d6e.tar.bz2 linux-7dfc8db1d117ae08c649266d5459ac8b10800d6e.zip |
arm_pmu: Tidy up clear_event_idx call backs
The armpmu uses get_event_idx callback to allocate an event
counter for a given event, which marks the selected counter
as "used". Now, when we delete the counter, the arm_pmu goes
ahead and clears the "used" bit and then invokes the "clear_event_idx"
call back, which kind of splits the job between the core code
and the backend. To keep things tidy, mandate the implementation
of clear_event_idx() and add it for exisiting backends.
This will be useful for adding the chained event support, where
we leave the event idx maintenance to the backend.
Also, when an event is removed from the PMU, reset the hw.idx
to indicate that a counter is not allocated for this event,
to help the backends do better checks. This will be also used
for the chain counter support.
Cc: Will Deacon <will.deacon@arm.com>
Cc: Mark Rutland <mark.rutland@arm.com>
Reviewed-by: Julien Thierry <julien.thierry@arm.com>
Signed-off-by: Suzuki K Poulose <suzuki.poulose@arm.com>
Signed-off-by: Will Deacon <will.deacon@arm.com>
Diffstat (limited to 'drivers/perf/arm_pmu.c')
-rw-r--r-- | drivers/perf/arm_pmu.c | 7 |
1 files changed, 3 insertions, 4 deletions
diff --git a/drivers/perf/arm_pmu.c b/drivers/perf/arm_pmu.c index 8cad6b535a2c..a28881058f18 100644 --- a/drivers/perf/arm_pmu.c +++ b/drivers/perf/arm_pmu.c @@ -238,11 +238,10 @@ armpmu_del(struct perf_event *event, int flags) armpmu_stop(event, PERF_EF_UPDATE); hw_events->events[idx] = NULL; - clear_bit(idx, hw_events->used_mask); - if (armpmu->clear_event_idx) - armpmu->clear_event_idx(hw_events, event); - + armpmu->clear_event_idx(hw_events, event); perf_event_update_userpage(event); + /* Clear the allocated counter */ + hwc->idx = -1; } static int |