
From: Matt Mackall <mpm@selenic.com>

Doing the algebra:

c = (a - b) * 3/2
a' = a - c = a - 3/2(a - b) = (2a - 3a + 3b)/2 = (3b - a)/2
a' >= 0
3b - a >= 0
3b >= a
b >= a/3
nr_free_pages() >= mempages/3

We can indeed get into trouble if we try to load a large kernel on a very
small box (ie kernel reserves more than 2/3 of usable memory).  Surprisingly I
haven't hit this, but here's a fix.


---

 25-akpm/fs/dcache.c |    2 +-
 1 files changed, 1 insertion(+), 1 deletion(-)

diff -puN fs/dcache.c~cache-sizing-fix fs/dcache.c
--- 25/fs/dcache.c~cache-sizing-fix	Tue May 18 16:59:40 2004
+++ 25-akpm/fs/dcache.c	Tue May 18 16:59:40 2004
@@ -1633,7 +1633,7 @@ void __init vfs_caches_init(unsigned lon
 	/* Base hash sizes on available memory, with a reserve equal to
            150% of current kernel size */
 
-	reserve = (mempages - nr_free_pages()) * 3/2;
+	reserve = min((mempages - nr_free_pages()) * 3/2, mempages - 1);
 	mempages -= reserve;
 
 	names_cachep = kmem_cache_create("names_cache", PATH_MAX, 0,

_
