Commit 9897009e authored by Ian Rogers's avatar Ian Rogers Committed by Arnaldo Carvalho de Melo

perf header: Fix missing PMU caps

PMU caps are written as HEADER_PMU_CAPS or for the special case of the
PMU "cpu" as HEADER_CPU_PMU_CAPS. As the PMU "cpu" is special, and not
any "core" PMU, the logic had become broken and core PMUs not called
"cpu" were not having their caps written.

This affects ARM and s390 non-hybrid PMUs.

Simplify the PMU caps writing logic to scan one fewer time and to be
more explicit in its behavior.

Fixes: 178ddf3b ("perf header: Avoid hybrid PMU list in write_pmu_caps")
Reported-by: default avatarWei Li <liwei391@huawei.com>
Signed-off-by: default avatarIan Rogers <irogers@google.com>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Athira Rajeev <atrajeev@linux.vnet.ibm.com>
Cc: Huacai Chen <chenhuacai@kernel.org>
Cc: Ian Rogers <irogers@google.com>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: James Clark <james.clark@arm.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: John Garry <john.g.garry@oracle.com>
Cc: K Prateek Nayak <kprateek.nayak@amd.com>
Cc: Kajol Jain <kjain@linux.ibm.com>
Cc: Kan Liang <kan.liang@linux.intel.com>
Cc: Leo Yan <leo.yan@linaro.org>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Mike Leach <mike.leach@linaro.org>
Cc: Ming Wang <wangming01@loongson.cn>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Ravi Bangoria <ravi.bangoria@amd.com>
Cc: Sean Christopherson <seanjc@google.com>
Cc: Suzuki Poulouse <suzuki.poulose@arm.com>
Cc: Will Deacon <will@kernel.org>
Cc: linux-arm-kernel@lists.infradead.org
Link: https://lore.kernel.org/r/20230825024002.801955-2-irogers@google.comSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent eeb6b129
...@@ -1605,8 +1605,15 @@ static int write_pmu_caps(struct feat_fd *ff, ...@@ -1605,8 +1605,15 @@ static int write_pmu_caps(struct feat_fd *ff,
int ret; int ret;
while ((pmu = perf_pmus__scan(pmu))) { while ((pmu = perf_pmus__scan(pmu))) {
if (!pmu->name || !strcmp(pmu->name, "cpu") || if (!strcmp(pmu->name, "cpu")) {
perf_pmu__caps_parse(pmu) <= 0) /*
* The "cpu" PMU is special and covered by
* HEADER_CPU_PMU_CAPS. Note, core PMUs are
* counted/written here for ARM, s390 and Intel hybrid.
*/
continue;
}
if (perf_pmu__caps_parse(pmu) <= 0)
continue; continue;
nr_pmu++; nr_pmu++;
} }
...@@ -1619,23 +1626,17 @@ static int write_pmu_caps(struct feat_fd *ff, ...@@ -1619,23 +1626,17 @@ static int write_pmu_caps(struct feat_fd *ff,
return 0; return 0;
/* /*
* Write hybrid pmu caps first to maintain compatibility with * Note older perf tools assume core PMUs come first, this is a property
* older perf tool. * of perf_pmus__scan.
*/ */
if (perf_pmus__num_core_pmus() > 1) {
pmu = NULL;
while ((pmu = perf_pmus__scan_core(pmu))) {
ret = __write_pmu_caps(ff, pmu, true);
if (ret < 0)
return ret;
}
}
pmu = NULL; pmu = NULL;
while ((pmu = perf_pmus__scan(pmu))) { while ((pmu = perf_pmus__scan(pmu))) {
if (pmu->is_core || !pmu->nr_caps) if (!strcmp(pmu->name, "cpu")) {
/* Skip as above. */
continue;
}
if (perf_pmu__caps_parse(pmu) <= 0)
continue; continue;
ret = __write_pmu_caps(ff, pmu, true); ret = __write_pmu_caps(ff, pmu, true);
if (ret < 0) if (ret < 0)
return ret; return ret;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment