Now when I don't set insecure_elasticity, ht->elasticity would be set 16, it would be checked in the loop of __rhashtable_insert_fast and rhashtable_lookup_one.
But if I set insecure_elasticity = true, ht->elasticity wouldn't be set (and the default is 0). when it is checked in that loop. they also return EAGAIN, as: if (elasticity <= 0) return ERR_PTR(-EAGAIN); it seems insecure_elasticity=true doesn't really work well. * @insecure_elasticity: Set to true to disable chain length checks shouldn't it be something like this ? or did I miss something ? ------------------------------------- diff --git a/include/linux/rhashtable.h b/include/linux/rhashtable.h index 5c132d3..9743ab7 100644 --- a/include/linux/rhashtable.h +++ b/include/linux/rhashtable.h @@ -702,7 +702,8 @@ static inline void *__rhashtable_insert_fast( struct rhlist_head *plist; struct rhlist_head *list; - elasticity--; + if (ht->elasticity) + elasticity--; if (!key || (params.obj_cmpfn ? params.obj_cmpfn(&arg, rht_obj(ht, head)) : @@ -726,7 +727,7 @@ static inline void *__rhashtable_insert_fast( goto good; } - if (elasticity <= 0) + if (ht->elasticity && elasticity <= 0) goto slow_path; data = ERR_PTR(-E2BIG); diff --git a/lib/rhashtable.c b/lib/rhashtable.c index 32d0ad0..e3d615a 100644 --- a/lib/rhashtable.c +++ b/lib/rhashtable.c @@ -444,7 +444,8 @@ static void *rhashtable_lookup_one(struct rhashtable *ht, struct rhlist_head *list; struct rhlist_head *plist; - elasticity--; + if (ht->elasticity) + elasticity--; if (!key || (ht->p.obj_cmpfn ? ht->p.obj_cmpfn(&arg, rht_obj(ht, head)) : @@ -465,7 +466,7 @@ static void *rhashtable_lookup_one(struct rhashtable *ht, return NULL; } - if (elasticity <= 0) + if (ht->elasticity && elasticity <= 0) return ERR_PTR(-EAGAIN); return ERR_PTR(-ENOENT);