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 /fs | |
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 'fs')
-rw-r--r-- | fs/dcache.c | 2 | ||||
-rw-r--r-- | fs/inode.c | 2 |
2 files changed, 4 insertions, 0 deletions
diff --git a/fs/dcache.c b/fs/dcache.c index 8c1ab8fb501..4435d8b3290 100644 --- a/fs/dcache.c +++ b/fs/dcache.c | |||
@@ -3093,6 +3093,7 @@ static void __init dcache_init_early(void) | |||
3093 | HASH_EARLY, | 3093 | HASH_EARLY, |
3094 | &d_hash_shift, | 3094 | &d_hash_shift, |
3095 | &d_hash_mask, | 3095 | &d_hash_mask, |
3096 | 0, | ||
3096 | 0); | 3097 | 0); |
3097 | 3098 | ||
3098 | for (loop = 0; loop < (1U << d_hash_shift); loop++) | 3099 | for (loop = 0; loop < (1U << d_hash_shift); loop++) |
@@ -3123,6 +3124,7 @@ static void __init dcache_init(void) | |||
3123 | 0, | 3124 | 0, |
3124 | &d_hash_shift, | 3125 | &d_hash_shift, |
3125 | &d_hash_mask, | 3126 | &d_hash_mask, |
3127 | 0, | ||
3126 | 0); | 3128 | 0); |
3127 | 3129 | ||
3128 | for (loop = 0; loop < (1U << d_hash_shift); loop++) | 3130 | for (loop = 0; loop < (1U << d_hash_shift); loop++) |
diff --git a/fs/inode.c b/fs/inode.c index 9f4f5fecc09..e3ef2573cbd 100644 --- a/fs/inode.c +++ b/fs/inode.c | |||
@@ -1647,6 +1647,7 @@ void __init inode_init_early(void) | |||
1647 | HASH_EARLY, | 1647 | HASH_EARLY, |
1648 | &i_hash_shift, | 1648 | &i_hash_shift, |
1649 | &i_hash_mask, | 1649 | &i_hash_mask, |
1650 | 0, | ||
1650 | 0); | 1651 | 0); |
1651 | 1652 | ||
1652 | for (loop = 0; loop < (1U << i_hash_shift); loop++) | 1653 | for (loop = 0; loop < (1U << i_hash_shift); loop++) |
@@ -1677,6 +1678,7 @@ void __init inode_init(void) | |||
1677 | 0, | 1678 | 0, |
1678 | &i_hash_shift, | 1679 | &i_hash_shift, |
1679 | &i_hash_mask, | 1680 | &i_hash_mask, |
1681 | 0, | ||
1680 | 0); | 1682 | 0); |
1681 | 1683 | ||
1682 | for (loop = 0; loop < (1U << i_hash_shift); loop++) | 1684 | for (loop = 0; loop < (1U << i_hash_shift); loop++) |