tools/perf/util/mem-events.c

Source file repositories/reference/linux-study-clean/tools/perf/util/mem-events.c

File Facts

System
Linux kernel
Corpus path
tools/perf/util/mem-events.c
Extension
.c
Size
22435 bytes
Lines
983
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 (e->ldlat) {
			if (!e->aux_event) {
				/* ARM and Most of Intel */
				scnprintf(buf, buf_size,
					  e->name, pmu->name,
					  perf_mem_events__loads_ldlat);
			} else {
				/* Intel with mem-loads-aux event */
				scnprintf(buf, buf_size,
					  e->name, pmu->name, pmu->name,
					  perf_mem_events__loads_ldlat);
			}
		} else {
			if (!e->aux_event) {
				/* AMD and POWER */
				scnprintf(buf, buf_size,
					  e->name, pmu->name);
			} else {
				return NULL;
			}
		}
		return buf;
	}

	if (i == PERF_MEM_EVENTS__STORE) {
		scnprintf(buf, buf_size,
			  e->name, pmu->name);
		return buf;
	}

	return NULL;
}

bool is_mem_loads_aux_event(struct evsel *leader)
{
	struct perf_pmu *pmu = leader->pmu;
	struct perf_mem_event *e;

	if (!pmu || !pmu->mem_events)
		return false;

	e = &pmu->mem_events[PERF_MEM_EVENTS__LOAD];
	if (!e->aux_event)
		return false;

	return leader->core.attr.config == e->aux_event;
}

int perf_pmu__mem_events_parse(struct perf_pmu *pmu, const char *str)
{
	char *tok, *saveptr = NULL;
	bool found = false;
	char *buf;
	int j;

	/* We need buffer that we know we can write to. */
	buf = malloc(strlen(str) + 1);
	if (!buf)
		return -ENOMEM;

	strcpy(buf, str);

	tok = strtok_r((char *)buf, ",", &saveptr);

	while (tok) {
		for (j = 0; j < PERF_MEM_EVENTS__MAX; j++) {
			struct perf_mem_event *e = perf_pmu__mem_events_ptr(pmu, j);

			if (!e->tag)
				continue;

			if (strstr(e->tag, tok))
				perf_mem_record[j] = found = true;
		}

		tok = strtok_r(NULL, ",", &saveptr);
	}

	free(buf);

	if (found)
		return 0;

	pr_err("failed: event '%s' not found, use '-e list' to get list of available events\n", str);
	return -1;
}

static bool perf_pmu__mem_events_supported(const char *mnt, struct perf_pmu *pmu,
				      struct perf_mem_event *e)
{

Annotation

Implementation Notes