arch/x86/events/perf_event.h

Source file repositories/reference/linux-study-clean/arch/x86/events/perf_event.h

File Facts

System
Linux kernel
Corpus path
arch/x86/events/perf_event.h
Extension
.h
Size
51919 bytes
Lines
1917
Domain
Architecture Layer
Bucket
arch/x86
Inferred role
Architecture Layer: implementation source
Status
source implementation candidate

Why This File Exists

CPU and platform-specific kernel glue: boot entry, traps, syscall entry, interrupts, page tables, context switch, and low-level barriers.

Dependency Surface

Detected Declarations

Annotated Snippet

struct event_constraint {
	union {
		unsigned long	idxmsk[BITS_TO_LONGS(X86_PMC_IDX_MAX)];
		u64		idxmsk64;
	};
	u64		code;
	u64		cmask;
	int		weight;
	int		overlap;
	int		flags;
	unsigned int	size;
};

static inline bool constraint_match(struct event_constraint *c, u64 ecode)
{
	return ((ecode & c->cmask) - c->code) <= (u64)c->size;
}

#define PERF_ARCH(name, val)	\
	PERF_X86_EVENT_##name = val,

/*
 * struct hw_perf_event.flags flags
 */
enum {
#include "perf_event_flags.h"
};

#undef PERF_ARCH

#define PERF_ARCH(name, val)						\
	static_assert((PERF_X86_EVENT_##name & PERF_EVENT_FLAG_ARCH) ==	\
		      PERF_X86_EVENT_##name);

#include "perf_event_flags.h"

#undef PERF_ARCH

static inline bool is_topdown_count(struct perf_event *event)
{
	return event->hw.flags & PERF_X86_EVENT_TOPDOWN;
}

static inline bool is_metric_event(struct perf_event *event)
{
	u64 config = event->attr.config;

	return ((config & ARCH_PERFMON_EVENTSEL_EVENT) == 0) &&
		((config & INTEL_ARCH_EVENT_MASK) >= INTEL_TD_METRIC_RETIRING)  &&
		((config & INTEL_ARCH_EVENT_MASK) <= INTEL_TD_METRIC_MAX);
}

static inline bool is_slots_event(struct perf_event *event)
{
	return (event->attr.config & INTEL_ARCH_EVENT_MASK) == INTEL_TD_SLOTS;
}

static inline bool is_topdown_event(struct perf_event *event)
{
	return is_metric_event(event) || is_slots_event(event);
}

int is_x86_event(struct perf_event *event);

static inline bool check_leader_group(struct perf_event *leader, int flags)
{
	return is_x86_event(leader) ? !!(leader->hw.flags & flags) : false;
}

static inline bool is_branch_counters_group(struct perf_event *event)
{
	return check_leader_group(event->group_leader, PERF_X86_EVENT_BRANCH_COUNTERS);
}

static inline bool is_pebs_counter_event_group(struct perf_event *event)
{
	return check_leader_group(event->group_leader, PERF_X86_EVENT_PEBS_CNTR);
}

static inline bool is_acr_event_group(struct perf_event *event)
{
	return check_leader_group(event->group_leader, PERF_X86_EVENT_ACR);
}

static inline bool is_acr_self_reload_event(struct perf_event *event)
{
	struct hw_perf_event *hwc = &event->hw;

	if (hwc->idx < 0)
		return false;

Annotation

Implementation Notes