Limit hash table size
Quoted 8 lines
Why cant we do something like Andrews recent
min_free_kbytespatch and make the rate of change non linear. Just slow the increase down as we get bigger. I agree a 2GB hashtable is pretty ludicrous, but a 4MB one on a 512GB machine (which we sell at the moment) could be too :)
What about making the limit configurable with a boot time parameter? If someone uses a 512 GB ppc64 as an nfs server, he might want a 2 GB inode hash.
--
Manfred
// $Header$
// Kernel Version:
// VERSION = 2 // PATCHLEVEL = 6 // SUBLEVEL = 0 // EXTRAVERSION = -test11
fs/inode.c +24 -2
@@ -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++) ;
fs/dcache.c +24 -2
@@ -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++) ;