mirror of
https://github.com/torvalds/linux.git
synced 2026-10-23 23:51:02 +02:00
perf/x86/amd/uncore: Free counter slot by index
amd_uncore_del() scans ctx->events[] from slot zero and attempts a compare-exchange until it finds the event. amd_uncore_add() records the slot it claimed in event->hw.idx. Perf calls ->del() only after a successful ->add(), and the driver never moves an installed event between slots. The index therefore remains valid until deletion. Use the recorded index directly and retain the compare-exchange ownership check. Warn if it fails, as that means the driver lost track of the slot. Deleting all events from a full PMU with N counters now requires N compare-exchanges instead of N * (N + 1) / 2. On a host running a production workload in the Meta fleet, amd_uncore_del() was called 56,575 times per second from mux rotation. Signed-off-by: Usama Arif <usama.arif@linux.dev> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Reviewed-by: Sandipan Das <sandipan.das@amd.com> Link: https://patch.msgid.link/20260921153108.2713179-3-usama.arif@linux.dev
This commit is contained in:
parent
4a8557a4e5
commit
6350de8671
|
|
@ -246,19 +246,15 @@ static int amd_uncore_add(struct perf_event *event, int flags)
|
|||
|
||||
static void amd_uncore_del(struct perf_event *event, int flags)
|
||||
{
|
||||
int i;
|
||||
struct amd_uncore_pmu *pmu = event_to_amd_uncore_pmu(event);
|
||||
struct amd_uncore_ctx *ctx = *per_cpu_ptr(pmu->ctx, event->cpu);
|
||||
struct hw_perf_event *hwc = &event->hw;
|
||||
struct perf_event *old = event;
|
||||
|
||||
event->pmu->stop(event, PERF_EF_UPDATE);
|
||||
|
||||
for (i = 0; i < pmu->num_counters; i++) {
|
||||
struct perf_event *tmp = event;
|
||||
|
||||
if (try_cmpxchg(&ctx->events[i], &tmp, NULL))
|
||||
break;
|
||||
}
|
||||
/* ->del() follows a successful ->add(), so hwc->idx owns this slot. */
|
||||
WARN_ON_ONCE(!try_cmpxchg(&ctx->events[hwc->idx], &old, NULL));
|
||||
|
||||
hwc->idx = -1;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user