From: Frederic Weisbecker Date: Tue, 10 Feb 2009 15:52:37 +0000 (+0100) Subject: softlockup: ensure the task has been switched out once X-Git-Tag: v2.6.30-rc1~1^2~4 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=cf2592f59c0e8ed4308adbdb2e0a88655379d579;p=thirdparty%2Fkernel%2Flinux.git softlockup: ensure the task has been switched out once When we check if a task has been switched out since the last scan, we might have a race condition on the following scenario: - the task is freshly created and scheduled - it puts its state to TASK_UNINTERRUPTIBLE and is not yet switched out - check_hung_task() scans this task and will report a false positive because t->nvcsw + t->nivcsw == t->last_switch_count == 0 Add a check for such cases. Signed-off-by: Frederic Weisbecker Acked-by: Mandeep Singh Baines Signed-off-by: Ingo Molnar --- diff --git a/kernel/hung_task.c b/kernel/hung_task.c index 0c924de58cb2c..022a4927b7853 100644 --- a/kernel/hung_task.c +++ b/kernel/hung_task.c @@ -72,7 +72,13 @@ static void check_hung_task(struct task_struct *t, unsigned long timeout) { unsigned long switch_count = t->nvcsw + t->nivcsw; - if (t->flags & PF_FROZEN) + /* + * Ensure the task is not frozen. + * Also, when a freshly created task is scheduled once, changes + * its state to TASK_UNINTERRUPTIBLE without having ever been + * switched out once, it musn't be checked. + */ + if (unlikely(t->flags & PF_FROZEN || !switch_count)) return; if (switch_count != t->last_switch_count) {