mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-29 19:21:31 -04:00
inet: simplify timewait refcounting
timewait sockets have a complex refcounting logic.
Once we realize it should be similar to established and
syn_recv sockets, we can use sk_nulls_del_node_init_rcu()
and remove inet_twsk_unhash()
In particular, deferred inet_twsk_put() added in commit
13475a30b6 ("tcp: connect() race with timewait reuse")
looks unecessary : When removing a timewait socket from
ehash or bhash, caller must own a reference on the socket
anyway.
Signed-off-by: Eric Dumazet <[email protected]>
Signed-off-by: David S. Miller <[email protected]>
This commit is contained in:
parent
3fd2f1b9d9
commit
fc01538f9f
5 changed files with 21 additions and 68 deletions
|
|
@ -207,7 +207,6 @@ static int __inet6_check_established(struct inet_timewait_death_row *death_row,
|
|||
struct sock *sk2;
|
||||
const struct hlist_nulls_node *node;
|
||||
struct inet_timewait_sock *tw = NULL;
|
||||
int twrefcnt = 0;
|
||||
|
||||
spin_lock(lock);
|
||||
|
||||
|
|
@ -234,12 +233,10 @@ static int __inet6_check_established(struct inet_timewait_death_row *death_row,
|
|||
WARN_ON(!sk_unhashed(sk));
|
||||
__sk_nulls_add_node_rcu(sk, &head->chain);
|
||||
if (tw) {
|
||||
twrefcnt = inet_twsk_unhash(tw);
|
||||
sk_nulls_del_node_init_rcu((struct sock *)tw);
|
||||
NET_INC_STATS_BH(net, LINUX_MIB_TIMEWAITRECYCLED);
|
||||
}
|
||||
spin_unlock(lock);
|
||||
if (twrefcnt)
|
||||
inet_twsk_put(tw);
|
||||
sock_prot_inuse_add(sock_net(sk), sk->sk_prot, 1);
|
||||
|
||||
if (twp) {
|
||||
|
|
@ -247,7 +244,6 @@ static int __inet6_check_established(struct inet_timewait_death_row *death_row,
|
|||
} else if (tw) {
|
||||
/* Silly. Should hash-dance instead... */
|
||||
inet_twsk_deschedule(tw);
|
||||
|
||||
inet_twsk_put(tw);
|
||||
}
|
||||
return 0;
|
||||
|
|
|
|||
Loading…
Reference in a new issue