diff options
author | Michal Hocko <mhocko@suse.com> | 2017-04-17 01:34:50 +1000 |
---|---|---|
committer | Stephen Rothwell <sfr@canb.auug.org.au> | 2017-04-18 17:13:49 +1000 |
commit | 17729a40f51381d4dc74bbe0ecb739a58fced539 (patch) | |
tree | afc3a704c7ec738fcb4435260624b3d7653223dd /lib | |
parent | c7b800f37b64181a3de53a69547c7ae6133bf9e4 (diff) |
lib/rhashtable.c: simplify a strange allocation pattern
alloc_bucket_locks allocation pattern is quite unusual. We are preferring
vmalloc when CONFIG_NUMA is enabled. The rationale is that vmalloc will
respect the memory policy of the current process and so the backing memory
will get distributed over multiple nodes if the requester is configured
properly. At least that is the intention, in reality rhastable is shrunk
and expanded from a kernel worker so no mempolicy can be assumed.
Let's just simplify the code and use kvmalloc helper, which is a
transparent way to use kmalloc with vmalloc fallback, if the caller is
allowed to block and use the flag otherwise.
Link: http://lkml.kernel.org/r/20170306103032.2540-4-mhocko@kernel.org
Signed-off-by: Michal Hocko <mhocko@suse.com>
Acked-by: Vlastimil Babka <vbabka@suse.cz>
Cc: Tom Herbert <tom@herbertland.com>
Cc: Eric Dumazet <eric.dumazet@gmail.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Diffstat (limited to 'lib')
-rw-r--r-- | lib/rhashtable.c | 13 |
1 files changed, 3 insertions, 10 deletions
diff --git a/lib/rhashtable.c b/lib/rhashtable.c index f8635fd57442..2c2c8afcde15 100644 --- a/lib/rhashtable.c +++ b/lib/rhashtable.c @@ -86,16 +86,9 @@ static int alloc_bucket_locks(struct rhashtable *ht, struct bucket_table *tbl, size = min(size, 1U << tbl->nest); if (sizeof(spinlock_t) != 0) { - tbl->locks = NULL; -#ifdef CONFIG_NUMA - if (size * sizeof(spinlock_t) > PAGE_SIZE && - gfp == GFP_KERNEL) - tbl->locks = vmalloc(size * sizeof(spinlock_t)); -#endif - if (gfp != GFP_KERNEL) - gfp |= __GFP_NOWARN | __GFP_NORETRY; - - if (!tbl->locks) + if (gfpflags_allow_blocking(gfp)) + tbl->locks = kvmalloc(size * sizeof(spinlock_t), gfp); + else tbl->locks = kmalloc_array(size, sizeof(spinlock_t), gfp); if (!tbl->locks) |