Skip to content

Commit 97a6ec4

Browse files
Tom Herbertdavem330
authored andcommitted
rhashtable: Change rhashtable_walk_start to return void
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>
1 parent a0b586f commit 97a6ec4

File tree

16 files changed

+48
-94
lines changed

16 files changed

+48
-94
lines changed

drivers/net/ethernet/broadcom/bnxt/bnxt_tc.c

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1412,11 +1412,7 @@ bnxt_tc_flow_stats_batch_prep(struct bnxt *bp,
14121412
void *flow_node;
14131413
int rc, i;
14141414

1415-
rc = rhashtable_walk_start(iter);
1416-
if (rc && rc != -EAGAIN) {
1417-
i = 0;
1418-
goto done;
1419-
}
1415+
rhashtable_walk_start(iter);
14201416

14211417
rc = 0;
14221418
for (i = 0; i < BNXT_FLOW_STATS_BATCH_MAX; i++) {

drivers/net/ethernet/chelsio/cxgb4/cxgb4_tc_flower.c

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -763,9 +763,7 @@ static void ch_flower_stats_handler(struct work_struct *work)
763763

764764
rhashtable_walk_enter(&adap->flower_tbl, &iter);
765765
do {
766-
flower_entry = ERR_PTR(rhashtable_walk_start(&iter));
767-
if (IS_ERR(flower_entry))
768-
goto walk_stop;
766+
rhashtable_walk_start(&iter);
769767

770768
while ((flower_entry = rhashtable_walk_next(&iter)) &&
771769
!IS_ERR(flower_entry)) {
@@ -784,8 +782,9 @@ static void ch_flower_stats_handler(struct work_struct *work)
784782
spin_unlock(&flower_entry->lock);
785783
}
786784
}
787-
walk_stop:
785+
788786
rhashtable_walk_stop(&iter);
787+
789788
} while (flower_entry == ERR_PTR(-EAGAIN));
790789
rhashtable_walk_exit(&iter);
791790
mod_timer(&adap->flower_stats_timer, jiffies + STATS_CHECK_PERIOD);

fs/gfs2/glock.c

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1549,16 +1549,13 @@ static void glock_hash_walk(glock_examiner examiner, const struct gfs2_sbd *sdp)
15491549
rhashtable_walk_enter(&gl_hash_table, &iter);
15501550

15511551
do {
1552-
gl = ERR_PTR(rhashtable_walk_start(&iter));
1553-
if (IS_ERR(gl))
1554-
goto walk_stop;
1552+
rhashtable_walk_start(&iter);
15551553

15561554
while ((gl = rhashtable_walk_next(&iter)) && !IS_ERR(gl))
15571555
if (gl->gl_name.ln_sbd == sdp &&
15581556
lockref_get_not_dead(&gl->gl_lockref))
15591557
examiner(gl);
15601558

1561-
walk_stop:
15621559
rhashtable_walk_stop(&iter);
15631560
} while (cond_resched(), gl == ERR_PTR(-EAGAIN));
15641561

@@ -1947,7 +1944,7 @@ static void *gfs2_glock_seq_start(struct seq_file *seq, loff_t *pos)
19471944
loff_t n = *pos;
19481945

19491946
rhashtable_walk_enter(&gl_hash_table, &gi->hti);
1950-
if (rhashtable_walk_start(&gi->hti) != 0)
1947+
if (rhashtable_walk_start_check(&gi->hti) != 0)
19511948
return NULL;
19521949

19531950
do {

include/linux/rhashtable.h

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -378,7 +378,13 @@ void *rhashtable_insert_slow(struct rhashtable *ht, const void *key,
378378
void rhashtable_walk_enter(struct rhashtable *ht,
379379
struct rhashtable_iter *iter);
380380
void rhashtable_walk_exit(struct rhashtable_iter *iter);
381-
int rhashtable_walk_start(struct rhashtable_iter *iter) __acquires(RCU);
381+
int rhashtable_walk_start_check(struct rhashtable_iter *iter) __acquires(RCU);
382+
383+
static inline void rhashtable_walk_start(struct rhashtable_iter *iter)
384+
{
385+
(void)rhashtable_walk_start_check(iter);
386+
}
387+
382388
void *rhashtable_walk_next(struct rhashtable_iter *iter);
383389
void rhashtable_walk_stop(struct rhashtable_iter *iter) __releases(RCU);
384390

include/net/sctp/sctp.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ extern struct percpu_counter sctp_sockets_allocated;
116116
int sctp_asconf_mgmt(struct sctp_sock *, struct sctp_sockaddr_entry *);
117117
struct sk_buff *sctp_skb_recv_datagram(struct sock *, int, int, int *);
118118

119-
int sctp_transport_walk_start(struct rhashtable_iter *iter);
119+
void sctp_transport_walk_start(struct rhashtable_iter *iter);
120120
void sctp_transport_walk_stop(struct rhashtable_iter *iter);
121121
struct sctp_transport *sctp_transport_get_next(struct net *net,
122122
struct rhashtable_iter *iter);

lib/rhashtable.c

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -732,7 +732,7 @@ void rhashtable_walk_exit(struct rhashtable_iter *iter)
732732
EXPORT_SYMBOL_GPL(rhashtable_walk_exit);
733733

734734
/**
735-
* rhashtable_walk_start - Start a hash table walk
735+
* rhashtable_walk_start_check - Start a hash table walk
736736
* @iter: Hash table iterator
737737
*
738738
* Start a hash table walk at the current iterator position. Note that we take
@@ -744,8 +744,12 @@ EXPORT_SYMBOL_GPL(rhashtable_walk_exit);
744744
* Returns -EAGAIN if resize event occured. Note that the iterator
745745
* will rewind back to the beginning and you may use it immediately
746746
* by calling rhashtable_walk_next.
747+
*
748+
* rhashtable_walk_start is defined as an inline variant that returns
749+
* void. This is preferred in cases where the caller would ignore
750+
* resize events and always continue.
747751
*/
748-
int rhashtable_walk_start(struct rhashtable_iter *iter)
752+
int rhashtable_walk_start_check(struct rhashtable_iter *iter)
749753
__acquires(RCU)
750754
{
751755
struct rhashtable *ht = iter->ht;
@@ -764,7 +768,7 @@ int rhashtable_walk_start(struct rhashtable_iter *iter)
764768

765769
return 0;
766770
}
767-
EXPORT_SYMBOL_GPL(rhashtable_walk_start);
771+
EXPORT_SYMBOL_GPL(rhashtable_walk_start_check);
768772

769773
/**
770774
* rhashtable_walk_next - Return the next object and advance the iterator

lib/test_rhashtable.c

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -162,11 +162,7 @@ static void test_bucket_stats(struct rhashtable *ht, unsigned int entries)
162162
return;
163163
}
164164

165-
err = rhashtable_walk_start(&hti);
166-
if (err && err != -EAGAIN) {
167-
pr_warn("Test failed: iterator failed: %d\n", err);
168-
return;
169-
}
165+
rhashtable_walk_start(&hti);
170166

171167
while ((pos = rhashtable_walk_next(&hti))) {
172168
if (PTR_ERR(pos) == -EAGAIN) {

net/ipv6/ila/ila_xlat.c

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -512,9 +512,7 @@ static int ila_nl_dump(struct sk_buff *skb, struct netlink_callback *cb)
512512
struct ila_map *ila;
513513
int ret;
514514

515-
ret = rhashtable_walk_start(rhiter);
516-
if (ret && ret != -EAGAIN)
517-
goto done;
515+
rhashtable_walk_start(rhiter);
518516

519517
for (;;) {
520518
ila = rhashtable_walk_next(rhiter);

net/ipv6/seg6.c

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -306,9 +306,7 @@ static int seg6_genl_dumphmac(struct sk_buff *skb, struct netlink_callback *cb)
306306
struct seg6_hmac_info *hinfo;
307307
int ret;
308308

309-
ret = rhashtable_walk_start(iter);
310-
if (ret && ret != -EAGAIN)
311-
goto done;
309+
rhashtable_walk_start(iter);
312310

313311
for (;;) {
314312
hinfo = rhashtable_walk_next(iter);

net/mac80211/mesh_pathtbl.c

Lines changed: 10 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -257,9 +257,7 @@ __mesh_path_lookup_by_idx(struct mesh_table *tbl, int idx)
257257
if (ret)
258258
return NULL;
259259

260-
ret = rhashtable_walk_start(&iter);
261-
if (ret && ret != -EAGAIN)
262-
goto err;
260+
rhashtable_walk_start(&iter);
263261

264262
while ((mpath = rhashtable_walk_next(&iter))) {
265263
if (IS_ERR(mpath) && PTR_ERR(mpath) == -EAGAIN)
@@ -269,7 +267,6 @@ __mesh_path_lookup_by_idx(struct mesh_table *tbl, int idx)
269267
if (i++ == idx)
270268
break;
271269
}
272-
err:
273270
rhashtable_walk_stop(&iter);
274271
rhashtable_walk_exit(&iter);
275272

@@ -513,9 +510,7 @@ void mesh_plink_broken(struct sta_info *sta)
513510
if (ret)
514511
return;
515512

516-
ret = rhashtable_walk_start(&iter);
517-
if (ret && ret != -EAGAIN)
518-
goto out;
513+
rhashtable_walk_start(&iter);
519514

520515
while ((mpath = rhashtable_walk_next(&iter))) {
521516
if (IS_ERR(mpath) && PTR_ERR(mpath) == -EAGAIN)
@@ -535,7 +530,6 @@ void mesh_plink_broken(struct sta_info *sta)
535530
WLAN_REASON_MESH_PATH_DEST_UNREACHABLE, bcast);
536531
}
537532
}
538-
out:
539533
rhashtable_walk_stop(&iter);
540534
rhashtable_walk_exit(&iter);
541535
}
@@ -584,9 +578,7 @@ void mesh_path_flush_by_nexthop(struct sta_info *sta)
584578
if (ret)
585579
return;
586580

587-
ret = rhashtable_walk_start(&iter);
588-
if (ret && ret != -EAGAIN)
589-
goto out;
581+
rhashtable_walk_start(&iter);
590582

591583
while ((mpath = rhashtable_walk_next(&iter))) {
592584
if (IS_ERR(mpath) && PTR_ERR(mpath) == -EAGAIN)
@@ -597,7 +589,7 @@ void mesh_path_flush_by_nexthop(struct sta_info *sta)
597589
if (rcu_access_pointer(mpath->next_hop) == sta)
598590
__mesh_path_del(tbl, mpath);
599591
}
600-
out:
592+
601593
rhashtable_walk_stop(&iter);
602594
rhashtable_walk_exit(&iter);
603595
}
@@ -614,9 +606,7 @@ static void mpp_flush_by_proxy(struct ieee80211_sub_if_data *sdata,
614606
if (ret)
615607
return;
616608

617-
ret = rhashtable_walk_start(&iter);
618-
if (ret && ret != -EAGAIN)
619-
goto out;
609+
rhashtable_walk_start(&iter);
620610

621611
while ((mpath = rhashtable_walk_next(&iter))) {
622612
if (IS_ERR(mpath) && PTR_ERR(mpath) == -EAGAIN)
@@ -627,7 +617,7 @@ static void mpp_flush_by_proxy(struct ieee80211_sub_if_data *sdata,
627617
if (ether_addr_equal(mpath->mpp, proxy))
628618
__mesh_path_del(tbl, mpath);
629619
}
630-
out:
620+
631621
rhashtable_walk_stop(&iter);
632622
rhashtable_walk_exit(&iter);
633623
}
@@ -642,9 +632,7 @@ static void table_flush_by_iface(struct mesh_table *tbl)
642632
if (ret)
643633
return;
644634

645-
ret = rhashtable_walk_start(&iter);
646-
if (ret && ret != -EAGAIN)
647-
goto out;
635+
rhashtable_walk_start(&iter);
648636

649637
while ((mpath = rhashtable_walk_next(&iter))) {
650638
if (IS_ERR(mpath) && PTR_ERR(mpath) == -EAGAIN)
@@ -653,7 +641,7 @@ static void table_flush_by_iface(struct mesh_table *tbl)
653641
break;
654642
__mesh_path_del(tbl, mpath);
655643
}
656-
out:
644+
657645
rhashtable_walk_stop(&iter);
658646
rhashtable_walk_exit(&iter);
659647
}
@@ -873,9 +861,7 @@ void mesh_path_tbl_expire(struct ieee80211_sub_if_data *sdata,
873861
if (ret)
874862
return;
875863

876-
ret = rhashtable_walk_start(&iter);
877-
if (ret && ret != -EAGAIN)
878-
goto out;
864+
rhashtable_walk_start(&iter);
879865

880866
while ((mpath = rhashtable_walk_next(&iter))) {
881867
if (IS_ERR(mpath) && PTR_ERR(mpath) == -EAGAIN)
@@ -887,7 +873,7 @@ void mesh_path_tbl_expire(struct ieee80211_sub_if_data *sdata,
887873
time_after(jiffies, mpath->exp_time + MESH_PATH_EXPIRE))
888874
__mesh_path_del(tbl, mpath);
889875
}
890-
out:
876+
891877
rhashtable_walk_stop(&iter);
892878
rhashtable_walk_exit(&iter);
893879
}

net/netfilter/nft_set_hash.c

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -251,11 +251,7 @@ static void nft_rhash_walk(const struct nft_ctx *ctx, struct nft_set *set,
251251
if (err)
252252
return;
253253

254-
err = rhashtable_walk_start(&hti);
255-
if (err && err != -EAGAIN) {
256-
iter->err = err;
257-
goto out;
258-
}
254+
rhashtable_walk_start(&hti);
259255

260256
while ((he = rhashtable_walk_next(&hti))) {
261257
if (IS_ERR(he)) {
@@ -306,9 +302,7 @@ static void nft_rhash_gc(struct work_struct *work)
306302
if (err)
307303
goto schedule;
308304

309-
err = rhashtable_walk_start(&hti);
310-
if (err && err != -EAGAIN)
311-
goto out;
305+
rhashtable_walk_start(&hti);
312306

313307
while ((he = rhashtable_walk_next(&hti))) {
314308
if (IS_ERR(he)) {

net/netlink/af_netlink.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2478,8 +2478,9 @@ static int netlink_walk_start(struct nl_seq_iter *iter)
24782478
return err;
24792479
}
24802480

2481-
err = rhashtable_walk_start(&iter->hti);
2482-
return err == -EAGAIN ? 0 : err;
2481+
rhashtable_walk_start(&iter->hti);
2482+
2483+
return 0;
24832484
}
24842485

24852486
static void netlink_walk_stop(struct nl_seq_iter *iter)

net/netlink/diag.c

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -115,11 +115,7 @@ static int __netlink_diag_dump(struct sk_buff *skb, struct netlink_callback *cb,
115115
if (!s_num)
116116
rhashtable_walk_enter(&tbl->hash, hti);
117117

118-
ret = rhashtable_walk_start(hti);
119-
if (ret == -EAGAIN)
120-
ret = 0;
121-
if (ret)
122-
goto stop;
118+
rhashtable_walk_start(hti);
123119

124120
while ((nlsk = rhashtable_walk_next(hti))) {
125121
if (IS_ERR(nlsk)) {
@@ -146,8 +142,8 @@ static int __netlink_diag_dump(struct sk_buff *skb, struct netlink_callback *cb,
146142
}
147143
}
148144

149-
stop:
150145
rhashtable_walk_stop(hti);
146+
151147
if (ret)
152148
goto done;
153149

net/sctp/proc.c

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -288,12 +288,8 @@ struct sctp_ht_iter {
288288
static void *sctp_transport_seq_start(struct seq_file *seq, loff_t *pos)
289289
{
290290
struct sctp_ht_iter *iter = seq->private;
291-
int err = sctp_transport_walk_start(&iter->hti);
292291

293-
if (err) {
294-
iter->start_fail = 1;
295-
return ERR_PTR(err);
296-
}
292+
sctp_transport_walk_start(&iter->hti);
297293

298294
iter->start_fail = 0;
299295
return sctp_transport_get_idx(seq_file_net(seq), &iter->hti, *pos);

net/sctp/socket.c

Lines changed: 4 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -4676,20 +4676,11 @@ int sctp_get_sctp_info(struct sock *sk, struct sctp_association *asoc,
46764676
EXPORT_SYMBOL_GPL(sctp_get_sctp_info);
46774677

46784678
/* use callback to avoid exporting the core structure */
4679-
int sctp_transport_walk_start(struct rhashtable_iter *iter)
4679+
void sctp_transport_walk_start(struct rhashtable_iter *iter)
46804680
{
4681-
int err;
4682-
46834681
rhltable_walk_enter(&sctp_transport_hashtable, iter);
46844682

4685-
err = rhashtable_walk_start(iter);
4686-
if (err && err != -EAGAIN) {
4687-
rhashtable_walk_stop(iter);
4688-
rhashtable_walk_exit(iter);
4689-
return err;
4690-
}
4691-
4692-
return 0;
4683+
rhashtable_walk_start(iter);
46934684
}
46944685

46954686
void sctp_transport_walk_stop(struct rhashtable_iter *iter)
@@ -4780,12 +4771,10 @@ int sctp_for_each_transport(int (*cb)(struct sctp_transport *, void *),
47804771
struct net *net, int *pos, void *p) {
47814772
struct rhashtable_iter hti;
47824773
struct sctp_transport *tsp;
4783-
int ret;
4774+
int ret = 0;
47844775

47854776
again:
4786-
ret = sctp_transport_walk_start(&hti);
4787-
if (ret)
4788-
return ret;
4777+
sctp_transport_walk_start(&hti);
47894778

47904779
tsp = sctp_transport_get_idx(net, &hti, *pos + 1);
47914780
for (; !IS_ERR_OR_NULL(tsp); tsp = sctp_transport_get_next(net, &hti)) {

0 commit comments

Comments
 (0)