diff options
author | 2019-07-15 04:11:03 +0000 | |
---|---|---|
committer | 2019-07-15 04:11:03 +0000 | |
commit | 8994f64af411fc832c7f1ee3934cc414321f1e81 (patch) | |
tree | 1661d715021b879f81d9287839e05c7488543130 | |
parent | sync (diff) | |
download | wireguard-openbsd-8994f64af411fc832c7f1ee3934cc414321f1e81.tar.xz wireguard-openbsd-8994f64af411fc832c7f1ee3934cc414321f1e81.zip |
Do not relock fdp in fdrelease(). This prevents unnecessary locking
in the common case.
OK mpi@
-rw-r--r-- | sys/kern/exec_script.c | 4 | ||||
-rw-r--r-- | sys/kern/kern_descrip.c | 21 | ||||
-rw-r--r-- | sys/kern/kern_exec.c | 4 | ||||
-rw-r--r-- | sys/kern/sys_pipe.c | 17 |
4 files changed, 28 insertions, 18 deletions
diff --git a/sys/kern/exec_script.c b/sys/kern/exec_script.c index 788260254f5..a31fa5a3269 100644 --- a/sys/kern/exec_script.c +++ b/sys/kern/exec_script.c @@ -1,4 +1,4 @@ -/* $OpenBSD: exec_script.c,v 1.47 2018/06/18 09:15:05 mpi Exp $ */ +/* $OpenBSD: exec_script.c,v 1.48 2019/07/15 04:11:03 visa Exp $ */ /* $NetBSD: exec_script.c,v 1.13 1996/02/04 02:15:06 christos Exp $ */ /* @@ -260,8 +260,8 @@ fail: if (epp->ep_flags & EXEC_HASFD) { epp->ep_flags &= ~EXEC_HASFD; fdplock(p->p_fd); + /* fdrelease() unlocks p->p_fd. */ (void) fdrelease(p, epp->ep_fd); - fdpunlock(p->p_fd); } else vn_close(scriptvp, FREAD, p->p_ucred, p); diff --git a/sys/kern/kern_descrip.c b/sys/kern/kern_descrip.c index c38ee669517..7370a56b74a 100644 --- a/sys/kern/kern_descrip.c +++ b/sys/kern/kern_descrip.c @@ -1,4 +1,4 @@ -/* $OpenBSD: kern_descrip.c,v 1.190 2019/07/12 13:56:27 solene Exp $ */ +/* $OpenBSD: kern_descrip.c,v 1.191 2019/07/15 04:11:03 visa Exp $ */ /* $NetBSD: kern_descrip.c,v 1.42 1996/03/30 22:24:38 christos Exp $ */ /* @@ -741,8 +741,10 @@ fdrelease(struct proc *p, int fd) fdpassertlocked(fdp); fp = fd_getfile(fdp, fd); - if (fp == NULL) + if (fp == NULL) { + fdpunlock(fdp); return (EBADF); + } /* Prevent race with kevent. */ KERNEL_LOCK(); fdremove(fdp, fd); @@ -750,8 +752,7 @@ fdrelease(struct proc *p, int fd) fdpunlock(fdp); error = closef(fp, p); KERNEL_UNLOCK(); - fdplock(fdp); - return error; + return (error); } /* @@ -767,8 +768,8 @@ sys_close(struct proc *p, void *v, register_t *retval) struct filedesc *fdp = p->p_fd; fdplock(fdp); + /* fdrelease unlocks fdp. */ error = fdrelease(p, fd); - fdpunlock(fdp); return (error); } @@ -1426,8 +1427,11 @@ fdcloseexec(struct proc *p) fdplock(fdp); for (fd = 0; fd <= fdp->fd_lastfile; fd++) { fdp->fd_ofileflags[fd] &= ~UF_PLEDGED; - if (fdp->fd_ofileflags[fd] & UF_EXCLOSE) + if (fdp->fd_ofileflags[fd] & UF_EXCLOSE) { + /* fdrelease() unlocks fdp. */ (void) fdrelease(p, fd); + fdplock(fdp); + } } fdpunlock(fdp); } @@ -1447,8 +1451,11 @@ sys_closefrom(struct proc *p, void *v, register_t *retval) return (EBADF); } - for (i = startfd; i <= fdp->fd_lastfile; i++) + for (i = startfd; i <= fdp->fd_lastfile; i++) { + /* fdrelease() unlocks fdp. */ fdrelease(p, i); + fdplock(fdp); + } fdpunlock(fdp); return (0); diff --git a/sys/kern/kern_exec.c b/sys/kern/kern_exec.c index 301d847f1c8..dedbe6fc73d 100644 --- a/sys/kern/kern_exec.c +++ b/sys/kern/kern_exec.c @@ -1,4 +1,4 @@ -/* $OpenBSD: kern_exec.c,v 1.206 2019/06/21 09:39:48 visa Exp $ */ +/* $OpenBSD: kern_exec.c,v 1.207 2019/07/15 04:11:03 visa Exp $ */ /* $NetBSD: kern_exec.c,v 1.75 1996/02/09 18:59:28 christos Exp $ */ /*- @@ -724,8 +724,8 @@ bad: if (pack.ep_flags & EXEC_HASFD) { pack.ep_flags &= ~EXEC_HASFD; fdplock(p->p_fd); + /* fdrelease unlocks p->p_fd. */ (void) fdrelease(p, pack.ep_fd); - fdpunlock(p->p_fd); } if (pack.ep_interp != NULL) pool_put(&namei_pool, pack.ep_interp); diff --git a/sys/kern/sys_pipe.c b/sys/kern/sys_pipe.c index 9fecf1b6df6..91df07fdcaf 100644 --- a/sys/kern/sys_pipe.c +++ b/sys/kern/sys_pipe.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sys_pipe.c,v 1.92 2019/07/14 10:21:11 semarie Exp $ */ +/* $OpenBSD: sys_pipe.c,v 1.93 2019/07/15 04:11:03 visa Exp $ */ /* * Copyright (c) 1996 John S. Dyson @@ -177,15 +177,18 @@ dopipe(struct proc *p, int *ufds, int flags) fdinsert(fdp, fds[1], cloexec, wf); error = copyout(fds, ufds, sizeof(fds)); - if (error != 0) { + if (error == 0) { + fdpunlock(fdp); +#ifdef KTRACE + if (KTRPOINT(p, KTR_STRUCT)) + ktrfds(p, fds, 2); +#endif + } else { + /* fdrelease() unlocks fdp. */ fdrelease(p, fds[0]); + fdplock(fdp); fdrelease(p, fds[1]); } -#ifdef KTRACE - else if (KTRPOINT(p, KTR_STRUCT)) - ktrfds(p, fds, 2); -#endif - fdpunlock(fdp); FRELE(rf, p); FRELE(wf, p); |