diff options
author | 2007-01-12 07:41:31 +0000 | |
---|---|---|
committer | 2007-01-12 07:41:31 +0000 | |
commit | 578c962dd661142b06d2d01c05e85d57bbf554d3 (patch) | |
tree | ab265433c23b7a4a0a9fac0a3ba7d8eb9778ff1e | |
parent | Note that only rev A of the DUB-E100 works for now. (diff) | |
download | wireguard-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.c | 16 | ||||
-rw-r--r-- | sys/kern/init_main.c | 5 | ||||
-rw-r--r-- | sys/kern/kern_malloc.c | 9 | ||||
-rw-r--r-- | sys/kern/kern_sysctl.c | 30 | ||||
-rw-r--r-- | sys/sys/sysctl.h | 4 | ||||
-rw-r--r-- | sys/uvm/uvm_swap.c | 9 |
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); |