mac80211: Use rhashtable_lookup_get_insert_fast instead of racy code
authorHerbert Xu <herbert@gondor.apana.org.au>
Thu, 14 Feb 2019 14:03:26 +0000 (22:03 +0800)
committerJohannes Berg <johannes.berg@intel.com>
Fri, 22 Feb 2019 12:48:48 +0000 (13:48 +0100)
The code in mesh_path_add tries to handle the case where a duplicate
entry is added to the rhashtable by doing a lookup after a failed
insertion.  It also tries to handle races by repeating the insertion
should the lookup fail.

This is now unnecessary as we have rhashtable API functions that can
directly return the mathcing object.

Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
net/mac80211/mesh_pathtbl.c

index 88a6d5e18ccc9e13d20af8736f82ed6fa42a8ce5..95eb5064fa9166220bf67af98dedf83726ffcdc8 100644 (file)
@@ -404,7 +404,6 @@ struct mesh_path *mesh_path_add(struct ieee80211_sub_if_data *sdata,
 {
        struct mesh_table *tbl;
        struct mesh_path *mpath, *new_mpath;
-       int ret;
 
        if (ether_addr_equal(dst, sdata->vif.addr))
                /* never add ourselves as neighbours */
@@ -422,25 +421,18 @@ struct mesh_path *mesh_path_add(struct ieee80211_sub_if_data *sdata,
 
        tbl = sdata->u.mesh.mesh_paths;
        spin_lock_bh(&tbl->walk_lock);
-       do {
-               ret = rhashtable_lookup_insert_fast(&tbl->rhead,
-                                                   &new_mpath->rhash,
-                                                   mesh_rht_params);
-
-               if (ret == -EEXIST)
-                       mpath = rhashtable_lookup_fast(&tbl->rhead,
-                                                      dst,
-                                                      mesh_rht_params);
-               else if (!ret)
-                       hlist_add_head(&new_mpath->walk_list, &tbl->walk_head);
-       } while (unlikely(ret == -EEXIST && !mpath));
+       mpath = rhashtable_lookup_get_insert_fast(&tbl->rhead,
+                                                 &new_mpath->rhash,
+                                                 mesh_rht_params);
+       if (!mpath)
+               hlist_add_head(&new_mpath->walk_list, &tbl->walk_head);
        spin_unlock_bh(&tbl->walk_lock);
 
-       if (ret) {
+       if (mpath) {
                kfree(new_mpath);
 
-               if (ret != -EEXIST)
-                       return ERR_PTR(ret);
+               if (IS_ERR(mpath))
+                       return mpath;
 
                new_mpath = mpath;
        }