From: "Chen, Kenneth W" To address Anton's concerns on PPC64, we have revised the patch to enforce maximum size base on number of entry instead of page order. So calculation. The upper bound is capped at 2M. All numbers on x86 remain the same as we don't want to disturb already established and working number. --- 25-akpm/fs/dcache.c | 7 ++++--- 25-akpm/fs/inode.c | 7 ++++--- 2 files changed, 8 insertions(+), 6 deletions(-) diff -puN fs/dcache.c~limit-hash-table-size-2 fs/dcache.c --- 25/fs/dcache.c~limit-hash-table-size-2 Wed Jan 14 14:53:03 2004 +++ 25-akpm/fs/dcache.c Wed Jan 14 14:53:03 2004 @@ -49,6 +49,7 @@ static kmem_cache_t *dentry_cache; */ #define D_HASHBITS d_hash_shift #define D_HASHMASK d_hash_mask +#define D_HASHMAX (2*1024*1024UL) /* max number of entries */ static unsigned int d_hash_mask; static unsigned int d_hash_shift; @@ -1552,9 +1553,9 @@ static void __init dcache_init(unsigned set_shrinker(DEFAULT_SEEKS, shrink_dcache_memory); - mempages >>= 1; - mempages *= sizeof(struct hlist_head); - for (order = 0; (order < 10) && (((1UL << order) << PAGE_SHIFT) < mempages); order++) + mempages = (mempages << PAGE_SHIFT) >> 13; + mempages = min(D_HASHMAX, mempages) * sizeof(struct hlist_head); + for (order = 0; ((1UL << order) << PAGE_SHIFT) < mempages; order++) ; do { diff -puN fs/inode.c~limit-hash-table-size-2 fs/inode.c --- 25/fs/inode.c~limit-hash-table-size-2 Wed Jan 14 14:53:03 2004 +++ 25-akpm/fs/inode.c Wed Jan 14 14:53:03 2004 @@ -53,6 +53,7 @@ */ #define I_HASHBITS i_hash_shift #define I_HASHMASK i_hash_mask +#define I_HASHMAX (2*1024*1024UL) /* max number of entries */ static unsigned int i_hash_mask; static unsigned int i_hash_shift; @@ -1325,9 +1326,9 @@ void __init inode_init(unsigned long mem for (i = 0; i < ARRAY_SIZE(i_wait_queue_heads); i++) init_waitqueue_head(&i_wait_queue_heads[i].wqh); - mempages >>= 2; - mempages *= sizeof(struct hlist_head); - for (order = 0; (order < 10) && (((1UL << order) << PAGE_SHIFT) < mempages); order++) + mempages = (mempages << PAGE_SHIFT) >> 14; + mempages = min(I_HASHMAX, mempages) * sizeof(struct hlist_head); + for (order = 0; ((1UL << order) << PAGE_SHIFT) < mempages; order++) ; do { _