.. | .. |
---|
62 | 62 | #include <linux/init.h> |
---|
63 | 63 | #include <linux/times.h> |
---|
64 | 64 | #include <linux/slab.h> |
---|
| 65 | +#include <linux/locallock.h> |
---|
65 | 66 | |
---|
66 | 67 | #include <net/net_namespace.h> |
---|
67 | 68 | #include <net/icmp.h> |
---|
.. | .. |
---|
637 | 638 | } |
---|
638 | 639 | EXPORT_SYMBOL(tcp_v4_send_check); |
---|
639 | 640 | |
---|
| 641 | +static DEFINE_LOCAL_IRQ_LOCK(tcp_sk_lock); |
---|
640 | 642 | /* |
---|
641 | 643 | * This routine will send an RST to the other tcp. |
---|
642 | 644 | * |
---|
.. | .. |
---|
771 | 773 | arg.tos = ip_hdr(skb)->tos; |
---|
772 | 774 | arg.uid = sock_net_uid(net, sk && sk_fullsock(sk) ? sk : NULL); |
---|
773 | 775 | local_bh_disable(); |
---|
| 776 | + local_lock(tcp_sk_lock); |
---|
774 | 777 | ctl_sk = *this_cpu_ptr(net->ipv4.tcp_sk); |
---|
775 | 778 | if (sk) |
---|
776 | 779 | ctl_sk->sk_mark = (sk->sk_state == TCP_TIME_WAIT) ? |
---|
.. | .. |
---|
783 | 786 | ctl_sk->sk_mark = 0; |
---|
784 | 787 | __TCP_INC_STATS(net, TCP_MIB_OUTSEGS); |
---|
785 | 788 | __TCP_INC_STATS(net, TCP_MIB_OUTRSTS); |
---|
| 789 | + local_unlock(tcp_sk_lock); |
---|
786 | 790 | local_bh_enable(); |
---|
787 | 791 | |
---|
788 | 792 | #ifdef CONFIG_TCP_MD5SIG |
---|
.. | .. |
---|
863 | 867 | arg.tos = tos; |
---|
864 | 868 | arg.uid = sock_net_uid(net, sk_fullsock(sk) ? sk : NULL); |
---|
865 | 869 | local_bh_disable(); |
---|
| 870 | + local_lock(tcp_sk_lock); |
---|
866 | 871 | ctl_sk = *this_cpu_ptr(net->ipv4.tcp_sk); |
---|
867 | 872 | if (sk) |
---|
868 | 873 | ctl_sk->sk_mark = (sk->sk_state == TCP_TIME_WAIT) ? |
---|
.. | .. |
---|
874 | 879 | |
---|
875 | 880 | ctl_sk->sk_mark = 0; |
---|
876 | 881 | __TCP_INC_STATS(net, TCP_MIB_OUTSEGS); |
---|
| 882 | + local_unlock(tcp_sk_lock); |
---|
877 | 883 | local_bh_enable(); |
---|
878 | 884 | } |
---|
879 | 885 | |
---|