
From: "Chen, Kenneth W" <kenneth.w.chen@intel.com>

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 {

_
