diff options
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/timer.c | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/kernel/timer.c b/kernel/timer.c index 45229694dc6a..7e12e7bc7ce6 100644 --- a/kernel/timer.c +++ b/kernel/timer.c | |||
@@ -982,9 +982,15 @@ static void call_timer_fn(struct timer_list *timer, void (*fn)(unsigned long), | |||
982 | lock_map_release(&lockdep_map); | 982 | lock_map_release(&lockdep_map); |
983 | 983 | ||
984 | if (preempt_count != preempt_count()) { | 984 | if (preempt_count != preempt_count()) { |
985 | printk(KERN_ERR "timer: %pF preempt leak: %08x -> %08x\n", | 985 | WARN_ONCE(1, "timer: %pF preempt leak: %08x -> %08x\n", |
986 | fn, preempt_count, preempt_count()); | 986 | fn, preempt_count, preempt_count()); |
987 | BUG(); | 987 | /* |
988 | * Restore the preempt count. That gives us a decent | ||
989 | * chance to survive and extract information. If the | ||
990 | * callback kept a lock held, bad luck, but not worse | ||
991 | * than the BUG() we had. | ||
992 | */ | ||
993 | preempt_count() = preempt_count; | ||
988 | } | 994 | } |
989 | } | 995 | } |
990 | 996 | ||