Use mutexes.

This commit is contained in:
ad 2007-03-12 16:42:14 +00:00
parent 3eeb069c1f
commit 3fcdeca2cc
1 changed files with 18 additions and 26 deletions

View File

@ -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.