diff --git a/tools/perf/builtin-top.c b/tools/perf/builtin-top.c index f2e7312f85c94dc6dd0a15989ebae6d3b848b166..fdc1d5863b012ae3da2aa41b339693f55a77f3b8 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) struct timeval last_read, this_read; -static void mmap_read(struct mmap_data *md) +static void mmap_read_counter(struct mmap_data *md) { unsigned int head = mmap_read_head(md); unsigned int old = md->prev; @@ -517,6 +517,16 @@ static void mmap_read(struct mmap_data *md) static struct pollfd event_array[MAX_NR_CPUS * MAX_COUNTERS]; static struct mmap_data mmap_array[MAX_NR_CPUS][MAX_COUNTERS]; +static void mmap_read(void) +{ + int i, counter; + + for (i = 0; i < nr_cpus; i++) { + for (counter = 0; counter < nr_counters; counter++) + mmap_read_counter(&mmap_array[i][counter]); + } +} + static int __cmd_top(void) { struct perf_counter_attr *attr; @@ -571,6 +581,11 @@ static int __cmd_top(void) } } + /* Wait for a minimal set of events before starting the snapshot */ + poll(event_array, nr_poll, 100); + + mmap_read(); + if (pthread_create(&thread, NULL, display_thread, NULL)) { printf("Could not create display thread.\n"); exit(-1); @@ -589,10 +604,7 @@ static int __cmd_top(void) while (1) { int hits = samples; - for (i = 0; i < nr_cpus; i++) { - for (counter = 0; counter < nr_counters; counter++) - mmap_read(&mmap_array[i][counter]); - } + mmap_read(); if (hits == samples) ret = poll(event_array, nr_poll, 100);