Message ID | 20170428061048.GA6817@gondor.apana.org.au |
---|---|
State | Accepted, archived |
Delegated to: | David Miller |
Headers | show |
From: Herbert Xu <herbert@gondor.apana.org.au> Date: Fri, 28 Apr 2017 14:10:48 +0800 > 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> Applied, thanks.
On 04/28/2017 07:14 AM, David Miller wrote: > From: Herbert Xu <herbert@gondor.apana.org.au> > Date: Fri, 28 Apr 2017 14:10:48 +0800 > >> 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> Tested-by: Florian Fainelli <f.fainelli@gmail.com> Thanks Herbert
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);