After applied to this patch and ran the reproducer (compiling gcc), had
no bucket_table_alloc in kmemleak report anymore. Hence,

Tested-by: CAI Qian <caiq...@redhat.com>

Funny enough, it now gave me this,

[ 3406.807461] kmemleak: 1353 new suspected memory leaks (see 
/sys/kernel/debug/kmemleak)

http://people.redhat.com/qcai/tmp/kmemleak.log

   CAI Qian

----- Original Message -----
> From: "Eric Dumazet" <eric.duma...@gmail.com>
> To: "David Miller" <da...@davemloft.net>
> Cc: "CAI Qian" <caiq...@redhat.com>, "Thomas Graf" <tg...@suug.ch>, "Herbert 
> Xu" <herb...@gondor.apana.org.au>, "Eric
> Dumazet" <eduma...@google.com>, "Network Development" 
> <netdev@vger.kernel.org>, "Linus Torvalds"
> <torva...@linux-foundation.org>, "Florian Westphal" <f...@strlen.de>
> Sent: Friday, August 26, 2016 11:51:39 AM
> Subject: [PATCH net] rhashtable: fix a memory leak in alloc_bucket_locks()
> 
> From: Eric Dumazet <eduma...@google.com>
> 
> If vmalloc() was successful, do not attempt a kmalloc_array()
> 
> Fixes: 4cf0b354d92e ("rhashtable: avoid large lock-array allocations")
> Reported-by: CAI Qian <caiq...@redhat.com>
> Signed-off-by: Eric Dumazet <eduma...@google.com>
> Cc: Florian Westphal <f...@strlen.de>
> ---
>  lib/rhashtable.c |    7 ++++---
>  1 file 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,
>       size = min_t(unsigned int, size, tbl->size >> 1);
>  
>       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));
> -             else
>  #endif
>               if (gfp != GFP_KERNEL)
>                       gfp |= __GFP_NOWARN | __GFP_NORETRY;
>  
> -             tbl->locks = kmalloc_array(size, sizeof(spinlock_t),
> -                                        gfp);
> +             if (!tbl->locks)
> +                     tbl->locks = kmalloc_array(size, sizeof(spinlock_t),
> +                                                gfp);
>               if (!tbl->locks)
>                       return -ENOMEM;
>               for (i = 0; i < size; i++)
> 
> 
> 

Reply via email to