@@ -808,47 +808,38 @@ void mptcp_data_ready(struct sock *sk, struct sock *ssk)
808
808
mptcp_data_unlock (sk );
809
809
}
810
810
811
- static bool mptcp_do_flush_join_list (struct mptcp_sock * msk )
811
+ static bool __mptcp_finish_join (struct mptcp_sock * msk , struct sock * ssk )
812
812
{
813
- struct mptcp_subflow_context * subflow ;
814
- bool ret = false;
813
+ struct sock * sk = (struct sock * )msk ;
815
814
816
- if (likely ( list_empty ( & msk -> join_list )) )
815
+ if (sk -> sk_state != TCP_ESTABLISHED )
817
816
return false;
818
817
819
- spin_lock_bh (& msk -> join_list_lock );
820
- list_for_each_entry (subflow , & msk -> join_list , node ) {
821
- u32 sseq = READ_ONCE (subflow -> setsockopt_seq );
822
-
823
- mptcp_propagate_sndbuf ((struct sock * )msk , mptcp_subflow_tcp_sock (subflow ));
824
- if (READ_ONCE (msk -> setsockopt_seq ) != sseq )
825
- ret = true;
826
- }
827
- list_splice_tail_init (& msk -> join_list , & msk -> conn_list );
828
- spin_unlock_bh (& msk -> join_list_lock );
829
-
830
- return ret ;
831
- }
832
-
833
- void __mptcp_flush_join_list (struct mptcp_sock * msk )
834
- {
835
- if (likely (!mptcp_do_flush_join_list (msk )))
836
- return ;
818
+ /* attach to msk socket only after we are sure we will deal with it
819
+ * at close time
820
+ */
821
+ if (sk -> sk_socket && !ssk -> sk_socket )
822
+ mptcp_sock_graft (ssk , sk -> sk_socket );
837
823
838
- if (!test_and_set_bit (MPTCP_WORK_SYNC_SETSOCKOPT , & msk -> flags ))
839
- mptcp_schedule_work ((struct sock * )msk );
824
+ mptcp_propagate_sndbuf ((struct sock * )msk , ssk );
825
+ mptcp_sockopt_sync_locked (msk , ssk );
826
+ return true;
840
827
}
841
828
842
- static void mptcp_flush_join_list (struct mptcp_sock * msk )
829
+ static void __mptcp_flush_join_list (struct sock * sk )
843
830
{
844
- bool sync_needed = test_and_clear_bit (MPTCP_WORK_SYNC_SETSOCKOPT , & msk -> flags );
845
-
846
- might_sleep ();
831
+ struct mptcp_subflow_context * tmp , * subflow ;
832
+ struct mptcp_sock * msk = mptcp_sk (sk );
847
833
848
- if (!mptcp_do_flush_join_list (msk ) && !sync_needed )
849
- return ;
834
+ list_for_each_entry_safe (subflow , tmp , & msk -> join_list , node ) {
835
+ struct sock * ssk = mptcp_subflow_tcp_sock (subflow );
836
+ bool slow = lock_sock_fast (ssk );
850
837
851
- mptcp_sockopt_sync_all (msk );
838
+ list_move_tail (& subflow -> node , & msk -> conn_list );
839
+ if (!__mptcp_finish_join (msk , ssk ))
840
+ mptcp_subflow_reset (ssk );
841
+ unlock_sock_fast (ssk , slow );
842
+ }
852
843
}
853
844
854
845
static bool mptcp_timer_pending (struct sock * sk )
@@ -1549,7 +1540,6 @@ void __mptcp_push_pending(struct sock *sk, unsigned int flags)
1549
1540
int ret = 0 ;
1550
1541
1551
1542
prev_ssk = ssk ;
1552
- __mptcp_flush_join_list (msk );
1553
1543
ssk = mptcp_subflow_get_send (msk );
1554
1544
1555
1545
/* First check. If the ssk has changed since
@@ -1954,7 +1944,6 @@ static bool __mptcp_move_skbs(struct mptcp_sock *msk)
1954
1944
unsigned int moved = 0 ;
1955
1945
bool ret , done ;
1956
1946
1957
- mptcp_flush_join_list (msk );
1958
1947
do {
1959
1948
struct sock * ssk = mptcp_subflow_recv_lookup (msk );
1960
1949
bool slowpath ;
@@ -2490,7 +2479,6 @@ static void mptcp_worker(struct work_struct *work)
2490
2479
goto unlock ;
2491
2480
2492
2481
mptcp_check_data_fin_ack (sk );
2493
- mptcp_flush_join_list (msk );
2494
2482
2495
2483
mptcp_check_fastclose (msk );
2496
2484
@@ -2528,8 +2516,6 @@ static int __mptcp_init_sock(struct sock *sk)
2528
2516
{
2529
2517
struct mptcp_sock * msk = mptcp_sk (sk );
2530
2518
2531
- spin_lock_init (& msk -> join_list_lock );
2532
-
2533
2519
INIT_LIST_HEAD (& msk -> conn_list );
2534
2520
INIT_LIST_HEAD (& msk -> join_list );
2535
2521
INIT_LIST_HEAD (& msk -> rtx_queue );
@@ -2703,7 +2689,6 @@ static void __mptcp_check_send_data_fin(struct sock *sk)
2703
2689
}
2704
2690
}
2705
2691
2706
- mptcp_flush_join_list (msk );
2707
2692
mptcp_for_each_subflow (msk , subflow ) {
2708
2693
struct sock * tcp_sk = mptcp_subflow_tcp_sock (subflow );
2709
2694
@@ -2736,12 +2721,7 @@ static void __mptcp_destroy_sock(struct sock *sk)
2736
2721
2737
2722
might_sleep ();
2738
2723
2739
- /* be sure to always acquire the join list lock, to sync vs
2740
- * mptcp_finish_join().
2741
- */
2742
- spin_lock_bh (& msk -> join_list_lock );
2743
- list_splice_tail_init (& msk -> join_list , & msk -> conn_list );
2744
- spin_unlock_bh (& msk -> join_list_lock );
2724
+ /* join list will be eventually flushed (with rst) at sock lock release time*/
2745
2725
list_splice_init (& msk -> conn_list , & conn_list );
2746
2726
2747
2727
sk_stop_timer (sk , & msk -> sk .icsk_retransmit_timer );
@@ -2844,8 +2824,6 @@ static int mptcp_disconnect(struct sock *sk, int flags)
2844
2824
struct mptcp_subflow_context * subflow ;
2845
2825
struct mptcp_sock * msk = mptcp_sk (sk );
2846
2826
2847
- mptcp_do_flush_join_list (msk );
2848
-
2849
2827
inet_sk_state_store (sk , TCP_CLOSE );
2850
2828
2851
2829
mptcp_for_each_subflow (msk , subflow ) {
@@ -3076,6 +3054,8 @@ static void mptcp_release_cb(struct sock *sk)
3076
3054
flags |= BIT (MPTCP_PUSH_PENDING );
3077
3055
if (test_and_clear_bit (MPTCP_RETRANSMIT , & mptcp_sk (sk )-> flags ))
3078
3056
flags |= BIT (MPTCP_RETRANSMIT );
3057
+ if (test_and_clear_bit (MPTCP_FLUSH_JOIN_LIST , & mptcp_sk (sk )-> flags ))
3058
+ flags |= BIT (MPTCP_FLUSH_JOIN_LIST );
3079
3059
if (!flags )
3080
3060
break ;
3081
3061
@@ -3088,6 +3068,8 @@ static void mptcp_release_cb(struct sock *sk)
3088
3068
*/
3089
3069
3090
3070
spin_unlock_bh (& sk -> sk_lock .slock );
3071
+ if (flags & BIT (MPTCP_FLUSH_JOIN_LIST ))
3072
+ __mptcp_flush_join_list (sk );
3091
3073
if (flags & BIT (MPTCP_PUSH_PENDING ))
3092
3074
__mptcp_push_pending (sk , 0 );
3093
3075
if (flags & BIT (MPTCP_RETRANSMIT ))
@@ -3232,8 +3214,7 @@ bool mptcp_finish_join(struct sock *ssk)
3232
3214
struct mptcp_subflow_context * subflow = mptcp_subflow_ctx (ssk );
3233
3215
struct mptcp_sock * msk = mptcp_sk (subflow -> conn );
3234
3216
struct sock * parent = (void * )msk ;
3235
- struct socket * parent_sock ;
3236
- bool ret ;
3217
+ bool ret = true;
3237
3218
3238
3219
pr_debug ("msk=%p, subflow=%p" , msk , subflow );
3239
3220
@@ -3246,35 +3227,38 @@ bool mptcp_finish_join(struct sock *ssk)
3246
3227
if (!msk -> pm .server_side )
3247
3228
goto out ;
3248
3229
3249
- if (!mptcp_pm_allow_new_subflow (msk )) {
3250
- subflow -> reset_reason = MPTCP_RST_EPROHIBIT ;
3251
- return false;
3252
- }
3230
+ if (!mptcp_pm_allow_new_subflow (msk ))
3231
+ goto err_prohibited ;
3253
3232
3254
- /* active connections are already on conn_list, and we can't acquire
3255
- * msk lock here.
3256
- * use the join list lock as synchronization point and double-check
3257
- * msk status to avoid racing with __mptcp_destroy_sock()
3233
+ if (WARN_ON_ONCE (!list_empty (& subflow -> node )))
3234
+ goto err_prohibited ;
3235
+
3236
+ /* active connections are already on conn_list.
3237
+ * If we can't acquire msk socket lock here, let the release callback
3238
+ * handle it
3258
3239
*/
3259
- spin_lock_bh (& msk -> join_list_lock );
3260
- ret = inet_sk_state_load (parent ) == TCP_ESTABLISHED ;
3261
- if (ret && !WARN_ON_ONCE (!list_empty (& subflow -> node ))) {
3262
- list_add_tail (& subflow -> node , & msk -> join_list );
3240
+ mptcp_data_lock (parent );
3241
+ if (!sock_owned_by_user (parent )) {
3242
+ ret = __mptcp_finish_join (msk , ssk );
3243
+ if (ret ) {
3244
+ sock_hold (ssk );
3245
+ list_add_tail (& subflow -> node , & msk -> conn_list );
3246
+ }
3247
+ } else {
3263
3248
sock_hold (ssk );
3249
+ list_add_tail (& subflow -> node , & msk -> join_list );
3250
+ set_bit (MPTCP_FLUSH_JOIN_LIST , & msk -> flags );
3264
3251
}
3265
- spin_unlock_bh (& msk -> join_list_lock );
3252
+ mptcp_data_unlock (parent );
3253
+
3266
3254
if (!ret ) {
3255
+ err_prohibited :
3267
3256
subflow -> reset_reason = MPTCP_RST_EPROHIBIT ;
3268
3257
return false;
3269
3258
}
3270
3259
3271
- /* attach to msk socket only after we are sure he will deal with us
3272
- * at close time
3273
- */
3274
- parent_sock = READ_ONCE (parent -> sk_socket );
3275
- if (parent_sock && !ssk -> sk_socket )
3276
- mptcp_sock_graft (ssk , parent_sock );
3277
3260
subflow -> map_seq = READ_ONCE (msk -> ack_seq );
3261
+
3278
3262
out :
3279
3263
mptcp_event (MPTCP_EVENT_SUB_ESTABLISHED , msk , ssk , GFP_ATOMIC );
3280
3264
return true;
@@ -3539,7 +3523,6 @@ static int mptcp_stream_accept(struct socket *sock, struct socket *newsock,
3539
3523
/* set ssk->sk_socket of accept()ed flows to mptcp socket.
3540
3524
* This is needed so NOSPACE flag can be set from tcp stack.
3541
3525
*/
3542
- mptcp_flush_join_list (msk );
3543
3526
mptcp_for_each_subflow (msk , subflow ) {
3544
3527
struct sock * ssk = mptcp_subflow_tcp_sock (subflow );
3545
3528
0 commit comments