mm: add a low limit to alloc_large_system_hash

UDP stack needs a minimum hash size value for proper operation and also
uses alloc_large_system_hash() for proper NUMA distribution of its hash
tables and automatic sizing depending on available system memory.

On some low memory situations, udp_table_init() must ignore the
alloc_large_system_hash() result and reallocs a bigger memory area.

As we cannot easily free old hash table, we leak it and kmemleak can
issue a warning.

This patch adds a low limit parameter to alloc_large_system_hash() to
solve this problem.

We then specify UDP_HTABLE_SIZE_MIN for UDP/UDPLite hash table
allocation.

Reported-by: Mark Asselstine <[email protected]>
Reported-by: Tim Bird <[email protected]>
Signed-off-by: Eric Dumazet <[email protected]>
Cc: Paul Gortmaker <[email protected]>
Signed-off-by: David S. Miller <[email protected]>
This commit is contained in:
Tim Bird 2012-05-23 13:33:35 +00:00 • committed by David S. Miller
commit 31fe62b958
8 changed files with 26 additions and 24 deletions

View file

@ -1647,6 +1647,7 @@ void __init inode_init_early(void)
HASH_EARLY,
&i_hash_shift,
&i_hash_mask,
0,
0);
for (loop = 0; loop < (1U << i_hash_shift); loop++)
@ -1677,6 +1678,7 @@ void __init inode_init(void)
0,
&i_hash_shift,
&i_hash_mask,
0,
0);
for (loop = 0; loop < (1U << i_hash_shift); loop++)