rhashtable: Do not lower max_elems when max_size is zero
authorHerbert Xu <herbert@gondor.apana.org.au>
Fri, 28 Apr 2017 06:10:48 +0000 (14:10 +0800)
committerDavid S. Miller <davem@davemloft.net>
Fri, 28 Apr 2017 14:14:09 +0000 (10:14 -0400)
The commit 6d684e54690c ("rhashtable: Cap total number of entries
to 2^31") breaks rhashtable users that do not set max_size.  This
is because when max_size is zero max_elems is also incorrectly set
to zero instead of 2^31.

This patch fixes it by only lowering max_elems when max_size is not
zero.

Fixes: 6d684e54690c ("rhashtable: Cap total number of entries to 2^31")
Reported-by: Florian Fainelli <f.fainelli@gmail.com>
Reported-by: kernel test robot <fengguang.wu@intel.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: David S. Miller <davem@davemloft.net>
lib/rhashtable.c

index 751630bbe40977f87cbbd6887fe663748131cc6a..3895486ef55111b0faf3966fb56b796028227de2 100644 (file)
@@ -958,13 +958,14 @@ int rhashtable_init(struct rhashtable *ht,
        if (params->min_size)
                ht->p.min_size = roundup_pow_of_two(params->min_size);
 
-       if (params->max_size)
-               ht->p.max_size = rounddown_pow_of_two(params->max_size);
-
        /* Cap total entries at 2^31 to avoid nelems overflow. */
        ht->max_elems = 1u << 31;
-       if (ht->p.max_size < ht->max_elems / 2)
-               ht->max_elems = ht->p.max_size * 2;
+
+       if (params->max_size) {
+               ht->p.max_size = rounddown_pow_of_two(params->max_size);
+               if (ht->p.max_size < ht->max_elems / 2)
+                       ht->max_elems = ht->p.max_size * 2;
+       }
 
        ht->p.min_size = max(ht->p.min_size, HASH_MIN_SIZE);