1 #include <linux/kernel.h> 2 #include <linux/types.h> 3 #include <stddef.h> 4 5 #include "tests.h" 6 7 #include "event.h" 8 #include "evlist.h" 9 #include "header.h" 10 #include "debug.h" 11 #include "util/sample.h" 12 13 static int process_event(struct evlist **pevlist, union perf_event *event) 14 { 15 struct perf_sample sample; 16 17 if (event->header.type == PERF_RECORD_HEADER_ATTR) { 18 if (perf_event__process_attr(NULL, event, pevlist)) { 19 pr_debug("perf_event__process_attr failed\n"); 20 return -1; 21 } 22 return 0; 23 } 24 25 if (event->header.type >= PERF_RECORD_USER_TYPE_START) 26 return -1; 27 28 if (!*pevlist) 29 return -1; 30 31 if (evlist__parse_sample(*pevlist, event, &sample)) { 32 pr_debug("evlist__parse_sample failed\n"); 33 return -1; 34 } 35 36 return 0; 37 } 38 39 static int process_events(union perf_event **events, size_t count) 40 { 41 struct evlist *evlist = NULL; 42 int err = 0; 43 size_t i; 44 45 for (i = 0; i < count && !err; i++) 46 err = process_event(&evlist, events[i]); 47 48 evlist__delete(evlist); 49 50 return err; 51 } 52 53 struct test_attr_event { 54 struct perf_event_header header; 55 struct perf_event_attr attr; 56 u64 id; 57 }; 58 59 /** 60 * test__parse_no_sample_id_all - test parsing with no sample_id_all bit set. 61 * 62 * This function tests parsing data produced on kernel's that do not support the 63 * sample_id_all bit. Without the sample_id_all bit, non-sample events (such as 64 * mmap events) do not have an id sample appended, and consequently logic 65 * designed to determine the id will not work. That case happens when there is 66 * more than one selected event, so this test processes three events: 2 67 * attributes representing the selected events and one mmap event. 68 * 69 * Return: %0 on success, %-1 if the test fails. 70 */ 71 static int test__parse_no_sample_id_all(struct test_suite *test __maybe_unused, 72 int subtest __maybe_unused) 73 { 74 int err; 75 76 struct test_attr_event event1 = { 77 .header = { 78 .type = PERF_RECORD_HEADER_ATTR, 79 .size = sizeof(struct test_attr_event), 80 }, 81 .id = 1, 82 }; 83 struct test_attr_event event2 = { 84 .header = { 85 .type = PERF_RECORD_HEADER_ATTR, 86 .size = sizeof(struct test_attr_event), 87 }, 88 .id = 2, 89 }; 90 struct perf_record_mmap event3 = { 91 .header = { 92 .type = PERF_RECORD_MMAP, 93 .size = sizeof(struct perf_record_mmap), 94 }, 95 }; 96 union perf_event *events[] = { 97 (union perf_event *)&event1, 98 (union perf_event *)&event2, 99 (union perf_event *)&event3, 100 }; 101 102 err = process_events(events, ARRAY_SIZE(events)); 103 if (err) 104 return -1; 105 106 return 0; 107 } 108 109 DEFINE_SUITE("Parse with no sample_id_all bit set", parse_no_sample_id_all); 110