From: Oleg Nesterov <oleg@tv-sign.ru>
To: Andrew Morton <akpm@linux-foundation.org>
Cc: Alexey Dobriyan <adobriyan@sw.ru>, Kees Cook <kees@ubuntu.com>,
Linus Torvalds <torvalds@linux-foundation.org>,
Roland McGrath <roland@redhat.com>,
Scott James Remnant <scott@ubuntu.com>,
linux-kernel@vger.kernel.org
Subject: [PATCH 2/3] wait_task_stopped: tidy up the noreap case
Date: Fri, 16 Nov 2007 20:24:13 +0300 [thread overview]
Message-ID: <20071116172413.GA7296@tv-sign.ru> (raw)
wait_task_stopped(WNOWAIT) unlocks tasklist_lock and re-checks ->exit_code and
->exit_state. This is not needed: both were valid before we dropped the lock,
and without tasklist_lock both are not stable anyway.
Read the exit_code under tasklist and report the cached value without re-check.
In fact this fixes the race with the dying child, we can report a completely
false exit_code if ->exit_state is not visible yet.
Signed-off-by: Oleg Nesterov <oleg@tv-sign.ru>
--- 24/kernel/exit.c~2_NOREAP 2007-11-16 18:13:54.000000000 +0300
+++ 24/kernel/exit.c 2007-11-16 18:18:24.000000000 +0300
@@ -1356,10 +1356,10 @@ static int wait_task_stopped(struct task
int noreap, struct siginfo __user *infop,
int __user *stat_addr, struct rusage __user *ru)
{
- int retval, exit_code;
+ int retval, exit_code = p->exit_code;
pid_t pid;
- if (!p->exit_code)
+ if (!exit_code)
return 0;
if (delayed_group_leader && !(p->ptrace & PT_PTRACED) &&
p->signal->group_stop_count > 0)
@@ -1384,9 +1384,6 @@ static int wait_task_stopped(struct task
uid_t uid = p->uid;
int why = (p->ptrace & PT_PTRACED) ? CLD_TRAPPED : CLD_STOPPED;
- exit_code = p->exit_code;
- if (unlikely(!exit_code) || unlikely(p->exit_state))
- goto bail_ref;
return wait_noreap_copyout(p, pid, uid,
why, (exit_code << 8) | 0x7f,
infop, ru);
@@ -1417,7 +1414,6 @@ static int wait_task_stopped(struct task
* resumed, or it resumed and then died.
*/
write_unlock_irq(&tasklist_lock);
-bail_ref:
put_task_struct(p);
/*
* We are returning to the wait loop without having successfully
next reply other threads:[~2007-11-16 17:24 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-11-16 17:24 Oleg Nesterov [this message]
2007-11-16 20:24 ` [PATCH 2/3] wait_task_stopped: tidy up the noreap case Roland McGrath
2007-11-17 16:38 ` Oleg Nesterov
2007-11-18 9:14 ` Scott James Remnant
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20071116172413.GA7296@tv-sign.ru \
--to=oleg@tv-sign.ru \
--cc=adobriyan@sw.ru \
--cc=akpm@linux-foundation.org \
--cc=kees@ubuntu.com \
--cc=linux-kernel@vger.kernel.org \
--cc=roland@redhat.com \
--cc=scott@ubuntu.com \
--cc=torvalds@linux-foundation.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.