Blame view

kernel/linux-imx6_3.14.28/tools/perf/tests/evsel-roundtrip-name.c 2.51 KB
6b13f685e   김민수   BSP 최초 추가
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
  #include "evlist.h"
  #include "evsel.h"
  #include "parse-events.h"
  #include "tests.h"
  
  static int perf_evsel__roundtrip_cache_name_test(void)
  {
  	char name[128];
  	int type, op, err = 0, ret = 0, i, idx;
  	struct perf_evsel *evsel;
  	struct perf_evlist *evlist = perf_evlist__new();
  
          if (evlist == NULL)
                  return -ENOMEM;
  
  	for (type = 0; type < PERF_COUNT_HW_CACHE_MAX; type++) {
  		for (op = 0; op < PERF_COUNT_HW_CACHE_OP_MAX; op++) {
  			/* skip invalid cache type */
  			if (!perf_evsel__is_cache_op_valid(type, op))
  				continue;
  
  			for (i = 0; i < PERF_COUNT_HW_CACHE_RESULT_MAX; i++) {
  				__perf_evsel__hw_cache_type_op_res_name(type, op, i,
  									name, sizeof(name));
  				err = parse_events(evlist, name);
  				if (err)
  					ret = err;
  			}
  		}
  	}
  
  	idx = 0;
  	evsel = perf_evlist__first(evlist);
  
  	for (type = 0; type < PERF_COUNT_HW_CACHE_MAX; type++) {
  		for (op = 0; op < PERF_COUNT_HW_CACHE_OP_MAX; op++) {
  			/* skip invalid cache type */
  			if (!perf_evsel__is_cache_op_valid(type, op))
  				continue;
  
  			for (i = 0; i < PERF_COUNT_HW_CACHE_RESULT_MAX; i++) {
  				__perf_evsel__hw_cache_type_op_res_name(type, op, i,
  									name, sizeof(name));
  				if (evsel->idx != idx)
  					continue;
  
  				++idx;
  
  				if (strcmp(perf_evsel__name(evsel), name)) {
  					pr_debug("%s != %s
  ", perf_evsel__name(evsel), name);
  					ret = -1;
  				}
  
  				evsel = perf_evsel__next(evsel);
  			}
  		}
  	}
  
  	perf_evlist__delete(evlist);
  	return ret;
  }
  
  static int __perf_evsel__name_array_test(const char *names[], int nr_names)
  {
  	int i, err;
  	struct perf_evsel *evsel;
  	struct perf_evlist *evlist = perf_evlist__new();
  
          if (evlist == NULL)
                  return -ENOMEM;
  
  	for (i = 0; i < nr_names; ++i) {
  		err = parse_events(evlist, names[i]);
  		if (err) {
  			pr_debug("failed to parse event '%s', err %d
  ",
  				 names[i], err);
  			goto out_delete_evlist;
  		}
  	}
  
  	err = 0;
  	evlist__for_each(evlist, evsel) {
  		if (strcmp(perf_evsel__name(evsel), names[evsel->idx])) {
  			--err;
  			pr_debug("%s != %s
  ", perf_evsel__name(evsel), names[evsel->idx]);
  		}
  	}
  
  out_delete_evlist:
  	perf_evlist__delete(evlist);
  	return err;
  }
  
  #define perf_evsel__name_array_test(names) \
  	__perf_evsel__name_array_test(names, ARRAY_SIZE(names))
  
  int test__perf_evsel__roundtrip_name_test(void)
  {
  	int err = 0, ret = 0;
  
  	err = perf_evsel__name_array_test(perf_evsel__hw_names);
  	if (err)
  		ret = err;
  
  	err = perf_evsel__name_array_test(perf_evsel__sw_names);
  	if (err)
  		ret = err;
  
  	err = perf_evsel__roundtrip_cache_name_test();
  	if (err)
  		ret = err;
  
  	return ret;
  }