NetBSD-Bugs archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: kern/38019: some kind of undetected deadlock slowly kills NetBSD-4.0_STABLE GENERIC.MP
The following reply was made to PR kern/38019; it has been noted by GNATS.
From: "Greg A. Woods" <woods%planix.com@localhost>
To: NetBSD GNATS <gnats-bugs%NetBSD.org@localhost>
Cc: NetBSD Kernel Technical Discussion List <tech-kern%NetBSD.org@localhost>,
NetBSD/i386 Discussion List <port-i386%NetBSD.org@localhost>,
YAMAMOTO Takashi <yamt%NetBSD.org@localhost>
Subject: Re: kern/38019: some kind of undetected deadlock slowly kills
NetBSD-4.0_STABLE GENERIC.MP
Date: Sat, 05 Apr 2008 12:56:13 -0400
At Fri, 04 Apr 2008 15:16:31 -0400, Me-planix.com wrote:
Subject: Re: kern/38019: some kind of undetected deadlock slowly kills
NetBSD-4.0_STABLE GENERIC.MP
>
> I was going though an old 3.0 kernel config for a client machine,
> preparing to build it on the netbsd-4 and noted that I had applied the
> 3.0 LAST_MINUTE hack to adjust KERNBASE_LOCORE as that machine has 4GB
> of RAM. Remembering this, noting that my PE2650 also has 4GB of RAM,
> and given that the last few hangs always show processes stuck in
> vmmapva, I've begun to wonder if maybe this hack might still be
> necessary in netbsd-4 too.
Is it possible that the following changes may correct the possible
lockups caused by KVA exhaustion on large-RAM machines without requiring
hacks to KERNBASE and/or manual manipulation of the various tunable
limits such as vm.bufmem_hiwater? If so I would like to request that
these changes (and any others which are pre- or co-requisite) be pulled
up to netbsd-4. If desired I can pre-test the pull-up(s) on my machine.
FYI, on my machine right now, after it has once again survived a near
miraculous three days and nights without locking up while running the
wrstuden-fixsa kernel (without any change to KERNBASE), I observe the
following:
12:01 [2051] # sysctl vm
vm.loadavg: 6.21 3.31 3.56
vm.nkmempages = 32768
vm.maxslp = 20
vm.uspace = 12288
vm.idlezero = 0
vm.anonmin = 40
vm.filemin = 5
vm.execmin = 40
vm.anonmax = 80
vm.filemax = 50
vm.execmax = 50
vm.inactivepct = 33
vm.bufcache = 15
vm.bufmem = 333012992
vm.bufmem_lowater = 75486720
vm.bufmem_hiwater = 603893760
----------------------------
revision 1.193
date: 2008/03/25 23:21:43; author: yamt; state: Exp; lines: +9 -3
- for some ports, especially for ones without pmap_growkernel,
buf_memcalc is used by bootstrap as well. fix NULL dereference for them.
- limit kva usage for each cache to 20% of vm_map. XXX a bit arbitrary.
- add a comment.
----------------------------
revision 1.192
date: 2008/03/23 10:39:52; author: yamt; state: Exp; lines: +9 -9
when calculating some cache sizes, consider the amount of available kva.
PR/33185.
----------------------------
Index: sys/kern/vfs_bio.c
===================================================================
RCS file: /cvs/master/m-NetBSD/main/src/sys/kern/vfs_bio.c,v
retrieving revision 1.191
retrieving revision 1.193
diff -u -r1.191 -r1.193
--- sys/kern/vfs_bio.c 23 Mar 2008 10:33:15 -0000 1.191
+++ sys/kern/vfs_bio.c 25 Mar 2008 23:21:43 -0000 1.193
@@ -1,4 +1,4 @@
-/* $NetBSD: vfs_bio.c,v 1.191 2008/03/23 10:33:15 yamt Exp $ */
+/* $NetBSD: vfs_bio.c,v 1.193 2008/03/25 23:21:43 yamt Exp $ */
/*-
* Copyright (c) 2007 The NetBSD Foundation, Inc.
@@ -114,7 +114,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: vfs_bio.c,v 1.191 2008/03/23 10:33:15 yamt Exp
$");
+__KERNEL_RCSID(0, "$NetBSD: vfs_bio.c,v 1.193 2008/03/25 23:21:43 yamt Exp
$");
#include "fs_ffs.h"
#include "opt_bufcache.h"
@@ -388,6 +388,10 @@
}
}
+/*
+ * note that for some ports this is used by pmap bootstrap code to
+ * determine kva size.
+ */
u_long
buf_memcalc(void)
{
@@ -413,7 +417,9 @@
printf("forcing bufcache %d -> 95", bufcache);
bufcache = 95;
}
- n = physmem / 100 * bufcache;
+ n = calc_cache_size(buf_map, bufcache,
+ (buf_map != kernel_map) ? 100 : BUFCACHE_VA_MAXPCT)
+ / PAGE_SIZE;
}
n <<= PAGE_SHIFT;
@@ -437,12 +443,6 @@
mutex_init(&buffer_lock, MUTEX_DEFAULT, IPL_NONE);
cv_init(&needbuffer_cv, "needbuf");
- /*
- * Initialize buffer cache memory parameters.
- */
- bufmem = 0;
- buf_setwm();
-
if (bufmem_valimit != 0) {
vaddr_t minaddr = 0, maxaddr;
buf_map = uvm_km_suballoc(kernel_map, &minaddr, &maxaddr,
@@ -452,6 +452,12 @@
} else
buf_map = kernel_map;
+ /*
+ * Initialize buffer cache memory parameters.
+ */
+ bufmem = 0;
+ buf_setwm();
+
/* On "small" machines use small pool page sizes where possible */
use_std = (physmem < atop(16*1024*1024));
--
Greg A. Woods
Planix, Inc.
<woods%planix.com@localhost> +1 416 489-5852 x122
http://www.planix.com/
Home |
Main Index |
Thread Index |
Old Index