Commit | Line | Data |
---|---|---|
8c3e10eb ACM |
1 | /* |
2 | * Copyright (C) 2011, Red Hat Inc, Arnaldo Carvalho de Melo <acme@redhat.com> | |
3 | * | |
4 | * Refactored from builtin-top.c, see that files for further copyright notes. | |
5 | * | |
6 | * Released under the GPL v2. (and only v2, not any later version) | |
7 | */ | |
8 | ||
9 | #include "cpumap.h" | |
10 | #include "event.h" | |
11 | #include "evlist.h" | |
12 | #include "evsel.h" | |
13 | #include "parse-events.h" | |
14 | #include "symbol.h" | |
15 | #include "top.h" | |
16 | #include <inttypes.h> | |
17 | ||
b9a46bba JO |
18 | #define SNPRINTF(buf, size, fmt, args...) \ |
19 | ({ \ | |
20 | size_t r = snprintf(buf, size, fmt, ## args); \ | |
21 | r > size ? size : r; \ | |
22 | }) | |
23 | ||
8c3e10eb ACM |
24 | size_t perf_top__header_snprintf(struct perf_top *top, char *bf, size_t size) |
25 | { | |
8c3e10eb ACM |
26 | float samples_per_sec = top->samples / top->delay_secs; |
27 | float ksamples_per_sec = top->kernel_samples / top->delay_secs; | |
28 | float esamples_percent = (100.0 * top->exact_samples) / top->samples; | |
29 | size_t ret = 0; | |
30 | ||
31 | if (!perf_guest) { | |
b9a46bba | 32 | ret = SNPRINTF(bf, size, |
8c3e10eb ACM |
33 | " PerfTop:%8.0f irqs/sec kernel:%4.1f%%" |
34 | " exact: %4.1f%% [", samples_per_sec, | |
35 | 100.0 - (100.0 * ((samples_per_sec - ksamples_per_sec) / | |
36 | samples_per_sec)), | |
37 | esamples_percent); | |
38 | } else { | |
39 | float us_samples_per_sec = top->us_samples / top->delay_secs; | |
40 | float guest_kernel_samples_per_sec = top->guest_kernel_samples / top->delay_secs; | |
41 | float guest_us_samples_per_sec = top->guest_us_samples / top->delay_secs; | |
42 | ||
b9a46bba | 43 | ret = SNPRINTF(bf, size, |
8c3e10eb ACM |
44 | " PerfTop:%8.0f irqs/sec kernel:%4.1f%% us:%4.1f%%" |
45 | " guest kernel:%4.1f%% guest us:%4.1f%%" | |
46 | " exact: %4.1f%% [", samples_per_sec, | |
47 | 100.0 - (100.0 * ((samples_per_sec - ksamples_per_sec) / | |
48 | samples_per_sec)), | |
49 | 100.0 - (100.0 * ((samples_per_sec - us_samples_per_sec) / | |
50 | samples_per_sec)), | |
51 | 100.0 - (100.0 * ((samples_per_sec - | |
52 | guest_kernel_samples_per_sec) / | |
53 | samples_per_sec)), | |
54 | 100.0 - (100.0 * ((samples_per_sec - | |
55 | guest_us_samples_per_sec) / | |
56 | samples_per_sec)), | |
57 | esamples_percent); | |
58 | } | |
59 | ||
ab81f3fd | 60 | if (top->evlist->nr_entries == 1) { |
8c3e10eb ACM |
61 | struct perf_evsel *first; |
62 | first = list_entry(top->evlist->entries.next, struct perf_evsel, node); | |
b9a46bba | 63 | ret += SNPRINTF(bf + ret, size - ret, "%" PRIu64 "%s ", |
8c3e10eb ACM |
64 | (uint64_t)first->attr.sample_period, |
65 | top->freq ? "Hz" : ""); | |
66 | } | |
67 | ||
ab81f3fd | 68 | ret += SNPRINTF(bf + ret, size - ret, "%s", event_name(top->sym_evsel)); |
8c3e10eb | 69 | |
b9a46bba | 70 | ret += SNPRINTF(bf + ret, size - ret, "], "); |
8c3e10eb | 71 | |
fe9d18a7 | 72 | if (top->target.pid) |
b52956c9 | 73 | ret += SNPRINTF(bf + ret, size - ret, " (target_pid: %s", |
fe9d18a7 NK |
74 | top->target.pid); |
75 | else if (top->target.tid) | |
b52956c9 | 76 | ret += SNPRINTF(bf + ret, size - ret, " (target_tid: %s", |
fe9d18a7 NK |
77 | top->target.tid); |
78 | else if (top->target.uid_str != NULL) | |
0d37aa34 | 79 | ret += SNPRINTF(bf + ret, size - ret, " (uid: %s", |
fe9d18a7 | 80 | top->target.uid_str); |
8c3e10eb | 81 | else |
b9a46bba | 82 | ret += SNPRINTF(bf + ret, size - ret, " (all"); |
8c3e10eb | 83 | |
fe9d18a7 | 84 | if (top->target.cpu_list) |
b9a46bba | 85 | ret += SNPRINTF(bf + ret, size - ret, ", CPU%s: %s)", |
fe9d18a7 NK |
86 | top->evlist->cpus->nr > 1 ? "s" : "", |
87 | top->target.cpu_list); | |
8c3e10eb | 88 | else { |
fe9d18a7 | 89 | if (top->target.tid) |
b9a46bba | 90 | ret += SNPRINTF(bf + ret, size - ret, ")"); |
8c3e10eb | 91 | else |
b9a46bba | 92 | ret += SNPRINTF(bf + ret, size - ret, ", %d CPU%s)", |
8c3e10eb ACM |
93 | top->evlist->cpus->nr, |
94 | top->evlist->cpus->nr > 1 ? "s" : ""); | |
95 | } | |
96 | ||
97 | return ret; | |
98 | } | |
99 | ||
100 | void perf_top__reset_sample_counters(struct perf_top *top) | |
101 | { | |
102 | top->samples = top->us_samples = top->kernel_samples = | |
103 | top->exact_samples = top->guest_kernel_samples = | |
104 | top->guest_us_samples = 0; | |
105 | } |