diff options
author | Thomas Gleixner <tglx@linutronix.de> | 2011-02-23 18:52:21 -0500 |
---|---|---|
committer | Thomas Gleixner <tglx@linutronix.de> | 2011-02-25 14:24:22 -0500 |
commit | 8eb90c30e0e815a1308828352eabd03ca04229dd (patch) | |
tree | cc41c26975f8ab4e9f3ed734f1bdad9b3774685a /kernel/sched.c | |
parent | 0c4602ff88d6d6ef0ee6d228ee9acaa6448ff6f5 (diff) |
sched: Switch wait_task_inactive to schedule_hrtimeout()
When we force thread hard and soft interrupts the startup of ksoftirqd
would hang in kthread_bind() when wait_task_inactive() calls
schedule_timeout_uninterruptible() because there is no softirq yet
which will wake us up.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Cc: Peter Zijlstra <peterz@infradead.org>
LKML-Reference: <20110223234956.677109139@linutronix.de>
Diffstat (limited to 'kernel/sched.c')
-rw-r--r-- | kernel/sched.c | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/kernel/sched.c b/kernel/sched.c index 18d38e4ec7ba..66ca5d9ba83c 100644 --- a/kernel/sched.c +++ b/kernel/sched.c | |||
@@ -2224,7 +2224,10 @@ unsigned long wait_task_inactive(struct task_struct *p, long match_state) | |||
2224 | * yield - it could be a while. | 2224 | * yield - it could be a while. |
2225 | */ | 2225 | */ |
2226 | if (unlikely(on_rq)) { | 2226 | if (unlikely(on_rq)) { |
2227 | schedule_timeout_uninterruptible(1); | 2227 | ktime_t to = ktime_set(0, NSEC_PER_SEC/HZ); |
2228 | |||
2229 | set_current_state(TASK_UNINTERRUPTIBLE); | ||
2230 | schedule_hrtimeout(&to, HRTIMER_MODE_REL); | ||
2228 | continue; | 2231 | continue; |
2229 | } | 2232 | } |
2230 | 2233 | ||