summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authortedu <tedu@openbsd.org>2016-07-28 16:08:56 +0000
committertedu <tedu@openbsd.org>2016-07-28 16:08:56 +0000
commitfe1c35d79003f57aff393aad6c7fa5c4b5e03e15 (patch)
tree91a127bc557d8e11f2788c62dd21bdd1ce6cf45a
parentUse long labs(3) for pointer arithmetic. (diff)
downloadwireguard-openbsd-fe1c35d79003f57aff393aad6c7fa5c4b5e03e15.tar.xz
wireguard-openbsd-fe1c35d79003f57aff393aad6c7fa5c4b5e03e15.zip
replace hand rolled physlock with real rwlock. ok mlarkin
-rw-r--r--sys/arch/i386/i386/mem.c20
1 files changed, 7 insertions, 13 deletions
diff --git a/sys/arch/i386/i386/mem.c b/sys/arch/i386/i386/mem.c
index 0cd086e0c97..513bc97b48a 100644
--- a/sys/arch/i386/i386/mem.c
+++ b/sys/arch/i386/i386/mem.c
@@ -1,5 +1,5 @@
/* $NetBSD: mem.c,v 1.31 1996/05/03 19:42:19 christos Exp $ */
-/* $OpenBSD: mem.c,v 1.47 2015/09/08 07:12:56 deraadt Exp $ */
+/* $OpenBSD: mem.c,v 1.48 2016/07/28 16:08:56 tedu Exp $ */
/*
* Copyright (c) 1988 University of Utah.
* Copyright (c) 1982, 1986, 1990, 1993
@@ -48,6 +48,7 @@
#include <sys/malloc.h>
#include <sys/memrange.h>
#include <sys/fcntl.h>
+#include <sys/rwlock.h>
#include <machine/cpu.h>
#include <machine/conf.h>
@@ -119,18 +120,13 @@ mmrw(dev_t dev, struct uio *uio, int flags)
size_t c;
struct iovec *iov;
int error = 0;
- static int physlock;
+ static struct rwlock physlock = RWLOCK_INITIALIZER("mmrw");
if (minor(dev) == 0) {
/* lock against other uses of shared vmmap */
- while (physlock > 0) {
- physlock++;
- error = tsleep((caddr_t)&physlock, PZERO | PCATCH,
- "mmrw", 0);
- if (error)
- return (error);
- }
- physlock = 1;
+ error = rw_enter(&physlock, RW_WRITE | RW_INTR);
+ if (error)
+ return (error);
}
while (uio->uio_resid > 0 && error == 0) {
iov = uio->uio_iov;
@@ -197,9 +193,7 @@ mmrw(dev_t dev, struct uio *uio, int flags)
uio->uio_resid -= c;
}
if (minor(dev) == 0) {
- if (physlock > 1)
- wakeup((caddr_t)&physlock);
- physlock = 0;
+ rw_exit(&physlock);
}
return (error);
}