mirror of
				https://github.com/Ysurac/openmptcprouter.git
				synced 2025-03-09 15:40:20 +00:00 
			
		
		
		
	This commit is contained in:
		
							parent
							
								
									bcdc53d0dd
								
							
						
					
					
						commit
						c725009877
					
				
					 1 changed files with 38 additions and 34 deletions
				
			
		| 
						 | 
				
			
			@ -4558,7 +4558,7 @@ diff -aurN ../linux-4.9.131/net/ipv4/tcp_ipv4.c ./net/ipv4/tcp_ipv4.c
 | 
			
		|||
+			if (!sock_owned_by_user(meta_sk)) {
 | 
			
		||||
 				tcp_v4_mtu_reduced(sk);
 | 
			
		||||
 			} else {
 | 
			
		||||
 				if (!test_and_set_bit(TCP_MTU_REDUCED_DEFERRED, &tp->tsq_flags))
 | 
			
		||||
 				if (!test_and_set_bit(TCP_MTU_REDUCED_DEFERRED, &sk->sk_tsq_flags))
 | 
			
		||||
 					sock_hold(sk);
 | 
			
		||||
+				if (mptcp(tp))
 | 
			
		||||
+					mptcp_tsq_flags(sk);
 | 
			
		||||
| 
						 | 
				
			
			@ -5401,43 +5401,47 @@ diff -aurN ../linux-4.9.131/net/ipv4/tcp_output.c ./net/ipv4/tcp_output.c
 | 
			
		|||
 
 | 
			
		||||
 	local_irq_save(flags);
 | 
			
		||||
 	list_splice_init(&tsq->head, &list);
 | 
			
		||||
@@ -774,15 +786,25 @@
 | 
			
		||||
 		list_del(&tp->tsq_node);
 | 
			
		||||
@@ -785,14 +796,28 @@
 | 
			
		||||
 		smp_mb__before_atomic();
 | 
			
		||||
 		clear_bit(TSQ_QUEUED, &sk->sk_tsq_flags);
 | 
			
		||||
 
 | 
			
		||||
 		sk = (struct sock *)tp;
 | 
			
		||||
-		bh_lock_sock(sk);
 | 
			
		||||
-		if (!sk->sk_lock.owned &&
 | 
			
		||||
+		meta_sk = mptcp(tp) ? mptcp_meta_sk(sk) : sk;
 | 
			
		||||
+		bh_lock_sock(meta_sk);
 | 
			
		||||
 
 | 
			
		||||
-		if (!sock_owned_by_user(sk)) {
 | 
			
		||||
+		if (!sock_owned_by_user(meta_sk)) {
 | 
			
		||||
 			tcp_tsq_handler(sk);
 | 
			
		||||
+			if (mptcp(tp))
 | 
			
		||||
+				tcp_tsq_handler(meta_sk);
 | 
			
		||||
 		} else {
 | 
			
		||||
+			if (mptcp(tp) && sk->sk_state == TCP_CLOSE)
 | 
			
		||||
+				goto exit;
 | 
			
		||||
+
 | 
			
		||||
 			/* defer the work to tcp_release_cb() */
 | 
			
		||||
 			set_bit(TCP_TSQ_DEFERRED, &tp->tsq_flags);
 | 
			
		||||
+
 | 
			
		||||
+			if (mptcp(tp))
 | 
			
		||||
+				mptcp_tsq_flags(sk);
 | 
			
		||||
+		if (!meta_sk->sk_lock.owned &&
 | 
			
		||||
 		    test_bit(TCP_TSQ_DEFERRED, &sk->sk_tsq_flags)) {
 | 
			
		||||
-			bh_lock_sock(sk);
 | 
			
		||||
-			if (!sock_owned_by_user(sk)) {
 | 
			
		||||
+			bh_lock_sock(meta_sk);
 | 
			
		||||
+			if (!sock_owned_by_user(meta_sk)) {
 | 
			
		||||
 				clear_bit(TCP_TSQ_DEFERRED, &sk->sk_tsq_flags);
 | 
			
		||||
 				tcp_tsq_handler(sk);
 | 
			
		||||
+				if (mptcp(tp))
 | 
			
		||||
+					tcp_tsq_handler(meta_sk);
 | 
			
		||||
+			} else if (mptcp(tp)) {
 | 
			
		||||
+				if (sk->sk_state != TCP_CLOSE)
 | 
			
		||||
+					mptcp_tsq_flags(sk);
 | 
			
		||||
+			}
 | 
			
		||||
+			bh_unlock_sock(meta_sk);
 | 
			
		||||
+		} else {
 | 
			
		||||
+			if (mptcp(tp)) {
 | 
			
		||||
+				bh_lock_sock(meta_sk);
 | 
			
		||||
+				if (sk->sk_state != TCP_CLOSE)
 | 
			
		||||
+					mptcp_tsq_flags(sk);
 | 
			
		||||
+				bh_unlock_sock(meta_sk);
 | 
			
		||||
 			}
 | 
			
		||||
-			bh_unlock_sock(sk);
 | 
			
		||||
 		}
 | 
			
		||||
-		bh_unlock_sock(sk);
 | 
			
		||||
+exit:
 | 
			
		||||
+		bh_unlock_sock(meta_sk);
 | 
			
		||||
 
 | 
			
		||||
 		clear_bit(TSQ_QUEUED, &tp->tsq_flags);
 | 
			
		||||
 		sk_free(sk);
 | 
			
		||||
@@ -792,7 +814,10 @@
 | 
			
		||||
 #define TCP_DEFERRED_ALL ((1UL << TCP_TSQ_DEFERRED) |		\
 | 
			
		||||
 			  (1UL << TCP_WRITE_TIMER_DEFERRED) |	\
 | 
			
		||||
 			  (1UL << TCP_DELACK_TIMER_DEFERRED) |	\
 | 
			
		||||
-			  (1UL << TCP_MTU_REDUCED_DEFERRED))
 | 
			
		||||
+			  (1UL << TCP_MTU_REDUCED_DEFERRED) |   \
 | 
			
		||||
+			  (1UL << MPTCP_PATH_MANAGER_DEFERRED) |\
 | 
			
		||||
+			  (1UL << MPTCP_SUB_DEFERRED))
 | 
			
		||||
 #define TCP_DEFERRED_ALL (TCPF_TSQ_DEFERRED |		\
 | 
			
		||||
 			  TCPF_WRITE_TIMER_DEFERRED |	\
 | 
			
		||||
 			  TCPF_DELACK_TIMER_DEFERRED |	\
 | 
			
		||||
-			  TCPF_MTU_REDUCED_DEFERRED)
 | 
			
		||||
+			  TCPF_MTU_REDUCED_DEFERRED |   \
 | 
			
		||||
+			  MPTCP_PATH_MANAGER_DEFERRED |\
 | 
			
		||||
+			  MPTCP_SUB_DEFERRED)
 | 
			
		||||
+
 | 
			
		||||
 /**
 | 
			
		||||
  * tcp_release_cb - tcp release_sock() callback
 | 
			
		||||
| 
						 | 
				
			
			@ -5873,7 +5877,7 @@ diff -aurN ../linux-4.9.131/net/ipv4/tcp_timer.c ./net/ipv4/tcp_timer.c
 | 
			
		|||
-		__NET_INC_STATS(sock_net(sk), LINUX_MIB_DELAYEDACKLOCKED);
 | 
			
		||||
+		__NET_INC_STATS(sock_net(meta_sk), LINUX_MIB_DELAYEDACKLOCKED);
 | 
			
		||||
 		/* deleguate our work to tcp_release_cb() */
 | 
			
		||||
 		if (!test_and_set_bit(TCP_DELACK_TIMER_DEFERRED, &tcp_sk(sk)->tsq_flags))
 | 
			
		||||
 		if (!test_and_set_bit(TCP_DELACK_TIMER_DEFERRED, &sk->sk_tsq_flags))
 | 
			
		||||
 			sock_hold(sk);
 | 
			
		||||
+		if (mptcp(tp))
 | 
			
		||||
+			mptcp_tsq_flags(sk);
 | 
			
		||||
| 
						 | 
				
			
			@ -5905,7 +5909,7 @@ diff -aurN ../linux-4.9.131/net/ipv4/tcp_timer.c ./net/ipv4/tcp_timer.c
 | 
			
		|||
 		tcp_write_timer_handler(sk);
 | 
			
		||||
 	} else {
 | 
			
		||||
 		/* delegate our work to tcp_release_cb() */
 | 
			
		||||
 		if (!test_and_set_bit(TCP_WRITE_TIMER_DEFERRED, &tcp_sk(sk)->tsq_flags))
 | 
			
		||||
 		if (!test_and_set_bit(TCP_WRITE_TIMER_DEFERRED, &sk->sk_tsq_flags))
 | 
			
		||||
 			sock_hold(sk);
 | 
			
		||||
+		if (mptcp(tcp_sk(sk)))
 | 
			
		||||
+			mptcp_tsq_flags(sk);
 | 
			
		||||
| 
						 | 
				
			
			@ -6268,7 +6272,7 @@ diff -aurN ../linux-4.9.131/net/ipv6/tcp_ipv6.c ./net/ipv6/tcp_ipv6.c
 | 
			
		|||
-		else if (!test_and_set_bit(TCP_MTU_REDUCED_DEFERRED,
 | 
			
		||||
+		else {
 | 
			
		||||
+			if (!test_and_set_bit(TCP_MTU_REDUCED_DEFERRED,
 | 
			
		||||
 					   &tp->tsq_flags))
 | 
			
		||||
 					   &sk->sk_tsq_flags))
 | 
			
		||||
-			sock_hold(sk);
 | 
			
		||||
+				sock_hold(sk);
 | 
			
		||||
+			if (mptcp(tp))
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue