Messages in this thread Patch in this message | | | Date | Wed, 12 Sep 2018 18:33:57 +0200 | From | Oleg Nesterov <> | Subject | [PATCH 2/2] hung_task: change check_hung_uninterruptible_tasks() to use for_each_process_thread_break/continue |
| |
Change check_hung_uninterruptible_tasks() to use the new helpers and remove the "can_cont" logic from rcu_lock_break().
We could add for_each_process_thread_break/continue right into rcu_lock_break() but see the next patch.
Signed-off-by: Oleg Nesterov <oleg@redhat.com> --- kernel/hung_task.c | 25 +++++++++---------------- 1 file changed, 9 insertions(+), 16 deletions(-)
diff --git a/kernel/hung_task.c b/kernel/hung_task.c index b9132d1..13af558 100644 --- a/kernel/hung_task.c +++ b/kernel/hung_task.c @@ -148,20 +148,11 @@ 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 bool rcu_lock_break(struct task_struct *g, struct task_struct *t) +static void rcu_lock_break(void) { - 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; } /* @@ -185,16 +176,18 @@ static void check_hung_uninterruptible_tasks(unsigned long timeout) hung_task_show_lock = false; rcu_read_lock(); for_each_process_thread(g, t) { - if (!max_count--) + /* use "==" to skip the TASK_KILLABLE tasks waiting on NFS */ + if (t->state == TASK_UNINTERRUPTIBLE) + check_hung_task(t, timeout); + + if (!--max_count) goto unlock; if (!--batch_count) { batch_count = HUNG_TASK_BATCHING; - if (!rcu_lock_break(g, t)) - goto unlock; + for_each_process_thread_break(g, t); + rcu_lock_break(); + for_each_process_thread_continue(&g, &t); } - /* use "==" to skip the TASK_KILLABLE tasks waiting on NFS */ - if (t->state == TASK_UNINTERRUPTIBLE) - check_hung_task(t, timeout); } unlock: rcu_read_unlock(); -- 2.5.0
| |