Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 2 Apr 2008 10:59:26 -0700
From:      "Rao, Nikhil" <nikhil.rao@intel.com>
To:        "Giorgos Keramidas" <keramida@ceid.upatras.gr>
Cc:        freebsd-hackers@freebsd.org, Roman Divacky <rdivacky@freebsd.org>
Subject:   RE: pfind() and the proc structure
Message-ID:  <12A5C15467D5B94F8E0FF265D9498ADD02CC01D8@orsmsx419.amr.corp.intel.com>
In-Reply-To: <878wzxa250.fsf@kobe.laptop>
References:  <20080329120018.0A8F5106567F@hub.freebsd.org><12A5C15467D5B94F8E0FF265D9498ADD02CBF8FF@orsmsx419.amr.corp.intel.com><20080401075623.GA19770@freebsd.org><12A5C15467D5B94F8E0FF265D9498ADD02CBF949@orsmsx419.amr.corp.intel.com> <878wzxa250.fsf@kobe.laptop>

next in thread | previous in thread | raw e-mail | index | archive | help

Thanks for all your replies,=20

the all_proc lock is held in pfind(..) at the point PROC_LOCK(p) is
obtained. In the kern_wait(..) code below, the allproc_lock is acquired
before removing the proc from the list of all procs. The PROC_LOCK is
then acquired before continuing. Since the thread that called pfind(..)
has the PROC_LOCK, kern_wait(..) would need to wait for it to release
the PROC_LOCK before continuing. I hope this understanding is correct.

In http://fxr.watson.org/fxr/source/kern/kern_exit.c?v=3DRELENG62#L579

				   sx_xlock(&allproc_lock);
675                         LIST_REMOVE(p, p_list); /* off zombproc */
676                         sx_xunlock(&allproc_lock);
677                         LIST_REMOVE(p, p_sibling);
678                         leavepgrp(p);
679                         sx_xunlock(&proctree_lock);
680=20
681                         /*
682                          * As a side effect of this lock, we know
that
683                          * all other writes to this proc are visible
now, so
684                          * no more locking is needed for p.
685                          */
686                         PROC_LOCK(p);



-----Original Message-----
From: Giorgos Keramidas [mailto:keramida@ceid.upatras.gr]=20
Sent: Tuesday, April 01, 2008 10:58 AM
To: Rao, Nikhil
Cc: Roman Divacky; freebsd-hackers@freebsd.org
Subject: Re: pfind() and the proc structure

On Tue, 1 Apr 2008 07:23:58 -0700, "Rao, Nikhil" <nikhil.rao@intel.com>
wrote:
> Ok, I should have caught that :-( Another question - Now that the
> PROC_LOCK on p is obtained the all_proc lock is released and the
> function returns, at this point can't the proc get deallocated ?
>
> Nikhil
>
> 242 struct proc *
> 243 pfind(pid)
> 244         register pid_t pid;
> 245 {
> 246         register struct proc *p;
> 247
> 248         sx_slock(&allproc_lock);
> 249         LIST_FOREACH(p, PIDHASH(pid), p_hash)
> 250                 if (p->p_pid =3D=3D pid) {
> 251                         if (p->p_state =3D=3D PRS_NEW) {
> 252                                 p =3D NULL;
> 253                                 break;
> 254                         }
> 255                         PROC_LOCK(p);
> 256                         break;
> 257                 }
> 258         sx_sunlock(&allproc_lock);
> 259         return (p);
> 260 }

Not until you unlock the specific proc entry.  You are holding a lock
for the specific proc entry, so anyone trying to `reap' the process
would have to wait until you are done with what you are doing.




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