diff options
| author | ad <ad@NetBSD.org> | 2007-03-12 16:42:14 +0000 |
|---|---|---|
| committer | ad <ad@NetBSD.org> | 2007-03-12 16:42:14 +0000 |
| commit | 3fcdeca2cca4eac4cddca03ffd105472daba6166 (patch) | |
| tree | 318b5110d6a6a421010f5d793bf043c98d1227ea | |
| parent | 3eeb069c1fae83f6926a49684b88e33495484f65 (diff) | |
Use mutexes.
| -rw-r--r-- | sys/kern/kern_malloc.c | 44 |
1 files changed, 18 insertions, 26 deletions
diff --git a/sys/kern/kern_malloc.c b/sys/kern/kern_malloc.c index cbb10c14630..37c843a4cbf 100644 --- a/sys/kern/kern_malloc.c +++ b/sys/kern/kern_malloc.c @@ -1,4 +1,4 @@ -/* $NetBSD: kern_malloc.c,v 1.108 2007/03/04 06:03:05 christos Exp $ */ +/* $NetBSD: kern_malloc.c,v 1.109 2007/03/12 16:42:14 ad Exp $ */ /* * Copyright (c) 1987, 1991, 1993 @@ -66,7 +66,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: kern_malloc.c,v 1.108 2007/03/04 06:03:05 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: kern_malloc.c,v 1.109 2007/03/12 16:42:14 ad Exp $"); #include "opt_lockdebug.h" @@ -76,6 +76,7 @@ __KERNEL_RCSID(0, "$NetBSD: kern_malloc.c,v 1.108 2007/03/04 06:03:05 christos E #include <sys/malloc.h> #include <sys/systm.h> #include <sys/debug.h> +#include <sys/mutex.h> #include <uvm/uvm_extern.h> @@ -302,7 +303,7 @@ MALLOC_DEFINE(M_MRTABLE, "mrt", "multicast routing tables"); MALLOC_DEFINE(M_BWMETER, "bwmeter", "multicast upcall bw meters"); MALLOC_DEFINE(M_1394DATA, "1394data", "IEEE 1394 data buffers"); -struct simplelock malloc_slock = SIMPLELOCK_INITIALIZER; +kmutex_t malloc_lock; /* * Allocate a block of memory @@ -320,7 +321,6 @@ malloc(unsigned long size, struct malloc_type *ksp, int flags) struct kmemusage *kup; struct freelist *freep; long indx, npg, allocsize; - int s; char *va, *cp, *savedlist; #ifdef DIAGNOSTIC uint32_t *end, *lp; @@ -340,19 +340,17 @@ malloc(unsigned long size, struct malloc_type *ksp, int flags) #endif indx = BUCKETINDX(size); kbp = &kmembuckets[indx]; - s = splvm(); - simple_lock(&malloc_slock); + mutex_enter(&malloc_lock); #ifdef KMEMSTATS while (ksp->ks_memuse >= ksp->ks_limit) { if (flags & M_NOWAIT) { - simple_unlock(&malloc_slock); - splx(s); + mutex_exit(&malloc_lock); return ((void *) NULL); } if (ksp->ks_limblocks < 65535) ksp->ks_limblocks++; - ltsleep((void *)ksp, PSWP+2, ksp->ks_shortdesc, 0, - &malloc_slock); + mtsleep((void *)ksp, PSWP+2, ksp->ks_shortdesc, 0, + &malloc_lock); } ksp->ks_size |= 1 << indx; #endif @@ -366,7 +364,7 @@ malloc(unsigned long size, struct malloc_type *ksp, int flags) else allocsize = 1 << indx; npg = btoc(allocsize); - simple_unlock(&malloc_slock); + mutex_exit(&malloc_lock); va = (void *) uvm_km_alloc(kmem_map, (vsize_t)ctob(npg), 0, ((flags & M_NOWAIT) ? UVM_KMF_NOWAIT : 0) | @@ -383,10 +381,9 @@ malloc(unsigned long size, struct malloc_type *ksp, int flags) */ if ((flags & (M_NOWAIT|M_CANFAIL)) == 0) panic("malloc: out of space in kmem_map"); - splx(s); return (NULL); } - simple_lock(&malloc_slock); + mutex_enter(&malloc_lock); #ifdef KMEMSTATS kbp->kb_total += kbp->kb_elmpercl; #endif @@ -511,8 +508,7 @@ out: #ifdef MALLOCLOG domlog(va, size, ksp, 1, file, line); #endif - simple_unlock(&malloc_slock); - splx(s); + mutex_exit(&malloc_lock); if ((flags & M_ZERO) != 0) memset(va, 0, size); FREECHECK_OUT(&malloc_freecheck, (void *)va); @@ -534,7 +530,6 @@ free(void *addr, struct malloc_type *ksp) struct kmemusage *kup; struct freelist *freep; long size; - int s; #ifdef DIAGNOSTIC void *cp; int32_t *end, *lp; @@ -562,8 +557,7 @@ free(void *addr, struct malloc_type *ksp) kup = btokup(addr); size = 1 << kup->ku_indx; kbp = &kmembuckets[kup->ku_indx]; - s = splvm(); - simple_lock(&malloc_slock); + mutex_enter(&malloc_lock); #ifdef MALLOCLOG domlog(addr, 0, ksp, 2, file, line); #endif @@ -598,8 +592,7 @@ free(void *addr, struct malloc_type *ksp) ksp->ks_inuse--; kbp->kb_total -= 1; #endif - simple_unlock(&malloc_slock); - splx(s); + mutex_exit(&malloc_lock); return; } freep = (struct freelist *)addr; @@ -663,8 +656,7 @@ free(void *addr, struct malloc_type *ksp) ((struct freelist *)kbp->kb_last)->next = addr; freep->next = NULL; kbp->kb_last = addr; - simple_unlock(&malloc_slock); - splx(s); + mutex_exit(&malloc_lock); } /* @@ -839,11 +831,9 @@ void malloc_type_setlimit(struct malloc_type *type, u_long limit) { #ifdef KMEMSTATS - int s; - - s = splvm(); + mutex_enter(&malloc_lock); type->ks_limit = limit; - splx(s); + mutex_exit(&malloc_lock); #endif } @@ -901,6 +891,8 @@ kmeminit(void) if (sizeof(struct freelist) > (1 << MINBUCKET)) panic("minbucket too small/struct freelist too big"); + mutex_init(&malloc_lock, MUTEX_DRIVER, IPL_VM); + /* * Compute the number of kmem_map pages, if we have not * done so already. |
