]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
perf: overflow/perf_count_sw_cpu_clock crashes recent kernels
authorPeter Zijlstra <a.p.zijlstra@chello.nl>
Wed, 3 Aug 2011 11:49:31 +0000 (13:49 +0200)
committerPaul Gortmaker <paul.gortmaker@windriver.com>
Fri, 17 Aug 2012 19:35:00 +0000 (15:35 -0400)
The below patch is for -stable only, upstream has a much larger patch
that contains the below hunk in commit a8b0ca17b80e92faab46ee7179ba9e99ccb61233

Vince found that under certain circumstances software event overflows
go wrong and deadlock. Avoid trying to delete a timer from the timer
callback.

Reported-by: Vince Weaver <vweaver1@eecs.utk.edu>
Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
[PG: backport from 2.6.32 queue, see https://lkml.org/lkml/2011/8/3/125 ]
Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com>
kernel/perf_event.c

index b203546f1ed28847350c94ce7cc50feb1cf4e866..540c26b0ab11cdd69f27e9f080acf4e96ed6b7e2 100644 (file)
@@ -3907,12 +3907,8 @@ static int __perf_event_overflow(struct perf_event *event, int nmi,
        if (events && atomic_dec_and_test(&event->event_limit)) {
                ret = 1;
                event->pending_kill = POLL_HUP;
-               if (nmi) {
-                       event->pending_disable = 1;
-                       perf_pending_queue(&event->pending,
-                                          perf_pending_event);
-               } else
-                       perf_event_disable(event);
+               event->pending_disable = 1;
+               perf_pending_queue(&event->pending, perf_pending_event);
        }
 
        if (event->overflow_handler)