| .. | .. |
|---|
| 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 | |
|---|