|
@@ -298,7 +298,7 @@ int rhashtable_shrink(struct rhashtable *ht, gfp_t flags)
|
|
|
|
|
|
ASSERT_RHT_MUTEX(ht);
|
|
|
|
|
|
- if (tbl->size <= HASH_MIN_SIZE)
|
|
|
+ if (ht->shift <= ht->p.min_shift)
|
|
|
return 0;
|
|
|
|
|
|
ntbl = bucket_table_alloc(tbl->size / 2, flags);
|
|
@@ -506,9 +506,10 @@ void *rhashtable_lookup_compare(const struct rhashtable *ht, u32 hash,
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(rhashtable_lookup_compare);
|
|
|
|
|
|
-static size_t rounded_hashtable_size(unsigned int nelem)
|
|
|
+static size_t rounded_hashtable_size(struct rhashtable_params *params)
|
|
|
{
|
|
|
- return max(roundup_pow_of_two(nelem * 4 / 3), HASH_MIN_SIZE);
|
|
|
+ return max(roundup_pow_of_two(params->nelem_hint * 4 / 3),
|
|
|
+ 1UL << params->min_shift);
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -566,8 +567,11 @@ int rhashtable_init(struct rhashtable *ht, struct rhashtable_params *params)
|
|
|
(!params->key_len && !params->obj_hashfn))
|
|
|
return -EINVAL;
|
|
|
|
|
|
+ params->min_shift = max_t(size_t, params->min_shift,
|
|
|
+ ilog2(HASH_MIN_SIZE));
|
|
|
+
|
|
|
if (params->nelem_hint)
|
|
|
- size = rounded_hashtable_size(params->nelem_hint);
|
|
|
+ size = rounded_hashtable_size(params);
|
|
|
|
|
|
tbl = bucket_table_alloc(size, GFP_KERNEL);
|
|
|
if (tbl == NULL)
|