1*b2441318SGreg 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> 83ac55b1dSArnaldo Carvalho de Melo #include "debug.h" 93ac55b1dSArnaldo Carvalho de Melo 103ac55b1dSArnaldo Carvalho de Melo struct machine; 116c872901SJiri Olsa 126c872901SJiri Olsa static int process_event_mask(struct perf_tool *tool __maybe_unused, 136c872901SJiri Olsa union perf_event *event, 146c872901SJiri Olsa struct perf_sample *sample __maybe_unused, 156c872901SJiri Olsa struct machine *machine __maybe_unused) 166c872901SJiri Olsa { 17f77b57adSJiri Olsa struct cpu_map_event *map_event = &event->cpu_map; 186c872901SJiri Olsa struct cpu_map_mask *mask; 196c872901SJiri Olsa struct cpu_map_data *data; 20f77b57adSJiri Olsa struct cpu_map *map; 216c872901SJiri Olsa int i; 226c872901SJiri Olsa 23f77b57adSJiri Olsa data = &map_event->data; 246c872901SJiri Olsa 256c872901SJiri Olsa TEST_ASSERT_VAL("wrong type", data->type == PERF_CPU_MAP__MASK); 266c872901SJiri Olsa 276c872901SJiri Olsa mask = (struct cpu_map_mask *)data->data; 286c872901SJiri Olsa 296c872901SJiri Olsa TEST_ASSERT_VAL("wrong nr", mask->nr == 1); 306c872901SJiri Olsa 316c872901SJiri Olsa for (i = 0; i < 20; i++) { 326c872901SJiri Olsa TEST_ASSERT_VAL("wrong cpu", test_bit(i, mask->mask)); 336c872901SJiri Olsa } 346c872901SJiri Olsa 35f77b57adSJiri Olsa map = cpu_map__new_data(data); 36f77b57adSJiri Olsa TEST_ASSERT_VAL("wrong nr", map->nr == 20); 37f77b57adSJiri Olsa 38f77b57adSJiri Olsa for (i = 0; i < 20; i++) { 39f77b57adSJiri Olsa TEST_ASSERT_VAL("wrong cpu", map->map[i] == i); 40f77b57adSJiri Olsa } 41f77b57adSJiri Olsa 42f77b57adSJiri Olsa cpu_map__put(map); 436c872901SJiri Olsa return 0; 446c872901SJiri Olsa } 456c872901SJiri Olsa 466c872901SJiri Olsa static int process_event_cpus(struct perf_tool *tool __maybe_unused, 476c872901SJiri Olsa union perf_event *event, 486c872901SJiri Olsa struct perf_sample *sample __maybe_unused, 496c872901SJiri Olsa struct machine *machine __maybe_unused) 506c872901SJiri Olsa { 51f77b57adSJiri Olsa struct cpu_map_event *map_event = &event->cpu_map; 526c872901SJiri Olsa struct cpu_map_entries *cpus; 536c872901SJiri Olsa struct cpu_map_data *data; 54f77b57adSJiri Olsa struct cpu_map *map; 556c872901SJiri Olsa 56f77b57adSJiri Olsa data = &map_event->data; 576c872901SJiri Olsa 586c872901SJiri Olsa TEST_ASSERT_VAL("wrong type", data->type == PERF_CPU_MAP__CPUS); 596c872901SJiri Olsa 606c872901SJiri Olsa cpus = (struct cpu_map_entries *)data->data; 616c872901SJiri Olsa 626c872901SJiri Olsa TEST_ASSERT_VAL("wrong nr", cpus->nr == 2); 636c872901SJiri Olsa TEST_ASSERT_VAL("wrong cpu", cpus->cpu[0] == 1); 646c872901SJiri Olsa TEST_ASSERT_VAL("wrong cpu", cpus->cpu[1] == 256); 65f77b57adSJiri Olsa 66f77b57adSJiri Olsa map = cpu_map__new_data(data); 67f77b57adSJiri Olsa TEST_ASSERT_VAL("wrong nr", map->nr == 2); 68f77b57adSJiri Olsa TEST_ASSERT_VAL("wrong cpu", map->map[0] == 1); 69f77b57adSJiri Olsa TEST_ASSERT_VAL("wrong cpu", map->map[1] == 256); 70ec09a42aSElena Reshetova TEST_ASSERT_VAL("wrong refcnt", refcount_read(&map->refcnt) == 1); 71f77b57adSJiri Olsa cpu_map__put(map); 726c872901SJiri Olsa return 0; 736c872901SJiri Olsa } 746c872901SJiri Olsa 756c872901SJiri Olsa 7681f17c90SArnaldo Carvalho de Melo int test__cpu_map_synthesize(struct test *test __maybe_unused, int subtest __maybe_unused) 776c872901SJiri Olsa { 786c872901SJiri Olsa struct cpu_map *cpus; 796c872901SJiri Olsa 806c872901SJiri Olsa /* This one is better stores in mask. */ 816c872901SJiri 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"); 826c872901SJiri Olsa 836c872901SJiri Olsa TEST_ASSERT_VAL("failed to synthesize map", 846c872901SJiri Olsa !perf_event__synthesize_cpu_map(NULL, cpus, process_event_mask, NULL)); 856c872901SJiri Olsa 866c872901SJiri Olsa cpu_map__put(cpus); 876c872901SJiri Olsa 886c872901SJiri Olsa /* This one is better stores in cpu values. */ 896c872901SJiri Olsa cpus = cpu_map__new("1,256"); 906c872901SJiri Olsa 916c872901SJiri Olsa TEST_ASSERT_VAL("failed to synthesize map", 926c872901SJiri Olsa !perf_event__synthesize_cpu_map(NULL, cpus, process_event_cpus, NULL)); 936c872901SJiri Olsa 946c872901SJiri Olsa cpu_map__put(cpus); 956c872901SJiri Olsa return 0; 966c872901SJiri Olsa } 97a24020e6SJiri Olsa 98a24020e6SJiri Olsa static int cpu_map_print(const char *str) 99a24020e6SJiri Olsa { 100a24020e6SJiri Olsa struct cpu_map *map = cpu_map__new(str); 101a24020e6SJiri Olsa char buf[100]; 102a24020e6SJiri Olsa 103a24020e6SJiri Olsa if (!map) 104a24020e6SJiri Olsa return -1; 105a24020e6SJiri Olsa 106a24020e6SJiri Olsa cpu_map__snprint(map, buf, sizeof(buf)); 107a24020e6SJiri Olsa return !strcmp(buf, str); 108a24020e6SJiri Olsa } 109a24020e6SJiri Olsa 11081f17c90SArnaldo Carvalho de Melo int test__cpu_map_print(struct test *test __maybe_unused, int subtest __maybe_unused) 111a24020e6SJiri Olsa { 112a24020e6SJiri Olsa TEST_ASSERT_VAL("failed to convert map", cpu_map_print("1")); 113a24020e6SJiri Olsa TEST_ASSERT_VAL("failed to convert map", cpu_map_print("1,5")); 114a24020e6SJiri Olsa TEST_ASSERT_VAL("failed to convert map", cpu_map_print("1,3,5,7,9,11,13,15,17,19,21-40")); 115a24020e6SJiri Olsa TEST_ASSERT_VAL("failed to convert map", cpu_map_print("2-5")); 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,3-6,8-10,24,35-37")); 118a24020e6SJiri Olsa TEST_ASSERT_VAL("failed to convert map", cpu_map_print("1-10,12-20,22-30,32-40")); 119a24020e6SJiri Olsa return 0; 120a24020e6SJiri Olsa } 121