1e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng/* 2e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * Copyright (C) 2011, Red Hat Inc, Arnaldo Carvalho de Melo <acme@redhat.com> 3e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * 4e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * Refactored from builtin-top.c, see that files for further copyright notes. 5e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * 6e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * Released under the GPL v2. (and only v2, not any later version) 7e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng */ 8e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 9e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include "cpumap.h" 10e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include "event.h" 11e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include "evlist.h" 12e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include "evsel.h" 13e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include "parse-events.h" 14e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include "symbol.h" 15e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include "top.h" 16e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#include <inttypes.h> 17e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 18e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng/* 19e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * Ordering weight: count-1 * count-2 * ... / count-n 20e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng */ 21e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstatic double sym_weight(const struct sym_entry *sym, struct perf_top *top) 22e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng{ 23e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng double weight = sym->snap_count; 24e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng int counter; 25e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 26e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng if (!top->display_weighted) 27e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng return weight; 28e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 29e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng for (counter = 1; counter < top->evlist->nr_entries - 1; counter++) 30e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng weight *= sym->count[counter]; 31e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 32e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng weight /= (sym->count[counter] + 1); 33e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 34e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng return weight; 35e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng} 36e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 37e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstatic void perf_top__remove_active_sym(struct perf_top *top, struct sym_entry *syme) 38e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng{ 39e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng pthread_mutex_lock(&top->active_symbols_lock); 40e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng list_del_init(&syme->node); 41e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng pthread_mutex_unlock(&top->active_symbols_lock); 42e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng} 43e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 44e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengstatic void rb_insert_active_sym(struct rb_root *tree, struct sym_entry *se) 45e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng{ 46e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng struct rb_node **p = &tree->rb_node; 47e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng struct rb_node *parent = NULL; 48e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng struct sym_entry *iter; 49e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 50e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng while (*p != NULL) { 51e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng parent = *p; 52e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng iter = rb_entry(parent, struct sym_entry, rb_node); 53e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 54e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng if (se->weight > iter->weight) 55e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng p = &(*p)->rb_left; 56e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng else 57e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng p = &(*p)->rb_right; 58e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng } 59e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 60e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng rb_link_node(&se->rb_node, parent, p); 61e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng rb_insert_color(&se->rb_node, tree); 62e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng} 63e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 64e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng#define SNPRINTF(buf, size, fmt, args...) \ 65e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng({ \ 66e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng size_t r = snprintf(buf, size, fmt, ## args); \ 67e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng r > size ? size : r; \ 68e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng}) 69e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 70e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengsize_t perf_top__header_snprintf(struct perf_top *top, char *bf, size_t size) 71e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng{ 72e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng struct perf_evsel *counter; 73e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng float samples_per_sec = top->samples / top->delay_secs; 74e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng float ksamples_per_sec = top->kernel_samples / top->delay_secs; 75e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng float esamples_percent = (100.0 * top->exact_samples) / top->samples; 76e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng size_t ret = 0; 77e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 78e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng if (!perf_guest) { 79e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng ret = SNPRINTF(bf, size, 80e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng " PerfTop:%8.0f irqs/sec kernel:%4.1f%%" 81e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng " exact: %4.1f%% [", samples_per_sec, 82e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 100.0 - (100.0 * ((samples_per_sec - ksamples_per_sec) / 83e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng samples_per_sec)), 84e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng esamples_percent); 85e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng } else { 86e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng float us_samples_per_sec = top->us_samples / top->delay_secs; 87e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng float guest_kernel_samples_per_sec = top->guest_kernel_samples / top->delay_secs; 88e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng float guest_us_samples_per_sec = top->guest_us_samples / top->delay_secs; 89e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 90e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng ret = SNPRINTF(bf, size, 91e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng " PerfTop:%8.0f irqs/sec kernel:%4.1f%% us:%4.1f%%" 92e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng " guest kernel:%4.1f%% guest us:%4.1f%%" 93e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng " exact: %4.1f%% [", samples_per_sec, 94e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 100.0 - (100.0 * ((samples_per_sec - ksamples_per_sec) / 95e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng samples_per_sec)), 96e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 100.0 - (100.0 * ((samples_per_sec - us_samples_per_sec) / 97e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng samples_per_sec)), 98e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 100.0 - (100.0 * ((samples_per_sec - 99e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng guest_kernel_samples_per_sec) / 100e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng samples_per_sec)), 101e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 100.0 - (100.0 * ((samples_per_sec - 102e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng guest_us_samples_per_sec) / 103e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng samples_per_sec)), 104e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng esamples_percent); 105e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng } 106e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 107e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng if (top->evlist->nr_entries == 1 || !top->display_weighted) { 108e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng struct perf_evsel *first; 109e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng first = list_entry(top->evlist->entries.next, struct perf_evsel, node); 110e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng ret += SNPRINTF(bf + ret, size - ret, "%" PRIu64 "%s ", 111e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng (uint64_t)first->attr.sample_period, 112e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng top->freq ? "Hz" : ""); 113e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng } 114e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 115e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng if (!top->display_weighted) { 116e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng ret += SNPRINTF(bf + ret, size - ret, "%s", 117e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng event_name(top->sym_evsel)); 118e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng } else { 119e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng /* 120e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * Don't let events eat all the space. Leaving 30 bytes 121e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * for the rest should be enough. 122e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng */ 123e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng size_t last_pos = size - 30; 124e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 125e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng list_for_each_entry(counter, &top->evlist->entries, node) { 126e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng ret += SNPRINTF(bf + ret, size - ret, "%s%s", 127e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng counter->idx ? "/" : "", 128e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng event_name(counter)); 129e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng if (ret > last_pos) { 130e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng sprintf(bf + last_pos - 3, ".."); 131e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng ret = last_pos - 1; 132e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng break; 133e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng } 134e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng } 135e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng } 136e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 137e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng ret += SNPRINTF(bf + ret, size - ret, "], "); 138e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 139e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng if (top->target_pid != -1) 140e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng ret += SNPRINTF(bf + ret, size - ret, " (target_pid: %d", 141e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng top->target_pid); 142e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng else if (top->target_tid != -1) 143e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng ret += SNPRINTF(bf + ret, size - ret, " (target_tid: %d", 144e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng top->target_tid); 145e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng else 146e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng ret += SNPRINTF(bf + ret, size - ret, " (all"); 147e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 148e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng if (top->cpu_list) 149e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng ret += SNPRINTF(bf + ret, size - ret, ", CPU%s: %s)", 150e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng top->evlist->cpus->nr > 1 ? "s" : "", top->cpu_list); 151e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng else { 152e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng if (top->target_tid != -1) 153e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng ret += SNPRINTF(bf + ret, size - ret, ")"); 154e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng else 155e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng ret += SNPRINTF(bf + ret, size - ret, ", %d CPU%s)", 156e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng top->evlist->cpus->nr, 157e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng top->evlist->cpus->nr > 1 ? "s" : ""); 158e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng } 159e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 160e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng return ret; 161e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng} 162e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 163e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengvoid perf_top__reset_sample_counters(struct perf_top *top) 164e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng{ 165e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng top->samples = top->us_samples = top->kernel_samples = 166e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng top->exact_samples = top->guest_kernel_samples = 167e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng top->guest_us_samples = 0; 168e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng} 169e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 170e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengfloat perf_top__decay_samples(struct perf_top *top, struct rb_root *root) 171e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng{ 172e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng struct sym_entry *syme, *n; 173e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng float sum_ksamples = 0.0; 174e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng int snap = !top->display_weighted ? top->sym_evsel->idx : 0, j; 175e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 176e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng /* Sort the active symbols */ 177e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng pthread_mutex_lock(&top->active_symbols_lock); 178e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng syme = list_entry(top->active_symbols.next, struct sym_entry, node); 179e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng pthread_mutex_unlock(&top->active_symbols_lock); 180e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 181e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng top->rb_entries = 0; 182e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng list_for_each_entry_safe_from(syme, n, &top->active_symbols, node) { 183e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng syme->snap_count = syme->count[snap]; 184e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng if (syme->snap_count != 0) { 185e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 186e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng if ((top->hide_user_symbols && 187e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng syme->map->dso->kernel == DSO_TYPE_USER) || 188e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng (top->hide_kernel_symbols && 189e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng syme->map->dso->kernel == DSO_TYPE_KERNEL)) { 190e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng perf_top__remove_active_sym(top, syme); 191e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng continue; 192e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng } 193e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng syme->weight = sym_weight(syme, top); 194e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 195e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng if ((int)syme->snap_count >= top->count_filter) { 196e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng rb_insert_active_sym(root, syme); 197e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng ++top->rb_entries; 198e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng } 199e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng sum_ksamples += syme->snap_count; 200e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 201e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng for (j = 0; j < top->evlist->nr_entries; j++) 202e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng syme->count[j] = top->zero ? 0 : syme->count[j] * 7 / 8; 203e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng } else 204e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng perf_top__remove_active_sym(top, syme); 205e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng } 206e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 207e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng return sum_ksamples; 208e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng} 209e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 210e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng/* 211e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng * Find the longest symbol name that will be displayed 212e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng */ 213e6817ec1d8ab31fc7b01906e305f848542df6413Ben Chengvoid perf_top__find_widths(struct perf_top *top, struct rb_root *root, 214e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng int *dso_width, int *dso_short_width, int *sym_width) 215e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng{ 216e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng struct rb_node *nd; 217e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng int printed = 0; 218e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 219e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng *sym_width = *dso_width = *dso_short_width = 0; 220e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 221e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng for (nd = rb_first(root); nd; nd = rb_next(nd)) { 222e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng struct sym_entry *syme = rb_entry(nd, struct sym_entry, rb_node); 223e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng struct symbol *sym = sym_entry__symbol(syme); 224e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 225e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng if (++printed > top->print_entries || 226e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng (int)syme->snap_count < top->count_filter) 227e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng continue; 228e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 229e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng if (syme->map->dso->long_name_len > *dso_width) 230e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng *dso_width = syme->map->dso->long_name_len; 231e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 232e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng if (syme->map->dso->short_name_len > *dso_short_width) 233e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng *dso_short_width = syme->map->dso->short_name_len; 234e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng 235e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng if (sym->namelen > *sym_width) 236e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng *sym_width = sym->namelen; 237e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng } 238e6817ec1d8ab31fc7b01906e305f848542df6413Ben Cheng} 239