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);
 }
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to