ipv4: tcp: ip_send_unicast_reply() is not BH safe
I forgot that ip_send_unicast_reply() is not BH safe (yet).
Disabling preemption before calling it was not a good move.
Fixes: c10d9310ed
("tcp: do not assume TCP code is non preemptible")
Signed-off-by: Eric Dumazet <edumazet@google.com>
Reported-by: Andres Lagar-Cavilla <andreslc@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Родитель
4b307a8edb
Коммит
47dcc20a39
|
@ -692,7 +692,7 @@ static void tcp_v4_send_reset(const struct sock *sk, struct sk_buff *skb)
|
|||
offsetof(struct inet_timewait_sock, tw_bound_dev_if));
|
||||
|
||||
arg.tos = ip_hdr(skb)->tos;
|
||||
preempt_disable();
|
||||
local_bh_disable();
|
||||
ip_send_unicast_reply(*this_cpu_ptr(net->ipv4.tcp_sk),
|
||||
skb, &TCP_SKB_CB(skb)->header.h4.opt,
|
||||
ip_hdr(skb)->saddr, ip_hdr(skb)->daddr,
|
||||
|
@ -700,7 +700,7 @@ static void tcp_v4_send_reset(const struct sock *sk, struct sk_buff *skb)
|
|||
|
||||
__TCP_INC_STATS(net, TCP_MIB_OUTSEGS);
|
||||
__TCP_INC_STATS(net, TCP_MIB_OUTRSTS);
|
||||
preempt_enable();
|
||||
local_bh_enable();
|
||||
|
||||
#ifdef CONFIG_TCP_MD5SIG
|
||||
out:
|
||||
|
@ -776,14 +776,14 @@ static void tcp_v4_send_ack(struct net *net,
|
|||
if (oif)
|
||||
arg.bound_dev_if = oif;
|
||||
arg.tos = tos;
|
||||
preempt_disable();
|
||||
local_bh_disable();
|
||||
ip_send_unicast_reply(*this_cpu_ptr(net->ipv4.tcp_sk),
|
||||
skb, &TCP_SKB_CB(skb)->header.h4.opt,
|
||||
ip_hdr(skb)->saddr, ip_hdr(skb)->daddr,
|
||||
&arg, arg.iov[0].iov_len);
|
||||
|
||||
__TCP_INC_STATS(net, TCP_MIB_OUTSEGS);
|
||||
preempt_enable();
|
||||
local_bh_enable();
|
||||
}
|
||||
|
||||
static void tcp_v4_timewait_ack(struct sock *sk, struct sk_buff *skb)
|
||||
|
|
Загрузка…
Ссылка в новой задаче