forked from mirrors/linux
		
	tcp: must block bh in __inet_twsk_hashdance()
__inet_twsk_hashdance() might be called from process context,
better block BH before acquiring bind hash and established locks
Fixes: c10d9310ed ("tcp: do not assume TCP code is non preemptible")
Signed-off-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
			
			
This commit is contained in:
		
							parent
							
								
									46cc6e4976
								
							
						
					
					
						commit
						614bdd4d6e
					
				
					 1 changed files with 3 additions and 3 deletions
				
			
		| 
						 | 
					@ -94,7 +94,7 @@ static void inet_twsk_add_bind_node(struct inet_timewait_sock *tw,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * Enter the time wait state. This is called with locally disabled BH.
 | 
					 * Enter the time wait state.
 | 
				
			||||||
 * Essentially we whip up a timewait bucket, copy the relevant info into it
 | 
					 * Essentially we whip up a timewait bucket, copy the relevant info into it
 | 
				
			||||||
 * from the SK, and mess with hash chains and list linkage.
 | 
					 * from the SK, and mess with hash chains and list linkage.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
| 
						 | 
					@ -112,7 +112,7 @@ void __inet_twsk_hashdance(struct inet_timewait_sock *tw, struct sock *sk,
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
	bhead = &hashinfo->bhash[inet_bhashfn(twsk_net(tw), inet->inet_num,
 | 
						bhead = &hashinfo->bhash[inet_bhashfn(twsk_net(tw), inet->inet_num,
 | 
				
			||||||
			hashinfo->bhash_size)];
 | 
								hashinfo->bhash_size)];
 | 
				
			||||||
	spin_lock(&bhead->lock);
 | 
						spin_lock_bh(&bhead->lock);
 | 
				
			||||||
	tw->tw_tb = icsk->icsk_bind_hash;
 | 
						tw->tw_tb = icsk->icsk_bind_hash;
 | 
				
			||||||
	WARN_ON(!icsk->icsk_bind_hash);
 | 
						WARN_ON(!icsk->icsk_bind_hash);
 | 
				
			||||||
	inet_twsk_add_bind_node(tw, &tw->tw_tb->owners);
 | 
						inet_twsk_add_bind_node(tw, &tw->tw_tb->owners);
 | 
				
			||||||
| 
						 | 
					@ -138,7 +138,7 @@ void __inet_twsk_hashdance(struct inet_timewait_sock *tw, struct sock *sk,
 | 
				
			||||||
	if (__sk_nulls_del_node_init_rcu(sk))
 | 
						if (__sk_nulls_del_node_init_rcu(sk))
 | 
				
			||||||
		sock_prot_inuse_add(sock_net(sk), sk->sk_prot, -1);
 | 
							sock_prot_inuse_add(sock_net(sk), sk->sk_prot, -1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	spin_unlock(lock);
 | 
						spin_unlock_bh(lock);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
EXPORT_SYMBOL_GPL(__inet_twsk_hashdance);
 | 
					EXPORT_SYMBOL_GPL(__inet_twsk_hashdance);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue