unix: add wrapper around perf_event_open on Linux

This adds a wrapper around perf_event_open, exported constants and
two structs:
 - perf_event_attr, used to configure the syscall
 - perf_event_mmap_page to coordinate the kernel's mmap ring buffer

Change-Id: Ife7ded8344de9e3eb74441bd51ab9a04c81b4965
Reviewed-on: https://go-review.googlesource.com/105756
Reviewed-by: Tobias Klauser <tobias.klauser@gmail.com>
Run-TryBot: Tobias Klauser <tobias.klauser@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
This commit is contained in:
Adam Sindelar
2018-04-16 11:22:24 +00:00
committed by Tobias Klauser
parent 2281fa97ef
commit 2f57af4873
24 changed files with 2190 additions and 0 deletions
+187
View File
@@ -231,6 +231,61 @@ struct my_epoll_event {
int32_t pad;
};
// Copied from <linux/perf_event.h> with the following modifications:
// 1) bit field after read_format redeclared as '__u64 bits' to make it
// accessible from Go
// 2) collapsed the unions, to avoid confusing godoc for the generated output
// (e.g. having to use BpAddr as an extension of Config)
struct perf_event_attr_go {
__u32 type;
__u32 size;
__u64 config;
// union {
// __u64 sample_period;
// __u64 sample_freq;
// };
__u64 sample;
__u64 sample_type;
__u64 read_format;
// Replaces the bit field. Flags are defined as constants.
__u64 bits;
// union {
// __u32 wakeup_events;
// __u32 wakeup_watermark;
// };
__u32 wakeup;
__u32 bp_type;
// union {
// __u64 bp_addr;
// __u64 config1;
// };
__u64 ext1;
// union {
// __u64 bp_len;
// __u64 config2;
// };
__u64 ext2;
__u64 branch_sample_type;
__u64 sample_regs_user;
__u32 sample_stack_user;
__s32 clockid;
__u64 sample_regs_intr;
__u32 aux_watermark;
__u32 __reserved_2;
};
*/
import "C"
@@ -698,6 +753,138 @@ const (
BDADDR_LE_RANDOM = C.BDADDR_LE_RANDOM
)
// Perf subsystem
type PerfEventAttr C.struct_perf_event_attr_go
type PerfEventMmapPage C.struct_perf_event_mmap_page
// Bit field in struct perf_event_attr expanded as flags.
// Set these on PerfEventAttr.Bits by ORing them together.
const (
PerfBitDisabled uint64 = CBitFieldMaskBit0
PerfBitInherit = CBitFieldMaskBit1
PerfBitPinned = CBitFieldMaskBit2
PerfBitExclusive = CBitFieldMaskBit3
PerfBitExcludeUser = CBitFieldMaskBit4
PerfBitExcludeKernel = CBitFieldMaskBit5
PerfBitExcludeHv = CBitFieldMaskBit6
PerfBitExcludeIdle = CBitFieldMaskBit7
PerfBitMmap = CBitFieldMaskBit8
PerfBitComm = CBitFieldMaskBit9
PerfBitFreq = CBitFieldMaskBit10
PerfBitInheritStat = CBitFieldMaskBit11
PerfBitEnableOnExec = CBitFieldMaskBit12
PerfBitTask = CBitFieldMaskBit13
PerfBitWatermark = CBitFieldMaskBit14
PerfBitPreciseIPBit1 = CBitFieldMaskBit15
PerfBitPreciseIPBit2 = CBitFieldMaskBit16
PerfBitMmapData = CBitFieldMaskBit17
PerfBitSampleIDAll = CBitFieldMaskBit18
PerfBitExcludeHost = CBitFieldMaskBit19
PerfBitExcludeGuest = CBitFieldMaskBit20
PerfBitExcludeCallchainKernel = CBitFieldMaskBit21
PerfBitExcludeCallchainUser = CBitFieldMaskBit22
PerfBitMmap2 = CBitFieldMaskBit23
PerfBitCommExec = CBitFieldMaskBit24
PerfBitUseClockID = CBitFieldMaskBit25
PerfBitContextSwitch = CBitFieldMaskBit26
)
const (
PERF_TYPE_HARDWARE = C.PERF_TYPE_HARDWARE
PERF_TYPE_SOFTWARE = C.PERF_TYPE_SOFTWARE
PERF_TYPE_TRACEPOINT = C.PERF_TYPE_TRACEPOINT
PERF_TYPE_HW_CACHE = C.PERF_TYPE_HW_CACHE
PERF_TYPE_RAW = C.PERF_TYPE_RAW
PERF_TYPE_BREAKPOINT = C.PERF_TYPE_BREAKPOINT
PERF_COUNT_HW_CPU_CYCLES = C.PERF_COUNT_HW_CPU_CYCLES
PERF_COUNT_HW_INSTRUCTIONS = C.PERF_COUNT_HW_INSTRUCTIONS
PERF_COUNT_HW_CACHE_REFERENCES = C.PERF_COUNT_HW_CACHE_REFERENCES
PERF_COUNT_HW_CACHE_MISSES = C.PERF_COUNT_HW_CACHE_MISSES
PERF_COUNT_HW_BRANCH_INSTRUCTIONS = C.PERF_COUNT_HW_BRANCH_INSTRUCTIONS
PERF_COUNT_HW_BRANCH_MISSES = C.PERF_COUNT_HW_BRANCH_MISSES
PERF_COUNT_HW_BUS_CYCLES = C.PERF_COUNT_HW_BUS_CYCLES
PERF_COUNT_HW_STALLED_CYCLES_FRONTEND = C.PERF_COUNT_HW_STALLED_CYCLES_FRONTEND
PERF_COUNT_HW_STALLED_CYCLES_BACKEND = C.PERF_COUNT_HW_STALLED_CYCLES_BACKEND
PERF_COUNT_HW_REF_CPU_CYCLES = C.PERF_COUNT_HW_REF_CPU_CYCLES
PERF_COUNT_HW_CACHE_L1D = C.PERF_COUNT_HW_CACHE_L1D
PERF_COUNT_HW_CACHE_L1I = C.PERF_COUNT_HW_CACHE_L1I
PERF_COUNT_HW_CACHE_LL = C.PERF_COUNT_HW_CACHE_LL
PERF_COUNT_HW_CACHE_DTLB = C.PERF_COUNT_HW_CACHE_DTLB
PERF_COUNT_HW_CACHE_ITLB = C.PERF_COUNT_HW_CACHE_ITLB
PERF_COUNT_HW_CACHE_BPU = C.PERF_COUNT_HW_CACHE_BPU
PERF_COUNT_HW_CACHE_NODE = C.PERF_COUNT_HW_CACHE_NODE
PERF_COUNT_HW_CACHE_OP_READ = C.PERF_COUNT_HW_CACHE_OP_READ
PERF_COUNT_HW_CACHE_OP_WRITE = C.PERF_COUNT_HW_CACHE_OP_WRITE
PERF_COUNT_HW_CACHE_OP_PREFETCH = C.PERF_COUNT_HW_CACHE_OP_PREFETCH
PERF_COUNT_HW_CACHE_RESULT_ACCESS = C.PERF_COUNT_HW_CACHE_RESULT_ACCESS
PERF_COUNT_HW_CACHE_RESULT_MISS = C.PERF_COUNT_HW_CACHE_RESULT_MISS
PERF_COUNT_SW_CPU_CLOCK = C.PERF_COUNT_SW_CPU_CLOCK
PERF_COUNT_SW_TASK_CLOCK = C.PERF_COUNT_SW_TASK_CLOCK
PERF_COUNT_SW_PAGE_FAULTS = C.PERF_COUNT_SW_PAGE_FAULTS
PERF_COUNT_SW_CONTEXT_SWITCHES = C.PERF_COUNT_SW_CONTEXT_SWITCHES
PERF_COUNT_SW_CPU_MIGRATIONS = C.PERF_COUNT_SW_CPU_MIGRATIONS
PERF_COUNT_SW_PAGE_FAULTS_MIN = C.PERF_COUNT_SW_PAGE_FAULTS_MIN
PERF_COUNT_SW_PAGE_FAULTS_MAJ = C.PERF_COUNT_SW_PAGE_FAULTS_MAJ
PERF_COUNT_SW_ALIGNMENT_FAULTS = C.PERF_COUNT_SW_ALIGNMENT_FAULTS
PERF_COUNT_SW_EMULATION_FAULTS = C.PERF_COUNT_SW_EMULATION_FAULTS
PERF_COUNT_SW_DUMMY = C.PERF_COUNT_SW_DUMMY
PERF_SAMPLE_IP = C.PERF_SAMPLE_IP
PERF_SAMPLE_TID = C.PERF_SAMPLE_TID
PERF_SAMPLE_TIME = C.PERF_SAMPLE_TIME
PERF_SAMPLE_ADDR = C.PERF_SAMPLE_ADDR
PERF_SAMPLE_READ = C.PERF_SAMPLE_READ
PERF_SAMPLE_CALLCHAIN = C.PERF_SAMPLE_CALLCHAIN
PERF_SAMPLE_ID = C.PERF_SAMPLE_ID
PERF_SAMPLE_CPU = C.PERF_SAMPLE_CPU
PERF_SAMPLE_PERIOD = C.PERF_SAMPLE_PERIOD
PERF_SAMPLE_STREAM_ID = C.PERF_SAMPLE_STREAM_ID
PERF_SAMPLE_RAW = C.PERF_SAMPLE_RAW
PERF_SAMPLE_BRANCH_STACK = C.PERF_SAMPLE_BRANCH_STACK
PERF_SAMPLE_BRANCH_USER = C.PERF_SAMPLE_BRANCH_USER
PERF_SAMPLE_BRANCH_KERNEL = C.PERF_SAMPLE_BRANCH_KERNEL
PERF_SAMPLE_BRANCH_HV = C.PERF_SAMPLE_BRANCH_HV
PERF_SAMPLE_BRANCH_ANY = C.PERF_SAMPLE_BRANCH_ANY
PERF_SAMPLE_BRANCH_ANY_CALL = C.PERF_SAMPLE_BRANCH_ANY_CALL
PERF_SAMPLE_BRANCH_ANY_RETURN = C.PERF_SAMPLE_BRANCH_ANY_RETURN
PERF_SAMPLE_BRANCH_IND_CALL = C.PERF_SAMPLE_BRANCH_IND_CALL
PERF_FORMAT_TOTAL_TIME_ENABLED = C.PERF_FORMAT_TOTAL_TIME_ENABLED
PERF_FORMAT_TOTAL_TIME_RUNNING = C.PERF_FORMAT_TOTAL_TIME_RUNNING
PERF_FORMAT_ID = C.PERF_FORMAT_ID
PERF_FORMAT_GROUP = C.PERF_FORMAT_GROUP
PERF_RECORD_MMAP = C.PERF_RECORD_MMAP
PERF_RECORD_LOST = C.PERF_RECORD_LOST
PERF_RECORD_COMM = C.PERF_RECORD_COMM
PERF_RECORD_EXIT = C.PERF_RECORD_EXIT
PERF_RECORD_THROTTLE = C.PERF_RECORD_THROTTLE
PERF_RECORD_UNTHROTTLE = C.PERF_RECORD_UNTHROTTLE
PERF_RECORD_FORK = C.PERF_RECORD_FORK
PERF_RECORD_READ = C.PERF_RECORD_READ
PERF_RECORD_SAMPLE = C.PERF_RECORD_SAMPLE
PERF_CONTEXT_HV = C.PERF_CONTEXT_HV
PERF_CONTEXT_KERNEL = C.PERF_CONTEXT_KERNEL
PERF_CONTEXT_USER = C.PERF_CONTEXT_USER
PERF_CONTEXT_GUEST = C.PERF_CONTEXT_GUEST
PERF_CONTEXT_GUEST_KERNEL = C.PERF_CONTEXT_GUEST_KERNEL
PERF_CONTEXT_GUEST_USER = C.PERF_CONTEXT_GUEST_USER
PERF_FLAG_FD_NO_GROUP = C.PERF_FLAG_FD_NO_GROUP
PERF_FLAG_FD_OUTPUT = C.PERF_FLAG_FD_OUTPUT
PERF_FLAG_PID_CGROUP = C.PERF_FLAG_PID_CGROUP
)
// Platform ABI and calling convention
// Bit field masks for interoperability with C code that uses bit fields.