File libperf-add-nr_entries-to-struct-perf_evlist.patch of Package perf
852
1
From: Jiri Olsa <jolsa@kernel.org>
2
Date: Sun, 21 Jul 2019 13:24:28 +0200
3
Subject: libperf: Add nr_entries to struct perf_evlist
4
Git-commit: 6484d2f9dc3ecbf13f07100f7f771d1d779eda04
5
Patch-mainline: v5.4-rc1
6
References: jsc#SLE-13661
7
8
Move nr_entries count from 'struct perf' to into perf_evlist struct.
9
10
Committer notes:
11
12
Fix tools/perf/arch/s390/util/auxtrace.c case. And also the comment in
13
tools/perf/util/annotate.h.
14
15
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
16
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
17
Cc: Alexey Budankov <alexey.budankov@linux.intel.com>
18
Cc: Andi Kleen <ak@linux.intel.com>
19
Cc: Michael Petlan <mpetlan@redhat.com>
20
Cc: Namhyung Kim <namhyung@kernel.org>
21
Cc: Peter Zijlstra <peterz@infradead.org>
22
Link: http://lkml.kernel.org/r/20190721112506.12306-42-jolsa@kernel.org
23
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
24
Signed-off-by: Tony Jones <tonyj@suse.de>
25
---
26
tools/perf/arch/s390/util/auxtrace.c | 2 +-
27
tools/perf/builtin-record.c | 4 +-
28
tools/perf/builtin-stat.c | 4 +-
29
tools/perf/builtin-top.c | 12 ++---
30
tools/perf/builtin-trace.c | 4 +-
31
tools/perf/lib/evlist.c | 3 ++
32
tools/perf/lib/include/internal/evlist.h | 1 +
33
tools/perf/tests/parse-events.c | 76 ++++++++++++++++----------------
34
tools/perf/ui/browsers/annotate.c | 2 +-
35
tools/perf/ui/browsers/hists.c | 2 +-
36
tools/perf/util/annotate.c | 2 +-
37
tools/perf/util/annotate.h | 2 +-
38
tools/perf/util/evlist.c | 26 +++++------
39
tools/perf/util/evlist.h | 1 -
40
tools/perf/util/header.c | 4 +-
41
tools/perf/util/parse-events.c | 4 +-
42
tools/perf/util/python.c | 8 ++--
43
tools/perf/util/record.c | 2 +-
44
tools/perf/util/sort.c | 2 +-
45
tools/perf/util/top.c | 2 +-
46
20 files changed, 83 insertions(+), 80 deletions(-)
47
48
diff --git a/tools/perf/arch/s390/util/auxtrace.c b/tools/perf/arch/s390/util/auxtrace.c
49
index 833f60fa9c5a..480ada281bdb 100644
50
--- a/tools/perf/arch/s390/util/auxtrace.c
51
+++ b/tools/perf/arch/s390/util/auxtrace.c
52
53
int diagnose = 0;
54
55
*err = 0;
56
- if (evlist->nr_entries == 0)
57
+ if (evlist->core.nr_entries == 0)
58
return NULL;
59
60
evlist__for_each_entry(evlist, pos) {
61
diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c
62
index 17bb0a536da3..778e46417f6b 100644
63
--- a/tools/perf/builtin-record.c
64
+++ b/tools/perf/builtin-record.c
65
66
* because we synthesize event name through the pipe
67
* and need the id for that.
68
*/
69
- if (data->is_pipe && rec->evlist->nr_entries == 1)
70
+ if (data->is_pipe && rec->evlist->core.nr_entries == 1)
71
rec->opts.sample_id = true;
72
73
if (record__open(rec) != 0) {
74
75
if (record.opts.overwrite)
76
record.opts.tail_synthesize = true;
77
78
- if (rec->evlist->nr_entries == 0 &&
79
+ if (rec->evlist->core.nr_entries == 0 &&
80
__perf_evlist__add_default(rec->evlist, !record.opts.no_samples) < 0) {
81
pr_err("Not enough memory for event selector list\n");
82
goto out;
83
diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c
84
index 39bd73d0e06e..3ba184f2e64f 100644
85
--- a/tools/perf/builtin-stat.c
86
+++ b/tools/perf/builtin-stat.c
87
88
free(str);
89
}
90
91
- if (!evsel_list->nr_entries) {
92
+ if (!evsel_list->core.nr_entries) {
93
if (target__has_cpu(&target))
94
default_attrs0[0].config = PERF_COUNT_SW_CPU_CLOCK;
95
96
97
return;
98
}
99
100
- if (evsel_list->nr_entries)
101
+ if (evsel_list->core.nr_entries)
102
target.system_wide = true;
103
}
104
}
105
diff --git a/tools/perf/builtin-top.c b/tools/perf/builtin-top.c
106
index b103f1ba01cb..3291eff13e28 100644
107
--- a/tools/perf/builtin-top.c
108
+++ b/tools/perf/builtin-top.c
109
110
notes = symbol__annotation(sym);
111
pthread_mutex_lock(¬es->lock);
112
113
- if (!symbol__hists(sym, top->evlist->nr_entries)) {
114
+ if (!symbol__hists(sym, top->evlist->core.nr_entries)) {
115
pthread_mutex_unlock(¬es->lock);
116
pr_err("Not enough memory for annotating '%s' symbol!\n",
117
sym->name);
118
119
fprintf(stdout, "\t[d] display refresh delay. \t(%d)\n", top->delay_secs);
120
fprintf(stdout, "\t[e] display entries (lines). \t(%d)\n", top->print_entries);
121
122
- if (top->evlist->nr_entries > 1)
123
+ if (top->evlist->core.nr_entries > 1)
124
fprintf(stdout, "\t[E] active event counter. \t(%s)\n", perf_evsel__name(top->sym_evsel));
125
126
fprintf(stdout, "\t[f] profile display filter (count). \t(%d)\n", top->count_filter);
127
128
case 'S':
129
return 1;
130
case 'E':
131
- return top->evlist->nr_entries > 1 ? 1 : 0;
132
+ return top->evlist->core.nr_entries > 1 ? 1 : 0;
133
default:
134
break;
135
}
136
137
}
138
break;
139
case 'E':
140
- if (top->evlist->nr_entries > 1) {
141
+ if (top->evlist->core.nr_entries > 1) {
142
/* Select 0 as the default event: */
143
int counter = 0;
144
145
146
147
prompt_integer(&counter, "Enter details event counter");
148
149
- if (counter >= top->evlist->nr_entries) {
150
+ if (counter >= top->evlist->core.nr_entries) {
151
top->sym_evsel = perf_evlist__first(top->evlist);
152
fprintf(stderr, "Sorry, no such event, using %s.\n", perf_evsel__name(top->sym_evsel));
153
sleep(1);
154
155
if (argc)
156
usage_with_options(top_usage, options);
157
158
- if (!top.evlist->nr_entries &&
159
+ if (!top.evlist->core.nr_entries &&
160
perf_evlist__add_default(top.evlist) < 0) {
161
pr_err("Not enough memory for event selector list\n");
162
goto out_delete_evlist;
163
diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c
164
index bcd033e91de4..06fcd8b1f160 100644
165
--- a/tools/perf/builtin-trace.c
166
+++ b/tools/perf/builtin-trace.c
167
168
symbol_conf.use_callchain = true;
169
}
170
171
- if (trace.evlist->nr_entries > 0) {
172
+ if (trace.evlist->core.nr_entries > 0) {
173
evlist__set_evsel_handler(trace.evlist, trace__event_handler);
174
if (evlist__set_syscall_tp_fields(trace.evlist)) {
175
perror("failed to set syscalls:* tracepoint fields");
176
177
trace.summary = trace.summary_only;
178
179
if (!trace.trace_syscalls && !trace.trace_pgfaults &&
180
- trace.evlist->nr_entries == 0 /* Was --events used? */) {
181
+ trace.evlist->core.nr_entries == 0 /* Was --events used? */) {
182
trace.trace_syscalls = true;
183
}
184
185
diff --git a/tools/perf/lib/evlist.c b/tools/perf/lib/evlist.c
186
index 023fe4b44131..1b27fd2de9b9 100644
187
--- a/tools/perf/lib/evlist.c
188
+++ b/tools/perf/lib/evlist.c
189
190
void perf_evlist__init(struct perf_evlist *evlist)
191
{
192
INIT_LIST_HEAD(&evlist->entries);
193
+ evlist->nr_entries = 0;
194
}
195
196
void perf_evlist__add(struct perf_evlist *evlist,
197
struct perf_evsel *evsel)
198
{
199
list_add_tail(&evsel->node, &evlist->entries);
200
+ evlist->nr_entries += 1;
201
}
202
203
void perf_evlist__remove(struct perf_evlist *evlist,
204
struct perf_evsel *evsel)
205
{
206
list_del_init(&evsel->node);
207
+ evlist->nr_entries -= 1;
208
}
209
diff --git a/tools/perf/lib/include/internal/evlist.h b/tools/perf/lib/include/internal/evlist.h
210
index 7fbfe5716652..a12c712a9197 100644
211
--- a/tools/perf/lib/include/internal/evlist.h
212
+++ b/tools/perf/lib/include/internal/evlist.h
213
214
215
struct perf_evlist {
216
struct list_head entries;
217
+ int nr_entries;
218
};
219
220
#endif /* __LIBPERF_INTERNAL_EVLIST_H */
221
diff --git a/tools/perf/tests/parse-events.c b/tools/perf/tests/parse-events.c
222
index 2365dd655c88..878140501edf 100644
223
--- a/tools/perf/tests/parse-events.c
224
+++ b/tools/perf/tests/parse-events.c
225
226
{
227
struct evsel *evsel = perf_evlist__first(evlist);
228
229
- TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries);
230
+ TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->core.nr_entries);
231
TEST_ASSERT_VAL("wrong number of groups", 0 == evlist->nr_groups);
232
TEST_ASSERT_VAL("wrong type", PERF_TYPE_TRACEPOINT == evsel->attr.type);
233
TEST_ASSERT_VAL("wrong sample_type",
234
235
{
236
struct evsel *evsel;
237
238
- TEST_ASSERT_VAL("wrong number of entries", evlist->nr_entries > 1);
239
+ TEST_ASSERT_VAL("wrong number of entries", evlist->core.nr_entries > 1);
240
TEST_ASSERT_VAL("wrong number of groups", 0 == evlist->nr_groups);
241
242
evlist__for_each_entry(evlist, evsel) {
243
244
{
245
struct evsel *evsel = perf_evlist__first(evlist);
246
247
- TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries);
248
+ TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->core.nr_entries);
249
TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->attr.type);
250
TEST_ASSERT_VAL("wrong config", 0x1a == evsel->attr.config);
251
return 0;
252
253
{
254
struct evsel *evsel = perf_evlist__first(evlist);
255
256
- TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries);
257
+ TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->core.nr_entries);
258
TEST_ASSERT_VAL("wrong type", 1 == evsel->attr.type);
259
TEST_ASSERT_VAL("wrong config", 1 == evsel->attr.config);
260
return 0;
261
262
{
263
struct evsel *evsel = perf_evlist__first(evlist);
264
265
- TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries);
266
+ TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->core.nr_entries);
267
TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
268
TEST_ASSERT_VAL("wrong config",
269
PERF_COUNT_HW_INSTRUCTIONS == evsel->attr.config);
270
271
{
272
struct evsel *evsel = perf_evlist__first(evlist);
273
274
- TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries);
275
+ TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->core.nr_entries);
276
TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type);
277
TEST_ASSERT_VAL("wrong config",
278
PERF_COUNT_HW_CPU_CYCLES == evsel->attr.config);
279
280
{
281
struct evsel *evsel = perf_evlist__first(evlist);
282
283
- TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries);
284
+ TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->core.nr_entries);
285
TEST_ASSERT_VAL("wrong type", PERF_TYPE_SOFTWARE == evsel->attr.type);
286
TEST_ASSERT_VAL("wrong config",
287
PERF_COUNT_SW_PAGE_FAULTS == evsel->attr.config);
288
289
{
290
struct evsel *evsel = perf_evlist__first(evlist);
291
292
- TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries);
293
+ TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->core.nr_entries);
294
TEST_ASSERT_VAL("wrong type", PERF_TYPE_HW_CACHE == evsel->attr.type);
295
TEST_ASSERT_VAL("wrong config", (1 << 16) == evsel->attr.config);
296
return 0;
297
298
{
299
struct evsel *evsel = perf_evlist__first(evlist);
300
301
- TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries);
302
+ TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->core.nr_entries);
303
TEST_ASSERT_VAL("wrong type", PERF_TYPE_BREAKPOINT == evsel->attr.type);
304
TEST_ASSERT_VAL("wrong config", 0 == evsel->attr.config);
305
TEST_ASSERT_VAL("wrong bp_type", (HW_BREAKPOINT_R | HW_BREAKPOINT_W) ==
306
307
{
308
struct evsel *evsel = perf_evlist__first(evlist);
309
310
- TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries);
311
+ TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->core.nr_entries);
312
TEST_ASSERT_VAL("wrong type", PERF_TYPE_BREAKPOINT == evsel->attr.type);
313
TEST_ASSERT_VAL("wrong config", 0 == evsel->attr.config);
314
TEST_ASSERT_VAL("wrong bp_type",
315
316
{
317
struct evsel *evsel = perf_evlist__first(evlist);
318
319
- TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries);
320
+ TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->core.nr_entries);
321
TEST_ASSERT_VAL("wrong type",
322
PERF_TYPE_BREAKPOINT == evsel->attr.type);
323
TEST_ASSERT_VAL("wrong config", 0 == evsel->attr.config);
324
325
{
326
struct evsel *evsel = perf_evlist__first(evlist);
327
328
- TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries);
329
+ TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->core.nr_entries);
330
TEST_ASSERT_VAL("wrong type",
331
PERF_TYPE_BREAKPOINT == evsel->attr.type);
332
TEST_ASSERT_VAL("wrong config", 0 == evsel->attr.config);
333
334
{
335
struct evsel *evsel = perf_evlist__first(evlist);
336
337
- TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries);
338
+ TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->core.nr_entries);
339
TEST_ASSERT_VAL("wrong type",
340
PERF_TYPE_BREAKPOINT == evsel->attr.type);
341
TEST_ASSERT_VAL("wrong config", 0 == evsel->attr.config);
342
343
{
344
struct evsel *evsel;
345
346
- TEST_ASSERT_VAL("wrong number of entries", evlist->nr_entries > 1);
347
+ TEST_ASSERT_VAL("wrong number of entries", evlist->core.nr_entries > 1);
348
349
evlist__for_each_entry(evlist, evsel) {
350
TEST_ASSERT_VAL("wrong exclude_user",
351
352
353
struct evsel *evsel = perf_evlist__first(evlist);
354
355
- TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries);
356
+ TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->core.nr_entries);
357
TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->attr.type);
358
TEST_ASSERT_VAL("wrong config", 10 == evsel->attr.config);
359
TEST_ASSERT_VAL("wrong config1", 1 == evsel->attr.config1);
360
361
{
362
struct evsel *evsel = perf_evlist__first(evlist);
363
364
- TEST_ASSERT_VAL("wrong number of entries", 3 == evlist->nr_entries);
365
+ TEST_ASSERT_VAL("wrong number of entries", 3 == evlist->core.nr_entries);
366
367
/* r1 */
368
TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->attr.type);
369
370
struct evsel *evsel = perf_evlist__first(evlist);
371
372
/* cpu/config=1,name=krava/u */
373
- TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->nr_entries);
374
+ TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->core.nr_entries);
375
TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->attr.type);
376
TEST_ASSERT_VAL("wrong config", 1 == evsel->attr.config);
377
TEST_ASSERT_VAL("wrong name", !strcmp(perf_evsel__name(evsel), "krava"));
378
379
/* cpu/config=2/u" */
380
evsel = perf_evsel__next(evsel);
381
- TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->nr_entries);
382
+ TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->core.nr_entries);
383
TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->attr.type);
384
TEST_ASSERT_VAL("wrong config", 2 == evsel->attr.config);
385
TEST_ASSERT_VAL("wrong name",
386
387
struct evsel *evsel = perf_evlist__first(evlist);
388
389
/* cpu/config=1,call-graph=fp,time,period=100000/ */
390
- TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->nr_entries);
391
+ TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->core.nr_entries);
392
TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->attr.type);
393
TEST_ASSERT_VAL("wrong config", 1 == evsel->attr.config);
394
/*
395
396
{
397
struct evsel *evsel = perf_evlist__first(evlist);
398
399
- TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries);
400
+ TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->core.nr_entries);
401
TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->attr.type);
402
TEST_ASSERT_VAL("wrong exclude_user",
403
!evsel->attr.exclude_user);
404
405
struct evsel *evsel = perf_evlist__first(evlist);
406
407
/* pmu-event:u */
408
- TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->nr_entries);
409
+ TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->core.nr_entries);
410
TEST_ASSERT_VAL("wrong exclude_user",
411
!evsel->attr.exclude_user);
412
TEST_ASSERT_VAL("wrong exclude_kernel",
413
414
415
/* cpu/pmu-event/u*/
416
evsel = perf_evsel__next(evsel);
417
- TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->nr_entries);
418
+ TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->core.nr_entries);
419
TEST_ASSERT_VAL("wrong type", PERF_TYPE_RAW == evsel->attr.type);
420
TEST_ASSERT_VAL("wrong exclude_user",
421
!evsel->attr.exclude_user);
422
423
{
424
struct evsel *evsel, *leader;
425
426
- TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->nr_entries);
427
+ TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->core.nr_entries);
428
TEST_ASSERT_VAL("wrong number of groups", 1 == evlist->nr_groups);
429
430
/* instructions:k */
431
432
{
433
struct evsel *evsel, *leader;
434
435
- TEST_ASSERT_VAL("wrong number of entries", 3 == evlist->nr_entries);
436
+ TEST_ASSERT_VAL("wrong number of entries", 3 == evlist->core.nr_entries);
437
TEST_ASSERT_VAL("wrong number of groups", 1 == evlist->nr_groups);
438
439
/* faults + :ku modifier */
440
441
{
442
struct evsel *evsel, *leader;
443
444
- TEST_ASSERT_VAL("wrong number of entries", 5 == evlist->nr_entries);
445
+ TEST_ASSERT_VAL("wrong number of entries", 5 == evlist->core.nr_entries);
446
TEST_ASSERT_VAL("wrong number of groups", 2 == evlist->nr_groups);
447
448
/* group1 syscalls:sys_enter_openat:H */
449
450
{
451
struct evsel *evsel, *leader;
452
453
- TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->nr_entries);
454
+ TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->core.nr_entries);
455
TEST_ASSERT_VAL("wrong number of groups", 1 == evlist->nr_groups);
456
457
/* cycles:u + p */
458
459
{
460
struct evsel *evsel, *leader;
461
462
- TEST_ASSERT_VAL("wrong number of entries", 5 == evlist->nr_entries);
463
+ TEST_ASSERT_VAL("wrong number of entries", 5 == evlist->core.nr_entries);
464
TEST_ASSERT_VAL("wrong number of groups", 2 == evlist->nr_groups);
465
466
/* cycles + G */
467
468
{
469
struct evsel *evsel, *leader;
470
471
- TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->nr_entries);
472
+ TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->core.nr_entries);
473
TEST_ASSERT_VAL("wrong number of groups", 1 == evlist->nr_groups);
474
475
/* cycles + :H group modifier */
476
477
{
478
struct evsel *evsel, *leader;
479
480
- TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->nr_entries);
481
+ TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->core.nr_entries);
482
TEST_ASSERT_VAL("wrong number of groups", 1 == evlist->nr_groups);
483
484
/* cycles + :G group modifier */
485
486
{
487
struct evsel *evsel, *leader;
488
489
- TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->nr_entries);
490
+ TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->core.nr_entries);
491
TEST_ASSERT_VAL("wrong number of groups", 1 == evlist->nr_groups);
492
493
/* cycles:G + :u group modifier */
494
495
{
496
struct evsel *evsel, *leader;
497
498
- TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->nr_entries);
499
+ TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->core.nr_entries);
500
TEST_ASSERT_VAL("wrong number of groups", 1 == evlist->nr_groups);
501
502
/* cycles:G + :uG group modifier */
503
504
{
505
struct evsel *evsel, *leader;
506
507
- TEST_ASSERT_VAL("wrong number of entries", 3 == evlist->nr_entries);
508
+ TEST_ASSERT_VAL("wrong number of entries", 3 == evlist->core.nr_entries);
509
510
/* cycles - sampling group leader */
511
evsel = leader = perf_evlist__first(evlist);
512
513
{
514
struct evsel *evsel, *leader;
515
516
- TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->nr_entries);
517
+ TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->core.nr_entries);
518
519
/* instructions - sampling group leader */
520
evsel = leader = perf_evlist__first(evlist);
521
522
{
523
struct evsel *evsel, *leader;
524
525
- TEST_ASSERT_VAL("wrong number of entries", 3 == evlist->nr_entries);
526
+ TEST_ASSERT_VAL("wrong number of entries", 3 == evlist->core.nr_entries);
527
528
/* cycles - group leader */
529
evsel = leader = perf_evlist__first(evlist);
530
531
{
532
struct evsel *evsel = perf_evlist__first(evlist);
533
534
- TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries);
535
+ TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->core.nr_entries);
536
TEST_ASSERT_VAL("wrong type", PERF_TYPE_BREAKPOINT == evsel->attr.type);
537
TEST_ASSERT_VAL("wrong config", 0 == evsel->attr.config);
538
TEST_ASSERT_VAL("wrong bp_type", (HW_BREAKPOINT_R | HW_BREAKPOINT_W) ==
539
540
{
541
struct evsel *evsel = perf_evlist__first(evlist);
542
543
- TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries);
544
+ TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->core.nr_entries);
545
TEST_ASSERT_VAL("wrong type", PERF_TYPE_BREAKPOINT == evsel->attr.type);
546
TEST_ASSERT_VAL("wrong config", 0 == evsel->attr.config);
547
TEST_ASSERT_VAL("wrong bp_type", HW_BREAKPOINT_W ==
548
549
{
550
struct evsel *evsel = perf_evlist__first(evlist);
551
552
- TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->nr_entries);
553
+ TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->core.nr_entries);
554
TEST_ASSERT_VAL("wrong type", PERF_TYPE_SOFTWARE == evsel->attr.type);
555
TEST_ASSERT_VAL("wrong config",
556
PERF_COUNT_SW_TASK_CLOCK == evsel->attr.config);
557
558
static int test__all_tracepoints(struct evlist *evlist)
559
{
560
TEST_ASSERT_VAL("wrong events count",
561
- count_tracepoints() == evlist->nr_entries);
562
+ count_tracepoints() == evlist->core.nr_entries);
563
564
return test__checkevent_tracepoint_multi(evlist);
565
}
566
diff --git a/tools/perf/ui/browsers/annotate.c b/tools/perf/ui/browsers/annotate.c
567
index 64cc650c4543..e633eb42550d 100644
568
--- a/tools/perf/ui/browsers/annotate.c
569
+++ b/tools/perf/ui/browsers/annotate.c
570
571
notes = symbol__annotation(dl->ops.target.sym);
572
pthread_mutex_lock(¬es->lock);
573
574
- if (!symbol__hists(dl->ops.target.sym, evsel->evlist->nr_entries)) {
575
+ if (!symbol__hists(dl->ops.target.sym, evsel->evlist->core.nr_entries)) {
576
pthread_mutex_unlock(¬es->lock);
577
ui__warning("Not enough memory for annotating '%s' symbol!\n",
578
dl->ops.target.sym->name);
579
diff --git a/tools/perf/ui/browsers/hists.c b/tools/perf/ui/browsers/hists.c
580
index ed5406ff9fe4..b195b1ba625b 100644
581
--- a/tools/perf/ui/browsers/hists.c
582
+++ b/tools/perf/ui/browsers/hists.c
583
584
bool warn_lost_event,
585
struct annotation_options *annotation_opts)
586
{
587
- int nr_entries = evlist->nr_entries;
588
+ int nr_entries = evlist->core.nr_entries;
589
590
single_entry:
591
if (nr_entries == 1) {
592
diff --git a/tools/perf/util/annotate.c b/tools/perf/util/annotate.c
593
index 6ea5d678a81c..d46f2ae2c695 100644
594
--- a/tools/perf/util/annotate.c
595
+++ b/tools/perf/util/annotate.c
596
597
598
if (sym == NULL)
599
return 0;
600
- src = symbol__hists(sym, evsel->evlist->nr_entries);
601
+ src = symbol__hists(sym, evsel->evlist->core.nr_entries);
602
return (src) ? __symbol__inc_addr_samples(sym, map, src, evsel->idx,
603
addr, sample) : 0;
604
}
605
diff --git a/tools/perf/util/annotate.h b/tools/perf/util/annotate.h
606
index 7c42f320efa2..d94be9140e31 100644
607
--- a/tools/perf/util/annotate.h
608
+++ b/tools/perf/util/annotate.h
609
610
/** struct annotated_source - symbols with hits have this attached as in sannotation
611
*
612
* @histograms: Array of addr hit histograms per event being monitored
613
- * nr_histograms: This may not be the same as evsel->evlist->nr_entries if
614
+ * nr_histograms: This may not be the same as evsel->evlist->core.nr_entries if
615
* we have more than a group in a evlist, where we will want
616
* to see each group separately, that is why symbol__annotate2()
617
* sets src->nr_histograms to evsel->nr_members.
618
diff --git a/tools/perf/util/evlist.c b/tools/perf/util/evlist.c
619
index 9b0108c23010..ce9f52215d60 100644
620
--- a/tools/perf/util/evlist.c
621
+++ b/tools/perf/util/evlist.c
622
623
evsel__delete(pos);
624
}
625
626
- evlist->nr_entries = 0;
627
+ evlist->core.nr_entries = 0;
628
}
629
630
void perf_evlist__exit(struct evlist *evlist)
631
632
633
void evlist__add(struct evlist *evlist, struct evsel *entry)
634
{
635
- perf_evlist__add(&evlist->core, &entry->core);
636
entry->evlist = evlist;
637
- entry->idx = evlist->nr_entries;
638
+ entry->idx = evlist->core.nr_entries;
639
entry->tracking = !entry->idx;
640
641
- if (!evlist->nr_entries++)
642
+ perf_evlist__add(&evlist->core, &entry->core);
643
+
644
+ if (evlist->core.nr_entries == 1)
645
perf_evlist__set_id_pos(evlist);
646
647
__perf_evlist__propagate_maps(evlist, entry);
648
649
{
650
evsel->evlist = NULL;
651
perf_evlist__remove(&evlist->core, &evsel->core);
652
- evlist->nr_entries -= 1;
653
}
654
655
void perf_evlist__splice_list_tail(struct evlist *evlist,
656
657
658
void perf_evlist__set_leader(struct evlist *evlist)
659
{
660
- if (evlist->nr_entries) {
661
- evlist->nr_groups = evlist->nr_entries > 1 ? 1 : 0;
662
+ if (evlist->core.nr_entries) {
663
+ evlist->nr_groups = evlist->core.nr_entries > 1 ? 1 : 0;
664
__perf_evlist__set_leader(&evlist->core.entries);
665
}
666
}
667
668
.config = PERF_COUNT_SW_DUMMY,
669
.size = sizeof(attr), /* to capture ABI version */
670
};
671
- struct evsel *evsel = perf_evsel__new_idx(&attr, evlist->nr_entries);
672
+ struct evsel *evsel = perf_evsel__new_idx(&attr, evlist->core.nr_entries);
673
674
if (evsel == NULL)
675
return -ENOMEM;
676
677
size_t i;
678
679
for (i = 0; i < nr_attrs; i++) {
680
- evsel = perf_evsel__new_idx(attrs + i, evlist->nr_entries + i);
681
+ evsel = perf_evsel__new_idx(attrs + i, evlist->core.nr_entries + i);
682
if (evsel == NULL)
683
goto out_delete_partial_list;
684
list_add_tail(&evsel->core.node, &head);
685
686
{
687
struct perf_sample_id *sid;
688
689
- if (evlist->nr_entries == 1 || !id)
690
+ if (evlist->core.nr_entries == 1 || !id)
691
return perf_evlist__first(evlist);
692
693
sid = perf_evlist__id2sid(evlist, id);
694
695
int hash;
696
u64 id;
697
698
- if (evlist->nr_entries == 1)
699
+ if (evlist->core.nr_entries == 1)
700
return first;
701
702
if (!first->attr.sample_id_all &&
703
704
{
705
struct evsel *pos;
706
707
- if (evlist->nr_entries == 1)
708
+ if (evlist->core.nr_entries == 1)
709
return true;
710
711
if (evlist->id_pos < 0 || evlist->is_pos < 0)
712
713
attr->sample_id_all = 1;
714
}
715
716
- evsel = perf_evsel__new_idx(attr, (*evlist)->nr_entries);
717
+ evsel = perf_evsel__new_idx(attr, (*evlist)->core.nr_entries);
718
if (!evsel)
719
goto out_err;
720
721
diff --git a/tools/perf/util/evlist.h b/tools/perf/util/evlist.h
722
index 7117378a08e3..17dd83021a79 100644
723
--- a/tools/perf/util/evlist.h
724
+++ b/tools/perf/util/evlist.h
725
726
struct evlist {
727
struct perf_evlist core;
728
struct hlist_head heads[PERF_EVLIST__HLIST_SIZE];
729
- int nr_entries;
730
int nr_groups;
731
int nr_mmaps;
732
bool enabled;
733
diff --git a/tools/perf/util/header.c b/tools/perf/util/header.c
734
index 70ab6b8c715b..141de4425100 100644
735
--- a/tools/perf/util/header.c
736
+++ b/tools/perf/util/header.c
737
738
u32 nre, nri, sz;
739
int ret;
740
741
- nre = evlist->nr_entries;
742
+ nre = evlist->core.nr_entries;
743
744
/*
745
* write number of events
746
747
.attr_size = sizeof(f_attr),
748
.attrs = {
749
.offset = attr_offset,
750
- .size = evlist->nr_entries * sizeof(f_attr),
751
+ .size = evlist->core.nr_entries * sizeof(f_attr),
752
},
753
.data = {
754
.offset = header->data_offset,
755
diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c
756
index a0b7d68d2f8e..10efc33c56a1 100644
757
--- a/tools/perf/util/parse-events.c
758
+++ b/tools/perf/util/parse-events.c
759
760
{
761
struct parse_events_state parse_state = {
762
.list = LIST_HEAD_INIT(parse_state.list),
763
- .idx = evlist->nr_entries,
764
+ .idx = evlist->core.nr_entries,
765
.error = err,
766
.evlist = evlist,
767
};
768
769
*
770
* So no need to WARN here, let *func do this.
771
*/
772
- if (evlist->nr_entries > 0)
773
+ if (evlist->core.nr_entries > 0)
774
last = perf_evlist__last(evlist);
775
776
do {
777
diff --git a/tools/perf/util/python.c b/tools/perf/util/python.c
778
index 19d2feee91d5..cf0a18d49018 100644
779
--- a/tools/perf/util/python.c
780
+++ b/tools/perf/util/python.c
781
782
783
Py_INCREF(pevsel);
784
evsel = &((struct pyrf_evsel *)pevsel)->evsel;
785
- evsel->idx = evlist->nr_entries;
786
+ evsel->idx = evlist->core.nr_entries;
787
evlist__add(evlist, evsel);
788
789
- return Py_BuildValue("i", evlist->nr_entries);
790
+ return Py_BuildValue("i", evlist->core.nr_entries);
791
}
792
793
static struct perf_mmap *get_md(struct evlist *evlist, int cpu)
794
795
{
796
struct pyrf_evlist *pevlist = (void *)obj;
797
798
- return pevlist->evlist.nr_entries;
799
+ return pevlist->evlist.core.nr_entries;
800
}
801
802
static PyObject *pyrf_evlist__item(PyObject *obj, Py_ssize_t i)
803
804
struct pyrf_evlist *pevlist = (void *)obj;
805
struct evsel *pos;
806
807
- if (i >= pevlist->evlist.nr_entries)
808
+ if (i >= pevlist->evlist.core.nr_entries)
809
return NULL;
810
811
evlist__for_each_entry(&pevlist->evlist, pos) {
812
diff --git a/tools/perf/util/record.c b/tools/perf/util/record.c
813
index fecccfd71aa1..3d3d732498e1 100644
814
--- a/tools/perf/util/record.c
815
+++ b/tools/perf/util/record.c
816
817
*/
818
use_sample_identifier = perf_can_sample_identifier();
819
sample_id = true;
820
- } else if (evlist->nr_entries > 1) {
821
+ } else if (evlist->core.nr_entries > 1) {
822
struct evsel *first = perf_evlist__first(evlist);
823
824
evlist__for_each_entry(evlist, evsel) {
825
diff --git a/tools/perf/util/sort.c b/tools/perf/util/sort.c
826
index d8e4392d6e18..fa3cc2112b82 100644
827
--- a/tools/perf/util/sort.c
828
+++ b/tools/perf/util/sort.c
829
830
if (event_name[0] == '%') {
831
int nr = strtol(event_name+1, NULL, 0);
832
833
- if (nr > evlist->nr_entries)
834
+ if (nr > evlist->core.nr_entries)
835
return NULL;
836
837
evsel = perf_evlist__first(evlist);
838
diff --git a/tools/perf/util/top.c b/tools/perf/util/top.c
839
index 9f098db76e3c..3bbbdac2c550 100644
840
--- a/tools/perf/util/top.c
841
+++ b/tools/perf/util/top.c
842
843
esamples_percent);
844
}
845
846
- if (top->evlist->nr_entries == 1) {
847
+ if (top->evlist->core.nr_entries == 1) {
848
struct evsel *first = perf_evlist__first(top->evlist);
849
ret += SNPRINTF(bf + ret, size - ret, "%" PRIu64 "%s ",
850
(uint64_t)first->attr.sample_period,
851
852