svn commit: r267755 - head/sys/kern
Mateusz Guzik
mjg at FreeBSD.org
Sun Jun 22 21:37:28 UTC 2014
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;
}
/*
More information about the svn-src-all
mailing list