xref: /linux/tools/perf/tests/cpumap.c (revision c0c914eca7f251c70facc37dfebeaf176601918d)
1 #include "tests.h"
2 #include "cpumap.h"
3 
4 static int process_event_mask(struct perf_tool *tool __maybe_unused,
5 			 union perf_event *event,
6 			 struct perf_sample *sample __maybe_unused,
7 			 struct machine *machine __maybe_unused)
8 {
9 	struct cpu_map_event *map_event = &event->cpu_map;
10 	struct cpu_map_mask *mask;
11 	struct cpu_map_data *data;
12 	struct cpu_map *map;
13 	int i;
14 
15 	data = &map_event->data;
16 
17 	TEST_ASSERT_VAL("wrong type", data->type == PERF_CPU_MAP__MASK);
18 
19 	mask = (struct cpu_map_mask *)data->data;
20 
21 	TEST_ASSERT_VAL("wrong nr",   mask->nr == 1);
22 
23 	for (i = 0; i < 20; i++) {
24 		TEST_ASSERT_VAL("wrong cpu", test_bit(i, mask->mask));
25 	}
26 
27 	map = cpu_map__new_data(data);
28 	TEST_ASSERT_VAL("wrong nr",  map->nr == 20);
29 
30 	for (i = 0; i < 20; i++) {
31 		TEST_ASSERT_VAL("wrong cpu", map->map[i] == i);
32 	}
33 
34 	cpu_map__put(map);
35 	return 0;
36 }
37 
38 static int process_event_cpus(struct perf_tool *tool __maybe_unused,
39 			 union perf_event *event,
40 			 struct perf_sample *sample __maybe_unused,
41 			 struct machine *machine __maybe_unused)
42 {
43 	struct cpu_map_event *map_event = &event->cpu_map;
44 	struct cpu_map_entries *cpus;
45 	struct cpu_map_data *data;
46 	struct cpu_map *map;
47 
48 	data = &map_event->data;
49 
50 	TEST_ASSERT_VAL("wrong type", data->type == PERF_CPU_MAP__CPUS);
51 
52 	cpus = (struct cpu_map_entries *)data->data;
53 
54 	TEST_ASSERT_VAL("wrong nr",   cpus->nr == 2);
55 	TEST_ASSERT_VAL("wrong cpu",  cpus->cpu[0] == 1);
56 	TEST_ASSERT_VAL("wrong cpu",  cpus->cpu[1] == 256);
57 
58 	map = cpu_map__new_data(data);
59 	TEST_ASSERT_VAL("wrong nr",  map->nr == 2);
60 	TEST_ASSERT_VAL("wrong cpu", map->map[0] == 1);
61 	TEST_ASSERT_VAL("wrong cpu", map->map[1] == 256);
62 	TEST_ASSERT_VAL("wrong refcnt", atomic_read(&map->refcnt) == 1);
63 	cpu_map__put(map);
64 	return 0;
65 }
66 
67 
68 int test__cpu_map_synthesize(int subtest __maybe_unused)
69 {
70 	struct cpu_map *cpus;
71 
72 	/* This one is better stores in mask. */
73 	cpus = cpu_map__new("0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19");
74 
75 	TEST_ASSERT_VAL("failed to synthesize map",
76 		!perf_event__synthesize_cpu_map(NULL, cpus, process_event_mask, NULL));
77 
78 	cpu_map__put(cpus);
79 
80 	/* This one is better stores in cpu values. */
81 	cpus = cpu_map__new("1,256");
82 
83 	TEST_ASSERT_VAL("failed to synthesize map",
84 		!perf_event__synthesize_cpu_map(NULL, cpus, process_event_cpus, NULL));
85 
86 	cpu_map__put(cpus);
87 	return 0;
88 }
89