Skip to content

Commit

Permalink
tcp/dccp: use rcu locking in inet_diag_find_one_icsk()
Browse files Browse the repository at this point in the history
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: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Eric Dumazet authored and David S. Miller committed Apr 5, 2016
1 parent ee3cf32 commit 2d33191
Show file tree
Hide file tree
Showing 3 changed files with 5 additions and 10 deletions.
7 changes: 5 additions & 2 deletions net/ipv4/inet_diag.c
Original file line number Diff line number Diff line change
Expand Up @@ -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],
Expand All @@ -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);

Expand Down
4 changes: 0 additions & 4 deletions net/ipv4/inet_hashtables.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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)
Expand All @@ -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);
Expand Down
4 changes: 0 additions & 4 deletions net/ipv6/inet6_hashtables.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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);
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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);
Expand Down

0 comments on commit 2d33191

Please sign in to comment.