diff options
Diffstat (limited to 'kernel/hung_task.c')
| -rw-r--r-- | kernel/hung_task.c | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/kernel/hung_task.c b/kernel/hung_task.c index 2e48ec0c2e91..c21449f85a2a 100644 --- a/kernel/hung_task.c +++ b/kernel/hung_task.c | |||
| @@ -119,15 +119,20 @@ static void check_hung_task(struct task_struct *t, unsigned long timeout) | |||
| 119 | * For preemptible RCU it is sufficient to call rcu_read_unlock in order | 119 | * For preemptible RCU it is sufficient to call rcu_read_unlock in order |
| 120 | * to exit the grace period. For classic RCU, a reschedule is required. | 120 | * to exit the grace period. For classic RCU, a reschedule is required. |
| 121 | */ | 121 | */ |
| 122 | static void rcu_lock_break(struct task_struct *g, struct task_struct *t) | 122 | static bool rcu_lock_break(struct task_struct *g, struct task_struct *t) |
| 123 | { | 123 | { |
| 124 | bool can_cont; | ||
| 125 | |||
| 124 | get_task_struct(g); | 126 | get_task_struct(g); |
| 125 | get_task_struct(t); | 127 | get_task_struct(t); |
| 126 | rcu_read_unlock(); | 128 | rcu_read_unlock(); |
| 127 | cond_resched(); | 129 | cond_resched(); |
| 128 | rcu_read_lock(); | 130 | rcu_read_lock(); |
| 131 | can_cont = pid_alive(g) && pid_alive(t); | ||
| 129 | put_task_struct(t); | 132 | put_task_struct(t); |
| 130 | put_task_struct(g); | 133 | put_task_struct(g); |
| 134 | |||
| 135 | return can_cont; | ||
| 131 | } | 136 | } |
| 132 | 137 | ||
| 133 | /* | 138 | /* |
| @@ -154,9 +159,7 @@ static void check_hung_uninterruptible_tasks(unsigned long timeout) | |||
| 154 | goto unlock; | 159 | goto unlock; |
| 155 | if (!--batch_count) { | 160 | if (!--batch_count) { |
| 156 | batch_count = HUNG_TASK_BATCHING; | 161 | batch_count = HUNG_TASK_BATCHING; |
| 157 | rcu_lock_break(g, t); | 162 | if (!rcu_lock_break(g, t)) |
| 158 | /* Exit if t or g was unhashed during refresh. */ | ||
| 159 | if (t->state == TASK_DEAD || g->state == TASK_DEAD) | ||
| 160 | goto unlock; | 163 | goto unlock; |
| 161 | } | 164 | } |
| 162 | /* use "==" to skip the TASK_KILLABLE tasks waiting on NFS */ | 165 | /* use "==" to skip the TASK_KILLABLE tasks waiting on NFS */ |
