Commit adc38b4c authored by Peter Zijlstra's avatar Peter Zijlstra Committed by Ingo Molnar
Browse files

perf/core: Introduce perf_free_addr_filters()



Replace _free_event()'s use of perf_addr_filters_splice()s use with an
explicit perf_free_addr_filters() with the explicit propery that it is
able to be called a second time without ill effect.

Most notable, referencing event->pmu must be avoided when there are no
filters left (from eg a previous call).

Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
Reviewed-by: default avatarRavi Bangoria <ravi.bangoria@amd.com>
Link: https://lore.kernel.org/r/20241104135518.868460518@infradead.org
parent b2996f56
Loading
Loading
Loading
Loading
+13 −3
Original line number Diff line number Diff line
@@ -5339,8 +5339,7 @@ static bool exclusive_event_installable(struct perf_event *event,
	return true;
}

static void perf_addr_filters_splice(struct perf_event *event,
				       struct list_head *head);
static void perf_free_addr_filters(struct perf_event *event);

static void perf_pending_task_sync(struct perf_event *event)
{
@@ -5439,7 +5438,7 @@ static void _free_event(struct perf_event *event)
	}

	perf_event_free_bpf_prog(event);
	perf_addr_filters_splice(event, NULL);
	perf_free_addr_filters(event);

	__free_event(event);
}
@@ -11004,6 +11003,17 @@ static void perf_addr_filters_splice(struct perf_event *event,
	free_filters_list(&list);
}

static void perf_free_addr_filters(struct perf_event *event)
{
	/*
	 * Used during free paths, there is no concurrency.
	 */
	if (list_empty(&event->addr_filters.list))
		return;

	perf_addr_filters_splice(event, NULL);
}

/*
 * Scan through mm's vmas and see if one of them matches the
 * @filter; if so, adjust filter's address range.