From 5c02ce5be529cd9d327ac9dc3f967777d8e2695b Mon Sep 17 00:00:00 2001 From: Oleg Nesterov Date: Mon, 5 Mar 2012 14:59:14 -0800 Subject: [PATCH] --- yaml --- r: 288239 b: refs/heads/master c: 6027ce497d44dd8eae1a9215789df178f6b422cc h: refs/heads/master i: 288237: f6a61d497081ef944cb278ca7b9fb60176fa53b4 288235: 2b277516b58f8639d621de7c0fe1638fea2578d8 288231: cc3b478d3c231b7f79fcbea2d5f9683131b10905 288223: e24970bce5f219d8aec63dee391097cf976bea49 v: v3 --- [refs] | 2 +- trunk/kernel/hung_task.c | 11 +++++++---- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/[refs] b/[refs] index a1c650666ccd..59b675b9493d 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 6e27f63edbd7ab893258e16500171dd1270a1369 +refs/heads/master: 6027ce497d44dd8eae1a9215789df178f6b422cc diff --git a/trunk/kernel/hung_task.c b/trunk/kernel/hung_task.c index 2e48ec0c2e91..c21449f85a2a 100644 --- a/trunk/kernel/hung_task.c +++ b/trunk/kernel/hung_task.c @@ -119,15 +119,20 @@ static void check_hung_task(struct task_struct *t, unsigned long timeout) * For preemptible RCU it is sufficient to call rcu_read_unlock in order * to exit the grace period. For classic RCU, a reschedule is required. */ -static void rcu_lock_break(struct task_struct *g, struct task_struct *t) +static bool rcu_lock_break(struct task_struct *g, struct task_struct *t) { + bool can_cont; + get_task_struct(g); get_task_struct(t); rcu_read_unlock(); cond_resched(); rcu_read_lock(); + can_cont = pid_alive(g) && pid_alive(t); put_task_struct(t); put_task_struct(g); + + return can_cont; } /* @@ -154,9 +159,7 @@ static void check_hung_uninterruptible_tasks(unsigned long timeout) goto unlock; if (!--batch_count) { batch_count = HUNG_TASK_BATCHING; - rcu_lock_break(g, t); - /* Exit if t or g was unhashed during refresh. */ - if (t->state == TASK_DEAD || g->state == TASK_DEAD) + if (!rcu_lock_break(g, t)) goto unlock; } /* use "==" to skip the TASK_KILLABLE tasks waiting on NFS */