summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorart <art@openbsd.org>2007-01-12 07:41:31 +0000
committerart <art@openbsd.org>2007-01-12 07:41:31 +0000
commit578c962dd661142b06d2d01c05e85d57bbf554d3 (patch)
treeab265433c23b7a4a0a9fac0a3ba7d8eb9778ff1e
parentNote that only rev A of the DUB-E100 works for now. (diff)
downloadwireguard-openbsd-578c962dd661142b06d2d01c05e85d57bbf554d3.tar.xz
wireguard-openbsd-578c962dd661142b06d2d01c05e85d57bbf554d3.zip
Switch some lockmgr locks to rwlocks.
In this commit: - gdt lock on amd64 - sysctl lock - malloc sysctl lock - disk sysctl lock - swap syscall lock miod@, pedro@ ok (and "looks good" others@)
-rw-r--r--sys/arch/amd64/amd64/gdt.c16
-rw-r--r--sys/kern/init_main.c5
-rw-r--r--sys/kern/kern_malloc.c9
-rw-r--r--sys/kern/kern_sysctl.c30
-rw-r--r--sys/sys/sysctl.h4
-rw-r--r--sys/uvm/uvm_swap.c9
6 files changed, 26 insertions, 47 deletions
diff --git a/sys/arch/amd64/amd64/gdt.c b/sys/arch/amd64/amd64/gdt.c
index 9a72648bfec..d0e3c9ba852 100644
--- a/sys/arch/amd64/amd64/gdt.c
+++ b/sys/arch/amd64/amd64/gdt.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: gdt.c,v 1.7 2005/11/19 02:18:00 pedro Exp $ */
+/* $OpenBSD: gdt.c,v 1.8 2007/01/12 07:41:31 art Exp $ */
/* $NetBSD: gdt.c,v 1.1 2003/04/26 18:39:28 fvdl Exp $ */
/*-
@@ -47,7 +47,7 @@
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/proc.h>
-#include <sys/lock.h>
+#include <sys/rwlock.h>
#include <sys/user.h>
#include <uvm/uvm.h>
@@ -60,7 +60,7 @@ int gdt_dynavail;
int gdt_next; /* next available slot for sweeping */
int gdt_free; /* next free slot; terminated with GNULL_SEL */
-struct lock gdt_lock_store;
+struct rwlock gdt_lock_store = RWLOCK_INITIALIZER;
static __inline void gdt_lock(void);
static __inline void gdt_unlock(void);
@@ -79,17 +79,17 @@ void gdt_put_slot(int);
* reclaim it.
*/
static __inline void
-gdt_lock()
+gdt_lock(void)
{
if (curproc != NULL) /* XXX - ugh. needed for startup */
- (void) lockmgr(&gdt_lock_store, LK_EXCLUSIVE, NULL);
+ rw_enter_write(&gdt_lock_store);
}
static __inline void
-gdt_unlock()
+gdt_unlock(void)
{
if (curproc != NULL)
- (void) lockmgr(&gdt_lock_store, LK_RELEASE, NULL);
+ rw_exit_write(&gdt_lock_store);
}
void
@@ -144,8 +144,6 @@ gdt_init()
vaddr_t va;
struct cpu_info *ci = &cpu_info_primary;
- lockinit(&gdt_lock_store, PZERO, "gdtlck", 0, 0);
-
gdt_size = MINGDTSIZ;
gdt_dyncount = 0;
gdt_next = 0;
diff --git a/sys/kern/init_main.c b/sys/kern/init_main.c
index 2d7476686d4..2d90604ff43 100644
--- a/sys/kern/init_main.c
+++ b/sys/kern/init_main.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: init_main.c,v 1.133 2007/01/02 06:07:58 drahn Exp $ */
+/* $OpenBSD: init_main.c,v 1.134 2007/01/12 07:41:31 art Exp $ */
/* $NetBSD: init_main.c,v 1.84.4.1 1996/06/02 09:08:06 mrg Exp $ */
/*
@@ -230,9 +230,6 @@ main(void *framep)
/* Initialize sockets. */
soinit();
- /* Initialize sysctls (must be done before any processes run) */
- sysctl_init();
-
/*
* Initialize process and pgrp structures.
*/
diff --git a/sys/kern/kern_malloc.c b/sys/kern/kern_malloc.c
index b577c483de4..19192639294 100644
--- a/sys/kern/kern_malloc.c
+++ b/sys/kern/kern_malloc.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: kern_malloc.c,v 1.65 2006/11/28 11:14:52 pedro Exp $ */
+/* $OpenBSD: kern_malloc.c,v 1.66 2007/01/12 07:41:31 art Exp $ */
/* $NetBSD: kern_malloc.c,v 1.15.4.2 1996/06/13 17:10:56 cgd Exp $ */
/*
@@ -39,6 +39,7 @@
#include <sys/systm.h>
#include <sys/sysctl.h>
#include <sys/time.h>
+#include <sys/rwlock.h>
#include <uvm/uvm_extern.h>
@@ -82,7 +83,7 @@ int buckstring_init = 0;
#if defined(KMEMSTATS) || defined(DIAGNOSTIC) || defined(FFS_SOFTUPDATES)
char *memname[] = INITKMEMNAMES;
char *memall = NULL;
-extern struct lock sysctl_kmemlock;
+struct rwlock sysctl_kmemlock = RWLOCK_INITIALIZER;
#endif
#ifdef DIAGNOSTIC
@@ -585,7 +586,7 @@ sysctl_malloc(int *name, u_int namelen, void *oldp, size_t *oldlenp, void *newp,
if (memall == NULL) {
int totlen;
- i = lockmgr(&sysctl_kmemlock, LK_EXCLUSIVE, NULL);
+ i = rw_enter(&sysctl_kmemlock, RW_WRITE|RW_INTR);
if (i)
return (i);
@@ -611,7 +612,7 @@ sysctl_malloc(int *name, u_int namelen, void *oldp, size_t *oldlenp, void *newp,
for (i = 0; i < totlen; i++)
if (memall[i] == ' ')
memall[i] = '_';
- lockmgr(&sysctl_kmemlock, LK_RELEASE, NULL);
+ rw_exit_write(&sysctl_kmemlock);
}
return (sysctl_rdstring(oldp, oldlenp, newp, memall));
#else
diff --git a/sys/kern/kern_sysctl.c b/sys/kern/kern_sysctl.c
index 65f086f229e..d40e173d43f 100644
--- a/sys/kern/kern_sysctl.c
+++ b/sys/kern/kern_sysctl.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: kern_sysctl.c,v 1.146 2006/12/23 17:41:26 deraadt Exp $ */
+/* $OpenBSD: kern_sysctl.c,v 1.147 2007/01/12 07:41:31 art Exp $ */
/* $NetBSD: kern_sysctl.c,v 1.17 1996/05/20 17:49:05 mrg Exp $ */
/*-
@@ -111,22 +111,8 @@ int perflevel = 100;
* Lock to avoid too many processes vslocking a large amount of memory
* at the same time.
*/
-struct lock sysctl_lock, sysctl_disklock;
-
-#if defined(KMEMSTATS) || defined(DIAGNOSTIC) || defined(FFS_SOFTUPDATES)
-struct lock sysctl_kmemlock;
-#endif
-
-void
-sysctl_init(void)
-{
- lockinit(&sysctl_lock, PLOCK|PCATCH, "sysctl", 0, 0);
- lockinit(&sysctl_disklock, PLOCK|PCATCH, "sysctl_disklock", 0, 0);
-
-#if defined(KMEMSTATS) || defined(DIAGNOSTIC) || defined(FFS_SOFTUPDATES)
- lockinit(&sysctl_kmemlock, PLOCK|PCATCH, "sysctl_kmemlock", 0, 0);
-#endif
-}
+struct rwlock sysctl_lock = RWLOCK_INITIALIZER;
+struct rwlock sysctl_disklock = RWLOCK_INITIALIZER;
int
sys___sysctl(struct proc *p, void *v, register_t *retval)
@@ -199,13 +185,13 @@ sys___sysctl(struct proc *p, void *v, register_t *retval)
(error = copyin(SCARG(uap, oldlenp), &oldlen, sizeof(oldlen))))
return (error);
if (SCARG(uap, old) != NULL) {
- if ((error = lockmgr(&sysctl_lock, LK_EXCLUSIVE, NULL)) != 0)
+ if ((error = rw_enter(&sysctl_lock, RW_WRITE|RW_INTR)) != 0)
return (error);
if (dolock) {
error = uvm_vslock(p, SCARG(uap, old), oldlen,
VM_PROT_READ|VM_PROT_WRITE);
if (error) {
- lockmgr(&sysctl_lock, LK_RELEASE, NULL);
+ rw_exit_write(&sysctl_lock);
return (error);
}
}
@@ -216,7 +202,7 @@ sys___sysctl(struct proc *p, void *v, register_t *retval)
if (SCARG(uap, old) != NULL) {
if (dolock)
uvm_vsunlock(p, SCARG(uap, old), savelen);
- lockmgr(&sysctl_lock, LK_RELEASE, NULL);
+ rw_exit_write(&sysctl_lock);
}
if (error)
return (error);
@@ -1577,7 +1563,7 @@ sysctl_diskinit(int update, struct proc *p)
struct disk *dk;
int i, tlen, l;
- if ((i = lockmgr(&sysctl_disklock, LK_EXCLUSIVE, NULL)) != 0)
+ if ((i = rw_enter(&sysctl_disklock, RW_WRITE|RW_INTR)) != 0)
return i;
if (disk_change) {
@@ -1638,7 +1624,7 @@ sysctl_diskinit(int update, struct proc *p)
sdk->ds_time = dk->dk_time;
}
}
- lockmgr(&sysctl_disklock, LK_RELEASE, NULL);
+ rw_exit_write(&sysctl_disklock);
return 0;
}
diff --git a/sys/sys/sysctl.h b/sys/sys/sysctl.h
index fc140c0adc5..0f11b02c58c 100644
--- a/sys/sys/sysctl.h
+++ b/sys/sys/sysctl.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: sysctl.h,v 1.89 2006/12/12 23:14:28 dim Exp $ */
+/* $OpenBSD: sysctl.h,v 1.90 2007/01/12 07:41:31 art Exp $ */
/* $NetBSD: sysctl.h,v 1.16 1996/04/09 20:55:36 cgd Exp $ */
/*
@@ -726,8 +726,6 @@ extern void (*cpu_setperf)(int);
int bpf_sysctl(int *, u_int, void *, size_t *, void *, size_t);
-void sysctl_init(void);
-
#else /* !_KERNEL */
#include <sys/cdefs.h>
diff --git a/sys/uvm/uvm_swap.c b/sys/uvm/uvm_swap.c
index 27548b8cb95..ffdaf3b2025 100644
--- a/sys/uvm/uvm_swap.c
+++ b/sys/uvm/uvm_swap.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: uvm_swap.c,v 1.66 2006/10/03 19:49:06 pedro Exp $ */
+/* $OpenBSD: uvm_swap.c,v 1.67 2007/01/12 07:41:31 art Exp $ */
/* $NetBSD: uvm_swap.c,v 1.40 2000/11/17 11:39:39 mrg Exp $ */
/*
@@ -227,7 +227,7 @@ LIST_HEAD(swap_priority, swappri);
static struct swap_priority swap_priority;
/* locks */
-lock_data_t swap_syscall_lock;
+struct rwlock swap_syscall_lock = RWLOCK_INITIALIZER;
/*
* prototypes
@@ -279,7 +279,6 @@ uvm_swap_init()
LIST_INIT(&swap_priority);
uvmexp.nswapdev = 0;
- lockinit(&swap_syscall_lock, PVM, "swapsys", 0, 0);
simple_lock_init(&uvm.swap_data_lock);
if (!swapdev_vp && bdevvp(swapdev, &swapdev_vp))
@@ -638,7 +637,7 @@ sys_swapctl(p, v, retval)
/*
* ensure serialized syscall access by grabbing the swap_syscall_lock
*/
- lockmgr(&swap_syscall_lock, LK_EXCLUSIVE, NULL);
+ rw_enter_write(&swap_syscall_lock);
/*
* we handle the non-priv NSWAP and STATS request first.
@@ -877,7 +876,7 @@ sys_swapctl(p, v, retval)
vput(vp);
out:
- lockmgr(&swap_syscall_lock, LK_RELEASE, NULL);
+ rw_exit_write(&swap_syscall_lock);
UVMHIST_LOG(pdhist, "<- done! error=%ld", error, 0, 0, 0);
return (error);