Sanely size hash tables when using large base pages. take 2.
Subsystems (2)
PATCH 1/1 Sanely size hash tables when using large base pages. take 2.
This is a resubmission of the earlier patch with the pidhash bits dropped.
At the moment the inode/dentry cache hash tables (common by way of alloc_large_system_hash()) are incorrectly sized by their respective detection logic when we attempt to use large base pages on systems with little memory.
This results in odd behaviour when using a 64kB PAGE_SIZE, such as:
Dentry cache hash table entries: 8192 (order: -1, 32768 bytes) Inode-cache hash table entries: 4096 (order: -2, 16384 bytes)
The mount cache hash table is seemingly the only one that gets this right by directly taking PAGE_SIZE in to account.
The following patch attempts to catch the bogus values and round it up to at least 0-order.
--
mm/page_alloc.c | 4 ++++ 1 file changed, 4 insertions(+)
mm/page_alloc.c +4 -0
@@ -3321,6 +3321,10 @@ void *__init alloc_large_system_hash(con numentries >>= (scale -PAGE_SHIFT ); else numentries <<= (PAGE_SHIFT - scale); + +/* Make sure we've got at least a 0-order allocation.. */ +if (unlikely ((numentries * bucketsize) <PAGE_SIZE )) + numentries =PAGE_SIZE / bucketsize; } numentries =roundup_pow_of_two (numentries);
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>