tools/perf/util/drm_pmu.c

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

File Facts

System
Linux kernel
Corpus path
tools/perf/util/drm_pmu.c
Extension
.c
Size
16350 bytes
Lines
686
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

struct drm_pmu_event {
	const char *name;
	const char *desc;
	enum drm_pmu_unit unit;
};

struct drm_pmu {
	struct perf_pmu pmu;
	struct drm_pmu_event *events;
	int num_events;
};

static const char * const drm_pmu_unit_strs[DRM_PMU_UNIT_MAX] = {
	"bytes",
	"capacity",
	"cycles",
	"hz",
	"ns",
};

static const char * const drm_pmu_scale_unit_strs[DRM_PMU_UNIT_MAX] = {
	"1bytes",
	"1capacity",
	"1cycles",
	"1hz",
	"1ns",
};

bool perf_pmu__is_drm(const struct perf_pmu *pmu)
{
	return pmu && pmu->type >= PERF_PMU_TYPE_DRM_START &&
		pmu->type <= PERF_PMU_TYPE_DRM_END;
}

bool evsel__is_drm(const struct evsel *evsel)
{
	return perf_pmu__is_drm(evsel->pmu);
}

static struct drm_pmu *add_drm_pmu(struct list_head *pmus, char *line, size_t line_len)
{
	struct drm_pmu *drm;
	struct perf_pmu *pmu;
	const char *name;
	__u32 max_drm_pmu_type = 0, type;
	int i = 12;

	if (line[line_len - 1] == '\n')
		line[line_len - 1] = '\0';
	while (isspace(line[i]))
		i++;

	line[--i] = '_';
	line[--i] = 'm';
	line[--i] = 'r';
	line[--i] = 'd';
	name = &line[i];

	list_for_each_entry(pmu, pmus, list) {
		if (!perf_pmu__is_drm(pmu))
			continue;
		if (pmu->type > max_drm_pmu_type)
			max_drm_pmu_type = pmu->type;
		if (!strcmp(pmu->name, name)) {
			/* PMU already exists. */
			return NULL;
		}
	}

	if (max_drm_pmu_type != 0)
		type = max_drm_pmu_type + 1;
	else
		type = PERF_PMU_TYPE_DRM_START;

	if (type > PERF_PMU_TYPE_DRM_END) {
		zfree(&drm);
		pr_err("Unable to encode DRM PMU type for %s\n", name);
		return NULL;
	}

	drm = zalloc(sizeof(*drm));
	if (!drm)
		return NULL;

	if (perf_pmu__init(&drm->pmu, type, name) != 0) {
		perf_pmu__delete(&drm->pmu);
		return NULL;
	}

	drm->pmu.cpus = perf_cpu_map__new_int(0);

Annotation

Implementation Notes