Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge branch 'mptcp-misc-fixes-for-v6-18-rc7'

Matthieu Baerts says:

====================
mptcp: misc fixes for v6.18-rc7

Here are various unrelated fixes:

- Patch 1: Fix window space computation for fallback connections which
can affect ACK generation. A fix for v5.11.

- Patch 2: Avoid unneeded subflow-level drops due to unsynced received
window. A fix for v5.11.

- Patch 3: Avoid premature close for fallback connections with PREEMPT
kernels. A fix for v5.12.

- Patch 4: Reset instead of fallback in case of data in the MPTCP
out-of-order queue. A fix for v5.7.

- Patches 5-7: Avoid also sending "plain" TCP reset when closing with an
MP_FASTCLOSE. A fix for v6.1.

- Patches 8-9: Longer timeout for background connections in MPTCP Join
selftests. An additional fix for recent patches for v5.13/v6.1.

- Patches 10-11: Fix typo in a check introduce in a recent refactoring.
A fix for v6.15.
====================

Link: https://patch.msgid.link/20251118-net-mptcp-misc-fixes-6-18-rc6-v1-0-806d3781c95f@kernel.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>

+113 -32
+53 -1
net/mptcp/options.c
··· 838 838 839 839 opts->suboptions = 0; 840 840 841 + /* Force later mptcp_write_options(), but do not use any actual 842 + * option space. 843 + */ 841 844 if (unlikely(__mptcp_check_fallback(msk) && !mptcp_check_infinite_map(skb))) 842 - return false; 845 + return true; 843 846 844 847 if (unlikely(skb && TCP_SKB_CB(skb)->tcp_flags & TCPHDR_RST)) { 845 848 if (mptcp_established_options_fastclose(sk, &opt_size, remaining, opts) || ··· 1044 1041 WRITE_ONCE(msk->snd_una, new_snd_una); 1045 1042 } 1046 1043 1044 + static void rwin_update(struct mptcp_sock *msk, struct sock *ssk, 1045 + struct sk_buff *skb) 1046 + { 1047 + struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(ssk); 1048 + struct tcp_sock *tp = tcp_sk(ssk); 1049 + u64 mptcp_rcv_wnd; 1050 + 1051 + /* Avoid touching extra cachelines if TCP is going to accept this 1052 + * skb without filling the TCP-level window even with a possibly 1053 + * outdated mptcp-level rwin. 1054 + */ 1055 + if (!skb->len || skb->len < tcp_receive_window(tp)) 1056 + return; 1057 + 1058 + mptcp_rcv_wnd = atomic64_read(&msk->rcv_wnd_sent); 1059 + if (!after64(mptcp_rcv_wnd, subflow->rcv_wnd_sent)) 1060 + return; 1061 + 1062 + /* Some other subflow grew the mptcp-level rwin since rcv_wup, 1063 + * resync. 1064 + */ 1065 + tp->rcv_wnd += mptcp_rcv_wnd - subflow->rcv_wnd_sent; 1066 + subflow->rcv_wnd_sent = mptcp_rcv_wnd; 1067 + } 1068 + 1047 1069 static void ack_update_msk(struct mptcp_sock *msk, 1048 1070 struct sock *ssk, 1049 1071 struct mptcp_options_received *mp_opt) ··· 1236 1208 */ 1237 1209 if (mp_opt.use_ack) 1238 1210 ack_update_msk(msk, sk, &mp_opt); 1211 + rwin_update(msk, sk, skb); 1239 1212 1240 1213 /* Zero-data-length packets are dropped by the caller and not 1241 1214 * propagated to the MPTCP layer, so the skb extension does not ··· 1323 1294 1324 1295 if (rcv_wnd_new != rcv_wnd_old) { 1325 1296 raise_win: 1297 + /* The msk-level rcv wnd is after the tcp level one, 1298 + * sync the latter. 1299 + */ 1300 + rcv_wnd_new = rcv_wnd_old; 1326 1301 win = rcv_wnd_old - ack_seq; 1327 1302 tp->rcv_wnd = min_t(u64, win, U32_MAX); 1328 1303 new_win = tp->rcv_wnd; ··· 1349 1316 } 1350 1317 1351 1318 update_wspace: 1319 + WRITE_ONCE(msk->old_wspace, tp->rcv_wnd); 1320 + subflow->rcv_wnd_sent = rcv_wnd_new; 1321 + } 1322 + 1323 + static void mptcp_track_rwin(struct tcp_sock *tp) 1324 + { 1325 + const struct sock *ssk = (const struct sock *)tp; 1326 + struct mptcp_subflow_context *subflow; 1327 + struct mptcp_sock *msk; 1328 + 1329 + if (!ssk) 1330 + return; 1331 + 1332 + subflow = mptcp_subflow_ctx(ssk); 1333 + msk = mptcp_sk(subflow->conn); 1352 1334 WRITE_ONCE(msk->old_wspace, tp->rcv_wnd); 1353 1335 } 1354 1336 ··· 1658 1610 TCPOLEN_MPTCP_RST, 1659 1611 opts->reset_transient, 1660 1612 opts->reset_reason); 1613 + return; 1614 + } else if (unlikely(!opts->suboptions)) { 1615 + /* Fallback to TCP */ 1616 + mptcp_track_rwin(tp); 1661 1617 return; 1662 1618 } 1663 1619
+1 -1
net/mptcp/pm_kernel.c
··· 672 672 673 673 void mptcp_pm_nl_rm_addr(struct mptcp_sock *msk, u8 rm_id) 674 674 { 675 - if (rm_id && WARN_ON_ONCE(msk->pm.add_addr_accepted == 0)) { 675 + if (rm_id && !WARN_ON_ONCE(msk->pm.add_addr_accepted == 0)) { 676 676 u8 limit_add_addr_accepted = 677 677 mptcp_pm_get_limit_add_addr_accepted(msk); 678 678
+41 -18
net/mptcp/protocol.c
··· 76 76 if (__mptcp_check_fallback(msk)) 77 77 return true; 78 78 79 + /* The caller possibly is not holding the msk socket lock, but 80 + * in the fallback case only the current subflow is touching 81 + * the OoO queue. 82 + */ 83 + if (!RB_EMPTY_ROOT(&msk->out_of_order_queue)) 84 + return false; 85 + 79 86 spin_lock_bh(&msk->fallback_lock); 80 87 if (!msk->allow_infinite_fallback) { 81 88 spin_unlock_bh(&msk->fallback_lock); ··· 2409 2402 2410 2403 /* flags for __mptcp_close_ssk() */ 2411 2404 #define MPTCP_CF_PUSH BIT(1) 2412 - #define MPTCP_CF_FASTCLOSE BIT(2) 2413 2405 2414 2406 /* be sure to send a reset only if the caller asked for it, also 2415 2407 * clean completely the subflow status when the subflow reaches ··· 2419 2413 unsigned int flags) 2420 2414 { 2421 2415 if (((1 << ssk->sk_state) & (TCPF_CLOSE | TCPF_LISTEN)) || 2422 - (flags & MPTCP_CF_FASTCLOSE)) { 2416 + subflow->send_fastclose) { 2423 2417 /* The MPTCP code never wait on the subflow sockets, TCP-level 2424 2418 * disconnect should never fail 2425 2419 */ ··· 2466 2460 2467 2461 lock_sock_nested(ssk, SINGLE_DEPTH_NESTING); 2468 2462 2469 - if ((flags & MPTCP_CF_FASTCLOSE) && !__mptcp_check_fallback(msk)) { 2470 - /* be sure to force the tcp_close path 2471 - * to generate the egress reset 2472 - */ 2473 - ssk->sk_lingertime = 0; 2474 - sock_set_flag(ssk, SOCK_LINGER); 2475 - subflow->send_fastclose = 1; 2476 - } 2463 + if (subflow->send_fastclose && ssk->sk_state != TCP_CLOSE) 2464 + tcp_set_state(ssk, TCP_CLOSE); 2477 2465 2478 2466 need_push = (flags & MPTCP_CF_PUSH) && __mptcp_retransmit_pending_data(sk); 2479 2467 if (!dispose_it) { ··· 2563 2563 2564 2564 if (ssk_state != TCP_CLOSE && 2565 2565 (ssk_state != TCP_CLOSE_WAIT || 2566 - inet_sk_state_load(sk) != TCP_ESTABLISHED)) 2566 + inet_sk_state_load(sk) != TCP_ESTABLISHED || 2567 + __mptcp_check_fallback(msk))) 2567 2568 continue; 2568 2569 2569 2570 /* 'subflow_data_ready' will re-sched once rx queue is empty */ ··· 2772 2771 struct mptcp_sock *msk = mptcp_sk(sk); 2773 2772 2774 2773 mptcp_set_state(sk, TCP_CLOSE); 2775 - mptcp_for_each_subflow_safe(msk, subflow, tmp) 2776 - __mptcp_close_ssk(sk, mptcp_subflow_tcp_sock(subflow), 2777 - subflow, MPTCP_CF_FASTCLOSE); 2774 + 2775 + /* Explicitly send the fastclose reset as need */ 2776 + if (__mptcp_check_fallback(msk)) 2777 + return; 2778 + 2779 + mptcp_for_each_subflow_safe(msk, subflow, tmp) { 2780 + struct sock *ssk = mptcp_subflow_tcp_sock(subflow); 2781 + 2782 + lock_sock(ssk); 2783 + 2784 + /* Some subflow socket states don't allow/need a reset.*/ 2785 + if ((1 << ssk->sk_state) & (TCPF_LISTEN | TCPF_CLOSE)) 2786 + goto unlock; 2787 + 2788 + subflow->send_fastclose = 1; 2789 + tcp_send_active_reset(ssk, ssk->sk_allocation, 2790 + SK_RST_REASON_TCP_ABORT_ON_CLOSE); 2791 + unlock: 2792 + release_sock(ssk); 2793 + } 2778 2794 } 2779 2795 2780 2796 static void mptcp_worker(struct work_struct *work) ··· 2818 2800 __mptcp_close_subflow(sk); 2819 2801 2820 2802 if (mptcp_close_tout_expired(sk)) { 2803 + struct mptcp_subflow_context *subflow, *tmp; 2804 + 2821 2805 mptcp_do_fastclose(sk); 2806 + mptcp_for_each_subflow_safe(msk, subflow, tmp) 2807 + __mptcp_close_ssk(sk, subflow->tcp_sock, subflow, 0); 2822 2808 mptcp_close_wake_up(sk); 2823 2809 } 2824 2810 ··· 3247 3225 /* msk->subflow is still intact, the following will not free the first 3248 3226 * subflow 3249 3227 */ 3250 - mptcp_destroy_common(msk, MPTCP_CF_FASTCLOSE); 3228 + mptcp_do_fastclose(sk); 3229 + mptcp_destroy_common(msk); 3251 3230 3252 3231 /* The first subflow is already in TCP_CLOSE status, the following 3253 3232 * can't overlap with a fallback anymore ··· 3427 3404 msk->rcvq_space.space = TCP_INIT_CWND * TCP_MSS_DEFAULT; 3428 3405 } 3429 3406 3430 - void mptcp_destroy_common(struct mptcp_sock *msk, unsigned int flags) 3407 + void mptcp_destroy_common(struct mptcp_sock *msk) 3431 3408 { 3432 3409 struct mptcp_subflow_context *subflow, *tmp; 3433 3410 struct sock *sk = (struct sock *)msk; ··· 3436 3413 3437 3414 /* join list will be eventually flushed (with rst) at sock lock release time */ 3438 3415 mptcp_for_each_subflow_safe(msk, subflow, tmp) 3439 - __mptcp_close_ssk(sk, mptcp_subflow_tcp_sock(subflow), subflow, flags); 3416 + __mptcp_close_ssk(sk, mptcp_subflow_tcp_sock(subflow), subflow, 0); 3440 3417 3441 3418 __skb_queue_purge(&sk->sk_receive_queue); 3442 3419 skb_rbtree_purge(&msk->out_of_order_queue); ··· 3454 3431 3455 3432 /* allow the following to close even the initial subflow */ 3456 3433 msk->free_first = 1; 3457 - mptcp_destroy_common(msk, 0); 3434 + mptcp_destroy_common(msk); 3458 3435 sk_sockets_allocated_dec(sk); 3459 3436 } 3460 3437
+2 -1
net/mptcp/protocol.h
··· 509 509 u64 remote_key; 510 510 u64 idsn; 511 511 u64 map_seq; 512 + u64 rcv_wnd_sent; 512 513 u32 snd_isn; 513 514 u32 token; 514 515 u32 rel_write_seq; ··· 977 976 local_bh_enable(); 978 977 } 979 978 980 - void mptcp_destroy_common(struct mptcp_sock *msk, unsigned int flags); 979 + void mptcp_destroy_common(struct mptcp_sock *msk); 981 980 982 981 #define MPTCP_TOKEN_MAX_RETRIES 4 983 982
+16 -11
tools/testing/selftests/net/mptcp/mptcp_join.sh
··· 3500 3500 fastclose_tests() 3501 3501 { 3502 3502 if reset_check_counter "fastclose test" "MPTcpExtMPFastcloseTx"; then 3503 - MPTCP_LIB_SUBTEST_FLAKY=1 3504 3503 test_linkfail=1024 fastclose=client \ 3505 3504 run_tests $ns1 $ns2 10.0.1.1 3506 3505 chk_join_nr 0 0 0 ··· 3508 3509 fi 3509 3510 3510 3511 if reset_check_counter "fastclose server test" "MPTcpExtMPFastcloseRx"; then 3511 - MPTCP_LIB_SUBTEST_FLAKY=1 3512 3512 test_linkfail=1024 fastclose=server \ 3513 3513 run_tests $ns1 $ns2 10.0.1.1 3514 3514 join_rst_nr=1 \ ··· 3804 3806 continue_if mptcp_lib_has_file '/proc/sys/net/mptcp/pm_type'; then 3805 3807 set_userspace_pm $ns1 3806 3808 pm_nl_set_limits $ns2 2 2 3807 - { test_linkfail=128 speed=5 \ 3809 + { timeout_test=120 test_linkfail=128 speed=5 \ 3808 3810 run_tests $ns1 $ns2 10.0.1.1 & } 2>/dev/null 3809 3811 local tests_pid=$! 3810 3812 wait_mpj $ns1 ··· 3837 3839 continue_if mptcp_lib_has_file '/proc/sys/net/mptcp/pm_type'; then 3838 3840 set_userspace_pm $ns2 3839 3841 pm_nl_set_limits $ns1 0 1 3840 - { test_linkfail=128 speed=5 \ 3842 + { timeout_test=120 test_linkfail=128 speed=5 \ 3841 3843 run_tests $ns1 $ns2 10.0.1.1 & } 2>/dev/null 3842 3844 local tests_pid=$! 3843 3845 wait_mpj $ns2 ··· 3865 3867 continue_if mptcp_lib_has_file '/proc/sys/net/mptcp/pm_type'; then 3866 3868 set_userspace_pm $ns2 3867 3869 pm_nl_set_limits $ns1 0 1 3868 - { test_linkfail=128 speed=5 \ 3870 + { timeout_test=120 test_linkfail=128 speed=5 \ 3869 3871 run_tests $ns1 $ns2 10.0.1.1 & } 2>/dev/null 3870 3872 local tests_pid=$! 3871 3873 wait_mpj $ns2 ··· 3886 3888 continue_if mptcp_lib_has_file '/proc/sys/net/mptcp/pm_type'; then 3887 3889 set_userspace_pm $ns2 3888 3890 pm_nl_set_limits $ns1 0 1 3889 - { test_linkfail=128 speed=5 \ 3891 + { timeout_test=120 test_linkfail=128 speed=5 \ 3890 3892 run_tests $ns1 $ns2 10.0.1.1 & } 2>/dev/null 3891 3893 local tests_pid=$! 3892 3894 wait_mpj $ns2 ··· 3910 3912 continue_if mptcp_lib_has_file '/proc/sys/net/mptcp/pm_type'; then 3911 3913 set_userspace_pm $ns1 3912 3914 pm_nl_set_limits $ns2 1 1 3913 - { test_linkfail=128 speed=5 \ 3915 + { timeout_test=120 test_linkfail=128 speed=5 \ 3914 3916 run_tests $ns1 $ns2 10.0.1.1 & } 2>/dev/null 3915 3917 local tests_pid=$! 3916 3918 wait_mpj $ns1 ··· 3941 3943 pm_nl_set_limits $ns1 2 2 3942 3944 pm_nl_set_limits $ns2 2 2 3943 3945 pm_nl_add_endpoint $ns1 10.0.2.1 flags signal 3944 - { test_linkfail=128 speed=slow \ 3946 + { timeout_test=120 test_linkfail=128 speed=slow \ 3945 3947 run_tests $ns1 $ns2 10.0.1.1 & } 2>/dev/null 3946 3948 local tests_pid=$! 3947 3949 ··· 3968 3970 pm_nl_set_limits $ns2 0 3 3969 3971 pm_nl_add_endpoint $ns2 10.0.1.2 id 1 dev ns2eth1 flags subflow 3970 3972 pm_nl_add_endpoint $ns2 10.0.2.2 id 2 dev ns2eth2 flags subflow 3971 - { test_linkfail=128 speed=5 \ 3973 + { timeout_test=120 test_linkfail=128 speed=5 \ 3972 3974 run_tests $ns1 $ns2 10.0.1.1 & } 2>/dev/null 3973 3975 local tests_pid=$! 3974 3976 ··· 4046 4048 # broadcast IP: no packet for this address will be received on ns1 4047 4049 pm_nl_add_endpoint $ns1 224.0.0.1 id 2 flags signal 4048 4050 pm_nl_add_endpoint $ns1 10.0.1.1 id 42 flags signal 4049 - { test_linkfail=128 speed=5 \ 4051 + { timeout_test=120 test_linkfail=128 speed=5 \ 4050 4052 run_tests $ns1 $ns2 10.0.1.1 & } 2>/dev/null 4051 4053 local tests_pid=$! 4052 4054 ··· 4055 4057 $ns1 10.0.2.1 id 1 flags signal 4056 4058 chk_subflow_nr "before delete" 2 4057 4059 chk_mptcp_info subflows 1 subflows 1 4060 + chk_mptcp_info add_addr_signal 2 add_addr_accepted 1 4058 4061 4059 4062 pm_nl_del_endpoint $ns1 1 10.0.2.1 4060 4063 pm_nl_del_endpoint $ns1 2 224.0.0.1 4061 4064 sleep 0.5 4062 4065 chk_subflow_nr "after delete" 1 4063 4066 chk_mptcp_info subflows 0 subflows 0 4067 + chk_mptcp_info add_addr_signal 0 add_addr_accepted 0 4064 4068 4065 4069 pm_nl_add_endpoint $ns1 10.0.2.1 id 1 flags signal 4066 4070 pm_nl_add_endpoint $ns1 10.0.3.1 id 2 flags signal 4067 4071 wait_mpj $ns2 4068 4072 chk_subflow_nr "after re-add" 3 4069 4073 chk_mptcp_info subflows 2 subflows 2 4074 + chk_mptcp_info add_addr_signal 2 add_addr_accepted 2 4070 4075 4071 4076 pm_nl_del_endpoint $ns1 42 10.0.1.1 4072 4077 sleep 0.5 4073 4078 chk_subflow_nr "after delete ID 0" 2 4074 4079 chk_mptcp_info subflows 2 subflows 2 4080 + chk_mptcp_info add_addr_signal 2 add_addr_accepted 2 4075 4081 4076 4082 pm_nl_add_endpoint $ns1 10.0.1.1 id 99 flags signal 4077 4083 wait_mpj $ns2 4078 4084 chk_subflow_nr "after re-add ID 0" 3 4079 4085 chk_mptcp_info subflows 3 subflows 3 4086 + chk_mptcp_info add_addr_signal 3 add_addr_accepted 2 4080 4087 4081 4088 pm_nl_del_endpoint $ns1 99 10.0.1.1 4082 4089 sleep 0.5 4083 4090 chk_subflow_nr "after re-delete ID 0" 2 4084 4091 chk_mptcp_info subflows 2 subflows 2 4092 + chk_mptcp_info add_addr_signal 2 add_addr_accepted 2 4085 4093 4086 4094 pm_nl_add_endpoint $ns1 10.0.1.1 id 88 flags signal 4087 4095 wait_mpj $ns2 4088 4096 chk_subflow_nr "after re-re-add ID 0" 3 4089 4097 chk_mptcp_info subflows 3 subflows 3 4098 + chk_mptcp_info add_addr_signal 3 add_addr_accepted 2 4090 4099 mptcp_lib_kill_group_wait $tests_pid 4091 4100 4092 4101 kill_events_pids ··· 4126 4121 # broadcast IP: no packet for this address will be received on ns1 4127 4122 pm_nl_add_endpoint $ns1 224.0.0.1 id 2 flags signal 4128 4123 pm_nl_add_endpoint $ns2 10.0.3.2 id 3 flags subflow 4129 - { test_linkfail=128 speed=20 \ 4124 + { timeout_test=120 test_linkfail=128 speed=20 \ 4130 4125 run_tests $ns1 $ns2 10.0.1.1 & } 2>/dev/null 4131 4126 local tests_pid=$! 4132 4127