forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-12-19 9370bb92b2d16684ee45cf24e879c93c509162da
kernel/tools/perf/ui/hist.c
....@@ -1,13 +1,17 @@
11 // SPDX-License-Identifier: GPL-2.0
22 #include <inttypes.h>
33 #include <math.h>
4
+#include <stdlib.h>
5
+#include <string.h>
46 #include <linux/compiler.h>
57
8
+#include "../util/callchain.h"
9
+#include "../util/debug.h"
610 #include "../util/hist.h"
7
-#include "../util/util.h"
811 #include "../util/sort.h"
912 #include "../util/evsel.h"
1013 #include "../util/evlist.h"
14
+#include "../perf.h"
1115
1216 /* hist period print (hpp) functions */
1317
....@@ -24,7 +28,7 @@
2428 {
2529 int ret;
2630 struct hists *hists = he->hists;
27
- struct perf_evsel *evsel = hists_to_evsel(hists);
31
+ struct evsel *evsel = hists_to_evsel(hists);
2832 char *buf = hpp->buf;
2933 size_t size = hpp->size;
3034
....@@ -39,12 +43,12 @@
3943 } else
4044 ret = hpp__call_print_fn(hpp, print_fn, fmt, len, get_field(he));
4145
42
- if (perf_evsel__is_group_event(evsel)) {
46
+ if (evsel__is_group_event(evsel)) {
4347 int prev_idx, idx_delta;
4448 struct hist_entry *pair;
45
- int nr_members = evsel->nr_members;
49
+ int nr_members = evsel->core.nr_members;
4650
47
- prev_idx = perf_evsel__group_idx(evsel);
51
+ prev_idx = evsel__group_idx(evsel);
4852
4953 list_for_each_entry(pair, &he->pairs.head, pairs.node) {
5054 u64 period = get_field(pair);
....@@ -54,7 +58,7 @@
5458 continue;
5559
5660 evsel = hists_to_evsel(pair->hists);
57
- idx_delta = perf_evsel__group_idx(evsel) - prev_idx - 1;
61
+ idx_delta = evsel__group_idx(evsel) - prev_idx - 1;
5862
5963 while (idx_delta--) {
6064 /*
....@@ -78,7 +82,7 @@
7882 len, period);
7983 }
8084
81
- prev_idx = perf_evsel__group_idx(evsel);
85
+ prev_idx = evsel__group_idx(evsel);
8286 }
8387
8488 idx_delta = nr_members - prev_idx - 1;
....@@ -147,39 +151,102 @@
147151 return 0;
148152 }
149153
154
+static int hist_entry__new_pair(struct hist_entry *a, struct hist_entry *b,
155
+ hpp_field_fn get_field, int nr_members,
156
+ u64 **fields_a, u64 **fields_b)
157
+{
158
+ u64 *fa = calloc(nr_members, sizeof(*fa)),
159
+ *fb = calloc(nr_members, sizeof(*fb));
160
+ struct hist_entry *pair;
161
+
162
+ if (!fa || !fb)
163
+ goto out_free;
164
+
165
+ list_for_each_entry(pair, &a->pairs.head, pairs.node) {
166
+ struct evsel *evsel = hists_to_evsel(pair->hists);
167
+ fa[evsel__group_idx(evsel)] = get_field(pair);
168
+ }
169
+
170
+ list_for_each_entry(pair, &b->pairs.head, pairs.node) {
171
+ struct evsel *evsel = hists_to_evsel(pair->hists);
172
+ fb[evsel__group_idx(evsel)] = get_field(pair);
173
+ }
174
+
175
+ *fields_a = fa;
176
+ *fields_b = fb;
177
+ return 0;
178
+out_free:
179
+ free(fa);
180
+ free(fb);
181
+ *fields_a = *fields_b = NULL;
182
+ return -1;
183
+}
184
+
185
+static int __hpp__group_sort_idx(struct hist_entry *a, struct hist_entry *b,
186
+ hpp_field_fn get_field, int idx)
187
+{
188
+ struct evsel *evsel = hists_to_evsel(a->hists);
189
+ u64 *fields_a, *fields_b;
190
+ int cmp, nr_members, ret, i;
191
+
192
+ cmp = field_cmp(get_field(a), get_field(b));
193
+ if (!evsel__is_group_event(evsel))
194
+ return cmp;
195
+
196
+ nr_members = evsel->core.nr_members;
197
+ if (idx < 1 || idx >= nr_members)
198
+ return cmp;
199
+
200
+ ret = hist_entry__new_pair(a, b, get_field, nr_members, &fields_a, &fields_b);
201
+ if (ret) {
202
+ ret = cmp;
203
+ goto out;
204
+ }
205
+
206
+ ret = field_cmp(fields_a[idx], fields_b[idx]);
207
+ if (ret)
208
+ goto out;
209
+
210
+ for (i = 1; i < nr_members; i++) {
211
+ if (i != idx) {
212
+ ret = field_cmp(fields_a[i], fields_b[i]);
213
+ if (ret)
214
+ goto out;
215
+ }
216
+ }
217
+
218
+out:
219
+ free(fields_a);
220
+ free(fields_b);
221
+
222
+ return ret;
223
+}
224
+
150225 static int __hpp__sort(struct hist_entry *a, struct hist_entry *b,
151226 hpp_field_fn get_field)
152227 {
153228 s64 ret;
154229 int i, nr_members;
155
- struct perf_evsel *evsel;
156
- struct hist_entry *pair;
230
+ struct evsel *evsel;
157231 u64 *fields_a, *fields_b;
232
+
233
+ if (symbol_conf.group_sort_idx && symbol_conf.event_group) {
234
+ return __hpp__group_sort_idx(a, b, get_field,
235
+ symbol_conf.group_sort_idx);
236
+ }
158237
159238 ret = field_cmp(get_field(a), get_field(b));
160239 if (ret || !symbol_conf.event_group)
161240 return ret;
162241
163242 evsel = hists_to_evsel(a->hists);
164
- if (!perf_evsel__is_group_event(evsel))
243
+ if (!evsel__is_group_event(evsel))
165244 return ret;
166245
167
- nr_members = evsel->nr_members;
168
- fields_a = calloc(nr_members, sizeof(*fields_a));
169
- fields_b = calloc(nr_members, sizeof(*fields_b));
170
-
171
- if (!fields_a || !fields_b)
246
+ nr_members = evsel->core.nr_members;
247
+ i = hist_entry__new_pair(a, b, get_field, nr_members, &fields_a, &fields_b);
248
+ if (i)
172249 goto out;
173
-
174
- list_for_each_entry(pair, &a->pairs.head, pairs.node) {
175
- evsel = hists_to_evsel(pair->hists);
176
- fields_a[perf_evsel__group_idx(evsel)] = get_field(pair);
177
- }
178
-
179
- list_for_each_entry(pair, &b->pairs.head, pairs.node) {
180
- evsel = hists_to_evsel(pair->hists);
181
- fields_b[perf_evsel__group_idx(evsel)] = get_field(pair);
182
- }
183250
184251 for (i = 1; i < nr_members; i++) {
185252 ret = field_cmp(fields_a[i], fields_b[i]);
....@@ -222,10 +289,10 @@
222289 struct hists *hists)
223290 {
224291 int len = fmt->user_len ?: fmt->len;
225
- struct perf_evsel *evsel = hists_to_evsel(hists);
292
+ struct evsel *evsel = hists_to_evsel(hists);
226293
227294 if (symbol_conf.event_group)
228
- len = max(len, evsel->nr_members * fmt->len);
295
+ len = max(len, evsel->core.nr_members * fmt->len);
229296
230297 if (len < (int)strlen(fmt->name))
231298 len = strlen(fmt->name);
....@@ -794,9 +861,9 @@
794861 }
795862
796863 int perf_hpp__setup_hists_formats(struct perf_hpp_list *list,
797
- struct perf_evlist *evlist)
864
+ struct evlist *evlist)
798865 {
799
- struct perf_evsel *evsel;
866
+ struct evsel *evsel;
800867 struct perf_hpp_fmt *fmt;
801868 struct hists *hists;
802869 int ret;