Commit a9ba68fd authored by Jin Yao's avatar Jin Yao Committed by PvsNarasimha
Browse files

perf pmu: Add hybrid helper functions

mainline inclusion
from mainline-v5.13-rc1
commit c5a26ea4
category: feature
bugzilla: https://gitee.com/openeuler/kernel/issues/IAU6ZD

Reference: https://github.com/torvalds/linux/commit/c5a26ea490a16798d973e6fa352c6b8375646bc4



--------------------------------

commit c5a26ea4 upstream

The functions perf_pmu__is_hybrid and perf_pmu__find_hybrid_pmu
can be used to identify the hybrid platform and return the found
hybrid cpu pmu. All the detected hybrid pmus have been saved in
'perf_pmu__hybrid_pmus' list. So we just need to search this list.

perf_pmu__hybrid_type_to_pmu converts the user specified string
to hybrid pmu name. This is used to support the '--cputype' option
in next patches.

perf_pmu__has_hybrid checks the existing of hybrid pmu. Note that,
we have to define it in pmu.c (make pmu-hybrid.c no more symbol
dependency), otherwise perf test python would be failed.

Signed-off-by: default avatarJin Yao <yao.jin@linux.intel.com>
Reviewed-by: default avatarJiri Olsa <jolsa@kernel.org>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Kan Liang <kan.liang@intel.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Link: https://lore.kernel.org/r/20210427070139.25256-7-yao.jin@linux.intel.com


Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
Signed-off-by: default avatarMalathi A <arunagiri.malathi@amd.com>
Signed-off-by: default avatarPvsNarasimha <PVS.NarasimhaRao@amd.com>
parent 59718314
Loading
Loading
Loading
Loading
+40 −0
Original line number Diff line number Diff line
@@ -47,3 +47,43 @@ bool perf_pmu__hybrid_mounted(const char *name)

	return true;
}

struct perf_pmu *perf_pmu__find_hybrid_pmu(const char *name)
{
	struct perf_pmu *pmu;

	if (!name)
		return NULL;

	perf_pmu__for_each_hybrid_pmu(pmu) {
		if (!strcmp(name, pmu->name))
			return pmu;
	}

	return NULL;
}

bool perf_pmu__is_hybrid(const char *name)
{
	return perf_pmu__find_hybrid_pmu(name) != NULL;
}

char *perf_pmu__hybrid_type_to_pmu(const char *type)
{
	char *pmu_name = NULL;

	if (asprintf(&pmu_name, "cpu_%s", type) < 0)
		return NULL;

	if (perf_pmu__is_hybrid(pmu_name))
		return pmu_name;

	/*
	 * pmu may be not scanned, check the sysfs.
	 */
	if (perf_pmu__hybrid_mounted(pmu_name))
		return pmu_name;

	free(pmu_name);
	return NULL;
}
+4 −0
Original line number Diff line number Diff line
@@ -15,4 +15,8 @@ extern struct list_head perf_pmu__hybrid_pmus;

bool perf_pmu__hybrid_mounted(const char *name);

struct perf_pmu *perf_pmu__find_hybrid_pmu(const char *name);
bool perf_pmu__is_hybrid(const char *name);
char *perf_pmu__hybrid_type_to_pmu(const char *type);

#endif /* __PMU_HYBRID_H */
+11 −0
Original line number Diff line number Diff line
@@ -42,6 +42,7 @@ int perf_pmu_parse(struct list_head *list, char *name);
extern FILE *perf_pmu_in;

static LIST_HEAD(pmus);
static bool hybrid_scanned;

/*
 * Parse & process all the sysfs attributes located under
@@ -1935,3 +1936,13 @@ void perf_pmu__warn_invalid_config(struct perf_pmu *pmu, __u64 config,
		   "'%llx' not supported by kernel)!\n",
		   name ?: "N/A", buf, config);
}

bool perf_pmu__has_hybrid(void)
{
	if (!hybrid_scanned) {
		hybrid_scanned = true;
		perf_pmu__scan(NULL);
	}

	return !list_empty(&perf_pmu__hybrid_pmus);
}
+2 −0
Original line number Diff line number Diff line
@@ -139,4 +139,6 @@ void perf_pmu__warn_invalid_config(struct perf_pmu *pmu, __u64 config,
				   char *name);
void perf_pmu__warn_invalid_formats(struct perf_pmu *pmu);

bool perf_pmu__has_hybrid(void);

#endif /* __PMU_H */