lkml.org 
[lkml]   [2018]   [Jul]   [23]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.17 39/63] lib/rhashtable: consider param->min_size when setting initial table size
    Date
    4.17-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Davidlohr Bueso <dave@stgolabs.net>

    [ Upstream commit 107d01f5ba10f4162c38109496607eb197059064 ]

    rhashtable_init() currently does not take into account the user-passed
    min_size parameter unless param->nelem_hint is set as well. As such,
    the default size (number of buckets) will always be HASH_DEFAULT_SIZE
    even if the smallest allowed size is larger than that. Remediate this
    by unconditionally calling into rounded_hashtable_size() and handling
    things accordingly.

    Signed-off-by: Davidlohr Bueso <dbueso@suse.de>
    Acked-by: Herbert Xu <herbert@gondor.apana.org.au>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    lib/rhashtable.c | 17 +++++++++++------
    1 file changed, 11 insertions(+), 6 deletions(-)

    --- a/lib/rhashtable.c
    +++ b/lib/rhashtable.c
    @@ -923,8 +923,16 @@ EXPORT_SYMBOL_GPL(rhashtable_walk_stop);

    static size_t rounded_hashtable_size(const struct rhashtable_params *params)
    {
    - return max(roundup_pow_of_two(params->nelem_hint * 4 / 3),
    - (unsigned long)params->min_size);
    + size_t retsize;
    +
    + if (params->nelem_hint)
    + retsize = max(roundup_pow_of_two(params->nelem_hint * 4 / 3),
    + (unsigned long)params->min_size);
    + else
    + retsize = max(HASH_DEFAULT_SIZE,
    + (unsigned long)params->min_size);
    +
    + return retsize;
    }

    static u32 rhashtable_jhash2(const void *key, u32 length, u32 seed)
    @@ -981,8 +989,6 @@ int rhashtable_init(struct rhashtable *h
    struct bucket_table *tbl;
    size_t size;

    - size = HASH_DEFAULT_SIZE;
    -
    if ((!params->key_len && !params->obj_hashfn) ||
    (params->obj_hashfn && !params->obj_cmpfn))
    return -EINVAL;
    @@ -1009,8 +1015,7 @@ int rhashtable_init(struct rhashtable *h

    ht->p.min_size = max_t(u16, ht->p.min_size, HASH_MIN_SIZE);

    - if (params->nelem_hint)
    - size = rounded_hashtable_size(&ht->p);
    + size = rounded_hashtable_size(&ht->p);

    if (params->locks_mul)
    ht->p.locks_mul = roundup_pow_of_two(params->locks_mul);

    \
     
     \ /
      Last update: 2018-07-23 14:42    [W:4.129 / U:10.084 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site