Skip to content

Commit

Permalink
perf: Fix wakeup storm for RO mmap()s
Browse files Browse the repository at this point in the history
RO mmap()s don't update the tail pointer, so
comparing against it for determining the written data
size doesn't really do any good.

Keep track of when we last did a wakeup, and compare
against that.

Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Steven Rostedt <rostedt@goodmis.org>
LKML-Reference: <20100521090710.684479310@chello.nl>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
  • Loading branch information
Peter Zijlstra authored and Ingo Molnar committed May 21, 2010
1 parent 0e2e63d commit adb8e11
Show file tree
Hide file tree
Showing 2 changed files with 3 additions and 3 deletions.
2 changes: 1 addition & 1 deletion include/linux/perf_event.h
Original file line number Diff line number Diff line change
Expand Up @@ -599,7 +599,7 @@ struct perf_mmap_data {
local_t head; /* write position */
local_t nest; /* nested writers */
local_t events; /* event limit */
local_t wakeup; /* needs a wakeup */
local_t wakeup; /* wakeup stamp */
local_t lost; /* nr records lost */

long watermark; /* wakeup watermark */
Expand Down
4 changes: 2 additions & 2 deletions kernel/perf_event.c
Original file line number Diff line number Diff line change
Expand Up @@ -3056,8 +3056,8 @@ int perf_output_begin(struct perf_output_handle *handle,
handle->offset = offset;
handle->head = head;

if (head - tail > data->watermark)
local_inc(&data->wakeup);
if (head - local_read(&data->wakeup) > data->watermark)
local_add(data->watermark, &data->wakeup);

if (have_lost) {
lost_event.header.type = PERF_RECORD_LOST;
Expand Down

0 comments on commit adb8e11

Please sign in to comment.