| From ab1b939d1a26dfa292a2d3f3ac558835abd62b37 Mon Sep 17 00:00:00 2001 |
| From: Peter Zijlstra <a.p.zijlstra@chello.nl> |
| Date: Wed, 3 Aug 2011 13:49:31 +0200 |
| Subject: [PATCH] perf: overflow/perf_count_sw_cpu_clock crashes recent |
| kernels |
| |
| 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> |
| |
| diff --git a/kernel/perf_event.c b/kernel/perf_event.c |
| index b203546..540c26b 100644 |
| --- a/kernel/perf_event.c |
| +++ b/kernel/perf_event.c |
| @@ -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) |
| -- |
| 1.7.9.7 |
| |