aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Documentation/perf_counter/builtin-top.c54
1 files changed, 28 insertions, 26 deletions
diff --git a/Documentation/perf_counter/builtin-top.c b/Documentation/perf_counter/builtin-top.c
index 74021ac90f51..4bed265926dd 100644
--- a/Documentation/perf_counter/builtin-top.c
+++ b/Documentation/perf_counter/builtin-top.c
@@ -374,18 +374,26 @@ static struct sym_entry tmp[MAX_SYMS];
374 374
375static void print_sym_table(void) 375static void print_sym_table(void)
376{ 376{
377 int i, printed; 377 int i, j, active_count, printed;
378 int counter; 378 int counter;
379 float events_per_sec = events/delay_secs; 379 float events_per_sec = events/delay_secs;
380 float kevents_per_sec = (events-userspace_events)/delay_secs; 380 float kevents_per_sec = (events-userspace_events)/delay_secs;
381 float sum_kevents = 0.0; 381 float sum_kevents = 0.0;
382 382
383 events = userspace_events = 0; 383 events = userspace_events = 0;
384 memcpy(tmp, sym_table, sizeof(sym_table[0])*sym_table_count);
385 qsort(tmp, sym_table_count, sizeof(tmp[0]), compare);
386 384
387 for (i = 0; i < sym_table_count && tmp[i].count[0]; i++) 385 /* Iterate over symbol table and copy/tally/decay active symbols. */
388 sum_kevents += tmp[i].count[0]; 386 for (i = 0, active_count = 0; i < sym_table_count; i++) {
387 if (sym_table[i].count[0]) {
388 tmp[active_count++] = sym_table[i];
389 sum_kevents += sym_table[i].count[0];
390
391 for (j = 0; j < nr_counters; j++)
392 sym_table[i].count[j] = zero ? 0 : sym_table[i].count[j] * 7 / 8;
393 }
394 }
395
396 qsort(tmp, active_count + 1, sizeof(tmp[0]), compare);
389 397
390 write(1, CONSOLE_CLEAR, strlen(CONSOLE_CLEAR)); 398 write(1, CONSOLE_CLEAR, strlen(CONSOLE_CLEAR));
391 399
@@ -433,29 +441,23 @@ static void print_sym_table(void)
433 " ______ ______ _____ ________________ _______________\n\n" 441 " ______ ______ _____ ________________ _______________\n\n"
434 ); 442 );
435 443
436 for (i = 0, printed = 0; i < sym_table_count; i++) { 444 for (i = 0, printed = 0; i < active_count; i++) {
437 float pcnt; 445 float pcnt;
438 int count;
439 446
440 if (printed <= 18 && tmp[i].count[0] >= count_filter) { 447 if (++printed > 18 || tmp[i].count[0] < count_filter)
441 pcnt = 100.0 - (100.0*((sum_kevents-tmp[i].count[0])/sum_kevents)); 448 break;
442 449
443 if (nr_counters == 1) 450 pcnt = 100.0 - (100.0*((sum_kevents-tmp[i].count[0])/sum_kevents));
444 printf("%19.2f - %4.1f%% - %016llx : %s\n", 451
445 sym_weight(tmp + i), 452 if (nr_counters == 1)
446 pcnt, tmp[i].addr, tmp[i].sym); 453 printf("%19.2f - %4.1f%% - %016llx : %s\n",
447 else 454 sym_weight(tmp + i),
448 printf("%8.1f %10ld - %4.1f%% - %016llx : %s\n", 455 pcnt, tmp[i].addr, tmp[i].sym);
449 sym_weight(tmp + i), 456 else
450 tmp[i].count[0], 457 printf("%8.1f %10ld - %4.1f%% - %016llx : %s\n",
451 pcnt, tmp[i].addr, tmp[i].sym); 458 sym_weight(tmp + i),
452 printed++; 459 tmp[i].count[0],
453 } 460 pcnt, tmp[i].addr, tmp[i].sym);
454 /*
455 * Add decay to the counts:
456 */
457 for (count = 0; count < nr_counters; count++)
458 sym_table[i].count[count] = zero ? 0 : sym_table[i].count[count] * 7 / 8;
459 } 461 }
460 462
461 if (sym_filter_entry) 463 if (sym_filter_entry)