tech-kern 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



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