2009-06-14 20:42:33 +00:00
|
|
|
From 10276fd993c6e4c92d8086a6ccd0c9e0ff53b053 Mon Sep 17 00:00:00 2001
|
|
|
|
From: =?utf-8?q?Arve=20Hj=C3=B8nnev=C3=A5g?= <arve@android.com>
|
|
|
|
Date: Wed, 10 Dec 2008 20:06:28 -0800
|
|
|
|
Subject: [PATCH 058/134] sched: Enable might_sleep before initializing drivers.
|
|
|
|
MIME-Version: 1.0
|
|
|
|
Content-Type: text/plain; charset=utf-8
|
|
|
|
Content-Transfer-Encoding: 8bit
|
|
|
|
|
|
|
|
This allows detection of init bugs in built-in drivers.
|
|
|
|
|
|
|
|
Signed-off-by: Arve Hjønnevåg <arve@android.com>
|
|
|
|
---
|
|
|
|
kernel/sched.c | 14 ++++++++++++--
|
|
|
|
1 files changed, 12 insertions(+), 2 deletions(-)
|
|
|
|
|
|
|
|
--- a/kernel/sched.c
|
|
|
|
+++ b/kernel/sched.c
|
2009-10-01 10:07:32 +00:00
|
|
|
@@ -9065,13 +9065,23 @@ void __init sched_init(void)
|
2009-06-14 20:42:33 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
#ifdef CONFIG_DEBUG_SPINLOCK_SLEEP
|
|
|
|
+static int __might_sleep_init_called;
|
|
|
|
+int __init __might_sleep_init(void)
|
|
|
|
+{
|
|
|
|
+ __might_sleep_init_called = 1;
|
|
|
|
+ return 0;
|
|
|
|
+}
|
|
|
|
+early_initcall(__might_sleep_init);
|
|
|
|
+
|
|
|
|
void __might_sleep(char *file, int line)
|
|
|
|
{
|
|
|
|
#ifdef in_atomic
|
|
|
|
static unsigned long prev_jiffy; /* ratelimiting */
|
|
|
|
|
|
|
|
- if ((!in_atomic() && !irqs_disabled()) ||
|
|
|
|
- system_state != SYSTEM_RUNNING || oops_in_progress)
|
|
|
|
+ if ((!in_atomic() && !irqs_disabled()) || oops_in_progress)
|
|
|
|
+ return;
|
|
|
|
+ if (system_state != SYSTEM_RUNNING &&
|
|
|
|
+ (!__might_sleep_init_called || system_state != SYSTEM_BOOTING))
|
|
|
|
return;
|
|
|
|
if (time_before(jiffies, prev_jiffy + HZ) && prev_jiffy)
|
|
|
|
return;
|