Author: mjg
Date: Sun Jun 22 21:37:27 2014
New Revision: 267755
URL: http://svnweb.freebsd.org/changeset/base/267755

Log:
  Don't take filedesc lock in fdunshare().
  
  We can read refcnt safely and only care if it is equal to 1.
  
  If it could suddenly change from 1 to something bigger the code would be
  buggy even in the previous form and transitions from > 1 to 1 are equally racy
  and harmless (we copy even though there is no need).
  
  MFC after:    1 week

Modified:
  head/sys/kern/kern_descrip.c

Modified: head/sys/kern/kern_descrip.c
==============================================================================
--- head/sys/kern/kern_descrip.c        Sun Jun 22 21:28:05 2014        
(r267754)
+++ head/sys/kern/kern_descrip.c        Sun Jun 22 21:37:27 2014        
(r267755)
@@ -1852,17 +1852,14 @@ fdshare(struct filedesc *fdp)
 void
 fdunshare(struct proc *p, struct thread *td)
 {
+       struct filedesc *tmp;
 
-       FILEDESC_XLOCK(p->p_fd);
-       if (p->p_fd->fd_refcnt > 1) {
-               struct filedesc *tmp;
-
-               FILEDESC_XUNLOCK(p->p_fd);
-               tmp = fdcopy(p->p_fd);
-               fdescfree(td);
-               p->p_fd = tmp;
-       } else
-               FILEDESC_XUNLOCK(p->p_fd);
+       if (p->p_fd->fd_refcnt == 1)
+               return;
+
+       tmp = fdcopy(p->p_fd);
+       fdescfree(td);
+       p->p_fd = tmp;
 }
 
 /*
_______________________________________________
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