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 18 #define SNPRINTF(buf, size, fmt, args...) \ 19 ({ \ 20 size_t r = snprintf(buf, size, fmt, ## args); \ 21 r > size ? size : r; \ 22 }) 23 24 size_t perf_top__header_snprintf(struct perf_top *top, char *bf, size_t size) 25 { 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) { 32 ret = SNPRINTF(bf, size, 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 43 ret = SNPRINTF(bf, size, 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 60 if (top->evlist->nr_entries == 1) { 61 struct perf_evsel *first; 62 first = list_entry(top->evlist->entries.next, struct perf_evsel, node); 63 ret += SNPRINTF(bf + ret, size - ret, "%" PRIu64 "%s ", 64 (uint64_t)first->attr.sample_period, 65 top->freq ? "Hz" : ""); 66 } 67 68 ret += SNPRINTF(bf + ret, size - ret, "%s", perf_evsel__name(top->sym_evsel)); 69 70 ret += SNPRINTF(bf + ret, size - ret, "], "); 71 72 if (top->target.pid) 73 ret += SNPRINTF(bf + ret, size - ret, " (target_pid: %s", 74 top->target.pid); 75 else if (top->target.tid) 76 ret += SNPRINTF(bf + ret, size - ret, " (target_tid: %s", 77 top->target.tid); 78 else if (top->target.uid_str != NULL) 79 ret += SNPRINTF(bf + ret, size - ret, " (uid: %s", 80 top->target.uid_str); 81 else 82 ret += SNPRINTF(bf + ret, size - ret, " (all"); 83 84 if (top->target.cpu_list) 85 ret += SNPRINTF(bf + ret, size - ret, ", CPU%s: %s)", 86 top->evlist->cpus->nr > 1 ? "s" : "", 87 top->target.cpu_list); 88 else { 89 if (top->target.tid) 90 ret += SNPRINTF(bf + ret, size - ret, ")"); 91 else 92 ret += SNPRINTF(bf + ret, size - ret, ", %d CPU%s)", 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 } 106