1 #include "tests.h" 2 #include <stdio.h> 3 #include "cpumap.h" 4 #include "event.h" 5 #include <string.h> 6 #include <linux/bitops.h> 7 #include "debug.h" 8 9 struct machine; 10 11 static int process_event_mask(struct perf_tool *tool __maybe_unused, 12 union perf_event *event, 13 struct perf_sample *sample __maybe_unused, 14 struct machine *machine __maybe_unused) 15 { 16 struct cpu_map_event *map_event = &event->cpu_map; 17 struct cpu_map_mask *mask; 18 struct cpu_map_data *data; 19 struct cpu_map *map; 20 int i; 21 22 data = &map_event->data; 23 24 TEST_ASSERT_VAL("wrong type", data->type == PERF_CPU_MAP__MASK); 25 26 mask = (struct cpu_map_mask *)data->data; 27 28 TEST_ASSERT_VAL("wrong nr", mask->nr == 1); 29 30 for (i = 0; i < 20; i++) { 31 TEST_ASSERT_VAL("wrong cpu", test_bit(i, mask->mask)); 32 } 33 34 map = cpu_map__new_data(data); 35 TEST_ASSERT_VAL("wrong nr", map->nr == 20); 36 37 for (i = 0; i < 20; i++) { 38 TEST_ASSERT_VAL("wrong cpu", map->map[i] == i); 39 } 40 41 cpu_map__put(map); 42 return 0; 43 } 44 45 static int process_event_cpus(struct perf_tool *tool __maybe_unused, 46 union perf_event *event, 47 struct perf_sample *sample __maybe_unused, 48 struct machine *machine __maybe_unused) 49 { 50 struct cpu_map_event *map_event = &event->cpu_map; 51 struct cpu_map_entries *cpus; 52 struct cpu_map_data *data; 53 struct cpu_map *map; 54 55 data = &map_event->data; 56 57 TEST_ASSERT_VAL("wrong type", data->type == PERF_CPU_MAP__CPUS); 58 59 cpus = (struct cpu_map_entries *)data->data; 60 61 TEST_ASSERT_VAL("wrong nr", cpus->nr == 2); 62 TEST_ASSERT_VAL("wrong cpu", cpus->cpu[0] == 1); 63 TEST_ASSERT_VAL("wrong cpu", cpus->cpu[1] == 256); 64 65 map = cpu_map__new_data(data); 66 TEST_ASSERT_VAL("wrong nr", map->nr == 2); 67 TEST_ASSERT_VAL("wrong cpu", map->map[0] == 1); 68 TEST_ASSERT_VAL("wrong cpu", map->map[1] == 256); 69 TEST_ASSERT_VAL("wrong refcnt", atomic_read(&map->refcnt) == 1); 70 cpu_map__put(map); 71 return 0; 72 } 73 74 75 int test__cpu_map_synthesize(int subtest __maybe_unused) 76 { 77 struct cpu_map *cpus; 78 79 /* This one is better stores in mask. */ 80 cpus = cpu_map__new("0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19"); 81 82 TEST_ASSERT_VAL("failed to synthesize map", 83 !perf_event__synthesize_cpu_map(NULL, cpus, process_event_mask, NULL)); 84 85 cpu_map__put(cpus); 86 87 /* This one is better stores in cpu values. */ 88 cpus = cpu_map__new("1,256"); 89 90 TEST_ASSERT_VAL("failed to synthesize map", 91 !perf_event__synthesize_cpu_map(NULL, cpus, process_event_cpus, NULL)); 92 93 cpu_map__put(cpus); 94 return 0; 95 } 96 97 static int cpu_map_print(const char *str) 98 { 99 struct cpu_map *map = cpu_map__new(str); 100 char buf[100]; 101 102 if (!map) 103 return -1; 104 105 cpu_map__snprint(map, buf, sizeof(buf)); 106 return !strcmp(buf, str); 107 } 108 109 int test__cpu_map_print(int subtest __maybe_unused) 110 { 111 TEST_ASSERT_VAL("failed to convert map", cpu_map_print("1")); 112 TEST_ASSERT_VAL("failed to convert map", cpu_map_print("1,5")); 113 TEST_ASSERT_VAL("failed to convert map", cpu_map_print("1,3,5,7,9,11,13,15,17,19,21-40")); 114 TEST_ASSERT_VAL("failed to convert map", cpu_map_print("2-5")); 115 TEST_ASSERT_VAL("failed to convert map", cpu_map_print("1,3-6,8-10,24,35-37")); 116 TEST_ASSERT_VAL("failed to convert map", cpu_map_print("1,3-6,8-10,24,35-37")); 117 TEST_ASSERT_VAL("failed to convert map", cpu_map_print("1-10,12-20,22-30,32-40")); 118 return 0; 119 } 120