diff options
author | Eric Dumazet <edumazet@google.com> | 2016-04-14 01:05:39 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2016-04-15 16:45:44 -0400 |
commit | b3d051477cf94e9d71d6acadb8a90de15237b9c1 (patch) | |
tree | 59009bc698f472b31b15059972e6904cd9272d32 /net/ipv4/tcp_ipv4.c | |
parent | ac18dd9e842294377dbaf1e8d169493567a81fa1 (diff) |
tcp: do not mess with listener sk_wmem_alloc
When removing sk_refcnt manipulation on synflood, I missed that
using skb_set_owner_w() was racy, if sk->sk_wmem_alloc had already
transitioned to 0.
We should hold sk_refcnt instead, but this is a big deal under attack.
(Doing so increase performance from 3.2 Mpps to 3.8 Mpps only)
In this patch, I chose to not attach a socket to syncookies skb.
Performance is now 5 Mpps instead of 3.2 Mpps.
Following patch will remove last known false sharing in
tcp_rcv_state_process()
Fixes: 3b24d854cb35 ("tcp/dccp: do not touch listener sk_refcnt under synflood")
Signed-off-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv4/tcp_ipv4.c')
-rw-r--r-- | net/ipv4/tcp_ipv4.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c index f4f2a0a3849d..d2a5763e5abc 100644 --- a/net/ipv4/tcp_ipv4.c +++ b/net/ipv4/tcp_ipv4.c | |||
@@ -830,7 +830,7 @@ static int tcp_v4_send_synack(const struct sock *sk, struct dst_entry *dst, | |||
830 | struct flowi *fl, | 830 | struct flowi *fl, |
831 | struct request_sock *req, | 831 | struct request_sock *req, |
832 | struct tcp_fastopen_cookie *foc, | 832 | struct tcp_fastopen_cookie *foc, |
833 | bool attach_req) | 833 | enum tcp_synack_type synack_type) |
834 | { | 834 | { |
835 | const struct inet_request_sock *ireq = inet_rsk(req); | 835 | const struct inet_request_sock *ireq = inet_rsk(req); |
836 | struct flowi4 fl4; | 836 | struct flowi4 fl4; |
@@ -841,7 +841,7 @@ static int tcp_v4_send_synack(const struct sock *sk, struct dst_entry *dst, | |||
841 | if (!dst && (dst = inet_csk_route_req(sk, &fl4, req)) == NULL) | 841 | if (!dst && (dst = inet_csk_route_req(sk, &fl4, req)) == NULL) |
842 | return -1; | 842 | return -1; |
843 | 843 | ||
844 | skb = tcp_make_synack(sk, dst, req, foc, attach_req); | 844 | skb = tcp_make_synack(sk, dst, req, foc, synack_type); |
845 | 845 | ||
846 | if (skb) { | 846 | if (skb) { |
847 | __tcp_v4_send_check(skb, ireq->ir_loc_addr, ireq->ir_rmt_addr); | 847 | __tcp_v4_send_check(skb, ireq->ir_loc_addr, ireq->ir_rmt_addr); |