From: Matt Mackall 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, _