summaryrefslogtreecommitdiff
path: root/sys/kern/kern_malloc.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/kern/kern_malloc.c')
-rw-r--r--sys/kern/kern_malloc.c15
1 files changed, 10 insertions, 5 deletions
diff --git a/sys/kern/kern_malloc.c b/sys/kern/kern_malloc.c
index 974da0ac31c..1998ba8022b 100644
--- a/sys/kern/kern_malloc.c
+++ b/sys/kern/kern_malloc.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: kern_malloc.c,v 1.30 2001/05/14 07:01:37 angelos Exp $ */
+/* $OpenBSD: kern_malloc.c,v 1.31 2001/05/14 08:03:13 angelos Exp $ */
/* $NetBSD: kern_malloc.c,v 1.15.4.2 1996/06/13 17:10:56 cgd Exp $ */
/*
@@ -63,6 +63,7 @@ int buckstring_init = 0;
#if defined(KMEMSTATS) || defined(DIAGNOSTIC) || defined(FFS_SOFTUPDATES)
char *memname[] = INITKMEMNAMES;
char *memall = NULL;
+extern struct lock sysctl_kmemlock;
#endif
#ifdef MALLOC_DEBUG
@@ -477,13 +478,14 @@ kmeminit()
* Return kernel malloc statistics information.
*/
int
-sysctl_malloc(name, namelen, oldp, oldlenp, newp, newlen)
+sysctl_malloc(name, namelen, oldp, oldlenp, newp, newlen, p)
int *name;
u_int namelen;
void *oldp;
size_t *oldlenp;
void *newp;
size_t newlen;
+ struct proc *p;
{
struct kmembuckets kb;
int i, siz;
@@ -525,15 +527,17 @@ sysctl_malloc(name, namelen, oldp, oldlenp, newp, newlen)
if (memall == NULL) {
int totlen;
+ i = lockmgr(&sysctl_kmemlock, LK_EXCLUSIVE, NULL, p);
+ if (i)
+ return (i);
+
/* Figure out how large a buffer we need */
for (totlen = 0, i = 0; i < M_LAST; i++) {
if (memname[i])
totlen += strlen(memname[i]);
totlen++;
}
- memall = malloc(totlen + M_LAST, M_SYSCTL, M_NOWAIT);
- if (memall == NULL)
- return (ENOMEM);
+ memall = malloc(totlen + M_LAST, M_SYSCTL, M_WAITOK);
bzero(memall, totlen + M_LAST);
for (siz = 0, i = 0; i < M_LAST; i++)
siz += sprintf(memall + siz, "%s,",
@@ -547,6 +551,7 @@ sysctl_malloc(name, namelen, oldp, oldlenp, newp, newlen)
for (i = 0; i < totlen; i++)
if (memall[i] == ' ')
memall[i] = '_';
+ lockmgr(&sysctl_kmemlock, LK_RELEASE, NULL, p);
}
return (sysctl_rdstring(oldp, oldlenp, newp, memall));
#else