Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 2 Apr 2000 17:23:49 -0700
From:      Alfred Perlstein <bright@wintelcom.net>
To:        Matthew Dillon <dillon@apollo.backplane.com>
Cc:        current@FreeBSD.ORG
Subject:   Re: cvs commit: src/sys/i386/i386 support.s src/sys/kern init_sysent.c kern_prot.c kern_sig.c
Message-ID:  <20000402172349.T21029@fw.wintelcom.net>
In-Reply-To: <200004022338.QAA51565@apollo.backplane.com>; from dillon@apollo.backplane.com on Sun, Apr 02, 2000 at 04:38:38PM -0700
References:  <200004021752.KAA13175@freefall.freebsd.org> <20000402163552.P21029@fw.wintelcom.net> <200004022312.QAA51299@apollo.backplane.com> <20000402164700.R21029@fw.wintelcom.net> <200004022338.QAA51565@apollo.backplane.com>

next in thread | previous in thread | raw e-mail | index | archive | help
* Matthew Dillon <dillon@apollo.backplane.com> [000402 17:04] wrote:
> 
> :I did look at the code, struct proc is allocated from a zone,
> :meaning it won't "go away" once allocated, there's no danger in
> :dereferencing p_pptr, I don't get it.
> :
> :-- 
> :-Alfred Perlstein - [bright@wintelcom.net|alfred@freebsd.org]
> :"I have the heart of a child; I keep it in a jar on my desk."
> 
>     What happens when the parent process exits and the system must
>     reassign the parent to process 1?  Now think about what happens
>     when it occurs on one cpu while another is trying to access the
>     ppid.
> 
> 	cpu#1:					cpu#2:
> 
> 	read p->p_pptr
> 	indirect through to get ppid
> 	(stalls on a cache miss plus, 
> 	due to heavy DMA, stalls on main memory)
> 						parent process finishes
> 						exiting, replaces p_pptr
> 						of children, releases
> 						struct proc.
> 
> 						struct proc is reused,
> 						pid is reallocated
>         read completes, wrong ppid is returned 
> 	(neither the original ppid nor ppid 1 
> 	is returned).
> 
>     In an SMP system you have to assume the worst case, and the worst case
>     is that a cpu can stall INDEFINITELY between instructions.

Good call.

Ugh, I should think about this more, but i'll just grasp at straws
and suggest that p_pptr is set to volatile variable, and we re-read
it after we snarf the pid from the pointer and make sure it hasn't
changed out from under us.

Either that or store it in the child's proc struct as well.

-- 
-Alfred Perlstein - [bright@wintelcom.net|alfred@freebsd.org]
"I have the heart of a child; I keep it in a jar on my desk."


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?20000402172349.T21029>