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

Commit 2d331915 authored by Eric Dumazet's avatar Eric Dumazet Committed by David S. Miller
Browse files

tcp/dccp: use rcu locking in inet_diag_find_one_icsk()



RX packet processing holds rcu_read_lock(), so we can remove
pairs of rcu_read_lock()/rcu_read_unlock() in lookup functions
if inet_diag also holds rcu before calling them.

This is needed anyway as __inet_lookup_listener() and
inet6_lookup_listener() will soon no longer increment
refcount on the found listener.

Signed-off-by: default avatarEric Dumazet <edumazet@google.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent ee3cf32a
Loading
Loading
Loading
Loading
+5 −2
Original line number Diff line number Diff line
@@ -356,6 +356,7 @@ struct sock *inet_diag_find_one_icsk(struct net *net,
{
	struct sock *sk;

	rcu_read_lock();
	if (req->sdiag_family == AF_INET)
		sk = inet_lookup(net, hashinfo, NULL, 0, req->id.idiag_dst[0],
				 req->id.idiag_dport, req->id.idiag_src[0],
@@ -376,9 +377,11 @@ struct sock *inet_diag_find_one_icsk(struct net *net,
					  req->id.idiag_if);
	}
#endif
	else
	else {
		rcu_read_unlock();
		return ERR_PTR(-EINVAL);

	}
	rcu_read_unlock();
	if (!sk)
		return ERR_PTR(-ENOENT);

+0 −4
Original line number Diff line number Diff line
@@ -220,7 +220,6 @@ struct sock *__inet_lookup_listener(struct net *net,
	bool select_ok = true;
	u32 phash = 0;

	rcu_read_lock();
begin:
	result = NULL;
	hiscore = 0;
@@ -269,7 +268,6 @@ struct sock *__inet_lookup_listener(struct net *net,
			goto begin;
		}
	}
	rcu_read_unlock();
	return result;
}
EXPORT_SYMBOL_GPL(__inet_lookup_listener);
@@ -312,7 +310,6 @@ struct sock *__inet_lookup_established(struct net *net,
	unsigned int slot = hash & hashinfo->ehash_mask;
	struct inet_ehash_bucket *head = &hashinfo->ehash[slot];

	rcu_read_lock();
begin:
	sk_nulls_for_each_rcu(sk, node, &head->chain) {
		if (sk->sk_hash != hash)
@@ -339,7 +336,6 @@ struct sock *__inet_lookup_established(struct net *net,
out:
	sk = NULL;
found:
	rcu_read_unlock();
	return sk;
}
EXPORT_SYMBOL_GPL(__inet_lookup_established);
+0 −4
Original line number Diff line number Diff line
@@ -69,7 +69,6 @@ struct sock *__inet6_lookup_established(struct net *net,
	struct inet_ehash_bucket *head = &hashinfo->ehash[slot];


	rcu_read_lock();
begin:
	sk_nulls_for_each_rcu(sk, node, &head->chain) {
		if (sk->sk_hash != hash)
@@ -90,7 +89,6 @@ struct sock *__inet6_lookup_established(struct net *net,
out:
	sk = NULL;
found:
	rcu_read_unlock();
	return sk;
}
EXPORT_SYMBOL(__inet6_lookup_established);
@@ -138,7 +136,6 @@ struct sock *inet6_lookup_listener(struct net *net,
	unsigned int hash = inet_lhashfn(net, hnum);
	struct inet_listen_hashbucket *ilb = &hashinfo->listening_hash[hash];

	rcu_read_lock();
begin:
	result = NULL;
	hiscore = 0;
@@ -187,7 +184,6 @@ struct sock *inet6_lookup_listener(struct net *net,
			goto begin;
		}
	}
	rcu_read_unlock();
	return result;
}
EXPORT_SYMBOL_GPL(inet6_lookup_listener);