Unverified Commit f7b387b5 authored by openeuler-ci-bot's avatar openeuler-ci-bot Committed by Gitee
Browse files

!8183 perf pmu: Count sys and cpuid JSON events separately

parents c0fb81fe 68b741b0
Loading
Loading
Loading
Loading
+48 −20
Original line number Diff line number Diff line
@@ -35,6 +35,18 @@ struct perf_pmu perf_pmu__fake = {

#define UNIT_MAX_LEN	31 /* max length for event unit name */

enum event_source {
	/* An event loaded from /sys/devices/<pmu>/events. */
	EVENT_SRC_SYSFS,
	/* An event loaded from a CPUID matched json file. */
	EVENT_SRC_CPU_JSON,
	/*
	 * An event loaded from a /sys/devices/<pmu>/identifier matched json
	 * file.
	 */
	EVENT_SRC_SYS_JSON,
};

/**
 * struct perf_pmu_alias - An event either read from sysfs or builtin in
 * pmu-events.c, created by parsing the pmu-events json files.
@@ -499,7 +511,7 @@ static int update_alias(const struct pmu_event *pe,

static int perf_pmu__new_alias(struct perf_pmu *pmu, const char *name,
				const char *desc, const char *val, FILE *val_fd,
				const struct pmu_event *pe)
			        const struct pmu_event *pe, enum event_source src)
{
	struct perf_pmu_alias *alias;
	int ret;
@@ -551,25 +563,30 @@ static int perf_pmu__new_alias(struct perf_pmu *pmu, const char *name,
		}
		snprintf(alias->unit, sizeof(alias->unit), "%s", unit);
	}
	if (!pe) {
	switch (src) {
	default:
	case EVENT_SRC_SYSFS:
		alias->from_sysfs = true;
		if (pmu->events_table) {
			/* Update an event from sysfs with json data. */
			struct update_alias_data data = {
				.pmu = pmu,
				.alias = alias,
			};

		alias->from_sysfs = true;
		if (pmu->events_table) {
			if (pmu_events_table__find_event(pmu->events_table, pmu, name,
							 update_alias, &data) == 0)
				pmu->loaded_json_aliases++;
		}
				pmu->cpu_json_aliases++;
		}

	if (!pe)
		pmu->sysfs_aliases++;
	else
		pmu->loaded_json_aliases++;
		break;
	case  EVENT_SRC_CPU_JSON:
		pmu->cpu_json_aliases++;
		break;
	case  EVENT_SRC_SYS_JSON:
		pmu->sys_json_aliases++;
		break;

	}
	list_add_tail(&alias->list, &pmu->aliases);
	return 0;
}
@@ -645,7 +662,8 @@ static int pmu_aliases_parse(struct perf_pmu *pmu)
		}

		if (perf_pmu__new_alias(pmu, name, /*desc=*/ NULL,
					/*val=*/ NULL, file, /*pe=*/ NULL) < 0)
					/*val=*/ NULL, file, /*pe=*/ NULL,
					EVENT_SRC_SYSFS) < 0)
			pr_debug("Cannot set up %s\n", name);
		fclose(file);
	}
@@ -880,7 +898,8 @@ static int pmu_add_cpu_aliases_map_callback(const struct pmu_event *pe,
{
	struct perf_pmu *pmu = vdata;

	perf_pmu__new_alias(pmu, pe->name, pe->desc, pe->event, /*val_fd=*/ NULL, pe);
	perf_pmu__new_alias(pmu, pe->name, pe->desc, pe->event, /*val_fd=*/ NULL,
			    pe, EVENT_SRC_CPU_JSON);
	return 0;
}

@@ -921,7 +940,8 @@ static int pmu_add_sys_aliases_iter_fn(const struct pmu_event *pe,
				pe->desc,
				pe->event,
				/*val_fd=*/ NULL,
				pe);
				pe,
				EVENT_SRC_SYS_JSON);
	}

	return 0;
@@ -1011,6 +1031,12 @@ struct perf_pmu *perf_pmu__lookup(struct list_head *pmus, int dirfd, const char
		pmu->id = pmu_id(name);
	pmu->max_precise = pmu_max_precise(dirfd, pmu);
	pmu->events_table = perf_pmu__find_events_table(pmu);
	/*
	 * Load the sys json events/aliases when loading the PMU as each event
	 * may have a different compat regular expression. We therefore can't
	 * know the number of sys json events/aliases without computing the
	 * regular expressions for them all.
	 */
	pmu_add_sys_aliases(pmu);
	list_add_tail(&pmu->list, pmus);

@@ -1607,12 +1633,14 @@ size_t perf_pmu__num_events(struct perf_pmu *pmu)
	if (!pmu->sysfs_aliases_loaded)
		pmu_aliases_parse(pmu);

	nr = pmu->sysfs_aliases;
	nr = pmu->sysfs_aliases + pmu->sys_json_aliases;;

	if (pmu->cpu_aliases_added)
		 nr += pmu->loaded_json_aliases;
		 nr += pmu->cpu_json_aliases;
	else if (pmu->events_table)
		nr += pmu_events_table__num_events(pmu->events_table, pmu) - pmu->loaded_json_aliases;
		nr += pmu_events_table__num_events(pmu->events_table, pmu) - pmu->cpu_json_aliases;
	else
		assert(pmu->cpu_json_aliases == 0);

	return pmu->selectable ? nr + 1 : nr;
}
+4 −2
Original line number Diff line number Diff line
@@ -120,8 +120,10 @@ struct perf_pmu {
	const struct pmu_events_table *events_table;
	/** @sysfs_aliases: Number of sysfs aliases loaded. */
	uint32_t sysfs_aliases;
	/** @sysfs_aliases: Number of json event aliases loaded. */
	uint32_t loaded_json_aliases;
	/** @cpu_json_aliases: Number of json event aliases loaded specific to the CPUID. */
	uint32_t cpu_json_aliases;
	/** @sys_json_aliases: Number of json event aliases loaded matching the PMU's identifier. */
	uint32_t sys_json_aliases;
	/** @sysfs_aliases_loaded: Are sysfs aliases loaded from disk? */
	bool sysfs_aliases_loaded;
	/**