Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 5 Apr 2001 18:00:57 -0400 (EDT)
From:      Garrett Wollman <wollman@khavrinen.lcs.mit.edu>
To:        John Baldwin <jhb@FreeBSD.ORG>
Cc:        current@FreeBSD.ORG
Subject:   RE: selwakeup()
Message-ID:  <200104052200.SAA71985@khavrinen.lcs.mit.edu>
In-Reply-To: <XFMail.010405144129.jhb@FreeBSD.org>
References:  <XFMail.010405104534.jhb@FreeBSD.org> <XFMail.010405144129.jhb@FreeBSD.org>

next in thread | previous in thread | raw e-mail | index | archive | help
<<On Thu, 05 Apr 2001 14:41:29 -0700 (PDT), John Baldwin <jhb@FreeBSD.ORG> said:

> As a safety check we should probably zero the pid right before zfree()'ing a
> proc in wait() however, so that a stale pointer to a free'd process doesn't
> have a valid pid if we do this.

Should not be necessary.  Here is the logic:

	p = sip->si_p;
	mtx_lock_spin(&sched_lock);
	if (p->p_stat != SZOMB || p->p_pid != sip->si_pid) {
		/* oops */
		mtx_lock_spin(&sched_lock);
		return;
	}

	sip->si_pid = 0;
	sip->si_p = 0;
	if (p->p_wchan == (caddr_t)&selwait) {
		/* ... */


If `p' is a pointer to a freed process, then p->p_stat is guaranteed
to be SZOMB -- the only code path which can free a process struct is
wrapped inside `if (p->p_stat == SZOMB)'.  (See kern_exit.c:exit1().)
If `p' is a pointer to an active process, and it's the wrong pid, then
we don't wake it up.  Otherwise, we wake it up.  (`p' might still be
the wrong process, if pid space wrapped around, but the current code
doesn't deal with that condition, either, nor should it.)

-GAWollman


To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-current" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200104052200.SAA71985>