rhashtable: Round up/down min/max_size to ensure we respect limit
authorThomas Graf <tgraf@suug.ch>
Thu, 19 Mar 2015 22:31:13 +0000 (22:31 +0000)
committerDavid S. Miller <davem@davemloft.net>
Fri, 20 Mar 2015 01:02:23 +0000 (21:02 -0400)
Round up min_size respectively round down max_size to the next power
of two to make sure we always respect the limit specified by the
user. This is required because we compare the table size against the
limit before we expand or shrink.

Also fixes a minor bug where we modified min_size in the params
provided instead of the copy stored in struct rhashtable.

Signed-off-by: Thomas Graf <tgraf@suug.ch>
Acked-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: David S. Miller <davem@davemloft.net>
lib/rhashtable.c

index 5f8fe3e8821988d0014ffa07ca4cd2ab3a03e8d8..e75c48d9d82f61b4e248b22d49bf3c55fa42acbb 100644 (file)
@@ -933,8 +933,6 @@ int rhashtable_init(struct rhashtable *ht, struct rhashtable_params *params)
        if (params->nulls_base && params->nulls_base < (1U << RHT_BASE_SHIFT))
                return -EINVAL;
 
-       params->min_size = max(params->min_size, HASH_MIN_SIZE);
-
        if (params->nelem_hint)
                size = rounded_hashtable_size(params);
 
@@ -942,6 +940,14 @@ int rhashtable_init(struct rhashtable *ht, struct rhashtable_params *params)
        mutex_init(&ht->mutex);
        memcpy(&ht->p, params, sizeof(*params));
 
+       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);
+
+       ht->p.min_size = max(params->min_size, HASH_MIN_SIZE);
+
        if (params->locks_mul)
                ht->p.locks_mul = roundup_pow_of_two(params->locks_mul);
        else