]> git.proxmox.com Git - mirror_ubuntu-kernels.git/commitdiff
rhashtable: Change rhashtable_walk_start to return void
authorTom Herbert <tom@quantonium.net>
Mon, 4 Dec 2017 18:31:41 +0000 (10:31 -0800)
committerDavid S. Miller <davem@davemloft.net>
Mon, 11 Dec 2017 14:58:38 +0000 (09:58 -0500)
Most callers of rhashtable_walk_start don't care about a resize event
which is indicated by a return value of -EAGAIN. So calls to
rhashtable_walk_start are wrapped wih code to ignore -EAGAIN. Something
like this is common:

       ret = rhashtable_walk_start(rhiter);
       if (ret && ret != -EAGAIN)
               goto out;

Since zero and -EAGAIN are the only possible return values from the
function this check is pointless. The condition never evaluates to true.

This patch changes rhashtable_walk_start to return void. This simplifies
code for the callers that ignore -EAGAIN. For the few cases where the
caller cares about the resize event, particularly where the table can be
walked in mulitple parts for netlink or seq file dump, the function
rhashtable_walk_start_check has been added that returns -EAGAIN on a
resize event.

Signed-off-by: Tom Herbert <tom@quantonium.net>
Acked-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: David S. Miller <davem@davemloft.net>
16 files changed:
drivers/net/ethernet/broadcom/bnxt/bnxt_tc.c
drivers/net/ethernet/chelsio/cxgb4/cxgb4_tc_flower.c
fs/gfs2/glock.c
include/linux/rhashtable.h
include/net/sctp/sctp.h
lib/rhashtable.c
lib/test_rhashtable.c
net/ipv6/ila/ila_xlat.c
net/ipv6/seg6.c
net/mac80211/mesh_pathtbl.c
net/netfilter/nft_set_hash.c
net/netlink/af_netlink.c
net/netlink/diag.c
net/sctp/proc.c
net/sctp/socket.c
net/tipc/socket.c

index 9807214da206714ec478739f882ed084ea406056..2ae5ed1513694a78e844d0f9dc62cb5b12092ac9 100644 (file)
@@ -1412,11 +1412,7 @@ bnxt_tc_flow_stats_batch_prep(struct bnxt *bp,
        void *flow_node;
        int rc, i;
 
-       rc = rhashtable_walk_start(iter);
-       if (rc && rc != -EAGAIN) {
-               i = 0;
-               goto done;
-       }
+       rhashtable_walk_start(iter);
 
        rc = 0;
        for (i = 0; i < BNXT_FLOW_STATS_BATCH_MAX; i++) {
index a12b894f135d7a9cbee14ef4a53655442f736b22..9b9f3f99b39d34e06a2ae6fb3cec2f55c3e8d6c7 100644 (file)
@@ -763,9 +763,7 @@ static void ch_flower_stats_handler(struct work_struct *work)
 
        rhashtable_walk_enter(&adap->flower_tbl, &iter);
        do {
-               flower_entry = ERR_PTR(rhashtable_walk_start(&iter));
-               if (IS_ERR(flower_entry))
-                       goto walk_stop;
+               rhashtable_walk_start(&iter);
 
                while ((flower_entry = rhashtable_walk_next(&iter)) &&
                       !IS_ERR(flower_entry)) {
@@ -784,8 +782,9 @@ static void ch_flower_stats_handler(struct work_struct *work)
                                spin_unlock(&flower_entry->lock);
                        }
                }
-walk_stop:
+
                rhashtable_walk_stop(&iter);
+
        } while (flower_entry == ERR_PTR(-EAGAIN));
        rhashtable_walk_exit(&iter);
        mod_timer(&adap->flower_stats_timer, jiffies + STATS_CHECK_PERIOD);
index 11066d8647d29320dcb30d063536aa4f218cf5ec..90af87ff29badcc21e1c0f17721a30bf4b2354e8 100644 (file)
@@ -1549,16 +1549,13 @@ static void glock_hash_walk(glock_examiner examiner, const struct gfs2_sbd *sdp)
        rhashtable_walk_enter(&gl_hash_table, &iter);
 
        do {
-               gl = ERR_PTR(rhashtable_walk_start(&iter));
-               if (IS_ERR(gl))
-                       goto walk_stop;
+               rhashtable_walk_start(&iter);
 
                while ((gl = rhashtable_walk_next(&iter)) && !IS_ERR(gl))
                        if (gl->gl_name.ln_sbd == sdp &&
                            lockref_get_not_dead(&gl->gl_lockref))
                                examiner(gl);
 
-walk_stop:
                rhashtable_walk_stop(&iter);
        } while (cond_resched(), gl == ERR_PTR(-EAGAIN));
 
@@ -1947,7 +1944,7 @@ static void *gfs2_glock_seq_start(struct seq_file *seq, loff_t *pos)
        loff_t n = *pos;
 
        rhashtable_walk_enter(&gl_hash_table, &gi->hti);
-       if (rhashtable_walk_start(&gi->hti) != 0)
+       if (rhashtable_walk_start_check(&gi->hti) != 0)
                return NULL;
 
        do {
index 361c08e35dbc388f0acd2891706d4df8f33026b6..13ccc483738d0316ceec8ec8cf9d12d3f9de3e1a 100644 (file)
@@ -378,7 +378,13 @@ void *rhashtable_insert_slow(struct rhashtable *ht, const void *key,
 void rhashtable_walk_enter(struct rhashtable *ht,
                           struct rhashtable_iter *iter);
 void rhashtable_walk_exit(struct rhashtable_iter *iter);
-int rhashtable_walk_start(struct rhashtable_iter *iter) __acquires(RCU);
+int rhashtable_walk_start_check(struct rhashtable_iter *iter) __acquires(RCU);
+
+static inline void rhashtable_walk_start(struct rhashtable_iter *iter)
+{
+       (void)rhashtable_walk_start_check(iter);
+}
+
 void *rhashtable_walk_next(struct rhashtable_iter *iter);
 void rhashtable_walk_stop(struct rhashtable_iter *iter) __releases(RCU);
 
index 906a9c0efa714efa28e0abdf98c9781d64e376d9..6f79415f66341932b3376032a9822ec8db8b7ceb 100644 (file)
@@ -116,7 +116,7 @@ extern struct percpu_counter sctp_sockets_allocated;
 int sctp_asconf_mgmt(struct sctp_sock *, struct sctp_sockaddr_entry *);
 struct sk_buff *sctp_skb_recv_datagram(struct sock *, int, int, int *);
 
-int sctp_transport_walk_start(struct rhashtable_iter *iter);
+void sctp_transport_walk_start(struct rhashtable_iter *iter);
 void sctp_transport_walk_stop(struct rhashtable_iter *iter);
 struct sctp_transport *sctp_transport_get_next(struct net *net,
                        struct rhashtable_iter *iter);
index ddd7dde87c3ca0db910d67a567f2a68c8d8e847e..1935e86ed4770adb524a097c6cd91a13759a5de2 100644 (file)
@@ -732,7 +732,7 @@ void rhashtable_walk_exit(struct rhashtable_iter *iter)
 EXPORT_SYMBOL_GPL(rhashtable_walk_exit);
 
 /**
- * rhashtable_walk_start - Start a hash table walk
+ * rhashtable_walk_start_check - Start a hash table walk
  * @iter:      Hash table iterator
  *
  * Start a hash table walk at the current iterator position.  Note that we take
@@ -744,8 +744,12 @@ EXPORT_SYMBOL_GPL(rhashtable_walk_exit);
  * Returns -EAGAIN if resize event occured.  Note that the iterator
  * will rewind back to the beginning and you may use it immediately
  * by calling rhashtable_walk_next.
+ *
+ * rhashtable_walk_start is defined as an inline variant that returns
+ * void. This is preferred in cases where the caller would ignore
+ * resize events and always continue.
  */
-int rhashtable_walk_start(struct rhashtable_iter *iter)
+int rhashtable_walk_start_check(struct rhashtable_iter *iter)
        __acquires(RCU)
 {
        struct rhashtable *ht = iter->ht;
@@ -764,7 +768,7 @@ int rhashtable_walk_start(struct rhashtable_iter *iter)
 
        return 0;
 }
-EXPORT_SYMBOL_GPL(rhashtable_walk_start);
+EXPORT_SYMBOL_GPL(rhashtable_walk_start_check);
 
 /**
  * rhashtable_walk_next - Return the next object and advance the iterator
index 8e83cbdc049c72a4665be30b8099c7c141d59ff0..76d3667fdea21c2c1842ce19818ddda05b7ceada 100644 (file)
@@ -162,11 +162,7 @@ static void test_bucket_stats(struct rhashtable *ht, unsigned int entries)
                return;
        }
 
-       err = rhashtable_walk_start(&hti);
-       if (err && err != -EAGAIN) {
-               pr_warn("Test failed: iterator failed: %d\n", err);
-               return;
-       }
+       rhashtable_walk_start(&hti);
 
        while ((pos = rhashtable_walk_next(&hti))) {
                if (PTR_ERR(pos) == -EAGAIN) {
index 6eb5e68f112a2045169233fc67fe18ac6f168d0a..44c39c5f06384c6c83901036a2e94bcda439f91c 100644 (file)
@@ -512,9 +512,7 @@ static int ila_nl_dump(struct sk_buff *skb, struct netlink_callback *cb)
        struct ila_map *ila;
        int ret;
 
-       ret = rhashtable_walk_start(rhiter);
-       if (ret && ret != -EAGAIN)
-               goto done;
+       rhashtable_walk_start(rhiter);
 
        for (;;) {
                ila = rhashtable_walk_next(rhiter);
index c814077709562cc070d21936c8bf101136d6aefe..7f5621d095719c4179b3b1ff6e7a7d6665419e39 100644 (file)
@@ -306,9 +306,7 @@ static int seg6_genl_dumphmac(struct sk_buff *skb, struct netlink_callback *cb)
        struct seg6_hmac_info *hinfo;
        int ret;
 
-       ret = rhashtable_walk_start(iter);
-       if (ret && ret != -EAGAIN)
-               goto done;
+       rhashtable_walk_start(iter);
 
        for (;;) {
                hinfo = rhashtable_walk_next(iter);
index 86c8dfef56a4c8f021b68aa723ced9447b5b9602..a5125624a76dce205b28e916a505faae765539ae 100644 (file)
@@ -257,9 +257,7 @@ __mesh_path_lookup_by_idx(struct mesh_table *tbl, int idx)
        if (ret)
                return NULL;
 
-       ret = rhashtable_walk_start(&iter);
-       if (ret && ret != -EAGAIN)
-               goto err;
+       rhashtable_walk_start(&iter);
 
        while ((mpath = rhashtable_walk_next(&iter))) {
                if (IS_ERR(mpath) && PTR_ERR(mpath) == -EAGAIN)
@@ -269,7 +267,6 @@ __mesh_path_lookup_by_idx(struct mesh_table *tbl, int idx)
                if (i++ == idx)
                        break;
        }
-err:
        rhashtable_walk_stop(&iter);
        rhashtable_walk_exit(&iter);
 
@@ -513,9 +510,7 @@ void mesh_plink_broken(struct sta_info *sta)
        if (ret)
                return;
 
-       ret = rhashtable_walk_start(&iter);
-       if (ret && ret != -EAGAIN)
-               goto out;
+       rhashtable_walk_start(&iter);
 
        while ((mpath = rhashtable_walk_next(&iter))) {
                if (IS_ERR(mpath) && PTR_ERR(mpath) == -EAGAIN)
@@ -535,7 +530,6 @@ void mesh_plink_broken(struct sta_info *sta)
                                WLAN_REASON_MESH_PATH_DEST_UNREACHABLE, bcast);
                }
        }
-out:
        rhashtable_walk_stop(&iter);
        rhashtable_walk_exit(&iter);
 }
@@ -584,9 +578,7 @@ void mesh_path_flush_by_nexthop(struct sta_info *sta)
        if (ret)
                return;
 
-       ret = rhashtable_walk_start(&iter);
-       if (ret && ret != -EAGAIN)
-               goto out;
+       rhashtable_walk_start(&iter);
 
        while ((mpath = rhashtable_walk_next(&iter))) {
                if (IS_ERR(mpath) && PTR_ERR(mpath) == -EAGAIN)
@@ -597,7 +589,7 @@ void mesh_path_flush_by_nexthop(struct sta_info *sta)
                if (rcu_access_pointer(mpath->next_hop) == sta)
                        __mesh_path_del(tbl, mpath);
        }
-out:
+
        rhashtable_walk_stop(&iter);
        rhashtable_walk_exit(&iter);
 }
@@ -614,9 +606,7 @@ static void mpp_flush_by_proxy(struct ieee80211_sub_if_data *sdata,
        if (ret)
                return;
 
-       ret = rhashtable_walk_start(&iter);
-       if (ret && ret != -EAGAIN)
-               goto out;
+       rhashtable_walk_start(&iter);
 
        while ((mpath = rhashtable_walk_next(&iter))) {
                if (IS_ERR(mpath) && PTR_ERR(mpath) == -EAGAIN)
@@ -627,7 +617,7 @@ static void mpp_flush_by_proxy(struct ieee80211_sub_if_data *sdata,
                if (ether_addr_equal(mpath->mpp, proxy))
                        __mesh_path_del(tbl, mpath);
        }
-out:
+
        rhashtable_walk_stop(&iter);
        rhashtable_walk_exit(&iter);
 }
@@ -642,9 +632,7 @@ static void table_flush_by_iface(struct mesh_table *tbl)
        if (ret)
                return;
 
-       ret = rhashtable_walk_start(&iter);
-       if (ret && ret != -EAGAIN)
-               goto out;
+       rhashtable_walk_start(&iter);
 
        while ((mpath = rhashtable_walk_next(&iter))) {
                if (IS_ERR(mpath) && PTR_ERR(mpath) == -EAGAIN)
@@ -653,7 +641,7 @@ static void table_flush_by_iface(struct mesh_table *tbl)
                        break;
                __mesh_path_del(tbl, mpath);
        }
-out:
+
        rhashtable_walk_stop(&iter);
        rhashtable_walk_exit(&iter);
 }
@@ -873,9 +861,7 @@ void mesh_path_tbl_expire(struct ieee80211_sub_if_data *sdata,
        if (ret)
                return;
 
-       ret = rhashtable_walk_start(&iter);
-       if (ret && ret != -EAGAIN)
-               goto out;
+       rhashtable_walk_start(&iter);
 
        while ((mpath = rhashtable_walk_next(&iter))) {
                if (IS_ERR(mpath) && PTR_ERR(mpath) == -EAGAIN)
@@ -887,7 +873,7 @@ void mesh_path_tbl_expire(struct ieee80211_sub_if_data *sdata,
                     time_after(jiffies, mpath->exp_time + MESH_PATH_EXPIRE))
                        __mesh_path_del(tbl, mpath);
        }
-out:
+
        rhashtable_walk_stop(&iter);
        rhashtable_walk_exit(&iter);
 }
index f8166c1d5430b853623daefebe872069bb77f795..3f1624ee056f96570254cf5d8737f38b82a87593 100644 (file)
@@ -251,11 +251,7 @@ static void nft_rhash_walk(const struct nft_ctx *ctx, struct nft_set *set,
        if (err)
                return;
 
-       err = rhashtable_walk_start(&hti);
-       if (err && err != -EAGAIN) {
-               iter->err = err;
-               goto out;
-       }
+       rhashtable_walk_start(&hti);
 
        while ((he = rhashtable_walk_next(&hti))) {
                if (IS_ERR(he)) {
@@ -306,9 +302,7 @@ static void nft_rhash_gc(struct work_struct *work)
        if (err)
                goto schedule;
 
-       err = rhashtable_walk_start(&hti);
-       if (err && err != -EAGAIN)
-               goto out;
+       rhashtable_walk_start(&hti);
 
        while ((he = rhashtable_walk_next(&hti))) {
                if (IS_ERR(he)) {
index b9e0ee4e22f57066d0ac0bc5f64181fbb65e6acc..ab325d4d6fefa919fbbf6e504cd3b47f10cf4ace 100644 (file)
@@ -2478,8 +2478,9 @@ static int netlink_walk_start(struct nl_seq_iter *iter)
                return err;
        }
 
-       err = rhashtable_walk_start(&iter->hti);
-       return err == -EAGAIN ? 0 : err;
+       rhashtable_walk_start(&iter->hti);
+
+       return 0;
 }
 
 static void netlink_walk_stop(struct nl_seq_iter *iter)
index 8faa20b4d4573f3e2b510f03f3d4a85a70352559..7dda33b9b78491aa568c0ae99682d34c0bc056dd 100644 (file)
@@ -115,11 +115,7 @@ static int __netlink_diag_dump(struct sk_buff *skb, struct netlink_callback *cb,
        if (!s_num)
                rhashtable_walk_enter(&tbl->hash, hti);
 
-       ret = rhashtable_walk_start(hti);
-       if (ret == -EAGAIN)
-               ret = 0;
-       if (ret)
-               goto stop;
+       rhashtable_walk_start(hti);
 
        while ((nlsk = rhashtable_walk_next(hti))) {
                if (IS_ERR(nlsk)) {
@@ -146,8 +142,8 @@ static int __netlink_diag_dump(struct sk_buff *skb, struct netlink_callback *cb,
                }
        }
 
-stop:
        rhashtable_walk_stop(hti);
+
        if (ret)
                goto done;
 
index 26b4be6b41720a23040fcf31983199d331f026e4..4545bc2aff84d2f5ed01531c9e95cfdab99f6c79 100644 (file)
@@ -288,12 +288,8 @@ struct sctp_ht_iter {
 static void *sctp_transport_seq_start(struct seq_file *seq, loff_t *pos)
 {
        struct sctp_ht_iter *iter = seq->private;
-       int err = sctp_transport_walk_start(&iter->hti);
 
-       if (err) {
-               iter->start_fail = 1;
-               return ERR_PTR(err);
-       }
+       sctp_transport_walk_start(&iter->hti);
 
        iter->start_fail = 0;
        return sctp_transport_get_idx(seq_file_net(seq), &iter->hti, *pos);
index eb17a911aa29717ac0db25cf0662b8e24a420655..3e55daa37e66533b8aa76133a5ab8beb3e72ad4f 100644 (file)
@@ -4676,20 +4676,11 @@ int sctp_get_sctp_info(struct sock *sk, struct sctp_association *asoc,
 EXPORT_SYMBOL_GPL(sctp_get_sctp_info);
 
 /* use callback to avoid exporting the core structure */
-int sctp_transport_walk_start(struct rhashtable_iter *iter)
+void sctp_transport_walk_start(struct rhashtable_iter *iter)
 {
-       int err;
-
        rhltable_walk_enter(&sctp_transport_hashtable, iter);
 
-       err = rhashtable_walk_start(iter);
-       if (err && err != -EAGAIN) {
-               rhashtable_walk_stop(iter);
-               rhashtable_walk_exit(iter);
-               return err;
-       }
-
-       return 0;
+       rhashtable_walk_start(iter);
 }
 
 void sctp_transport_walk_stop(struct rhashtable_iter *iter)
@@ -4780,12 +4771,10 @@ int sctp_for_each_transport(int (*cb)(struct sctp_transport *, void *),
                            struct net *net, int *pos, void *p) {
        struct rhashtable_iter hti;
        struct sctp_transport *tsp;
-       int ret;
+       int ret = 0;
 
 again:
-       ret = sctp_transport_walk_start(&hti);
-       if (ret)
-               return ret;
+       sctp_transport_walk_start(&hti);
 
        tsp = sctp_transport_get_idx(net, &hti, *pos + 1);
        for (; !IS_ERR_OR_NULL(tsp); tsp = sctp_transport_get_next(net, &hti)) {
index 5d18c0caa92b213740e5c6e3152ec8ce37717dc2..22c4fd8a9dfe5a5dc95941ce9c144037bb3b943d 100644 (file)
@@ -2640,9 +2640,7 @@ void tipc_sk_reinit(struct net *net)
        rhashtable_walk_enter(&tn->sk_rht, &iter);
 
        do {
-               tsk = ERR_PTR(rhashtable_walk_start(&iter));
-               if (IS_ERR(tsk))
-                       goto walk_stop;
+               rhashtable_walk_start(&iter);
 
                while ((tsk = rhashtable_walk_next(&iter)) && !IS_ERR(tsk)) {
                        spin_lock_bh(&tsk->sk.sk_lock.slock);
@@ -2651,7 +2649,7 @@ void tipc_sk_reinit(struct net *net)
                        msg_set_orignode(msg, tn->own_addr);
                        spin_unlock_bh(&tsk->sk.sk_lock.slock);
                }
-walk_stop:
+
                rhashtable_walk_stop(&iter);
        } while (tsk == ERR_PTR(-EAGAIN));
 }