Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 97a6ec4a authored by Tom Herbert's avatar Tom Herbert Committed by David S. Miller
Browse files

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: default avatarTom Herbert <tom@quantonium.net>
Acked-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent a0b586fa
Loading
Loading
Loading
Loading
+1 −5
Original line number Diff line number Diff line
@@ -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++) {
+3 −4
Original line number Diff line number Diff line
@@ -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);
+2 −5
Original line number Diff line number Diff line
@@ -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 {
+7 −1
Original line number Diff line number Diff line
@@ -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);

+1 −1
Original line number Diff line number Diff line
@@ -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);
Loading