]>
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 | { | |
6f29097f NK |
26 | float samples_per_sec; |
27 | float ksamples_per_sec; | |
28 | float esamples_percent; | |
b4006796 | 29 | struct record_opts *opts = &top->record_opts; |
602ad878 | 30 | struct target *target = &opts->target; |
8c3e10eb ACM |
31 | size_t ret = 0; |
32 | ||
6f29097f NK |
33 | if (top->samples) { |
34 | samples_per_sec = top->samples / top->delay_secs; | |
35 | ksamples_per_sec = top->kernel_samples / top->delay_secs; | |
36 | esamples_percent = (100.0 * top->exact_samples) / top->samples; | |
37 | } else { | |
38 | samples_per_sec = ksamples_per_sec = esamples_percent = 0.0; | |
39 | } | |
40 | ||
8c3e10eb | 41 | if (!perf_guest) { |
6f29097f NK |
42 | float ksamples_percent = 0.0; |
43 | ||
44 | if (samples_per_sec) | |
45 | ksamples_percent = (100.0 * ksamples_per_sec) / | |
46 | samples_per_sec; | |
b9a46bba | 47 | ret = SNPRINTF(bf, size, |
8c3e10eb ACM |
48 | " PerfTop:%8.0f irqs/sec kernel:%4.1f%%" |
49 | " exact: %4.1f%% [", samples_per_sec, | |
6f29097f | 50 | ksamples_percent, esamples_percent); |
8c3e10eb ACM |
51 | } else { |
52 | float us_samples_per_sec = top->us_samples / top->delay_secs; | |
53 | float guest_kernel_samples_per_sec = top->guest_kernel_samples / top->delay_secs; | |
54 | float guest_us_samples_per_sec = top->guest_us_samples / top->delay_secs; | |
55 | ||
b9a46bba | 56 | ret = SNPRINTF(bf, size, |
8c3e10eb ACM |
57 | " PerfTop:%8.0f irqs/sec kernel:%4.1f%% us:%4.1f%%" |
58 | " guest kernel:%4.1f%% guest us:%4.1f%%" | |
59 | " exact: %4.1f%% [", samples_per_sec, | |
60 | 100.0 - (100.0 * ((samples_per_sec - ksamples_per_sec) / | |
61 | samples_per_sec)), | |
62 | 100.0 - (100.0 * ((samples_per_sec - us_samples_per_sec) / | |
63 | samples_per_sec)), | |
64 | 100.0 - (100.0 * ((samples_per_sec - | |
65 | guest_kernel_samples_per_sec) / | |
66 | samples_per_sec)), | |
67 | 100.0 - (100.0 * ((samples_per_sec - | |
68 | guest_us_samples_per_sec) / | |
69 | samples_per_sec)), | |
70 | esamples_percent); | |
71 | } | |
72 | ||
ab81f3fd | 73 | if (top->evlist->nr_entries == 1) { |
0c21f736 | 74 | struct perf_evsel *first = perf_evlist__first(top->evlist); |
b9a46bba | 75 | ret += SNPRINTF(bf + ret, size - ret, "%" PRIu64 "%s ", |
8c3e10eb | 76 | (uint64_t)first->attr.sample_period, |
2376c67a | 77 | opts->freq ? "Hz" : ""); |
8c3e10eb ACM |
78 | } |
79 | ||
7289f83c | 80 | ret += SNPRINTF(bf + ret, size - ret, "%s", perf_evsel__name(top->sym_evsel)); |
8c3e10eb | 81 | |
b9a46bba | 82 | ret += SNPRINTF(bf + ret, size - ret, "], "); |
8c3e10eb | 83 | |
2376c67a | 84 | if (target->pid) |
b52956c9 | 85 | ret += SNPRINTF(bf + ret, size - ret, " (target_pid: %s", |
2376c67a ACM |
86 | target->pid); |
87 | else if (target->tid) | |
b52956c9 | 88 | ret += SNPRINTF(bf + ret, size - ret, " (target_tid: %s", |
2376c67a ACM |
89 | target->tid); |
90 | else if (target->uid_str != NULL) | |
0d37aa34 | 91 | ret += SNPRINTF(bf + ret, size - ret, " (uid: %s", |
2376c67a | 92 | target->uid_str); |
8c3e10eb | 93 | else |
b9a46bba | 94 | ret += SNPRINTF(bf + ret, size - ret, " (all"); |
8c3e10eb | 95 | |
2376c67a | 96 | if (target->cpu_list) |
b9a46bba | 97 | ret += SNPRINTF(bf + ret, size - ret, ", CPU%s: %s)", |
fe9d18a7 | 98 | top->evlist->cpus->nr > 1 ? "s" : "", |
2376c67a | 99 | target->cpu_list); |
8c3e10eb | 100 | else { |
2376c67a | 101 | if (target->tid) |
b9a46bba | 102 | ret += SNPRINTF(bf + ret, size - ret, ")"); |
8c3e10eb | 103 | else |
b9a46bba | 104 | ret += SNPRINTF(bf + ret, size - ret, ", %d CPU%s)", |
8c3e10eb ACM |
105 | top->evlist->cpus->nr, |
106 | top->evlist->cpus->nr > 1 ? "s" : ""); | |
107 | } | |
108 | ||
109 | return ret; | |
110 | } | |
111 | ||
112 | void perf_top__reset_sample_counters(struct perf_top *top) | |
113 | { | |
114 | top->samples = top->us_samples = top->kernel_samples = | |
115 | top->exact_samples = top->guest_kernel_samples = | |
116 | top->guest_us_samples = 0; | |
117 | } |