From: OGAWA Hirofumi <hirofumi@mail.parknet.co.jp>
To: Dave McCracken <dmccr@us.ibm.com>
Cc: Jeff Long <jeffwlong@hotmail.com>,
linux-kernel@vger.kernel.org,
Linus Torvalds <torvalds@transmeta.com>
Subject: Re: [PATCH] Re: Zombies with 2.4.15pre5 (exit.c)
Date: 21 Nov 2001 03:40:49 +0900 [thread overview]
Message-ID: <8766851e1a.fsf@devron.myhome.or.jp> (raw)
In-Reply-To: <F207EKzlO329qhXbGE400017908@hotmail.com> <41490000.1006272492@baldur>
In-Reply-To: <41490000.1006272492@baldur>
Hi,
Dave McCracken <dmccr@us.ibm.com> writes:
> The intent of the original patch was to make the task unfindable to other
> waiters, which fixed a race condition in sys_wait4(). My assumption was
> that the task was about to be cleaned up in release_task(). What I missed
> was that there are a couple of code paths that don't release the task, but
> assume it'll be cleaned up later.
I think the original patch don't fix race condition, because
tasklist_lock is read_lock(). Furthermore, the threads which did not
receive process status continues waiting, even when there is no child
process.
I wrote the following patch. But, I'm not sure whether it is right.
Thanks
--
OGAWA Hirofumi <hirofumi@mail.parknet.co.jp>
--- linux-head/kernel/exit.c Tue Nov 20 23:32:58 2001
+++ wait/kernel/exit.c Tue Nov 20 17:56:12 2001
@@ -529,23 +529,27 @@
retval = ru ? getrusage(p, RUSAGE_BOTH, ru) : 0;
if (!retval && stat_addr)
retval = put_user((p->exit_code << 8) | 0x7f, stat_addr);
- if (!retval) {
- p->exit_code = 0;
- retval = p->pid;
+ if (retval)
+ goto end_wait4;
+
+ /* exactly one thread return the process status */
+ task_lock(p);
+ if (p->exit_code == 0) {
+ task_unlock(p);
+ goto repeat;
}
+ p->exit_code = 0;
+ task_unlock(p);
+ retval = p->pid;
goto end_wait4;
case TASK_ZOMBIE:
- /* Make sure no other waiter picks this task up */
- p->state = TASK_DEAD;
-
- current->times.tms_cutime += p->times.tms_utime + p->times.tms_cutime;
- current->times.tms_cstime += p->times.tms_stime + p->times.tms_cstime;
read_unlock(&tasklist_lock);
retval = ru ? getrusage(p, RUSAGE_BOTH, ru) : 0;
if (!retval && stat_addr)
retval = put_user(p->exit_code, stat_addr);
if (retval)
- goto end_wait4;
+ goto end_wait4;
+
retval = p->pid;
if (p->p_opptr != p->p_pptr) {
write_lock_irq(&tasklist_lock);
@@ -554,8 +558,20 @@
SET_LINKS(p);
do_notify_parent(p, SIGCHLD);
write_unlock_irq(&tasklist_lock);
- } else
- release_task(p);
+ goto end_wait4;
+ }
+
+ /* exactly one thread return the process status */
+ task_lock(p);
+ if (p->pid == 0) {
+ task_unlock(p);
+ goto repeat;
+ }
+ p->pid = 0;
+ task_unlock(p);
+ current->times.tms_cutime += p->times.tms_utime + p->times.tms_cutime;
+ current->times.tms_cstime += p->times.tms_stime + p->times.tms_cstime;
+ release_task(p);
goto end_wait4;
default:
continue;
--- linux-head/include/linux/sched.h Tue Nov 20 23:32:58 2001
+++ wait/include/linux/sched.h Tue Nov 20 17:38:11 2001
@@ -88,7 +88,6 @@
#define TASK_UNINTERRUPTIBLE 2
#define TASK_ZOMBIE 4
#define TASK_STOPPED 8
-#define TASK_DEAD 16
#define __set_task_state(tsk, state_value) \
do { (tsk)->state = (state_value); } while (0)
next prev parent reply other threads:[~2001-11-20 18:44 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2001-11-17 3:45 Zombies with 2.4.15pre5 (exit.c) Jeff Long
2001-11-20 16:08 ` [PATCH] " Dave McCracken
2001-11-20 18:40 ` OGAWA Hirofumi [this message]
2001-11-21 18:10 ` Pau Aliagas
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=8766851e1a.fsf@devron.myhome.or.jp \
--to=hirofumi@mail.parknet.co.jp \
--cc=dmccr@us.ibm.com \
--cc=jeffwlong@hotmail.com \
--cc=linux-kernel@vger.kernel.org \
--cc=torvalds@transmeta.com \
/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.