diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/rhashtable.c | 12 |
1 files changed, 8 insertions, 4 deletions
diff --git a/lib/rhashtable.c b/lib/rhashtable.c index a2c78810ebc1..8dfec3f26d4c 100644 --- a/lib/rhashtable.c +++ b/lib/rhashtable.c | |||
@@ -298,7 +298,7 @@ int rhashtable_shrink(struct rhashtable *ht, gfp_t flags) | |||
298 | 298 | ||
299 | ASSERT_RHT_MUTEX(ht); | 299 | ASSERT_RHT_MUTEX(ht); |
300 | 300 | ||
301 | if (tbl->size <= HASH_MIN_SIZE) | 301 | if (ht->shift <= ht->p.min_shift) |
302 | return 0; | 302 | return 0; |
303 | 303 | ||
304 | ntbl = bucket_table_alloc(tbl->size / 2, flags); | 304 | ntbl = bucket_table_alloc(tbl->size / 2, flags); |
@@ -506,9 +506,10 @@ void *rhashtable_lookup_compare(const struct rhashtable *ht, u32 hash, | |||
506 | } | 506 | } |
507 | EXPORT_SYMBOL_GPL(rhashtable_lookup_compare); | 507 | EXPORT_SYMBOL_GPL(rhashtable_lookup_compare); |
508 | 508 | ||
509 | static size_t rounded_hashtable_size(unsigned int nelem) | 509 | static size_t rounded_hashtable_size(struct rhashtable_params *params) |
510 | { | 510 | { |
511 | return max(roundup_pow_of_two(nelem * 4 / 3), HASH_MIN_SIZE); | 511 | return max(roundup_pow_of_two(params->nelem_hint * 4 / 3), |
512 | 1UL << params->min_shift); | ||
512 | } | 513 | } |
513 | 514 | ||
514 | /** | 515 | /** |
@@ -566,8 +567,11 @@ int rhashtable_init(struct rhashtable *ht, struct rhashtable_params *params) | |||
566 | (!params->key_len && !params->obj_hashfn)) | 567 | (!params->key_len && !params->obj_hashfn)) |
567 | return -EINVAL; | 568 | return -EINVAL; |
568 | 569 | ||
570 | params->min_shift = max_t(size_t, params->min_shift, | ||
571 | ilog2(HASH_MIN_SIZE)); | ||
572 | |||
569 | if (params->nelem_hint) | 573 | if (params->nelem_hint) |
570 | size = rounded_hashtable_size(params->nelem_hint); | 574 | size = rounded_hashtable_size(params); |
571 | 575 | ||
572 | tbl = bucket_table_alloc(size, GFP_KERNEL); | 576 | tbl = bucket_table_alloc(size, GFP_KERNEL); |
573 | if (tbl == NULL) | 577 | if (tbl == NULL) |