16c872901SJiri Olsa #include "tests.h" 2*3ac55b1dSArnaldo Carvalho de Melo #include <stdio.h> 36c872901SJiri Olsa #include "cpumap.h" 4*3ac55b1dSArnaldo Carvalho de Melo #include "event.h" 5*3ac55b1dSArnaldo Carvalho de Melo #include <string.h> 6*3ac55b1dSArnaldo Carvalho de Melo #include <linux/bitops.h> 7*3ac55b1dSArnaldo Carvalho de Melo #include "debug.h" 8*3ac55b1dSArnaldo Carvalho de Melo 9*3ac55b1dSArnaldo Carvalho de Melo struct machine; 106c872901SJiri Olsa 116c872901SJiri Olsa static int process_event_mask(struct perf_tool *tool __maybe_unused, 126c872901SJiri Olsa union perf_event *event, 136c872901SJiri Olsa struct perf_sample *sample __maybe_unused, 146c872901SJiri Olsa struct machine *machine __maybe_unused) 156c872901SJiri Olsa { 16f77b57adSJiri Olsa struct cpu_map_event *map_event = &event->cpu_map; 176c872901SJiri Olsa struct cpu_map_mask *mask; 186c872901SJiri Olsa struct cpu_map_data *data; 19f77b57adSJiri Olsa struct cpu_map *map; 206c872901SJiri Olsa int i; 216c872901SJiri Olsa 22f77b57adSJiri Olsa data = &map_event->data; 236c872901SJiri Olsa 246c872901SJiri Olsa TEST_ASSERT_VAL("wrong type", data->type == PERF_CPU_MAP__MASK); 256c872901SJiri Olsa 266c872901SJiri Olsa mask = (struct cpu_map_mask *)data->data; 276c872901SJiri Olsa 286c872901SJiri Olsa TEST_ASSERT_VAL("wrong nr", mask->nr == 1); 296c872901SJiri Olsa 306c872901SJiri Olsa for (i = 0; i < 20; i++) { 316c872901SJiri Olsa TEST_ASSERT_VAL("wrong cpu", test_bit(i, mask->mask)); 326c872901SJiri Olsa } 336c872901SJiri Olsa 34f77b57adSJiri Olsa map = cpu_map__new_data(data); 35f77b57adSJiri Olsa TEST_ASSERT_VAL("wrong nr", map->nr == 20); 36f77b57adSJiri Olsa 37f77b57adSJiri Olsa for (i = 0; i < 20; i++) { 38f77b57adSJiri Olsa TEST_ASSERT_VAL("wrong cpu", map->map[i] == i); 39f77b57adSJiri Olsa } 40f77b57adSJiri Olsa 41f77b57adSJiri Olsa cpu_map__put(map); 426c872901SJiri Olsa return 0; 436c872901SJiri Olsa } 446c872901SJiri Olsa 456c872901SJiri Olsa static int process_event_cpus(struct perf_tool *tool __maybe_unused, 466c872901SJiri Olsa union perf_event *event, 476c872901SJiri Olsa struct perf_sample *sample __maybe_unused, 486c872901SJiri Olsa struct machine *machine __maybe_unused) 496c872901SJiri Olsa { 50f77b57adSJiri Olsa struct cpu_map_event *map_event = &event->cpu_map; 516c872901SJiri Olsa struct cpu_map_entries *cpus; 526c872901SJiri Olsa struct cpu_map_data *data; 53f77b57adSJiri Olsa struct cpu_map *map; 546c872901SJiri Olsa 55f77b57adSJiri Olsa data = &map_event->data; 566c872901SJiri Olsa 576c872901SJiri Olsa TEST_ASSERT_VAL("wrong type", data->type == PERF_CPU_MAP__CPUS); 586c872901SJiri Olsa 596c872901SJiri Olsa cpus = (struct cpu_map_entries *)data->data; 606c872901SJiri Olsa 616c872901SJiri Olsa TEST_ASSERT_VAL("wrong nr", cpus->nr == 2); 626c872901SJiri Olsa TEST_ASSERT_VAL("wrong cpu", cpus->cpu[0] == 1); 636c872901SJiri Olsa TEST_ASSERT_VAL("wrong cpu", cpus->cpu[1] == 256); 64f77b57adSJiri Olsa 65f77b57adSJiri Olsa map = cpu_map__new_data(data); 66f77b57adSJiri Olsa TEST_ASSERT_VAL("wrong nr", map->nr == 2); 67f77b57adSJiri Olsa TEST_ASSERT_VAL("wrong cpu", map->map[0] == 1); 68f77b57adSJiri Olsa TEST_ASSERT_VAL("wrong cpu", map->map[1] == 256); 69f77b57adSJiri Olsa TEST_ASSERT_VAL("wrong refcnt", atomic_read(&map->refcnt) == 1); 70f77b57adSJiri Olsa cpu_map__put(map); 716c872901SJiri Olsa return 0; 726c872901SJiri Olsa } 736c872901SJiri Olsa 746c872901SJiri Olsa 756c872901SJiri Olsa int test__cpu_map_synthesize(int subtest __maybe_unused) 766c872901SJiri Olsa { 776c872901SJiri Olsa struct cpu_map *cpus; 786c872901SJiri Olsa 796c872901SJiri Olsa /* This one is better stores in mask. */ 806c872901SJiri Olsa cpus = cpu_map__new("0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19"); 816c872901SJiri Olsa 826c872901SJiri Olsa TEST_ASSERT_VAL("failed to synthesize map", 836c872901SJiri Olsa !perf_event__synthesize_cpu_map(NULL, cpus, process_event_mask, NULL)); 846c872901SJiri Olsa 856c872901SJiri Olsa cpu_map__put(cpus); 866c872901SJiri Olsa 876c872901SJiri Olsa /* This one is better stores in cpu values. */ 886c872901SJiri Olsa cpus = cpu_map__new("1,256"); 896c872901SJiri Olsa 906c872901SJiri Olsa TEST_ASSERT_VAL("failed to synthesize map", 916c872901SJiri Olsa !perf_event__synthesize_cpu_map(NULL, cpus, process_event_cpus, NULL)); 926c872901SJiri Olsa 936c872901SJiri Olsa cpu_map__put(cpus); 946c872901SJiri Olsa return 0; 956c872901SJiri Olsa } 96a24020e6SJiri Olsa 97a24020e6SJiri Olsa static int cpu_map_print(const char *str) 98a24020e6SJiri Olsa { 99a24020e6SJiri Olsa struct cpu_map *map = cpu_map__new(str); 100a24020e6SJiri Olsa char buf[100]; 101a24020e6SJiri Olsa 102a24020e6SJiri Olsa if (!map) 103a24020e6SJiri Olsa return -1; 104a24020e6SJiri Olsa 105a24020e6SJiri Olsa cpu_map__snprint(map, buf, sizeof(buf)); 106a24020e6SJiri Olsa return !strcmp(buf, str); 107a24020e6SJiri Olsa } 108a24020e6SJiri Olsa 109a24020e6SJiri Olsa int test__cpu_map_print(int subtest __maybe_unused) 110a24020e6SJiri Olsa { 111a24020e6SJiri Olsa TEST_ASSERT_VAL("failed to convert map", cpu_map_print("1")); 112a24020e6SJiri Olsa TEST_ASSERT_VAL("failed to convert map", cpu_map_print("1,5")); 113a24020e6SJiri Olsa TEST_ASSERT_VAL("failed to convert map", cpu_map_print("1,3,5,7,9,11,13,15,17,19,21-40")); 114a24020e6SJiri Olsa TEST_ASSERT_VAL("failed to convert map", cpu_map_print("2-5")); 115a24020e6SJiri Olsa TEST_ASSERT_VAL("failed to convert map", cpu_map_print("1,3-6,8-10,24,35-37")); 116a24020e6SJiri Olsa TEST_ASSERT_VAL("failed to convert map", cpu_map_print("1,3-6,8-10,24,35-37")); 117a24020e6SJiri Olsa TEST_ASSERT_VAL("failed to convert map", cpu_map_print("1-10,12-20,22-30,32-40")); 118a24020e6SJiri Olsa return 0; 119a24020e6SJiri Olsa } 120