2019-07-29 16:47:58

by Christian Brauner

[permalink] [raw]
Subject: [PATCH] exit: make setting exit_state consistent

Since commit [1] we unconditionally set exit_state to EXIT_ZOMBIE before
calling into do_notify_parent(). This was done to eliminate a race when
querying exit_state in do_notify_pidfd().
Back then we decided to do the absolute minimal thing to fix this and
not touch the rest of the exit_notify() function where exit_state is
set.
Since this fix has not caused any issues change the setting of
exit_state to EXIT_DEAD in the autoreap case to account for the fact hat
exit_state is set to EXIT_ZOMBIE unconditionally. This fix was planned
but also explicitly requested in [2] and makes the whole code more
consistent.

/* References */
[1]: b191d6491be6 ("pidfd: fix a poll race when setting exit_state")
[2]: https://lore.kernel.org/lkml/CAHk-=wigcxGFR2szue4wavJtH5cYTTeNES=toUBVGsmX0rzX+g@mail.gmail.com

Signed-off-by: Christian Brauner <[email protected]>
Cc: Oleg Nesterov <[email protected]>
Cc: Linus Torvalds <[email protected]>
---
kernel/exit.c | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/kernel/exit.c b/kernel/exit.c
index 4436158a6d30..5b4a5dcce8f8 100644
--- a/kernel/exit.c
+++ b/kernel/exit.c
@@ -734,9 +734,10 @@ static void exit_notify(struct task_struct *tsk, int group_dead)
autoreap = true;
}

- tsk->exit_state = autoreap ? EXIT_DEAD : EXIT_ZOMBIE;
- if (tsk->exit_state == EXIT_DEAD)
+ if (autoreap) {
+ tsk->exit_state = EXIT_DEAD;
list_add(&tsk->ptrace_entry, &dead);
+ }

/* mt-exec, de_thread() is waiting for group leader */
if (unlikely(tsk->signal->notify_count < 0))
--
2.22.0


2019-07-29 16:48:38

by Christian Brauner

[permalink] [raw]
Subject: Re: [PATCH] exit: make setting exit_state consistent

On Mon, Jul 29, 2019 at 06:27:57PM +0200, Christian Brauner wrote:
> Since commit [1] we unconditionally set exit_state to EXIT_ZOMBIE before
> calling into do_notify_parent(). This was done to eliminate a race when
> querying exit_state in do_notify_pidfd().
> Back then we decided to do the absolute minimal thing to fix this and
> not touch the rest of the exit_notify() function where exit_state is
> set.
> Since this fix has not caused any issues change the setting of
> exit_state to EXIT_DEAD in the autoreap case to account for the fact hat
> exit_state is set to EXIT_ZOMBIE unconditionally. This fix was planned
> but also explicitly requested in [2] and makes the whole code more
> consistent.
>
> /* References */
> [1]: b191d6491be6 ("pidfd: fix a poll race when setting exit_state")
> [2]: https://lore.kernel.org/lkml/CAHk-=wigcxGFR2szue4wavJtH5cYTTeNES=toUBVGsmX0rzX+g@mail.gmail.com
>
> Signed-off-by: Christian Brauner <[email protected]>
> Cc: Oleg Nesterov <[email protected]>
> Cc: Linus Torvalds <[email protected]>

I plan on sending this together with a few other fixes later. (Assuming
the change here is correct of course.)

Christian

2019-07-30 16:51:52

by Oleg Nesterov

[permalink] [raw]
Subject: Re: [PATCH] exit: make setting exit_state consistent

On 07/29, Christian Brauner wrote:
>
> --- a/kernel/exit.c
> +++ b/kernel/exit.c
> @@ -734,9 +734,10 @@ static void exit_notify(struct task_struct *tsk, int group_dead)
> autoreap = true;
> }
>
> - tsk->exit_state = autoreap ? EXIT_DEAD : EXIT_ZOMBIE;
> - if (tsk->exit_state == EXIT_DEAD)
> + if (autoreap) {
> + tsk->exit_state = EXIT_DEAD;
> list_add(&tsk->ptrace_entry, &dead);
> + }
>

Acked-by: Oleg Nesterov <[email protected]>