Commit | Line | Data |
---|---|---|
91007045 | 1 | // SPDX-License-Identifier: GPL-2.0-only |
8c3e10eb ACM |
2 | /* |
3 | * Copyright (C) 2011, Red Hat Inc, Arnaldo Carvalho de Melo <acme@redhat.com> | |
4 | * | |
5 | * Refactored from builtin-top.c, see that files for further copyright notes. | |
8c3e10eb ACM |
6 | */ |
7 | ||
8c3e10eb ACM |
8 | #include "event.h" |
9 | #include "evlist.h" | |
10 | #include "evsel.h" | |
11 | #include "parse-events.h" | |
12 | #include "symbol.h" | |
13 | #include "top.h" | |
ea0c5239 | 14 | #include "util.h" |
8c3e10eb ACM |
15 | #include <inttypes.h> |
16 | ||
b9a46bba JO |
17 | #define SNPRINTF(buf, size, fmt, args...) \ |
18 | ({ \ | |
19 | size_t r = snprintf(buf, size, fmt, ## args); \ | |
20 | r > size ? size : r; \ | |
21 | }) | |
22 | ||
8c3e10eb ACM |
23 | size_t perf_top__header_snprintf(struct perf_top *top, char *bf, size_t size) |
24 | { | |
6f29097f NK |
25 | float samples_per_sec; |
26 | float ksamples_per_sec; | |
27 | float esamples_percent; | |
b4006796 | 28 | struct record_opts *opts = &top->record_opts; |
602ad878 | 29 | struct target *target = &opts->target; |
8c3e10eb | 30 | size_t ret = 0; |
3e0594f9 | 31 | int nr_cpus; |
8c3e10eb | 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 | 48 | " PerfTop:%8.0f irqs/sec kernel:%4.1f%%" |
97f7e0b3 JO |
49 | " exact: %4.1f%% lost: %" PRIu64 "/%" PRIu64 " drop: %" PRIu64 "/%" PRIu64 " [", |
50 | samples_per_sec, ksamples_percent, esamples_percent, | |
51 | top->lost, top->lost_total, top->drop, top->drop_total); | |
8c3e10eb ACM |
52 | } else { |
53 | float us_samples_per_sec = top->us_samples / top->delay_secs; | |
54 | float guest_kernel_samples_per_sec = top->guest_kernel_samples / top->delay_secs; | |
55 | float guest_us_samples_per_sec = top->guest_us_samples / top->delay_secs; | |
56 | ||
b9a46bba | 57 | ret = SNPRINTF(bf, size, |
8c3e10eb ACM |
58 | " PerfTop:%8.0f irqs/sec kernel:%4.1f%% us:%4.1f%%" |
59 | " guest kernel:%4.1f%% guest us:%4.1f%%" | |
60 | " exact: %4.1f%% [", samples_per_sec, | |
61 | 100.0 - (100.0 * ((samples_per_sec - ksamples_per_sec) / | |
62 | samples_per_sec)), | |
63 | 100.0 - (100.0 * ((samples_per_sec - us_samples_per_sec) / | |
64 | samples_per_sec)), | |
65 | 100.0 - (100.0 * ((samples_per_sec - | |
66 | guest_kernel_samples_per_sec) / | |
67 | samples_per_sec)), | |
68 | 100.0 - (100.0 * ((samples_per_sec - | |
69 | guest_us_samples_per_sec) / | |
70 | samples_per_sec)), | |
71 | esamples_percent); | |
72 | } | |
73 | ||
6484d2f9 | 74 | if (top->evlist->core.nr_entries == 1) { |
515dbe48 | 75 | struct evsel *first = evlist__first(top->evlist); |
b9a46bba | 76 | ret += SNPRINTF(bf + ret, size - ret, "%" PRIu64 "%s ", |
1fc632ce | 77 | (uint64_t)first->core.attr.sample_period, |
2376c67a | 78 | opts->freq ? "Hz" : ""); |
8c3e10eb ACM |
79 | } |
80 | ||
8ab2e96d | 81 | ret += SNPRINTF(bf + ret, size - ret, "%s", evsel__name(top->sym_evsel)); |
8c3e10eb | 82 | |
b9a46bba | 83 | ret += SNPRINTF(bf + ret, size - ret, "], "); |
8c3e10eb | 84 | |
2376c67a | 85 | if (target->pid) |
b52956c9 | 86 | ret += SNPRINTF(bf + ret, size - ret, " (target_pid: %s", |
2376c67a ACM |
87 | target->pid); |
88 | else if (target->tid) | |
b52956c9 | 89 | ret += SNPRINTF(bf + ret, size - ret, " (target_tid: %s", |
2376c67a ACM |
90 | target->tid); |
91 | else if (target->uid_str != NULL) | |
0d37aa34 | 92 | ret += SNPRINTF(bf + ret, size - ret, " (uid: %s", |
2376c67a | 93 | target->uid_str); |
8c3e10eb | 94 | else |
b9a46bba | 95 | ret += SNPRINTF(bf + ret, size - ret, " (all"); |
8c3e10eb | 96 | |
3e0594f9 | 97 | nr_cpus = perf_cpu_map__nr(top->evlist->core.user_requested_cpus); |
2376c67a | 98 | if (target->cpu_list) |
b9a46bba | 99 | ret += SNPRINTF(bf + ret, size - ret, ", CPU%s: %s)", |
3e0594f9 | 100 | nr_cpus > 1 ? "s" : "", |
2376c67a | 101 | target->cpu_list); |
8c3e10eb | 102 | else { |
2376c67a | 103 | if (target->tid) |
b9a46bba | 104 | ret += SNPRINTF(bf + ret, size - ret, ")"); |
8c3e10eb | 105 | else |
b9a46bba | 106 | ret += SNPRINTF(bf + ret, size - ret, ", %d CPU%s)", |
3e0594f9 | 107 | nr_cpus, nr_cpus > 1 ? "s" : ""); |
8c3e10eb ACM |
108 | } |
109 | ||
8aa5c8ed | 110 | perf_top__reset_sample_counters(top); |
8c3e10eb ACM |
111 | return ret; |
112 | } | |
113 | ||
114 | void perf_top__reset_sample_counters(struct perf_top *top) | |
115 | { | |
116 | top->samples = top->us_samples = top->kernel_samples = | |
117 | top->exact_samples = top->guest_kernel_samples = | |
97f7e0b3 | 118 | top->guest_us_samples = top->lost = top->drop = 0; |
8c3e10eb | 119 | } |