--- 2.6/fs/inode.c 2003-11-29 09:46:34.000000000 +0100 +++ build-2.6/fs/inode.c 2003-11-29 10:19:21.000000000 +0100 @@ -1327,6 +1327,20 @@ wake_up_all(wq); } +static __initdata int ihash_entries; + +static int __init set_ihash_entries(char *str) +{ + get_option(&str, &ihash_entries); + if (ihash_entries <= 0) { + ihash_entries = 0; + return 0; + } + return 1; +} + +__setup("ihash_entries=", set_ihash_entries); + /* * Initialize the waitqueues and inode hash table. */ @@ -1340,8 +1354,16 @@ for (i = 0; i < ARRAY_SIZE(i_wait_queue_heads); i++) init_waitqueue_head(&i_wait_queue_heads[i].wqh); - mempages >>= (14 - PAGE_SHIFT); - mempages *= sizeof(struct hlist_head); + if (!ihash_entries) { + ihash_entries = mempages >> (14 - PAGE_SHIFT); + /* Limit inode hash size. Override for nfs servers + * that handle lots of files. + */ + if (ihash_entries > 1024*1024) + ihash_entries = 1024*1024; + } + + mempages = ihash_entries*sizeof(struct hlist_head); for (order = 0; ((1UL << order) << PAGE_SHIFT) < mempages; order++) ; --- 2.6/fs/dcache.c 2003-11-29 09:46:34.000000000 +0100 +++ build-2.6/fs/dcache.c 2003-11-29 10:53:15.000000000 +0100 @@ -1546,6 +1546,20 @@ return ino; } +static __initdata int dhash_entries; + +static int __init set_dhash_entries(char *str) +{ + get_option(&str, &dhash_entries); + if (dhash_entries <= 0) { + dhash_entries = 0; + return 0; + } + return 1; +} + +__setup("dhash_entries=", set_dhash_entries); + static void __init dcache_init(unsigned long mempages) { struct hlist_head *d; @@ -1571,10 +1585,18 @@ set_shrinker(DEFAULT_SEEKS, shrink_dcache_memory); + if (!dhash_entries) { #if PAGE_SHIFT < 13 - mempages >>= (13 - PAGE_SHIFT); + mempages >>= (13 - PAGE_SHIFT); #endif - mempages *= sizeof(struct hlist_head); + dhash_entries = mempages; + /* 8 mio is enough for general purpose systems. + * For file servers, override with "dhash_entries=" + */ + if (dhash_entries > 8*1024*1024) + dhash_entries = 8*1024*1024; + } + mempages = dhash_entries*sizeof(struct hlist_head); for (order = 0; ((1UL << order) << PAGE_SHIFT) < mempages; order++) ;