diff options
-rw-r--r-- | net/ipv4/tcp.c | 4 | ||||
-rw-r--r-- | net/ipv4/tcp_input.c | 2 |
2 files changed, 5 insertions, 1 deletions
diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c index 59c8a027721b..8c5cd9efebbc 100644 --- a/net/ipv4/tcp.c +++ b/net/ipv4/tcp.c | |||
@@ -520,8 +520,10 @@ unsigned int tcp_poll(struct file *file, struct socket *sock, poll_table *wait) | |||
520 | 520 | ||
521 | /* Race breaker. If space is freed after | 521 | /* Race breaker. If space is freed after |
522 | * wspace test but before the flags are set, | 522 | * wspace test but before the flags are set, |
523 | * IO signal will be lost. | 523 | * IO signal will be lost. Memory barrier |
524 | * pairs with the input side. | ||
524 | */ | 525 | */ |
526 | smp_mb__after_atomic(); | ||
525 | if (sk_stream_is_writeable(sk)) | 527 | if (sk_stream_is_writeable(sk)) |
526 | mask |= POLLOUT | POLLWRNORM; | 528 | mask |= POLLOUT | POLLWRNORM; |
527 | } | 529 | } |
diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index a7ef679dd3ea..3a4d9b34bed4 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c | |||
@@ -4845,6 +4845,8 @@ static void tcp_check_space(struct sock *sk) | |||
4845 | { | 4845 | { |
4846 | if (sock_flag(sk, SOCK_QUEUE_SHRUNK)) { | 4846 | if (sock_flag(sk, SOCK_QUEUE_SHRUNK)) { |
4847 | sock_reset_flag(sk, SOCK_QUEUE_SHRUNK); | 4847 | sock_reset_flag(sk, SOCK_QUEUE_SHRUNK); |
4848 | /* pairs with tcp_poll() */ | ||
4849 | smp_mb__after_atomic(); | ||
4848 | if (sk->sk_socket && | 4850 | if (sk->sk_socket && |
4849 | test_bit(SOCK_NOSPACE, &sk->sk_socket->flags)) | 4851 | test_bit(SOCK_NOSPACE, &sk->sk_socket->flags)) |
4850 | tcp_new_space(sk); | 4852 | tcp_new_space(sk); |