Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 6 Jul 2014 22:56:35 +0000 (UTC)
From:      Mateusz Guzik <mjg@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-10@freebsd.org
Subject:   svn commit: r268339 - stable/10/sys/kern
Message-ID:  <201407062256.s66MuZ2F073323@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: mjg
Date: Sun Jul  6 22:56:34 2014
New Revision: 268339
URL: http://svnweb.freebsd.org/changeset/base/268339

Log:
  MFC r267755:
  
  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).

Modified:
  stable/10/sys/kern/kern_descrip.c

Modified: stable/10/sys/kern/kern_descrip.c
==============================================================================
--- stable/10/sys/kern/kern_descrip.c	Sun Jul  6 22:54:17 2014	(r268338)
+++ stable/10/sys/kern/kern_descrip.c	Sun Jul  6 22:56:34 2014	(r268339)
@@ -1885,17 +1885,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;
 }
 
 /*



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201407062256.s66MuZ2F073323>