summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorvisa <visa@openbsd.org>2019-07-15 04:11:03 +0000
committervisa <visa@openbsd.org>2019-07-15 04:11:03 +0000
commit8994f64af411fc832c7f1ee3934cc414321f1e81 (patch)
tree1661d715021b879f81d9287839e05c7488543130
parentsync (diff)
downloadwireguard-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.c4
-rw-r--r--sys/kern/kern_descrip.c21
-rw-r--r--sys/kern/kern_exec.c4
-rw-r--r--sys/kern/sys_pipe.c17
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);