svn commit: r268074 - head/sys/kern
Mateusz Guzik
mjg at FreeBSD.org
Tue Jul 1 06:29:16 UTC 2014
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);
}
More information about the svn-src-head
mailing list