svn commit: r268074 - head/sys/kern
John Baldwin
jhb at freebsd.org
Tue Jul 1 13:59:47 UTC 2014
On Tuesday, July 01, 2014 2:29:15 am Mateusz Guzik wrote:
> Author: mjg
> Date: Tue Jul 1 06:29:15 2014
> New Revision: 268074
> URL: http://svnweb.freebsd.org/changeset/base/268074
>
> Log:
> Perform a lockless check in sigacts_shared.
>
> It is used only during execve (i.e. singlethreaded), so there is no fear
> of returning 'not shared' which soon becomes 'shared'.
>
> While here reorganize the code a little to avoid proc lock/unlock in
> shared case.
>
> MFC after: 1 week
>
> Modified:
> head/sys/kern/kern_exec.c
> head/sys/kern/kern_sig.c
>
> Modified: head/sys/kern/kern_exec.c
>
==============================================================================
> --- head/sys/kern/kern_exec.c Tue Jul 1 06:23:48 2014 (r268073)
> +++ head/sys/kern/kern_exec.c Tue Jul 1 06:29:15 2014 (r268074)
> @@ -621,18 +621,17 @@ interpret:
> * handlers. In execsigs(), the new process will have its signals
> * reset.
> */
> - PROC_LOCK(p);
> - oldcred = crcopysafe(p, newcred);
> if (sigacts_shared(p->p_sigacts)) {
> oldsigacts = p->p_sigacts;
> - PROC_UNLOCK(p);
> newsigacts = sigacts_alloc();
> sigacts_copy(newsigacts, oldsigacts);
> - PROC_LOCK(p);
> - p->p_sigacts = newsigacts;
> } else
> oldsigacts = NULL;
>
> + PROC_LOCK(p);
> + if (oldsigacts)
> + p->p_sigacts = newsigacts;
> + oldcred = crcopysafe(p, newcred);
> /* Stop profiling */
> stopprofclock(p);
>
>
> Modified: head/sys/kern/kern_sig.c
>
==============================================================================
> --- head/sys/kern/kern_sig.c Tue Jul 1 06:23:48 2014 (r268073)
> +++ head/sys/kern/kern_sig.c Tue Jul 1 06:29:15 2014 (r268074)
> @@ -3453,10 +3453,6 @@ sigacts_copy(struct sigacts *dest, struc
> int
> sigacts_shared(struct sigacts *ps)
> {
> - int shared;
>
> - mtx_lock(&ps->ps_mtx);
> - shared = ps->ps_refcnt > 1;
> - mtx_unlock(&ps->ps_mtx);
> - return (shared);
> + return (ps->ps_refcnt > 1);
> }
You should KASSERT() in sigacts_shared that P_HADTHREADS is not set so that
new code does not call this function unsafely in the future.
--
John Baldwin
More information about the svn-src-head
mailing list