Update the perf_event_open support to match the current 4.4-rc4 kernel. Signed-off-by: Vince Weaver <vincent.weaver@xxxxxxxxx> diff --git a/include/perf_event.h b/include/perf_event.h index 89edd64..356f3be 100644 --- a/include/perf_event.h +++ b/include/perf_event.h @@ -109,6 +109,7 @@ enum perf_sw_ids { PERF_COUNT_SW_ALIGNMENT_FAULTS = 7, PERF_COUNT_SW_EMULATION_FAULTS = 8, PERF_COUNT_SW_DUMMY = 9, + PERF_COUNT_SW_BPF_OUTPUT = 10, PERF_COUNT_SW_MAX, /* non-ABI */ }; @@ -166,6 +167,8 @@ enum perf_branch_sample_type_shift { PERF_SAMPLE_BRANCH_COND_SHIFT = 10, /* conditional branches */ PERF_SAMPLE_BRANCH_CALL_STACK_SHIFT = 11, /* call/ret stack */ + PERF_SAMPLE_BRANCH_IND_JUMP_SHIFT = 12, /* indirect jumps */ + PERF_SAMPLE_BRANCH_CALL_SHIFT = 13, /* direct call */ PERF_SAMPLE_BRANCH_MAX_SHIFT /* non-ABI */ }; @@ -185,6 +188,8 @@ enum perf_branch_sample_type { PERF_SAMPLE_BRANCH_COND = 1U << PERF_SAMPLE_BRANCH_COND_SHIFT, PERF_SAMPLE_BRANCH_CALL_STACK = 1U << PERF_SAMPLE_BRANCH_CALL_STACK_SHIFT, + PERF_SAMPLE_BRANCH_IND_JUMP = 1U << PERF_SAMPLE_BRANCH_IND_JUMP_SHIFT, + PERF_SAMPLE_BRANCH_CALL = 1U << PERF_SAMPLE_BRANCH_CALL_SHIFT, PERF_SAMPLE_BRANCH_MAX = 1U << PERF_SAMPLE_BRANCH_MAX_SHIFT, }; @@ -327,7 +332,8 @@ struct perf_event_attr { mmap2 : 1, /* include mmap with inode data */ comm_exec : 1, /* flag comm events that are due to an exec */ use_clockid : 1, /* use @clockid for time fields */ - __reserved_1 : 38; + context_switch : 1, /* context switch data */ + __reserved_1 : 37; union { __u32 wakeup_events; /* wakeup every n events */ @@ -472,7 +478,7 @@ struct perf_event_mmap_page { * u64 delta; * * quot = (cyc >> time_shift); - * rem = cyc & ((1 << time_shift) - 1); + * rem = cyc & (((u64)1 << time_shift) - 1); * delta = time_offset + quot * time_mult + * ((rem * time_mult) >> time_shift); * @@ -503,7 +509,7 @@ struct perf_event_mmap_page { * And vice versa: * * quot = cyc >> time_shift; - * rem = cyc & ((1 << time_shift) - 1); + * rem = cyc & (((u64)1 << time_shift) - 1); * timestamp = time_zero + quot * time_mult + * ((rem * time_mult) >> time_shift); */ @@ -563,11 +569,17 @@ struct perf_event_mmap_page { #define PERF_RECORD_MISC_GUEST_USER (5 << 0) /* + * Indicates that /proc/PID/maps parsing are truncated by time out. + */ +#define PERF_RECORD_MISC_PROC_MAP_PARSE_TIMEOUT (1 << 12) +/* * PERF_RECORD_MISC_MMAP_DATA and PERF_RECORD_MISC_COMM_EXEC are used on * different events so can reuse the same bit position. + * Ditto PERF_RECORD_MISC_SWITCH_OUT. */ #define PERF_RECORD_MISC_MMAP_DATA (1 << 13) #define PERF_RECORD_MISC_COMM_EXEC (1 << 13) +#define PERF_RECORD_MISC_SWITCH_OUT (1 << 13) /* * Indicates that the content of PERF_SAMPLE_IP points to * the actual instruction that triggered the event. See also @@ -799,6 +811,44 @@ enum perf_event_type { */ PERF_RECORD_ITRACE_START = 12, + /* + * Records the dropped/lost sample number. + * + * struct { + * struct perf_event_header header; + * + * u64 lost; + * struct sample_id sample_id; + * }; + */ + PERF_RECORD_LOST_SAMPLES = 13, + + /* + * Records a context switch in or out (flagged by + * PERF_RECORD_MISC_SWITCH_OUT). See also + * PERF_RECORD_SWITCH_CPU_WIDE. + * + * struct { + * struct perf_event_header header; + * struct sample_id sample_id; + * }; + */ + PERF_RECORD_SWITCH = 14, + + /* + * CPU-wide version of PERF_RECORD_SWITCH with next_prev_pid and + * next_prev_tid that are the next (switching out) or previous + * (switching in) pid/tid. + * + * struct { + * struct perf_event_header header; + * u32 next_prev_pid; + * u32 next_prev_tid; + * struct sample_id sample_id; + * }; + */ + PERF_RECORD_SWITCH_CPU_WIDE = 15, + PERF_RECORD_MAX, /* non-ABI */ }; @@ -903,6 +953,7 @@ union perf_mem_data_src { * * in_tx: running in a hardware transaction * abort: aborting a hardware transaction + * cycles: cycles from last branch (or 0 if not supported) */ struct perf_branch_entry { __u64 from; @@ -911,5 +962,6 @@ struct perf_branch_entry { predicted:1,/* target predicted */ in_tx:1, /* in transaction */ abort:1, /* transaction abort */ - reserved:60; + cycles:16, /* cycle count to last branch */ + reserved:44; }; diff --git a/syscalls/perf_event_open.c b/syscalls/perf_event_open.c index 6ace250..97eb720 100644 --- a/syscalls/perf_event_open.c +++ b/syscalls/perf_event_open.c @@ -689,7 +689,7 @@ static long long random_event_config(__u32 *event_type, } break; case PERF_TYPE_SOFTWARE: - switch (rand() % 11) { + switch (rand() % 12) { case 0: config = PERF_COUNT_SW_CPU_CLOCK; break; @@ -721,6 +721,9 @@ static long long random_event_config(__u32 *event_type, config = PERF_COUNT_SW_DUMMY; break; case 10: + config = PERF_COUNT_SW_BPF_OUTPUT; + break; + case 11: config = rand64(); break; default: @@ -956,6 +959,10 @@ static long long random_branch_sample_type(void) branch_sample |= PERF_SAMPLE_BRANCH_COND; if (RAND_BOOL()) branch_sample |= PERF_SAMPLE_BRANCH_CALL_STACK; + if (RAND_BOOL()) + branch_sample |= PERF_SAMPLE_BRANCH_IND_JUMP; + if (RAND_BOOL()) + branch_sample |= PERF_SAMPLE_BRANCH_CALL; /* Transactional Memory Types */ if (RAND_BOOL()) @@ -1012,6 +1019,7 @@ static void create_mostly_valid_counting_event(struct perf_event_attr *attr, attr->mmap2 = RAND_BOOL(); attr->comm_exec = RAND_BOOL(); attr->use_clockid = RAND_BOOL(); + attr->context_switch = RAND_BOOL(); /* wakeup events not relevant */ @@ -1076,6 +1084,7 @@ static void create_mostly_valid_sampling_event(struct perf_event_attr *attr, attr->mmap2 = RAND_BOOL(); attr->comm_exec = RAND_BOOL(); attr->use_clockid = RAND_BOOL(); + attr->context_switch = RAND_BOOL(); attr->wakeup_events = rand32(); -- To unsubscribe from this list: send the line "unsubscribe trinity" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html