File libperf-add-perf_thread_map__get-perf_thread_map__put.patch of Package perf
xxxxxxxxxx
1
From: Jiri Olsa <jolsa@kernel.org>
2
Date: Sun, 21 Jul 2019 13:24:20 +0200
3
Subject: libperf: Add perf_thread_map__get()/perf_thread_map__put()
4
Git-commit: 7836e52e518b5e3fd695850f1d4081f756f58406
5
Patch-mainline: v5.4-rc1
6
References: jsc#SLE-13661
7
8
Move the following functions:
9
10
thread_map__get()
11
thread_map__put()
12
thread_map__comm()
13
14
to libperf with the following names:
15
16
perf_thread_map__get()
17
perf_thread_map__put()
18
perf_thread_map__comm()
19
20
Add the perf_thread_map__comm() function for it to work/compile.
21
22
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
23
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
24
Cc: Alexey Budankov <alexey.budankov@linux.intel.com>
25
Cc: Andi Kleen <ak@linux.intel.com>
26
Cc: Michael Petlan <mpetlan@redhat.com>
27
Cc: Namhyung Kim <namhyung@kernel.org>
28
Cc: Peter Zijlstra <peterz@infradead.org>
29
Link: http://lkml.kernel.org/r/20190721112506.12306-34-jolsa@kernel.org
30
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
31
Signed-off-by: Tony Jones <tonyj@suse.de>
32
---
33
tools/perf/builtin-record.c | 2 +-
34
tools/perf/lib/include/perf/threadmap.h | 4 ++++
35
tools/perf/lib/libperf.map | 3 +++
36
tools/perf/lib/threadmap.c | 33 ++++++++++++++++++++++++++++++
37
tools/perf/tests/code-reading.c | 4 ++--
38
tools/perf/tests/event-times.c | 4 ++--
39
tools/perf/tests/keep-tracking.c | 2 +-
40
tools/perf/tests/mmap-basic.c | 2 +-
41
tools/perf/tests/mmap-thread-lookup.c | 2 +-
42
tools/perf/tests/openat-syscall-all-cpus.c | 2 +-
43
tools/perf/tests/openat-syscall.c | 2 +-
44
tools/perf/tests/sw-clock.c | 2 +-
45
tools/perf/tests/switch-tracking.c | 2 +-
46
tools/perf/tests/task-exit.c | 2 +-
47
tools/perf/tests/thread-map.c | 18 ++++++++--------
48
tools/perf/util/event.c | 4 ++--
49
tools/perf/util/evlist.c | 12 +++++------
50
tools/perf/util/evsel.c | 2 +-
51
tools/perf/util/parse-events.c | 2 +-
52
tools/perf/util/python.c | 2 +-
53
tools/perf/util/stat-display.c | 2 +-
54
tools/perf/util/thread_map.c | 26 -----------------------
55
tools/perf/util/thread_map.h | 8 --------
56
23 files changed, 74 insertions(+), 68 deletions(-)
57
58
diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c
59
index c0962ddfad04..03fbe4600ca0 100644
60
--- a/tools/perf/builtin-record.c
61
+++ b/tools/perf/builtin-record.c
62
63
process_synthesized_event,
64
&rec->session->machines.host,
65
rec->opts.sample_address);
66
- thread_map__put(thread_map);
67
+ perf_thread_map__put(thread_map);
68
return err;
69
}
70
71
diff --git a/tools/perf/lib/include/perf/threadmap.h b/tools/perf/lib/include/perf/threadmap.h
72
index 34ed7f587101..456295273daa 100644
73
--- a/tools/perf/lib/include/perf/threadmap.h
74
+++ b/tools/perf/lib/include/perf/threadmap.h
75
76
LIBPERF_API struct perf_thread_map *perf_thread_map__new_dummy(void);
77
78
LIBPERF_API void perf_thread_map__set_pid(struct perf_thread_map *map, int thread, pid_t pid);
79
+LIBPERF_API char *perf_thread_map__comm(struct perf_thread_map *map, int thread);
80
+
81
+LIBPERF_API struct perf_thread_map *perf_thread_map__get(struct perf_thread_map *map);
82
+LIBPERF_API void perf_thread_map__put(struct perf_thread_map *map);
83
84
#endif /* __LIBPERF_THREADMAP_H */
85
diff --git a/tools/perf/lib/libperf.map b/tools/perf/lib/libperf.map
86
index 6b4ec1c4d3f3..c4f611010ccc 100644
87
--- a/tools/perf/lib/libperf.map
88
+++ b/tools/perf/lib/libperf.map
89
90
perf_cpu_map__put;
91
perf_thread_map__new_dummy;
92
perf_thread_map__set_pid;
93
+ perf_thread_map__comm;
94
+ perf_thread_map__get;
95
+ perf_thread_map__put;
96
local:
97
*;
98
};
99
diff --git a/tools/perf/lib/threadmap.c b/tools/perf/lib/threadmap.c
100
index 23e628a1437a..4865b73e2586 100644
101
--- a/tools/perf/lib/threadmap.c
102
+++ b/tools/perf/lib/threadmap.c
103
104
#include <linux/refcount.h>
105
#include <internal/threadmap.h>
106
#include <string.h>
107
+#include <asm/bug.h>
108
+#include <stdio.h>
109
110
static void perf_thread_map__reset(struct perf_thread_map *map, int start, int nr)
111
{
112
113
map->map[thread].pid = pid;
114
}
115
116
+char *perf_thread_map__comm(struct perf_thread_map *map, int thread)
117
+{
118
+ return map->map[thread].comm;
119
+}
120
+
121
struct perf_thread_map *perf_thread_map__new_dummy(void)
122
{
123
struct perf_thread_map *threads = thread_map__alloc(1);
124
125
}
126
return threads;
127
}
128
+
129
+static void perf_thread_map__delete(struct perf_thread_map *threads)
130
+{
131
+ if (threads) {
132
+ int i;
133
+
134
+ WARN_ONCE(refcount_read(&threads->refcnt) != 0,
135
+ "thread map refcnt unbalanced\n");
136
+ for (i = 0; i < threads->nr; i++)
137
+ free(perf_thread_map__comm(threads, i));
138
+ free(threads);
139
+ }
140
+}
141
+
142
+struct perf_thread_map *perf_thread_map__get(struct perf_thread_map *map)
143
+{
144
+ if (map)
145
+ refcount_inc(&map->refcnt);
146
+ return map;
147
+}
148
+
149
+void perf_thread_map__put(struct perf_thread_map *map)
150
+{
151
+ if (map && refcount_dec_and_test(&map->refcnt))
152
+ perf_thread_map__delete(map);
153
+}
154
diff --git a/tools/perf/tests/code-reading.c b/tools/perf/tests/code-reading.c
155
index ce2d3266286a..7b26be1dfb47 100644
156
--- a/tools/perf/tests/code-reading.c
157
+++ b/tools/perf/tests/code-reading.c
158
159
* call. Getting refference to keep them alive.
160
*/
161
perf_cpu_map__get(cpus);
162
- thread_map__get(threads);
163
+ perf_thread_map__get(threads);
164
perf_evlist__set_maps(evlist, NULL, NULL);
165
evlist__delete(evlist);
166
evlist = NULL;
167
168
evlist__delete(evlist);
169
} else {
170
perf_cpu_map__put(cpus);
171
- thread_map__put(threads);
172
+ perf_thread_map__put(threads);
173
}
174
machine__delete_threads(machine);
175
machine__delete(machine);
176
diff --git a/tools/perf/tests/event-times.c b/tools/perf/tests/event-times.c
177
index dcfff4b20c92..9238180416b0 100644
178
--- a/tools/perf/tests/event-times.c
179
+++ b/tools/perf/tests/event-times.c
180
181
return err;
182
}
183
184
- thread_map__put(threads);
185
+ perf_thread_map__put(threads);
186
return evsel__enable(evsel) == 0 ? TEST_OK : TEST_FAIL;
187
}
188
189
190
191
err = perf_evsel__open_per_thread(evsel, threads);
192
193
- thread_map__put(threads);
194
+ perf_thread_map__put(threads);
195
return err == 0 ? TEST_OK : TEST_FAIL;
196
}
197
198
diff --git a/tools/perf/tests/keep-tracking.c b/tools/perf/tests/keep-tracking.c
199
index 43e55fe98f8c..830fb3d7ea2e 100644
200
--- a/tools/perf/tests/keep-tracking.c
201
+++ b/tools/perf/tests/keep-tracking.c
202
203
evlist__delete(evlist);
204
} else {
205
perf_cpu_map__put(cpus);
206
- thread_map__put(threads);
207
+ perf_thread_map__put(threads);
208
}
209
210
return err;
211
diff --git a/tools/perf/tests/mmap-basic.c b/tools/perf/tests/mmap-basic.c
212
index d15282174b2e..72fbf55f4fc3 100644
213
--- a/tools/perf/tests/mmap-basic.c
214
+++ b/tools/perf/tests/mmap-basic.c
215
216
out_free_cpus:
217
perf_cpu_map__put(cpus);
218
out_free_threads:
219
- thread_map__put(threads);
220
+ perf_thread_map__put(threads);
221
return err;
222
}
223
diff --git a/tools/perf/tests/mmap-thread-lookup.c b/tools/perf/tests/mmap-thread-lookup.c
224
index ad6ca943e568..360d70deb855 100644
225
--- a/tools/perf/tests/mmap-thread-lookup.c
226
+++ b/tools/perf/tests/mmap-thread-lookup.c
227
228
perf_event__process,
229
machine, 0);
230
231
- thread_map__put(map);
232
+ perf_thread_map__put(map);
233
return err;
234
}
235
236
diff --git a/tools/perf/tests/openat-syscall-all-cpus.c b/tools/perf/tests/openat-syscall-all-cpus.c
237
index 611f6ea9b702..674b0fa035ec 100644
238
--- a/tools/perf/tests/openat-syscall-all-cpus.c
239
+++ b/tools/perf/tests/openat-syscall-all-cpus.c
240
241
out_cpu_map_delete:
242
perf_cpu_map__put(cpus);
243
out_thread_map_delete:
244
- thread_map__put(threads);
245
+ perf_thread_map__put(threads);
246
return err;
247
}
248
diff --git a/tools/perf/tests/openat-syscall.c b/tools/perf/tests/openat-syscall.c
249
index 20e353fbfdd0..87c212545767 100644
250
--- a/tools/perf/tests/openat-syscall.c
251
+++ b/tools/perf/tests/openat-syscall.c
252
253
out_evsel_delete:
254
evsel__delete(evsel);
255
out_thread_map_delete:
256
- thread_map__put(threads);
257
+ perf_thread_map__put(threads);
258
return err;
259
}
260
diff --git a/tools/perf/tests/sw-clock.c b/tools/perf/tests/sw-clock.c
261
index c464e301ade9..2decda2d4c17 100644
262
--- a/tools/perf/tests/sw-clock.c
263
+++ b/tools/perf/tests/sw-clock.c
264
265
266
out_free_maps:
267
perf_cpu_map__put(cpus);
268
- thread_map__put(threads);
269
+ perf_thread_map__put(threads);
270
out_delete_evlist:
271
evlist__delete(evlist);
272
return err;
273
diff --git a/tools/perf/tests/switch-tracking.c b/tools/perf/tests/switch-tracking.c
274
index 27af7b7109a3..0935a5a1ecaa 100644
275
--- a/tools/perf/tests/switch-tracking.c
276
+++ b/tools/perf/tests/switch-tracking.c
277
278
evlist__delete(evlist);
279
} else {
280
perf_cpu_map__put(cpus);
281
- thread_map__put(threads);
282
+ perf_thread_map__put(threads);
283
}
284
285
return err;
286
diff --git a/tools/perf/tests/task-exit.c b/tools/perf/tests/task-exit.c
287
index f026759a05d7..24257285844b 100644
288
--- a/tools/perf/tests/task-exit.c
289
+++ b/tools/perf/tests/task-exit.c
290
291
292
out_free_maps:
293
perf_cpu_map__put(cpus);
294
- thread_map__put(threads);
295
+ perf_thread_map__put(threads);
296
out_delete_evlist:
297
evlist__delete(evlist);
298
return err;
299
diff --git a/tools/perf/tests/thread-map.c b/tools/perf/tests/thread-map.c
300
index 73bc404ed390..d61773cacf0b 100644
301
--- a/tools/perf/tests/thread-map.c
302
+++ b/tools/perf/tests/thread-map.c
303
304
TEST_ASSERT_VAL("wrong pid",
305
thread_map__pid(map, 0) == getpid());
306
TEST_ASSERT_VAL("wrong comm",
307
- thread_map__comm(map, 0) &&
308
- !strcmp(thread_map__comm(map, 0), NAME));
309
+ perf_thread_map__comm(map, 0) &&
310
+ !strcmp(perf_thread_map__comm(map, 0), NAME));
311
TEST_ASSERT_VAL("wrong refcnt",
312
refcount_read(&map->refcnt) == 1);
313
- thread_map__put(map);
314
+ perf_thread_map__put(map);
315
316
/* test dummy pid */
317
map = perf_thread_map__new_dummy();
318
319
TEST_ASSERT_VAL("wrong nr", map->nr == 1);
320
TEST_ASSERT_VAL("wrong pid", thread_map__pid(map, 0) == -1);
321
TEST_ASSERT_VAL("wrong comm",
322
- thread_map__comm(map, 0) &&
323
- !strcmp(thread_map__comm(map, 0), "dummy"));
324
+ perf_thread_map__comm(map, 0) &&
325
+ !strcmp(perf_thread_map__comm(map, 0), "dummy"));
326
TEST_ASSERT_VAL("wrong refcnt",
327
refcount_read(&map->refcnt) == 1);
328
- thread_map__put(map);
329
+ perf_thread_map__put(map);
330
return 0;
331
}
332
333
334
TEST_ASSERT_VAL("wrong pid",
335
thread_map__pid(threads, 0) == getpid());
336
TEST_ASSERT_VAL("wrong comm",
337
- thread_map__comm(threads, 0) &&
338
- !strcmp(thread_map__comm(threads, 0), NAME));
339
+ perf_thread_map__comm(threads, 0) &&
340
+ !strcmp(perf_thread_map__comm(threads, 0), NAME));
341
TEST_ASSERT_VAL("wrong refcnt",
342
refcount_read(&threads->refcnt) == 1);
343
- thread_map__put(threads);
344
+ perf_thread_map__put(threads);
345
return 0;
346
}
347
348
diff --git a/tools/perf/util/event.c b/tools/perf/util/event.c
349
index 1a3db35f9f7d..f440fdc3e953 100644
350
--- a/tools/perf/util/event.c
351
+++ b/tools/perf/util/event.c
352
353
354
for (i = 0; i < threads->nr; i++) {
355
struct thread_map_event_entry *entry = &event->thread_map.entries[i];
356
- char *comm = thread_map__comm(threads, i);
357
+ char *comm = perf_thread_map__comm(threads, i);
358
359
if (!comm)
360
comm = (char *) "";
361
362
else
363
ret += fprintf(fp, "failed to get threads from event\n");
364
365
- thread_map__put(threads);
366
+ perf_thread_map__put(threads);
367
return ret;
368
}
369
370
diff --git a/tools/perf/util/evlist.c b/tools/perf/util/evlist.c
371
index 88d131769df4..38a3c6d16b4b 100644
372
--- a/tools/perf/util/evlist.c
373
+++ b/tools/perf/util/evlist.c
374
375
perf_evlist__munmap(evlist);
376
evlist__close(evlist);
377
perf_cpu_map__put(evlist->cpus);
378
- thread_map__put(evlist->threads);
379
+ perf_thread_map__put(evlist->threads);
380
evlist->cpus = NULL;
381
evlist->threads = NULL;
382
perf_evlist__purge(evlist);
383
384
evsel->cpus = perf_cpu_map__get(evsel->own_cpus);
385
}
386
387
- thread_map__put(evsel->threads);
388
- evsel->threads = thread_map__get(evlist->threads);
389
+ perf_thread_map__put(evsel->threads);
390
+ evsel->threads = perf_thread_map__get(evlist->threads);
391
}
392
393
static void perf_evlist__propagate_maps(struct evlist *evlist)
394
395
return 0;
396
397
out_delete_threads:
398
- thread_map__put(threads);
399
+ perf_thread_map__put(threads);
400
return -1;
401
}
402
403
404
}
405
406
if (threads != evlist->threads) {
407
- thread_map__put(evlist->threads);
408
- evlist->threads = thread_map__get(threads);
409
+ perf_thread_map__put(evlist->threads);
410
+ evlist->threads = perf_thread_map__get(threads);
411
}
412
413
perf_evlist__propagate_maps(evlist);
414
diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c
415
index 72c0e6948e83..652e53279b28 100644
416
--- a/tools/perf/util/evsel.c
417
+++ b/tools/perf/util/evsel.c
418
419
cgroup__put(evsel->cgrp);
420
perf_cpu_map__put(evsel->cpus);
421
perf_cpu_map__put(evsel->own_cpus);
422
- thread_map__put(evsel->threads);
423
+ perf_thread_map__put(evsel->threads);
424
zfree(&evsel->group_name);
425
zfree(&evsel->name);
426
perf_evsel__object.fini(evsel);
427
diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c
428
index 8c9928feb38a..38eeca6fa1fc 100644
429
--- a/tools/perf/util/parse-events.c
430
+++ b/tools/perf/util/parse-events.c
431
432
evsel__delete(evsel);
433
}
434
435
- thread_map__put(tmap);
436
+ perf_thread_map__put(tmap);
437
return ret;
438
}
439
440
diff --git a/tools/perf/util/python.c b/tools/perf/util/python.c
441
index 677c93f91c6c..19d2feee91d5 100644
442
--- a/tools/perf/util/python.c
443
+++ b/tools/perf/util/python.c
444
445
446
static void pyrf_thread_map__delete(struct pyrf_thread_map *pthreads)
447
{
448
- thread_map__put(pthreads->threads);
449
+ perf_thread_map__put(pthreads->threads);
450
Py_TYPE(pthreads)->tp_free((PyObject*)pthreads);
451
}
452
453
diff --git a/tools/perf/util/stat-display.c b/tools/perf/util/stat-display.c
454
index f7666d2e6e0c..1f099823a1f9 100644
455
--- a/tools/perf/util/stat-display.c
456
+++ b/tools/perf/util/stat-display.c
457
458
case AGGR_THREAD:
459
fprintf(config->output, "%*s-%*d%s",
460
config->csv_output ? 0 : 16,
461
- thread_map__comm(evsel->threads, id),
462
+ perf_thread_map__comm(evsel->threads, id),
463
config->csv_output ? 0 : -8,
464
thread_map__pid(evsel->threads, id),
465
config->csv_sep);
466
diff --git a/tools/perf/util/thread_map.c b/tools/perf/util/thread_map.c
467
index 06dd9f2e4ce5..c58385ea05be 100644
468
--- a/tools/perf/util/thread_map.c
469
+++ b/tools/perf/util/thread_map.c
470
471
return thread_map__new_by_tid_str(tid);
472
}
473
474
-static void thread_map__delete(struct perf_thread_map *threads)
475
-{
476
- if (threads) {
477
- int i;
478
-
479
- WARN_ONCE(refcount_read(&threads->refcnt) != 0,
480
- "thread map refcnt unbalanced\n");
481
- for (i = 0; i < threads->nr; i++)
482
- free(thread_map__comm(threads, i));
483
- free(threads);
484
- }
485
-}
486
-
487
-struct perf_thread_map *thread_map__get(struct perf_thread_map *map)
488
-{
489
- if (map)
490
- refcount_inc(&map->refcnt);
491
- return map;
492
-}
493
-
494
-void thread_map__put(struct perf_thread_map *map)
495
-{
496
- if (map && refcount_dec_and_test(&map->refcnt))
497
- thread_map__delete(map);
498
-}
499
-
500
size_t thread_map__fprintf(struct perf_thread_map *threads, FILE *fp)
501
{
502
int i;
503
diff --git a/tools/perf/util/thread_map.h b/tools/perf/util/thread_map.h
504
index 94a1f9565f5e..ba45c760be72 100644
505
--- a/tools/perf/util/thread_map.h
506
+++ b/tools/perf/util/thread_map.h
507
508
struct perf_thread_map *thread_map__new(pid_t pid, pid_t tid, uid_t uid);
509
struct perf_thread_map *thread_map__new_event(struct thread_map_event *event);
510
511
-struct perf_thread_map *thread_map__get(struct perf_thread_map *map);
512
-void thread_map__put(struct perf_thread_map *map);
513
-
514
struct perf_thread_map *thread_map__new_str(const char *pid,
515
const char *tid, uid_t uid, bool all_threads);
516
517
518
return map->map[thread].pid;
519
}
520
521
-static inline char *thread_map__comm(struct perf_thread_map *map, int thread)
522
-{
523
- return map->map[thread].comm;
524
-}
525
-
526
void thread_map__read_comms(struct perf_thread_map *threads);
527
bool thread_map__has(struct perf_thread_map *threads, pid_t pid);
528
int thread_map__remove(struct perf_thread_map *threads, int idx);
529
530