diff options
-rw-r--r-- | tools/perf/builtin-top.c | 22 |
1 files changed, 17 insertions, 5 deletions
diff --git a/tools/perf/builtin-top.c b/tools/perf/builtin-top.c index f2e7312f85c9..fdc1d5863b01 100644 --- a/tools/perf/builtin-top.c +++ b/tools/perf/builtin-top.c | |||
@@ -420,7 +420,7 @@ static unsigned int mmap_read_head(struct mmap_data *md) | |||
420 | 420 | ||
421 | struct timeval last_read, this_read; | 421 | struct timeval last_read, this_read; |
422 | 422 | ||
423 | static void mmap_read(struct mmap_data *md) | 423 | static void mmap_read_counter(struct mmap_data *md) |
424 | { | 424 | { |
425 | unsigned int head = mmap_read_head(md); | 425 | unsigned int head = mmap_read_head(md); |
426 | unsigned int old = md->prev; | 426 | unsigned int old = md->prev; |
@@ -517,6 +517,16 @@ static void mmap_read(struct mmap_data *md) | |||
517 | static struct pollfd event_array[MAX_NR_CPUS * MAX_COUNTERS]; | 517 | static struct pollfd event_array[MAX_NR_CPUS * MAX_COUNTERS]; |
518 | static struct mmap_data mmap_array[MAX_NR_CPUS][MAX_COUNTERS]; | 518 | static struct mmap_data mmap_array[MAX_NR_CPUS][MAX_COUNTERS]; |
519 | 519 | ||
520 | static void mmap_read(void) | ||
521 | { | ||
522 | int i, counter; | ||
523 | |||
524 | for (i = 0; i < nr_cpus; i++) { | ||
525 | for (counter = 0; counter < nr_counters; counter++) | ||
526 | mmap_read_counter(&mmap_array[i][counter]); | ||
527 | } | ||
528 | } | ||
529 | |||
520 | static int __cmd_top(void) | 530 | static int __cmd_top(void) |
521 | { | 531 | { |
522 | struct perf_counter_attr *attr; | 532 | struct perf_counter_attr *attr; |
@@ -571,6 +581,11 @@ static int __cmd_top(void) | |||
571 | } | 581 | } |
572 | } | 582 | } |
573 | 583 | ||
584 | /* Wait for a minimal set of events before starting the snapshot */ | ||
585 | poll(event_array, nr_poll, 100); | ||
586 | |||
587 | mmap_read(); | ||
588 | |||
574 | if (pthread_create(&thread, NULL, display_thread, NULL)) { | 589 | if (pthread_create(&thread, NULL, display_thread, NULL)) { |
575 | printf("Could not create display thread.\n"); | 590 | printf("Could not create display thread.\n"); |
576 | exit(-1); | 591 | exit(-1); |
@@ -589,10 +604,7 @@ static int __cmd_top(void) | |||
589 | while (1) { | 604 | while (1) { |
590 | int hits = samples; | 605 | int hits = samples; |
591 | 606 | ||
592 | for (i = 0; i < nr_cpus; i++) { | 607 | mmap_read(); |
593 | for (counter = 0; counter < nr_counters; counter++) | ||
594 | mmap_read(&mmap_array[i][counter]); | ||
595 | } | ||
596 | 608 | ||
597 | if (hits == samples) | 609 | if (hits == samples) |
598 | ret = poll(event_array, nr_poll, 100); | 610 | ret = poll(event_array, nr_poll, 100); |