diff options
author | Tim Bird <tim.bird@am.sony.com> | 2012-05-23 09:33:35 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2012-05-24 00:28:21 -0400 |
commit | 31fe62b9586643953f0c0c37a6357dafc69034e2 (patch) | |
tree | 69f9990423969df4ecbaea9d1e8de748284bea5e /mm/page_alloc.c | |
parent | d0a24a3516fb36023bef28d2355fa34e7f32029f (diff) |
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 <mark.asselstine@windriver.com>
Reported-by: Tim Bird <tim.bird@am.sony.com>
Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
Cc: Paul Gortmaker <paul.gortmaker@windriver.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'mm/page_alloc.c')
-rw-r--r-- | mm/page_alloc.c | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 918330f71dba..b7af568f0ed9 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c | |||
@@ -5242,9 +5242,10 @@ void *__init alloc_large_system_hash(const char *tablename, | |||
5242 | int flags, | 5242 | int flags, |
5243 | unsigned int *_hash_shift, | 5243 | unsigned int *_hash_shift, |
5244 | unsigned int *_hash_mask, | 5244 | unsigned int *_hash_mask, |
5245 | unsigned long limit) | 5245 | unsigned long low_limit, |
5246 | unsigned long high_limit) | ||
5246 | { | 5247 | { |
5247 | unsigned long long max = limit; | 5248 | unsigned long long max = high_limit; |
5248 | unsigned long log2qty, size; | 5249 | unsigned long log2qty, size; |
5249 | void *table = NULL; | 5250 | void *table = NULL; |
5250 | 5251 | ||
@@ -5282,6 +5283,8 @@ void *__init alloc_large_system_hash(const char *tablename, | |||
5282 | } | 5283 | } |
5283 | max = min(max, 0x80000000ULL); | 5284 | max = min(max, 0x80000000ULL); |
5284 | 5285 | ||
5286 | if (numentries < low_limit) | ||
5287 | numentries = low_limit; | ||
5285 | if (numentries > max) | 5288 | if (numentries > max) |
5286 | numentries = max; | 5289 | numentries = max; |
5287 | 5290 | ||