1b2441318SGreg Kroah-Hartman // SPDX-License-Identifier: GPL-2.0 26c872901SJiri Olsa #include "tests.h" 33ac55b1dSArnaldo Carvalho de Melo #include <stdio.h> 46c872901SJiri Olsa #include "cpumap.h" 53ac55b1dSArnaldo Carvalho de Melo #include "event.h" 63ac55b1dSArnaldo Carvalho de Melo #include <string.h> 73ac55b1dSArnaldo Carvalho de Melo #include <linux/bitops.h> 89c3516d1SJiri Olsa #include <perf/cpumap.h> 93ac55b1dSArnaldo Carvalho de Melo #include "debug.h" 103ac55b1dSArnaldo Carvalho de Melo 113ac55b1dSArnaldo Carvalho de Melo struct machine; 126c872901SJiri Olsa 136c872901SJiri Olsa static int process_event_mask(struct perf_tool *tool __maybe_unused, 146c872901SJiri Olsa union perf_event *event, 156c872901SJiri Olsa struct perf_sample *sample __maybe_unused, 166c872901SJiri Olsa struct machine *machine __maybe_unused) 176c872901SJiri Olsa { 18*72932371SJiri Olsa struct perf_record_cpu_map *map_event = &event->cpu_map; 19*72932371SJiri Olsa struct perf_record_record_cpu_map *mask; 20*72932371SJiri Olsa struct perf_record_cpu_map_data *data; 21f854839bSJiri Olsa struct perf_cpu_map *map; 226c872901SJiri Olsa int i; 236c872901SJiri Olsa 24f77b57adSJiri Olsa data = &map_event->data; 256c872901SJiri Olsa 266c872901SJiri Olsa TEST_ASSERT_VAL("wrong type", data->type == PERF_CPU_MAP__MASK); 276c872901SJiri Olsa 28*72932371SJiri Olsa mask = (struct perf_record_record_cpu_map *)data->data; 296c872901SJiri Olsa 306c872901SJiri Olsa TEST_ASSERT_VAL("wrong nr", mask->nr == 1); 316c872901SJiri Olsa 326c872901SJiri Olsa for (i = 0; i < 20; i++) { 336c872901SJiri Olsa TEST_ASSERT_VAL("wrong cpu", test_bit(i, mask->mask)); 346c872901SJiri Olsa } 356c872901SJiri Olsa 36f77b57adSJiri Olsa map = cpu_map__new_data(data); 37f77b57adSJiri Olsa TEST_ASSERT_VAL("wrong nr", map->nr == 20); 38f77b57adSJiri Olsa 39f77b57adSJiri Olsa for (i = 0; i < 20; i++) { 40f77b57adSJiri Olsa TEST_ASSERT_VAL("wrong cpu", map->map[i] == i); 41f77b57adSJiri Olsa } 42f77b57adSJiri Olsa 4338f01d8dSJiri Olsa perf_cpu_map__put(map); 446c872901SJiri Olsa return 0; 456c872901SJiri Olsa } 466c872901SJiri Olsa 476c872901SJiri Olsa static int process_event_cpus(struct perf_tool *tool __maybe_unused, 486c872901SJiri Olsa union perf_event *event, 496c872901SJiri Olsa struct perf_sample *sample __maybe_unused, 506c872901SJiri Olsa struct machine *machine __maybe_unused) 516c872901SJiri Olsa { 52*72932371SJiri Olsa struct perf_record_cpu_map *map_event = &event->cpu_map; 536c872901SJiri Olsa struct cpu_map_entries *cpus; 54*72932371SJiri Olsa struct perf_record_cpu_map_data *data; 55f854839bSJiri Olsa struct perf_cpu_map *map; 566c872901SJiri Olsa 57f77b57adSJiri Olsa data = &map_event->data; 586c872901SJiri Olsa 596c872901SJiri Olsa TEST_ASSERT_VAL("wrong type", data->type == PERF_CPU_MAP__CPUS); 606c872901SJiri Olsa 616c872901SJiri Olsa cpus = (struct cpu_map_entries *)data->data; 626c872901SJiri Olsa 636c872901SJiri Olsa TEST_ASSERT_VAL("wrong nr", cpus->nr == 2); 646c872901SJiri Olsa TEST_ASSERT_VAL("wrong cpu", cpus->cpu[0] == 1); 656c872901SJiri Olsa TEST_ASSERT_VAL("wrong cpu", cpus->cpu[1] == 256); 66f77b57adSJiri Olsa 67f77b57adSJiri Olsa map = cpu_map__new_data(data); 68f77b57adSJiri Olsa TEST_ASSERT_VAL("wrong nr", map->nr == 2); 69f77b57adSJiri Olsa TEST_ASSERT_VAL("wrong cpu", map->map[0] == 1); 70f77b57adSJiri Olsa TEST_ASSERT_VAL("wrong cpu", map->map[1] == 256); 71ec09a42aSElena Reshetova TEST_ASSERT_VAL("wrong refcnt", refcount_read(&map->refcnt) == 1); 7238f01d8dSJiri Olsa perf_cpu_map__put(map); 736c872901SJiri Olsa return 0; 746c872901SJiri Olsa } 756c872901SJiri Olsa 766c872901SJiri Olsa 7781f17c90SArnaldo Carvalho de Melo int test__cpu_map_synthesize(struct test *test __maybe_unused, int subtest __maybe_unused) 786c872901SJiri Olsa { 79f854839bSJiri Olsa struct perf_cpu_map *cpus; 806c872901SJiri Olsa 816c872901SJiri Olsa /* This one is better stores in mask. */ 829c3516d1SJiri Olsa cpus = perf_cpu_map__new("0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19"); 836c872901SJiri Olsa 846c872901SJiri Olsa TEST_ASSERT_VAL("failed to synthesize map", 856c872901SJiri Olsa !perf_event__synthesize_cpu_map(NULL, cpus, process_event_mask, NULL)); 866c872901SJiri Olsa 8738f01d8dSJiri Olsa perf_cpu_map__put(cpus); 886c872901SJiri Olsa 896c872901SJiri Olsa /* This one is better stores in cpu values. */ 909c3516d1SJiri Olsa cpus = perf_cpu_map__new("1,256"); 916c872901SJiri Olsa 926c872901SJiri Olsa TEST_ASSERT_VAL("failed to synthesize map", 936c872901SJiri Olsa !perf_event__synthesize_cpu_map(NULL, cpus, process_event_cpus, NULL)); 946c872901SJiri Olsa 9538f01d8dSJiri Olsa perf_cpu_map__put(cpus); 966c872901SJiri Olsa return 0; 976c872901SJiri Olsa } 98a24020e6SJiri Olsa 99a24020e6SJiri Olsa static int cpu_map_print(const char *str) 100a24020e6SJiri Olsa { 1019c3516d1SJiri Olsa struct perf_cpu_map *map = perf_cpu_map__new(str); 102a24020e6SJiri Olsa char buf[100]; 103a24020e6SJiri Olsa 104a24020e6SJiri Olsa if (!map) 105a24020e6SJiri Olsa return -1; 106a24020e6SJiri Olsa 107a24020e6SJiri Olsa cpu_map__snprint(map, buf, sizeof(buf)); 108a24020e6SJiri Olsa return !strcmp(buf, str); 109a24020e6SJiri Olsa } 110a24020e6SJiri Olsa 11181f17c90SArnaldo Carvalho de Melo int test__cpu_map_print(struct test *test __maybe_unused, int subtest __maybe_unused) 112a24020e6SJiri Olsa { 113a24020e6SJiri Olsa TEST_ASSERT_VAL("failed to convert map", cpu_map_print("1")); 114a24020e6SJiri Olsa TEST_ASSERT_VAL("failed to convert map", cpu_map_print("1,5")); 115a24020e6SJiri Olsa TEST_ASSERT_VAL("failed to convert map", cpu_map_print("1,3,5,7,9,11,13,15,17,19,21-40")); 116a24020e6SJiri Olsa TEST_ASSERT_VAL("failed to convert map", cpu_map_print("2-5")); 117a24020e6SJiri Olsa TEST_ASSERT_VAL("failed to convert map", cpu_map_print("1,3-6,8-10,24,35-37")); 118a24020e6SJiri Olsa TEST_ASSERT_VAL("failed to convert map", cpu_map_print("1,3-6,8-10,24,35-37")); 119a24020e6SJiri Olsa TEST_ASSERT_VAL("failed to convert map", cpu_map_print("1-10,12-20,22-30,32-40")); 120a24020e6SJiri Olsa return 0; 121a24020e6SJiri Olsa } 122