summaryrefslogtreecommitdiffstats
path: root/lib/rhashtable.c
diff options
context:
space:
mode:
authorEric Dumazet <edumazet@google.com>2016-08-26 11:51:39 -0400
committerDavid S. Miller <davem@davemloft.net>2016-08-27 00:59:53 -0400
commit9dbeea7f08f3784b152d9fb3b86beb34aad77c72 (patch)
tree8247a2cd0567720c777833fa320686bacbec8132 /lib/rhashtable.c
parente70c70c38d7a5ced76fc8b1c4a7ccee76e9c2911 (diff)
rhashtable: fix a memory leak in alloc_bucket_locks()
If vmalloc() was successful, do not attempt a kmalloc_array() Fixes: 4cf0b354d92e ("rhashtable: avoid large lock-array allocations") Reported-by: CAI Qian <caiqian@redhat.com> Signed-off-by: Eric Dumazet <edumazet@google.com> Cc: Florian Westphal <fw@strlen.de> Acked-by: Herbert Xu <herbert@gondor.apana.org.au> Tested-by: CAI Qian <caiqian@redhat.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'lib/rhashtable.c')
-rw-r--r--lib/rhashtable.c7
1 files changed, 4 insertions, 3 deletions
diff --git a/lib/rhashtable.c b/lib/rhashtable.c
index 5ba520b544d7..56054e541a0f 100644
--- a/lib/rhashtable.c
+++ b/lib/rhashtable.c
@@ -77,17 +77,18 @@ static int alloc_bucket_locks(struct rhashtable *ht, struct bucket_table *tbl,
77 size = min_t(unsigned int, size, tbl->size >> 1); 77 size = min_t(unsigned int, size, tbl->size >> 1);
78 78
79 if (sizeof(spinlock_t) != 0) { 79 if (sizeof(spinlock_t) != 0) {
80 tbl->locks = NULL;
80#ifdef CONFIG_NUMA 81#ifdef CONFIG_NUMA
81 if (size * sizeof(spinlock_t) > PAGE_SIZE && 82 if (size * sizeof(spinlock_t) > PAGE_SIZE &&
82 gfp == GFP_KERNEL) 83 gfp == GFP_KERNEL)
83 tbl->locks = vmalloc(size * sizeof(spinlock_t)); 84 tbl->locks = vmalloc(size * sizeof(spinlock_t));
84 else
85#endif 85#endif
86 if (gfp != GFP_KERNEL) 86 if (gfp != GFP_KERNEL)
87 gfp |= __GFP_NOWARN | __GFP_NORETRY; 87 gfp |= __GFP_NOWARN | __GFP_NORETRY;
88 88
89 tbl->locks = kmalloc_array(size, sizeof(spinlock_t), 89 if (!tbl->locks)
90 gfp); 90 tbl->locks = kmalloc_array(size, sizeof(spinlock_t),
91 gfp);
91 if (!tbl->locks) 92 if (!tbl->locks)
92 return -ENOMEM; 93 return -ENOMEM;
93 for (i = 0; i < size; i++) 94 for (i = 0; i < size; i++)