On Thu, Apr 27, 2017 at 03:30:24PM -0700, Florian Fainelli wrote:
> After commit 6d684e54690c ("rhashtable: Cap total number of
> entries to 2^31"), we would be hitting a panic() in net/core/rtnetlink.c
> during initialization. The call stack would look like this:

Thanks for the patch.  I think we could just fold it into the
previous if clause, like this:

---8<---
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.faine...@gmail.com>
Reported-by: kernel test robot <fengguang...@intel.com>
Signed-off-by: Herbert Xu <herb...@gondor.apana.org.au>

diff --git a/lib/rhashtable.c b/lib/rhashtable.c
index 751630b..3895486 100644
--- a/lib/rhashtable.c
+++ b/lib/rhashtable.c
@@ -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);
 
-- 
Email: Herbert Xu <herb...@gondor.apana.org.au>
Home Page: http://gondor.apana.org.au/~herbert/
PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt

Reply via email to