forked from mirrors/linux
		
	tcp: add memory barriers to write space paths
Ensure that we either see that the buffer has write space in tcp_poll() or that we perform a wakeup from the input side. Did not run into any actual problem here, but thought that we should make things explicit. Signed-off-by: Jason Baron <jbaron@akamai.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
		
							parent
							
								
									71cd26e76a
								
							
						
					
					
						commit
						3c7151275c
					
				
					 2 changed files with 5 additions and 1 deletions
				
			
		| 
						 | 
				
			
			@ -520,8 +520,10 @@ unsigned int tcp_poll(struct file *file, struct socket *sock, poll_table *wait)
 | 
			
		|||
 | 
			
		||||
				/* Race breaker. If space is freed after
 | 
			
		||||
				 * wspace test but before the flags are set,
 | 
			
		||||
				 * IO signal will be lost.
 | 
			
		||||
				 * IO signal will be lost. Memory barrier
 | 
			
		||||
				 * pairs with the input side.
 | 
			
		||||
				 */
 | 
			
		||||
				smp_mb__after_atomic();
 | 
			
		||||
				if (sk_stream_is_writeable(sk))
 | 
			
		||||
					mask |= POLLOUT | POLLWRNORM;
 | 
			
		||||
			}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -4845,6 +4845,8 @@ static void tcp_check_space(struct sock *sk)
 | 
			
		|||
{
 | 
			
		||||
	if (sock_flag(sk, SOCK_QUEUE_SHRUNK)) {
 | 
			
		||||
		sock_reset_flag(sk, SOCK_QUEUE_SHRUNK);
 | 
			
		||||
		/* pairs with tcp_poll() */
 | 
			
		||||
		smp_mb__after_atomic();
 | 
			
		||||
		if (sk->sk_socket &&
 | 
			
		||||
		    test_bit(SOCK_NOSPACE, &sk->sk_socket->flags))
 | 
			
		||||
			tcp_new_space(sk);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue