Messages in this thread | | | Date | Fri, 18 Jun 2010 13:38:54 -0700 | From | Mandeep Singh Baines <> | Subject | Re: [PATCH] fix the racy check_hung_uninterruptible_tasks()->rcu_lock_break() logic |
| |
Oleg Nesterov (oleg@redhat.com) wrote: > check_hung_uninterruptible_tasks()->rcu_lock_break() introduced by > "softlockup: check all tasks in hung_task" commit ce9dbe24 looks > absolutely wrong. > > - rcu_lock_break() does put_task_struct(). If the task has exited > it is not safe to even read its ->state, nothing protects this > task_struct. > > - The TASK_DEAD checks are wrong too. Contrary to the comment, we > can't use it to check if the task was unhashed. It can be unhashed > without TASK_DEAD, or it can be valid with TASK_DEAD. > > For example, an autoreaping task can do release_task(current) > long before it sets TASK_DEAD in do_exit(). > > Or, a zombie task can have ->state == TASK_DEAD but release_task() > was not called, and in this case we must not break the loop. > > Change this code to check pid_alive() instead, and do this before we > drop the reference to the task_struct. > > Signed-off-by: Oleg Nesterov <oleg@redhat.com> > ---
Acked-by: Mandeep Singh Baines <msb@google.com>
| |