summaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authorad <ad@NetBSD.org>2007-03-12 16:42:14 +0000
committerad <ad@NetBSD.org>2007-03-12 16:42:14 +0000
commit3fcdeca2cca4eac4cddca03ffd105472daba6166 (patch)
tree318b5110d6a6a421010f5d793bf043c98d1227ea /sys
parent3eeb069c1fae83f6926a49684b88e33495484f65 (diff)
Use mutexes.
Diffstat (limited to 'sys')
-rw-r--r--sys/kern/kern_malloc.c44
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.