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>