tools/perf/arch/x86/util/evsel.c

Source file repositories/reference/linux-study-clean/tools/perf/arch/x86/util/evsel.c

File Facts

System
Linux kernel
Corpus path
tools/perf/arch/x86/util/evsel.c
Extension
.c
Size
6515 bytes
Lines
230
Domain
Support Tooling And Documentation
Bucket
tools
Inferred role
Support Tooling And Documentation: implementation source
Status
source implementation candidate

Why This File Exists

Repository support layer: documentation, build tooling, samples, user-space helper tools, generated initramfs support, licenses, and validation utilities.

Dependency Surface

Detected Declarations

Annotated Snippet

if (attr->config & IBS_FETCH_L3MISSONLY) {
			ibs_l3miss_warn();
			warned_once = 1;
		}
	} else if (ibs_op_pmu && ibs_op_pmu->type == evsel_pmu->type) {
		if (attr->config & IBS_OP_L3MISSONLY) {
			ibs_l3miss_warn();
			warned_once = 1;
		}
	}
}

static int amd_evsel__open_strerror(struct evsel *evsel, char *msg, size_t size)
{
	struct perf_pmu *pmu;

	if (evsel->core.attr.precise_ip == 0)
		return 0;

	pmu = evsel__find_pmu(evsel);
	if (!pmu || strncmp(pmu->name, "ibs", 3))
		return 0;

	/* More verbose IBS errors. */
	if (evsel->core.attr.exclude_kernel || evsel->core.attr.exclude_user ||
	    evsel->core.attr.exclude_hv || evsel->core.attr.exclude_idle ||
	    evsel->core.attr.exclude_host || evsel->core.attr.exclude_guest) {
		return scnprintf(msg, size, "AMD IBS doesn't support privilege filtering. Try "
				 "again without the privilege modifiers (like 'k') at the end.");
	}
	return 0;
}

static int intel_evsel__open_strerror(struct evsel *evsel, int err, char *msg, size_t size)
{
	struct strbuf sb = STRBUF_INIT;
	int ret;

	if (err != EINVAL)
		return 0;

	if (!topdown_sys_has_perf_metrics())
		return 0;

	if (arch_is_topdown_slots(evsel)) {
		if (!evsel__is_group_leader(evsel)) {
			evlist__uniquify_evsel_names(evsel->evlist, &stat_config);
			evlist__format_evsels(evsel->evlist, &sb, 2048);
			ret = scnprintf(msg, size, "Topdown slots event can only be group leader "
					"in '%s'.", sb.buf);
			strbuf_release(&sb);
			return ret;
		}
	} else if (arch_is_topdown_metrics(evsel)) {
		struct evsel *pos;

		evlist__for_each_entry(evsel->evlist, pos) {
			if (pos == evsel || !arch_is_topdown_metrics(pos))
				continue;

			if (pos->core.attr.config != evsel->core.attr.config)
				continue;

			evlist__uniquify_evsel_names(evsel->evlist, &stat_config);
			evlist__format_evsels(evsel->evlist, &sb, 2048);
			ret = scnprintf(msg, size, "Perf metric event '%s' is duplicated "
					"in the same group (only one event is allowed) in '%s'.",
					evsel__name(evsel), sb.buf);
			strbuf_release(&sb);
			return ret;
		}
	}
	return 0;
}

int arch_evsel__open_strerror(struct evsel *evsel, int err, char *msg, size_t size)
{
	return x86__is_amd_cpu()
		? amd_evsel__open_strerror(evsel, msg, size)
		: intel_evsel__open_strerror(evsel, err, msg, size);
}

Annotation

Implementation Notes