1 #include "util.h" 2 #include "build-id.h" 3 #include "hist.h" 4 #include "session.h" 5 #include "sort.h" 6 #include "evsel.h" 7 #include "annotate.h" 8 #include <math.h> 9 10 static bool hists__filter_entry_by_dso(struct hists *hists, 11 struct hist_entry *he); 12 static bool hists__filter_entry_by_thread(struct hists *hists, 13 struct hist_entry *he); 14 static bool hists__filter_entry_by_symbol(struct hists *hists, 15 struct hist_entry *he); 16 17 struct callchain_param callchain_param = { 18 .mode = CHAIN_GRAPH_REL, 19 .min_percent = 0.5, 20 .order = ORDER_CALLEE, 21 .key = CCKEY_FUNCTION 22 }; 23 24 u16 hists__col_len(struct hists *hists, enum hist_column col) 25 { 26 return hists->col_len[col]; 27 } 28 29 void hists__set_col_len(struct hists *hists, enum hist_column col, u16 len) 30 { 31 hists->col_len[col] = len; 32 } 33 34 bool hists__new_col_len(struct hists *hists, enum hist_column col, u16 len) 35 { 36 if (len > hists__col_len(hists, col)) { 37 hists__set_col_len(hists, col, len); 38 return true; 39 } 40 return false; 41 } 42 43 void hists__reset_col_len(struct hists *hists) 44 { 45 enum hist_column col; 46 47 for (col = 0; col < HISTC_NR_COLS; ++col) 48 hists__set_col_len(hists, col, 0); 49 } 50 51 static void hists__set_unres_dso_col_len(struct hists *hists, int dso) 52 { 53 const unsigned int unresolved_col_width = BITS_PER_LONG / 4; 54 55 if (hists__col_len(hists, dso) < unresolved_col_width && 56 !symbol_conf.col_width_list_str && !symbol_conf.field_sep && 57 !symbol_conf.dso_list) 58 hists__set_col_len(hists, dso, unresolved_col_width); 59 } 60 61 void hists__calc_col_len(struct hists *hists, struct hist_entry *h) 62 { 63 const unsigned int unresolved_col_width = BITS_PER_LONG / 4; 64 int symlen; 65 u16 len; 66 67 /* 68 * +4 accounts for '[x] ' priv level info 69 * +2 accounts for 0x prefix on raw addresses 70 * +3 accounts for ' y ' symtab origin info 71 */ 72 if (h->ms.sym) { 73 symlen = h->ms.sym->namelen + 4; 74 if (verbose) 75 symlen += BITS_PER_LONG / 4 + 2 + 3; 76 hists__new_col_len(hists, HISTC_SYMBOL, symlen); 77 } else { 78 symlen = unresolved_col_width + 4 + 2; 79 hists__new_col_len(hists, HISTC_SYMBOL, symlen); 80 hists__set_unres_dso_col_len(hists, HISTC_DSO); 81 } 82 83 len = thread__comm_len(h->thread); 84 if (hists__new_col_len(hists, HISTC_COMM, len)) 85 hists__set_col_len(hists, HISTC_THREAD, len + 6); 86 87 if (h->ms.map) { 88 len = dso__name_len(h->ms.map->dso); 89 hists__new_col_len(hists, HISTC_DSO, len); 90 } 91 92 if (h->parent) 93 hists__new_col_len(hists, HISTC_PARENT, h->parent->namelen); 94 95 if (h->branch_info) { 96 if (h->branch_info->from.sym) { 97 symlen = (int)h->branch_info->from.sym->namelen + 4; 98 if (verbose) 99 symlen += BITS_PER_LONG / 4 + 2 + 3; 100 hists__new_col_len(hists, HISTC_SYMBOL_FROM, symlen); 101 102 symlen = dso__name_len(h->branch_info->from.map->dso); 103 hists__new_col_len(hists, HISTC_DSO_FROM, symlen); 104 } else { 105 symlen = unresolved_col_width + 4 + 2; 106 hists__new_col_len(hists, HISTC_SYMBOL_FROM, symlen); 107 hists__set_unres_dso_col_len(hists, HISTC_DSO_FROM); 108 } 109 110 if (h->branch_info->to.sym) { 111 symlen = (int)h->branch_info->to.sym->namelen + 4; 112 if (verbose) 113 symlen += BITS_PER_LONG / 4 + 2 + 3; 114 hists__new_col_len(hists, HISTC_SYMBOL_TO, symlen); 115 116 symlen = dso__name_len(h->branch_info->to.map->dso); 117 hists__new_col_len(hists, HISTC_DSO_TO, symlen); 118 } else { 119 symlen = unresolved_col_width + 4 + 2; 120 hists__new_col_len(hists, HISTC_SYMBOL_TO, symlen); 121 hists__set_unres_dso_col_len(hists, HISTC_DSO_TO); 122 } 123 } 124 125 if (h->mem_info) { 126 if (h->mem_info->daddr.sym) { 127 symlen = (int)h->mem_info->daddr.sym->namelen + 4 128 + unresolved_col_width + 2; 129 hists__new_col_len(hists, HISTC_MEM_DADDR_SYMBOL, 130 symlen); 131 hists__new_col_len(hists, HISTC_MEM_DCACHELINE, 132 symlen + 1); 133 } else { 134 symlen = unresolved_col_width + 4 + 2; 135 hists__new_col_len(hists, HISTC_MEM_DADDR_SYMBOL, 136 symlen); 137 } 138 if (h->mem_info->daddr.map) { 139 symlen = dso__name_len(h->mem_info->daddr.map->dso); 140 hists__new_col_len(hists, HISTC_MEM_DADDR_DSO, 141 symlen); 142 } else { 143 symlen = unresolved_col_width + 4 + 2; 144 hists__set_unres_dso_col_len(hists, HISTC_MEM_DADDR_DSO); 145 } 146 } else { 147 symlen = unresolved_col_width + 4 + 2; 148 hists__new_col_len(hists, HISTC_MEM_DADDR_SYMBOL, symlen); 149 hists__set_unres_dso_col_len(hists, HISTC_MEM_DADDR_DSO); 150 } 151 152 hists__new_col_len(hists, HISTC_MEM_LOCKED, 6); 153 hists__new_col_len(hists, HISTC_MEM_TLB, 22); 154 hists__new_col_len(hists, HISTC_MEM_SNOOP, 12); 155 hists__new_col_len(hists, HISTC_MEM_LVL, 21 + 3); 156 hists__new_col_len(hists, HISTC_LOCAL_WEIGHT, 12); 157 hists__new_col_len(hists, HISTC_GLOBAL_WEIGHT, 12); 158 159 if (h->transaction) 160 hists__new_col_len(hists, HISTC_TRANSACTION, 161 hist_entry__transaction_len()); 162 } 163 164 void hists__output_recalc_col_len(struct hists *hists, int max_rows) 165 { 166 struct rb_node *next = rb_first(&hists->entries); 167 struct hist_entry *n; 168 int row = 0; 169 170 hists__reset_col_len(hists); 171 172 while (next && row++ < max_rows) { 173 n = rb_entry(next, struct hist_entry, rb_node); 174 if (!n->filtered) 175 hists__calc_col_len(hists, n); 176 next = rb_next(&n->rb_node); 177 } 178 } 179 180 static void he_stat__add_cpumode_period(struct he_stat *he_stat, 181 unsigned int cpumode, u64 period) 182 { 183 switch (cpumode) { 184 case PERF_RECORD_MISC_KERNEL: 185 he_stat->period_sys += period; 186 break; 187 case PERF_RECORD_MISC_USER: 188 he_stat->period_us += period; 189 break; 190 case PERF_RECORD_MISC_GUEST_KERNEL: 191 he_stat->period_guest_sys += period; 192 break; 193 case PERF_RECORD_MISC_GUEST_USER: 194 he_stat->period_guest_us += period; 195 break; 196 default: 197 break; 198 } 199 } 200 201 static void he_stat__add_period(struct he_stat *he_stat, u64 period, 202 u64 weight) 203 { 204 205 he_stat->period += period; 206 he_stat->weight += weight; 207 he_stat->nr_events += 1; 208 } 209 210 static void he_stat__add_stat(struct he_stat *dest, struct he_stat *src) 211 { 212 dest->period += src->period; 213 dest->period_sys += src->period_sys; 214 dest->period_us += src->period_us; 215 dest->period_guest_sys += src->period_guest_sys; 216 dest->period_guest_us += src->period_guest_us; 217 dest->nr_events += src->nr_events; 218 dest->weight += src->weight; 219 } 220 221 static void he_stat__decay(struct he_stat *he_stat) 222 { 223 he_stat->period = (he_stat->period * 7) / 8; 224 he_stat->nr_events = (he_stat->nr_events * 7) / 8; 225 /* XXX need decay for weight too? */ 226 } 227 228 static bool hists__decay_entry(struct hists *hists, struct hist_entry *he) 229 { 230 u64 prev_period = he->stat.period; 231 u64 diff; 232 233 if (prev_period == 0) 234 return true; 235 236 he_stat__decay(&he->stat); 237 if (symbol_conf.cumulate_callchain) 238 he_stat__decay(he->stat_acc); 239 240 diff = prev_period - he->stat.period; 241 242 hists->stats.total_period -= diff; 243 if (!he->filtered) 244 hists->stats.total_non_filtered_period -= diff; 245 246 return he->stat.period == 0; 247 } 248 249 void hists__decay_entries(struct hists *hists, bool zap_user, bool zap_kernel) 250 { 251 struct rb_node *next = rb_first(&hists->entries); 252 struct hist_entry *n; 253 254 while (next) { 255 n = rb_entry(next, struct hist_entry, rb_node); 256 next = rb_next(&n->rb_node); 257 /* 258 * We may be annotating this, for instance, so keep it here in 259 * case some it gets new samples, we'll eventually free it when 260 * the user stops browsing and it agains gets fully decayed. 261 */ 262 if (((zap_user && n->level == '.') || 263 (zap_kernel && n->level != '.') || 264 hists__decay_entry(hists, n)) && 265 !n->used) { 266 rb_erase(&n->rb_node, &hists->entries); 267 268 if (sort__need_collapse) 269 rb_erase(&n->rb_node_in, &hists->entries_collapsed); 270 271 --hists->nr_entries; 272 if (!n->filtered) 273 --hists->nr_non_filtered_entries; 274 275 hist_entry__free(n); 276 } 277 } 278 } 279 280 /* 281 * histogram, sorted on item, collects periods 282 */ 283 284 static struct hist_entry *hist_entry__new(struct hist_entry *template, 285 bool sample_self) 286 { 287 size_t callchain_size = 0; 288 struct hist_entry *he; 289 290 if (symbol_conf.use_callchain || symbol_conf.cumulate_callchain) 291 callchain_size = sizeof(struct callchain_root); 292 293 he = zalloc(sizeof(*he) + callchain_size); 294 295 if (he != NULL) { 296 *he = *template; 297 298 if (symbol_conf.cumulate_callchain) { 299 he->stat_acc = malloc(sizeof(he->stat)); 300 if (he->stat_acc == NULL) { 301 free(he); 302 return NULL; 303 } 304 memcpy(he->stat_acc, &he->stat, sizeof(he->stat)); 305 if (!sample_self) 306 memset(&he->stat, 0, sizeof(he->stat)); 307 } 308 309 if (he->ms.map) 310 he->ms.map->referenced = true; 311 312 if (he->branch_info) { 313 /* 314 * This branch info is (a part of) allocated from 315 * sample__resolve_bstack() and will be freed after 316 * adding new entries. So we need to save a copy. 317 */ 318 he->branch_info = malloc(sizeof(*he->branch_info)); 319 if (he->branch_info == NULL) { 320 free(he->stat_acc); 321 free(he); 322 return NULL; 323 } 324 325 memcpy(he->branch_info, template->branch_info, 326 sizeof(*he->branch_info)); 327 328 if (he->branch_info->from.map) 329 he->branch_info->from.map->referenced = true; 330 if (he->branch_info->to.map) 331 he->branch_info->to.map->referenced = true; 332 } 333 334 if (he->mem_info) { 335 if (he->mem_info->iaddr.map) 336 he->mem_info->iaddr.map->referenced = true; 337 if (he->mem_info->daddr.map) 338 he->mem_info->daddr.map->referenced = true; 339 } 340 341 if (symbol_conf.use_callchain) 342 callchain_init(he->callchain); 343 344 INIT_LIST_HEAD(&he->pairs.node); 345 } 346 347 return he; 348 } 349 350 static u8 symbol__parent_filter(const struct symbol *parent) 351 { 352 if (symbol_conf.exclude_other && parent == NULL) 353 return 1 << HIST_FILTER__PARENT; 354 return 0; 355 } 356 357 static struct hist_entry *add_hist_entry(struct hists *hists, 358 struct hist_entry *entry, 359 struct addr_location *al, 360 bool sample_self) 361 { 362 struct rb_node **p; 363 struct rb_node *parent = NULL; 364 struct hist_entry *he; 365 int64_t cmp; 366 u64 period = entry->stat.period; 367 u64 weight = entry->stat.weight; 368 369 p = &hists->entries_in->rb_node; 370 371 while (*p != NULL) { 372 parent = *p; 373 he = rb_entry(parent, struct hist_entry, rb_node_in); 374 375 /* 376 * Make sure that it receives arguments in a same order as 377 * hist_entry__collapse() so that we can use an appropriate 378 * function when searching an entry regardless which sort 379 * keys were used. 380 */ 381 cmp = hist_entry__cmp(he, entry); 382 383 if (!cmp) { 384 if (sample_self) 385 he_stat__add_period(&he->stat, period, weight); 386 if (symbol_conf.cumulate_callchain) 387 he_stat__add_period(he->stat_acc, period, weight); 388 389 /* 390 * This mem info was allocated from sample__resolve_mem 391 * and will not be used anymore. 392 */ 393 zfree(&entry->mem_info); 394 395 /* If the map of an existing hist_entry has 396 * become out-of-date due to an exec() or 397 * similar, update it. Otherwise we will 398 * mis-adjust symbol addresses when computing 399 * the history counter to increment. 400 */ 401 if (he->ms.map != entry->ms.map) { 402 he->ms.map = entry->ms.map; 403 if (he->ms.map) 404 he->ms.map->referenced = true; 405 } 406 goto out; 407 } 408 409 if (cmp < 0) 410 p = &(*p)->rb_left; 411 else 412 p = &(*p)->rb_right; 413 } 414 415 he = hist_entry__new(entry, sample_self); 416 if (!he) 417 return NULL; 418 419 rb_link_node(&he->rb_node_in, parent, p); 420 rb_insert_color(&he->rb_node_in, hists->entries_in); 421 out: 422 if (sample_self) 423 he_stat__add_cpumode_period(&he->stat, al->cpumode, period); 424 if (symbol_conf.cumulate_callchain) 425 he_stat__add_cpumode_period(he->stat_acc, al->cpumode, period); 426 return he; 427 } 428 429 struct hist_entry *__hists__add_entry(struct hists *hists, 430 struct addr_location *al, 431 struct symbol *sym_parent, 432 struct branch_info *bi, 433 struct mem_info *mi, 434 u64 period, u64 weight, u64 transaction, 435 bool sample_self) 436 { 437 struct hist_entry entry = { 438 .thread = al->thread, 439 .comm = thread__comm(al->thread), 440 .ms = { 441 .map = al->map, 442 .sym = al->sym, 443 }, 444 .cpu = al->cpu, 445 .cpumode = al->cpumode, 446 .ip = al->addr, 447 .level = al->level, 448 .stat = { 449 .nr_events = 1, 450 .period = period, 451 .weight = weight, 452 }, 453 .parent = sym_parent, 454 .filtered = symbol__parent_filter(sym_parent) | al->filtered, 455 .hists = hists, 456 .branch_info = bi, 457 .mem_info = mi, 458 .transaction = transaction, 459 }; 460 461 return add_hist_entry(hists, &entry, al, sample_self); 462 } 463 464 static int 465 iter_next_nop_entry(struct hist_entry_iter *iter __maybe_unused, 466 struct addr_location *al __maybe_unused) 467 { 468 return 0; 469 } 470 471 static int 472 iter_add_next_nop_entry(struct hist_entry_iter *iter __maybe_unused, 473 struct addr_location *al __maybe_unused) 474 { 475 return 0; 476 } 477 478 static int 479 iter_prepare_mem_entry(struct hist_entry_iter *iter, struct addr_location *al) 480 { 481 struct perf_sample *sample = iter->sample; 482 struct mem_info *mi; 483 484 mi = sample__resolve_mem(sample, al); 485 if (mi == NULL) 486 return -ENOMEM; 487 488 iter->priv = mi; 489 return 0; 490 } 491 492 static int 493 iter_add_single_mem_entry(struct hist_entry_iter *iter, struct addr_location *al) 494 { 495 u64 cost; 496 struct mem_info *mi = iter->priv; 497 struct hist_entry *he; 498 499 if (mi == NULL) 500 return -EINVAL; 501 502 cost = iter->sample->weight; 503 if (!cost) 504 cost = 1; 505 506 /* 507 * must pass period=weight in order to get the correct 508 * sorting from hists__collapse_resort() which is solely 509 * based on periods. We want sorting be done on nr_events * weight 510 * and this is indirectly achieved by passing period=weight here 511 * and the he_stat__add_period() function. 512 */ 513 he = __hists__add_entry(&iter->evsel->hists, al, iter->parent, NULL, mi, 514 cost, cost, 0, true); 515 if (!he) 516 return -ENOMEM; 517 518 iter->he = he; 519 return 0; 520 } 521 522 static int 523 iter_finish_mem_entry(struct hist_entry_iter *iter, 524 struct addr_location *al __maybe_unused) 525 { 526 struct perf_evsel *evsel = iter->evsel; 527 struct hist_entry *he = iter->he; 528 int err = -EINVAL; 529 530 if (he == NULL) 531 goto out; 532 533 hists__inc_nr_samples(&evsel->hists, he->filtered); 534 535 err = hist_entry__append_callchain(he, iter->sample); 536 537 out: 538 /* 539 * We don't need to free iter->priv (mem_info) here since 540 * the mem info was either already freed in add_hist_entry() or 541 * passed to a new hist entry by hist_entry__new(). 542 */ 543 iter->priv = NULL; 544 545 iter->he = NULL; 546 return err; 547 } 548 549 static int 550 iter_prepare_branch_entry(struct hist_entry_iter *iter, struct addr_location *al) 551 { 552 struct branch_info *bi; 553 struct perf_sample *sample = iter->sample; 554 555 bi = sample__resolve_bstack(sample, al); 556 if (!bi) 557 return -ENOMEM; 558 559 iter->curr = 0; 560 iter->total = sample->branch_stack->nr; 561 562 iter->priv = bi; 563 return 0; 564 } 565 566 static int 567 iter_add_single_branch_entry(struct hist_entry_iter *iter __maybe_unused, 568 struct addr_location *al __maybe_unused) 569 { 570 /* to avoid calling callback function */ 571 iter->he = NULL; 572 573 return 0; 574 } 575 576 static int 577 iter_next_branch_entry(struct hist_entry_iter *iter, struct addr_location *al) 578 { 579 struct branch_info *bi = iter->priv; 580 int i = iter->curr; 581 582 if (bi == NULL) 583 return 0; 584 585 if (iter->curr >= iter->total) 586 return 0; 587 588 al->map = bi[i].to.map; 589 al->sym = bi[i].to.sym; 590 al->addr = bi[i].to.addr; 591 return 1; 592 } 593 594 static int 595 iter_add_next_branch_entry(struct hist_entry_iter *iter, struct addr_location *al) 596 { 597 struct branch_info *bi; 598 struct perf_evsel *evsel = iter->evsel; 599 struct hist_entry *he = NULL; 600 int i = iter->curr; 601 int err = 0; 602 603 bi = iter->priv; 604 605 if (iter->hide_unresolved && !(bi[i].from.sym && bi[i].to.sym)) 606 goto out; 607 608 /* 609 * The report shows the percentage of total branches captured 610 * and not events sampled. Thus we use a pseudo period of 1. 611 */ 612 he = __hists__add_entry(&evsel->hists, al, iter->parent, &bi[i], NULL, 613 1, 1, 0, true); 614 if (he == NULL) 615 return -ENOMEM; 616 617 hists__inc_nr_samples(&evsel->hists, he->filtered); 618 619 out: 620 iter->he = he; 621 iter->curr++; 622 return err; 623 } 624 625 static int 626 iter_finish_branch_entry(struct hist_entry_iter *iter, 627 struct addr_location *al __maybe_unused) 628 { 629 zfree(&iter->priv); 630 iter->he = NULL; 631 632 return iter->curr >= iter->total ? 0 : -1; 633 } 634 635 static int 636 iter_prepare_normal_entry(struct hist_entry_iter *iter __maybe_unused, 637 struct addr_location *al __maybe_unused) 638 { 639 return 0; 640 } 641 642 static int 643 iter_add_single_normal_entry(struct hist_entry_iter *iter, struct addr_location *al) 644 { 645 struct perf_evsel *evsel = iter->evsel; 646 struct perf_sample *sample = iter->sample; 647 struct hist_entry *he; 648 649 he = __hists__add_entry(&evsel->hists, al, iter->parent, NULL, NULL, 650 sample->period, sample->weight, 651 sample->transaction, true); 652 if (he == NULL) 653 return -ENOMEM; 654 655 iter->he = he; 656 return 0; 657 } 658 659 static int 660 iter_finish_normal_entry(struct hist_entry_iter *iter, 661 struct addr_location *al __maybe_unused) 662 { 663 struct hist_entry *he = iter->he; 664 struct perf_evsel *evsel = iter->evsel; 665 struct perf_sample *sample = iter->sample; 666 667 if (he == NULL) 668 return 0; 669 670 iter->he = NULL; 671 672 hists__inc_nr_samples(&evsel->hists, he->filtered); 673 674 return hist_entry__append_callchain(he, sample); 675 } 676 677 static int 678 iter_prepare_cumulative_entry(struct hist_entry_iter *iter __maybe_unused, 679 struct addr_location *al __maybe_unused) 680 { 681 struct hist_entry **he_cache; 682 683 callchain_cursor_commit(&callchain_cursor); 684 685 /* 686 * This is for detecting cycles or recursions so that they're 687 * cumulated only one time to prevent entries more than 100% 688 * overhead. 689 */ 690 he_cache = malloc(sizeof(*he_cache) * (PERF_MAX_STACK_DEPTH + 1)); 691 if (he_cache == NULL) 692 return -ENOMEM; 693 694 iter->priv = he_cache; 695 iter->curr = 0; 696 697 return 0; 698 } 699 700 static int 701 iter_add_single_cumulative_entry(struct hist_entry_iter *iter, 702 struct addr_location *al) 703 { 704 struct perf_evsel *evsel = iter->evsel; 705 struct perf_sample *sample = iter->sample; 706 struct hist_entry **he_cache = iter->priv; 707 struct hist_entry *he; 708 int err = 0; 709 710 he = __hists__add_entry(&evsel->hists, al, iter->parent, NULL, NULL, 711 sample->period, sample->weight, 712 sample->transaction, true); 713 if (he == NULL) 714 return -ENOMEM; 715 716 iter->he = he; 717 he_cache[iter->curr++] = he; 718 719 callchain_append(he->callchain, &callchain_cursor, sample->period); 720 721 /* 722 * We need to re-initialize the cursor since callchain_append() 723 * advanced the cursor to the end. 724 */ 725 callchain_cursor_commit(&callchain_cursor); 726 727 hists__inc_nr_samples(&evsel->hists, he->filtered); 728 729 return err; 730 } 731 732 static int 733 iter_next_cumulative_entry(struct hist_entry_iter *iter, 734 struct addr_location *al) 735 { 736 struct callchain_cursor_node *node; 737 738 node = callchain_cursor_current(&callchain_cursor); 739 if (node == NULL) 740 return 0; 741 742 return fill_callchain_info(al, node, iter->hide_unresolved); 743 } 744 745 static int 746 iter_add_next_cumulative_entry(struct hist_entry_iter *iter, 747 struct addr_location *al) 748 { 749 struct perf_evsel *evsel = iter->evsel; 750 struct perf_sample *sample = iter->sample; 751 struct hist_entry **he_cache = iter->priv; 752 struct hist_entry *he; 753 struct hist_entry he_tmp = { 754 .cpu = al->cpu, 755 .thread = al->thread, 756 .comm = thread__comm(al->thread), 757 .ip = al->addr, 758 .ms = { 759 .map = al->map, 760 .sym = al->sym, 761 }, 762 .parent = iter->parent, 763 }; 764 int i; 765 struct callchain_cursor cursor; 766 767 callchain_cursor_snapshot(&cursor, &callchain_cursor); 768 769 callchain_cursor_advance(&callchain_cursor); 770 771 /* 772 * Check if there's duplicate entries in the callchain. 773 * It's possible that it has cycles or recursive calls. 774 */ 775 for (i = 0; i < iter->curr; i++) { 776 if (hist_entry__cmp(he_cache[i], &he_tmp) == 0) { 777 /* to avoid calling callback function */ 778 iter->he = NULL; 779 return 0; 780 } 781 } 782 783 he = __hists__add_entry(&evsel->hists, al, iter->parent, NULL, NULL, 784 sample->period, sample->weight, 785 sample->transaction, false); 786 if (he == NULL) 787 return -ENOMEM; 788 789 iter->he = he; 790 he_cache[iter->curr++] = he; 791 792 callchain_append(he->callchain, &cursor, sample->period); 793 return 0; 794 } 795 796 static int 797 iter_finish_cumulative_entry(struct hist_entry_iter *iter, 798 struct addr_location *al __maybe_unused) 799 { 800 zfree(&iter->priv); 801 iter->he = NULL; 802 803 return 0; 804 } 805 806 const struct hist_iter_ops hist_iter_mem = { 807 .prepare_entry = iter_prepare_mem_entry, 808 .add_single_entry = iter_add_single_mem_entry, 809 .next_entry = iter_next_nop_entry, 810 .add_next_entry = iter_add_next_nop_entry, 811 .finish_entry = iter_finish_mem_entry, 812 }; 813 814 const struct hist_iter_ops hist_iter_branch = { 815 .prepare_entry = iter_prepare_branch_entry, 816 .add_single_entry = iter_add_single_branch_entry, 817 .next_entry = iter_next_branch_entry, 818 .add_next_entry = iter_add_next_branch_entry, 819 .finish_entry = iter_finish_branch_entry, 820 }; 821 822 const struct hist_iter_ops hist_iter_normal = { 823 .prepare_entry = iter_prepare_normal_entry, 824 .add_single_entry = iter_add_single_normal_entry, 825 .next_entry = iter_next_nop_entry, 826 .add_next_entry = iter_add_next_nop_entry, 827 .finish_entry = iter_finish_normal_entry, 828 }; 829 830 const struct hist_iter_ops hist_iter_cumulative = { 831 .prepare_entry = iter_prepare_cumulative_entry, 832 .add_single_entry = iter_add_single_cumulative_entry, 833 .next_entry = iter_next_cumulative_entry, 834 .add_next_entry = iter_add_next_cumulative_entry, 835 .finish_entry = iter_finish_cumulative_entry, 836 }; 837 838 int hist_entry_iter__add(struct hist_entry_iter *iter, struct addr_location *al, 839 struct perf_evsel *evsel, struct perf_sample *sample, 840 int max_stack_depth, void *arg) 841 { 842 int err, err2; 843 844 err = sample__resolve_callchain(sample, &iter->parent, evsel, al, 845 max_stack_depth); 846 if (err) 847 return err; 848 849 iter->evsel = evsel; 850 iter->sample = sample; 851 852 err = iter->ops->prepare_entry(iter, al); 853 if (err) 854 goto out; 855 856 err = iter->ops->add_single_entry(iter, al); 857 if (err) 858 goto out; 859 860 if (iter->he && iter->add_entry_cb) { 861 err = iter->add_entry_cb(iter, al, true, arg); 862 if (err) 863 goto out; 864 } 865 866 while (iter->ops->next_entry(iter, al)) { 867 err = iter->ops->add_next_entry(iter, al); 868 if (err) 869 break; 870 871 if (iter->he && iter->add_entry_cb) { 872 err = iter->add_entry_cb(iter, al, false, arg); 873 if (err) 874 goto out; 875 } 876 } 877 878 out: 879 err2 = iter->ops->finish_entry(iter, al); 880 if (!err) 881 err = err2; 882 883 return err; 884 } 885 886 int64_t 887 hist_entry__cmp(struct hist_entry *left, struct hist_entry *right) 888 { 889 struct perf_hpp_fmt *fmt; 890 int64_t cmp = 0; 891 892 perf_hpp__for_each_sort_list(fmt) { 893 if (perf_hpp__should_skip(fmt)) 894 continue; 895 896 cmp = fmt->cmp(left, right); 897 if (cmp) 898 break; 899 } 900 901 return cmp; 902 } 903 904 int64_t 905 hist_entry__collapse(struct hist_entry *left, struct hist_entry *right) 906 { 907 struct perf_hpp_fmt *fmt; 908 int64_t cmp = 0; 909 910 perf_hpp__for_each_sort_list(fmt) { 911 if (perf_hpp__should_skip(fmt)) 912 continue; 913 914 cmp = fmt->collapse(left, right); 915 if (cmp) 916 break; 917 } 918 919 return cmp; 920 } 921 922 void hist_entry__free(struct hist_entry *he) 923 { 924 zfree(&he->branch_info); 925 zfree(&he->mem_info); 926 zfree(&he->stat_acc); 927 free_srcline(he->srcline); 928 free(he); 929 } 930 931 /* 932 * collapse the histogram 933 */ 934 935 static bool hists__collapse_insert_entry(struct hists *hists __maybe_unused, 936 struct rb_root *root, 937 struct hist_entry *he) 938 { 939 struct rb_node **p = &root->rb_node; 940 struct rb_node *parent = NULL; 941 struct hist_entry *iter; 942 int64_t cmp; 943 944 while (*p != NULL) { 945 parent = *p; 946 iter = rb_entry(parent, struct hist_entry, rb_node_in); 947 948 cmp = hist_entry__collapse(iter, he); 949 950 if (!cmp) { 951 he_stat__add_stat(&iter->stat, &he->stat); 952 if (symbol_conf.cumulate_callchain) 953 he_stat__add_stat(iter->stat_acc, he->stat_acc); 954 955 if (symbol_conf.use_callchain) { 956 callchain_cursor_reset(&callchain_cursor); 957 callchain_merge(&callchain_cursor, 958 iter->callchain, 959 he->callchain); 960 } 961 hist_entry__free(he); 962 return false; 963 } 964 965 if (cmp < 0) 966 p = &(*p)->rb_left; 967 else 968 p = &(*p)->rb_right; 969 } 970 971 rb_link_node(&he->rb_node_in, parent, p); 972 rb_insert_color(&he->rb_node_in, root); 973 return true; 974 } 975 976 static struct rb_root *hists__get_rotate_entries_in(struct hists *hists) 977 { 978 struct rb_root *root; 979 980 pthread_mutex_lock(&hists->lock); 981 982 root = hists->entries_in; 983 if (++hists->entries_in > &hists->entries_in_array[1]) 984 hists->entries_in = &hists->entries_in_array[0]; 985 986 pthread_mutex_unlock(&hists->lock); 987 988 return root; 989 } 990 991 static void hists__apply_filters(struct hists *hists, struct hist_entry *he) 992 { 993 hists__filter_entry_by_dso(hists, he); 994 hists__filter_entry_by_thread(hists, he); 995 hists__filter_entry_by_symbol(hists, he); 996 } 997 998 void hists__collapse_resort(struct hists *hists, struct ui_progress *prog) 999 { 1000 struct rb_root *root; 1001 struct rb_node *next; 1002 struct hist_entry *n; 1003 1004 if (!sort__need_collapse) 1005 return; 1006 1007 root = hists__get_rotate_entries_in(hists); 1008 next = rb_first(root); 1009 1010 while (next) { 1011 if (session_done()) 1012 break; 1013 n = rb_entry(next, struct hist_entry, rb_node_in); 1014 next = rb_next(&n->rb_node_in); 1015 1016 rb_erase(&n->rb_node_in, root); 1017 if (hists__collapse_insert_entry(hists, &hists->entries_collapsed, n)) { 1018 /* 1019 * If it wasn't combined with one of the entries already 1020 * collapsed, we need to apply the filters that may have 1021 * been set by, say, the hist_browser. 1022 */ 1023 hists__apply_filters(hists, n); 1024 } 1025 if (prog) 1026 ui_progress__update(prog, 1); 1027 } 1028 } 1029 1030 static int hist_entry__sort(struct hist_entry *a, struct hist_entry *b) 1031 { 1032 struct perf_hpp_fmt *fmt; 1033 int64_t cmp = 0; 1034 1035 perf_hpp__for_each_sort_list(fmt) { 1036 if (perf_hpp__should_skip(fmt)) 1037 continue; 1038 1039 cmp = fmt->sort(a, b); 1040 if (cmp) 1041 break; 1042 } 1043 1044 return cmp; 1045 } 1046 1047 static void hists__reset_filter_stats(struct hists *hists) 1048 { 1049 hists->nr_non_filtered_entries = 0; 1050 hists->stats.total_non_filtered_period = 0; 1051 } 1052 1053 void hists__reset_stats(struct hists *hists) 1054 { 1055 hists->nr_entries = 0; 1056 hists->stats.total_period = 0; 1057 1058 hists__reset_filter_stats(hists); 1059 } 1060 1061 static void hists__inc_filter_stats(struct hists *hists, struct hist_entry *h) 1062 { 1063 hists->nr_non_filtered_entries++; 1064 hists->stats.total_non_filtered_period += h->stat.period; 1065 } 1066 1067 void hists__inc_stats(struct hists *hists, struct hist_entry *h) 1068 { 1069 if (!h->filtered) 1070 hists__inc_filter_stats(hists, h); 1071 1072 hists->nr_entries++; 1073 hists->stats.total_period += h->stat.period; 1074 } 1075 1076 static void __hists__insert_output_entry(struct rb_root *entries, 1077 struct hist_entry *he, 1078 u64 min_callchain_hits) 1079 { 1080 struct rb_node **p = &entries->rb_node; 1081 struct rb_node *parent = NULL; 1082 struct hist_entry *iter; 1083 1084 if (symbol_conf.use_callchain) 1085 callchain_param.sort(&he->sorted_chain, he->callchain, 1086 min_callchain_hits, &callchain_param); 1087 1088 while (*p != NULL) { 1089 parent = *p; 1090 iter = rb_entry(parent, struct hist_entry, rb_node); 1091 1092 if (hist_entry__sort(he, iter) > 0) 1093 p = &(*p)->rb_left; 1094 else 1095 p = &(*p)->rb_right; 1096 } 1097 1098 rb_link_node(&he->rb_node, parent, p); 1099 rb_insert_color(&he->rb_node, entries); 1100 } 1101 1102 void hists__output_resort(struct hists *hists) 1103 { 1104 struct rb_root *root; 1105 struct rb_node *next; 1106 struct hist_entry *n; 1107 u64 min_callchain_hits; 1108 1109 min_callchain_hits = hists->stats.total_period * (callchain_param.min_percent / 100); 1110 1111 if (sort__need_collapse) 1112 root = &hists->entries_collapsed; 1113 else 1114 root = hists->entries_in; 1115 1116 next = rb_first(root); 1117 hists->entries = RB_ROOT; 1118 1119 hists__reset_stats(hists); 1120 hists__reset_col_len(hists); 1121 1122 while (next) { 1123 n = rb_entry(next, struct hist_entry, rb_node_in); 1124 next = rb_next(&n->rb_node_in); 1125 1126 __hists__insert_output_entry(&hists->entries, n, min_callchain_hits); 1127 hists__inc_stats(hists, n); 1128 1129 if (!n->filtered) 1130 hists__calc_col_len(hists, n); 1131 } 1132 } 1133 1134 static void hists__remove_entry_filter(struct hists *hists, struct hist_entry *h, 1135 enum hist_filter filter) 1136 { 1137 h->filtered &= ~(1 << filter); 1138 if (h->filtered) 1139 return; 1140 1141 /* force fold unfiltered entry for simplicity */ 1142 h->ms.unfolded = false; 1143 h->row_offset = 0; 1144 1145 hists->stats.nr_non_filtered_samples += h->stat.nr_events; 1146 1147 hists__inc_filter_stats(hists, h); 1148 hists__calc_col_len(hists, h); 1149 } 1150 1151 1152 static bool hists__filter_entry_by_dso(struct hists *hists, 1153 struct hist_entry *he) 1154 { 1155 if (hists->dso_filter != NULL && 1156 (he->ms.map == NULL || he->ms.map->dso != hists->dso_filter)) { 1157 he->filtered |= (1 << HIST_FILTER__DSO); 1158 return true; 1159 } 1160 1161 return false; 1162 } 1163 1164 void hists__filter_by_dso(struct hists *hists) 1165 { 1166 struct rb_node *nd; 1167 1168 hists->stats.nr_non_filtered_samples = 0; 1169 1170 hists__reset_filter_stats(hists); 1171 hists__reset_col_len(hists); 1172 1173 for (nd = rb_first(&hists->entries); nd; nd = rb_next(nd)) { 1174 struct hist_entry *h = rb_entry(nd, struct hist_entry, rb_node); 1175 1176 if (symbol_conf.exclude_other && !h->parent) 1177 continue; 1178 1179 if (hists__filter_entry_by_dso(hists, h)) 1180 continue; 1181 1182 hists__remove_entry_filter(hists, h, HIST_FILTER__DSO); 1183 } 1184 } 1185 1186 static bool hists__filter_entry_by_thread(struct hists *hists, 1187 struct hist_entry *he) 1188 { 1189 if (hists->thread_filter != NULL && 1190 he->thread != hists->thread_filter) { 1191 he->filtered |= (1 << HIST_FILTER__THREAD); 1192 return true; 1193 } 1194 1195 return false; 1196 } 1197 1198 void hists__filter_by_thread(struct hists *hists) 1199 { 1200 struct rb_node *nd; 1201 1202 hists->stats.nr_non_filtered_samples = 0; 1203 1204 hists__reset_filter_stats(hists); 1205 hists__reset_col_len(hists); 1206 1207 for (nd = rb_first(&hists->entries); nd; nd = rb_next(nd)) { 1208 struct hist_entry *h = rb_entry(nd, struct hist_entry, rb_node); 1209 1210 if (hists__filter_entry_by_thread(hists, h)) 1211 continue; 1212 1213 hists__remove_entry_filter(hists, h, HIST_FILTER__THREAD); 1214 } 1215 } 1216 1217 static bool hists__filter_entry_by_symbol(struct hists *hists, 1218 struct hist_entry *he) 1219 { 1220 if (hists->symbol_filter_str != NULL && 1221 (!he->ms.sym || strstr(he->ms.sym->name, 1222 hists->symbol_filter_str) == NULL)) { 1223 he->filtered |= (1 << HIST_FILTER__SYMBOL); 1224 return true; 1225 } 1226 1227 return false; 1228 } 1229 1230 void hists__filter_by_symbol(struct hists *hists) 1231 { 1232 struct rb_node *nd; 1233 1234 hists->stats.nr_non_filtered_samples = 0; 1235 1236 hists__reset_filter_stats(hists); 1237 hists__reset_col_len(hists); 1238 1239 for (nd = rb_first(&hists->entries); nd; nd = rb_next(nd)) { 1240 struct hist_entry *h = rb_entry(nd, struct hist_entry, rb_node); 1241 1242 if (hists__filter_entry_by_symbol(hists, h)) 1243 continue; 1244 1245 hists__remove_entry_filter(hists, h, HIST_FILTER__SYMBOL); 1246 } 1247 } 1248 1249 void events_stats__inc(struct events_stats *stats, u32 type) 1250 { 1251 ++stats->nr_events[0]; 1252 ++stats->nr_events[type]; 1253 } 1254 1255 void hists__inc_nr_events(struct hists *hists, u32 type) 1256 { 1257 events_stats__inc(&hists->stats, type); 1258 } 1259 1260 void hists__inc_nr_samples(struct hists *hists, bool filtered) 1261 { 1262 events_stats__inc(&hists->stats, PERF_RECORD_SAMPLE); 1263 if (!filtered) 1264 hists->stats.nr_non_filtered_samples++; 1265 } 1266 1267 static struct hist_entry *hists__add_dummy_entry(struct hists *hists, 1268 struct hist_entry *pair) 1269 { 1270 struct rb_root *root; 1271 struct rb_node **p; 1272 struct rb_node *parent = NULL; 1273 struct hist_entry *he; 1274 int64_t cmp; 1275 1276 if (sort__need_collapse) 1277 root = &hists->entries_collapsed; 1278 else 1279 root = hists->entries_in; 1280 1281 p = &root->rb_node; 1282 1283 while (*p != NULL) { 1284 parent = *p; 1285 he = rb_entry(parent, struct hist_entry, rb_node_in); 1286 1287 cmp = hist_entry__collapse(he, pair); 1288 1289 if (!cmp) 1290 goto out; 1291 1292 if (cmp < 0) 1293 p = &(*p)->rb_left; 1294 else 1295 p = &(*p)->rb_right; 1296 } 1297 1298 he = hist_entry__new(pair, true); 1299 if (he) { 1300 memset(&he->stat, 0, sizeof(he->stat)); 1301 he->hists = hists; 1302 rb_link_node(&he->rb_node_in, parent, p); 1303 rb_insert_color(&he->rb_node_in, root); 1304 hists__inc_stats(hists, he); 1305 he->dummy = true; 1306 } 1307 out: 1308 return he; 1309 } 1310 1311 static struct hist_entry *hists__find_entry(struct hists *hists, 1312 struct hist_entry *he) 1313 { 1314 struct rb_node *n; 1315 1316 if (sort__need_collapse) 1317 n = hists->entries_collapsed.rb_node; 1318 else 1319 n = hists->entries_in->rb_node; 1320 1321 while (n) { 1322 struct hist_entry *iter = rb_entry(n, struct hist_entry, rb_node_in); 1323 int64_t cmp = hist_entry__collapse(iter, he); 1324 1325 if (cmp < 0) 1326 n = n->rb_left; 1327 else if (cmp > 0) 1328 n = n->rb_right; 1329 else 1330 return iter; 1331 } 1332 1333 return NULL; 1334 } 1335 1336 /* 1337 * Look for pairs to link to the leader buckets (hist_entries): 1338 */ 1339 void hists__match(struct hists *leader, struct hists *other) 1340 { 1341 struct rb_root *root; 1342 struct rb_node *nd; 1343 struct hist_entry *pos, *pair; 1344 1345 if (sort__need_collapse) 1346 root = &leader->entries_collapsed; 1347 else 1348 root = leader->entries_in; 1349 1350 for (nd = rb_first(root); nd; nd = rb_next(nd)) { 1351 pos = rb_entry(nd, struct hist_entry, rb_node_in); 1352 pair = hists__find_entry(other, pos); 1353 1354 if (pair) 1355 hist_entry__add_pair(pair, pos); 1356 } 1357 } 1358 1359 /* 1360 * Look for entries in the other hists that are not present in the leader, if 1361 * we find them, just add a dummy entry on the leader hists, with period=0, 1362 * nr_events=0, to serve as the list header. 1363 */ 1364 int hists__link(struct hists *leader, struct hists *other) 1365 { 1366 struct rb_root *root; 1367 struct rb_node *nd; 1368 struct hist_entry *pos, *pair; 1369 1370 if (sort__need_collapse) 1371 root = &other->entries_collapsed; 1372 else 1373 root = other->entries_in; 1374 1375 for (nd = rb_first(root); nd; nd = rb_next(nd)) { 1376 pos = rb_entry(nd, struct hist_entry, rb_node_in); 1377 1378 if (!hist_entry__has_pairs(pos)) { 1379 pair = hists__add_dummy_entry(leader, pos); 1380 if (pair == NULL) 1381 return -1; 1382 hist_entry__add_pair(pos, pair); 1383 } 1384 } 1385 1386 return 0; 1387 } 1388 1389 u64 hists__total_period(struct hists *hists) 1390 { 1391 return symbol_conf.filter_relative ? hists->stats.total_non_filtered_period : 1392 hists->stats.total_period; 1393 } 1394 1395 int parse_filter_percentage(const struct option *opt __maybe_unused, 1396 const char *arg, int unset __maybe_unused) 1397 { 1398 if (!strcmp(arg, "relative")) 1399 symbol_conf.filter_relative = true; 1400 else if (!strcmp(arg, "absolute")) 1401 symbol_conf.filter_relative = false; 1402 else 1403 return -1; 1404 1405 return 0; 1406 } 1407 1408 int perf_hist_config(const char *var, const char *value) 1409 { 1410 if (!strcmp(var, "hist.percentage")) 1411 return parse_filter_percentage(NULL, value, 0); 1412 1413 return 0; 1414 } 1415