Date: Sat, 5 Aug 2006 02:58:31 GMT From: John Birrell <jb@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 103220 for review Message-ID: <200608050258.k752wVjJ093202@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=103220 Change 103220 by jb@jb_freebsd2 on 2006/08/05 02:57:43 Sync to current. Affected files ... .. //depot/projects/dtrace/src/sys/kern/kern_descrip.c#6 edit Differences ... ==== //depot/projects/dtrace/src/sys/kern/kern_descrip.c#6 (text+ko) ==== @@ -359,33 +359,41 @@ struct vnode *vp; u_int newmin; int error, flg, tmp; - int giant_locked = 0; + int giant_locked; + + /* + * XXXRW: Some fcntl() calls require Giant -- others don't. Try to + * avoid grabbing Giant for calls we know don't need it. + */ + switch (cmd) { + case F_DUPFD: + case F_GETFD: + case F_SETFD: + case F_GETFL: + giant_locked = 0; + break; + + default: + giant_locked = 1; + mtx_lock(&Giant); + } error = 0; flg = F_POSIX; p = td->td_proc; fdp = p->p_fd; - retry: FILEDESC_LOCK(fdp); if ((unsigned)fd >= fdp->fd_nfiles || (fp = fdp->fd_ofiles[fd]) == NULL) { FILEDESC_UNLOCK(fdp); - if (giant_locked) - mtx_unlock(&Giant); error = EBADF; goto done2; } pop = &fdp->fd_ofileflags[fd]; - if ((giant_locked == 0) && ((fp->f_ops->fo_flags & DFLAG_MPSAFE) == 0)) { - FILEDESC_UNLOCK(fdp); - mtx_lock(&Giant); - giant_locked = 1; - /* we may have lost a race */ - goto retry; - } switch (cmd) { case F_DUPFD: + /* mtx_assert(&Giant, MA_NOTOWNED); */ FILEDESC_UNLOCK(fdp); newmin = arg; PROC_LOCK(p); @@ -400,17 +408,20 @@ break; case F_GETFD: + /* mtx_assert(&Giant, MA_NOTOWNED); */ td->td_retval[0] = (*pop & UF_EXCLOSE) ? FD_CLOEXEC : 0; FILEDESC_UNLOCK(fdp); break; case F_SETFD: + /* mtx_assert(&Giant, MA_NOTOWNED); */ *pop = (*pop &~ UF_EXCLOSE) | (arg & FD_CLOEXEC ? UF_EXCLOSE : 0); FILEDESC_UNLOCK(fdp); break; case F_GETFL: + /* mtx_assert(&Giant, MA_NOTOWNED); */ FILE_LOCK(fp); td->td_retval[0] = OFLAGS(fp->f_flag); FILE_UNLOCK(fp); @@ -418,6 +429,7 @@ break; case F_SETFL: + mtx_assert(&Giant, MA_OWNED); FILE_LOCK(fp); fhold_locked(fp); fp->f_flag &= ~FCNTLFLAGS; @@ -445,6 +457,7 @@ break; case F_GETOWN: + mtx_assert(&Giant, MA_OWNED); fhold(fp); FILEDESC_UNLOCK(fdp); error = fo_ioctl(fp, FIOGETOWN, &tmp, td->td_ucred, td); @@ -454,6 +467,7 @@ break; case F_SETOWN: + mtx_assert(&Giant, MA_OWNED); fhold(fp); FILEDESC_UNLOCK(fdp); tmp = arg; @@ -462,10 +476,12 @@ break; case F_SETLKW: + mtx_assert(&Giant, MA_OWNED); flg |= F_WAIT; /* FALLTHROUGH F_SETLK */ case F_SETLK: + mtx_assert(&Giant, MA_OWNED); if (fp->f_type != DTYPE_VNODE) { FILEDESC_UNLOCK(fdp); error = EBADF; @@ -539,6 +555,7 @@ break; case F_GETLK: + mtx_assert(&Giant, MA_OWNED); if (fp->f_type != DTYPE_VNODE) { FILEDESC_UNLOCK(fdp); error = EBADF; @@ -2492,7 +2509,7 @@ return (error); } -SYSCTL_PROC(_kern, KERN_FILE, file, CTLTYPE_OPAQUE|CTLFLAG_RD|CTLFLAG_MPSAFE, +SYSCTL_PROC(_kern, KERN_FILE, file, CTLTYPE_OPAQUE|CTLFLAG_RD, 0, 0, sysctl_kern_file, "S,xfile", "Entire file table"); #ifdef DDB
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200608050258.k752wVjJ093202>