Commit 469c76a8 authored by Dhananjay Ugwekar's avatar Dhananjay Ugwekar Committed by Peter Zijlstra
Browse files

perf/x86/rapl: Fix the error checking order

After the commit b4943b8b ("perf/x86/rapl: Add core energy counter
support for AMD CPUs"), the default "perf record"/"perf top" command is
broken in systems where there isn't a PMU registered for type
PERF_TYPE_RAW.

This is due to the change in order of error checks in rapl_pmu_event_init()
Due to which we return -EINVAL instead of -ENOENT, when we reach here from
the fallback loop in perf_init_event().

Move the "PMU and event type match" back to the beginning of the function
so that we return -ENOENT early on.

Closes: https://lore.kernel.org/all/uv7mz6vew2bzgre5jdpmwldxljp5djzmuiksqdcdwipfm4zm7w@ribobcretidk/


Fixes: b4943b8b ("perf/x86/rapl: Add core energy counter support for AMD CPUs")
Reported-by: default avatarKoichiro Den <koichiro.den@canonical.com>
Signed-off-by: default avatarDhananjay Ugwekar <dhananjay.ugwekar@amd.com>
Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
Link: https://lkml.kernel.org/r/20250129080513.30353-1-dhananjay.ugwekar@amd.com
parent 2014c95a
Loading
Loading
Loading
Loading
+4 −8
Original line number Diff line number Diff line
@@ -370,6 +370,10 @@ static int rapl_pmu_event_init(struct perf_event *event)
	unsigned int rapl_pmu_idx;
	struct rapl_pmus *rapl_pmus;

	/* only look at RAPL events */
	if (event->attr.type != event->pmu->type)
		return -ENOENT;

	/* unsupported modes and filters */
	if (event->attr.sample_period) /* no sampling */
		return -EINVAL;
@@ -387,10 +391,6 @@ static int rapl_pmu_event_init(struct perf_event *event)
	rapl_pmus_scope = rapl_pmus->pmu.scope;

	if (rapl_pmus_scope == PERF_PMU_SCOPE_PKG || rapl_pmus_scope == PERF_PMU_SCOPE_DIE) {
		/* only look at RAPL package events */
		if (event->attr.type != rapl_pmus_pkg->pmu.type)
			return -ENOENT;

		cfg = array_index_nospec((long)cfg, NR_RAPL_PKG_DOMAINS + 1);
		if (!cfg || cfg >= NR_RAPL_PKG_DOMAINS + 1)
			return -EINVAL;
@@ -398,10 +398,6 @@ static int rapl_pmu_event_init(struct perf_event *event)
		bit = cfg - 1;
		event->hw.event_base = rapl_model->rapl_pkg_msrs[bit].msr;
	} else if (rapl_pmus_scope == PERF_PMU_SCOPE_CORE) {
		/* only look at RAPL core events */
		if (event->attr.type != rapl_pmus_core->pmu.type)
			return -ENOENT;

		cfg = array_index_nospec((long)cfg, NR_RAPL_CORE_DOMAINS + 1);
		if (!cfg || cfg >= NR_RAPL_PKG_DOMAINS + 1)
			return -EINVAL;