2015-05-25 17:45:53

by Kirill Tkhai

[permalink] [raw]
Subject: [PATCH RFC 09/13] exit: Use for_each_thread() in do_wait()

Refactoring, no functionality change.

Signed-off-by: Kirill Tkhai <[email protected]>
---
kernel/exit.c | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/kernel/exit.c b/kernel/exit.c
index a268093..c84f3e4 100644
--- a/kernel/exit.c
+++ b/kernel/exit.c
@@ -1538,8 +1538,7 @@ static long do_wait(struct wait_opts *wo)

set_current_state(TASK_INTERRUPTIBLE);
read_lock(&tasklist_lock);
- tsk = current;
- do {
+ for_each_thread(current, tsk) {
retval = do_wait_thread(wo, tsk);
if (retval)
goto end;
@@ -1550,7 +1549,7 @@ static long do_wait(struct wait_opts *wo)

if (wo->wo_flags & __WNOTHREAD)
break;
- } while_each_thread(current, tsk);
+ }
read_unlock(&tasklist_lock);

notask:



2015-05-26 19:47:02

by Oleg Nesterov

[permalink] [raw]
Subject: Re: [PATCH RFC 09/13] exit: Use for_each_thread() in do_wait()

On 05/25, Kirill Tkhai wrote:
>
> Refactoring, no functionality change.

Hmm. unless I missed something this change is wrong.

> --- a/kernel/exit.c
> +++ b/kernel/exit.c
> @@ -1538,8 +1538,7 @@ static long do_wait(struct wait_opts *wo)
>
> set_current_state(TASK_INTERRUPTIBLE);
> read_lock(&tasklist_lock);
> - tsk = current;
> - do {
> + for_each_thread(current, tsk) {
> retval = do_wait_thread(wo, tsk);
> if (retval)
> goto end;
> @@ -1550,7 +1549,7 @@ static long do_wait(struct wait_opts *wo)
>
> if (wo->wo_flags & __WNOTHREAD)
> break;
> - } while_each_thread(current, tsk);
> + }

Please note the __WNOTHREAD check. This is the rare case when we
actually want while_each_thread() (although it should die anyway).

for_each_thread() always starts from ->group_leader, but we need
to start from "current" first.

Oleg.