Patch "perf/core: Disable the event on a truncated AUX record" has been added to the 4.4-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
perf/core: Disable the event on a truncated AUX record
to the 4.4-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
perf-core-disable-the-event-on-a-truncated-aux-record.patch
and it can be found in the queue-4.4 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
9f448cd3cbcec8995935e60b27802ae56aac8cc0Mon Sep 17 00:00:00 2001
From: Alexander Shishkin <[email protected]>
Date: Tue, 10 May 2016 16:18:33 +0300
Subject: perf/core: Disable the event on a truncated AUX record
From: Alexander Shishkin <[email protected]>
commit 9f448cd3cbcec8995935e60b27802ae56aac8cc0 upstream.
When the PMU driver reports a truncated AUX record, it effectively means that there is no more usable room in the event's AUX buffer (even though there may still be some room, so that perf_aux_output_begin() doesn't take action). At this point the consumer still has to be woken up and the event has to be disabled, otherwise the event will just keep spinning between perf_aux_output_begin() and perf_aux_output_end() until its context gets unscheduled.
Again, for cpu-wide events this means never, so once in this condition, they will be forever losing data.
Fix this by disabling the event and waking up the consumer in case of a truncated AUX record.
--- kernel/events/ring_buffer.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-)
kernel/events/ring_buffer.c +9 -1
@@ -347,6 +347,7 @@ void perf_aux_output_end(struct perf_out bool truncated) {struct ring_buffer *rb = handle->rb; +bool wakeup = truncated;unsigned long aux_head;u64 flags =0 ;
@@ -375,9 +376,16 @@ void perf_aux_output_end(struct perf_out aux_head = rb->user_page->aux_head =local_read (&rb->aux_head);if (aux_head -local_read (&rb->aux_wakeup) >= rb->aux_watermark) { -perf_output_wakeup (handle); + wakeup = true;local_add (rb->aux_watermark, &rb->aux_wakeup); } + +if (wakeup) { +if (truncated) + handle->event->pending_disable =1 ; +perf_output_wakeup (handle); + } + handle->event =NULL ;local_set (&rb->aux_nest,0 );
Patches currently in stable-queue which might be from [email protected] are
queue-4.4/perf-core-disable-the-event-on-a-truncated-aux-record.patch