cvs commit: src/sys/kern kern_fork.c

Alfred Perlstein alfred at freebsd.org
Wed Oct 24 19:34:28 PDT 2007


* David Xu <davidxu at FreeBSD.org> [071024 19:32] wrote:
> Alfred Perlstein wrote:
> >* David Xu <davidxu at FreeBSD.org> [071024 18:34] wrote:
> >
> >>Julian Elischer wrote:
> >>
> >>>julian      2007-10-23 17:54:16 UTC
> >>>
> >>>FreeBSD src repository
> >>>
> >>>Modified files:
> >>>  sys/kern             kern_fork.c 
> >>>Log:
> >>>Take out the single-threading code in fork.
> >>>After discussions with jeff, alc, (various Ironport people), david Xu,
> >>>and mostly Alfred (who found the problem) it has been demonstrated that 
> >>>this
> >>>is not needed for our implementations of threads and represents a real
> >>>(as in we've seen it happen a lot) deadlock danger.
> >>>...
> >>
> >>I think if process is forking a thread, that says flag RFPROC is not
> >>set and flags RFCFDG or RFCFDG is set, you still need to call
> >>thread_single(SINGLE_BOUNDARY), otherwise, for a threaded process,
> >>the memory pointed by p_fd is freed while other threads are using it,
> >>it will cause kernel to panic.
> >
> >
> >This is unlikely to be fixed by SINGLE_BOUNDARY and will likely require
> >refcounting to fix.  SINGLE_BOUNDARY will not fix the locations where
> >this happens:
> >
> >        p = td->td_proc;
> >        fdp = p->p_fd;
> >        do something that blocks...
> >        re-use fdp.
> >
> thread_suspend_check() with SINGLE_BOUNDARY is used is only called
> in userret() where I don't think any code is still using the p_fd.

This is not an acceptable solution as it will deadlock unless all
threads exit the kernel.

filedescs can be refcounted per thread I think.

-- 
- Alfred Perlstein


More information about the cvs-src mailing list