@@ -914,12 +914,16 @@ mptcp_carve_data_frag(const struct mptcp_sock *msk, struct page_frag *pfrag,
914914 return dfrag ;
915915}
916916
917+ struct mptcp_sendmsg_info {
918+ int mss_now ;
919+ int size_goal ;
920+ };
921+
917922static int mptcp_sendmsg_frag (struct sock * sk , struct sock * ssk ,
918923 struct msghdr * msg , struct mptcp_data_frag * dfrag ,
919- long * timeo , int * pmss_now ,
920- int * ps_goal )
924+ struct mptcp_sendmsg_info * info )
921925{
922- int mss_now , avail_size , size_goal , offset , ret , frag_truesize = 0 ;
926+ int avail_size , offset , ret , frag_truesize = 0 ;
923927 bool dfrag_collapsed , can_collapse = false;
924928 struct mptcp_sock * msk = mptcp_sk (sk );
925929 struct mptcp_ext * mpext = NULL ;
@@ -945,10 +949,8 @@ static int mptcp_sendmsg_frag(struct sock *sk, struct sock *ssk,
945949 }
946950
947951 /* compute copy limit */
948- mss_now = tcp_send_mss (ssk , & size_goal , msg -> msg_flags );
949- * pmss_now = mss_now ;
950- * ps_goal = size_goal ;
951- avail_size = size_goal ;
952+ info -> mss_now = tcp_send_mss (ssk , & info -> size_goal , msg -> msg_flags );
953+ avail_size = info -> size_goal ;
952954 skb = tcp_write_queue_tail (ssk );
953955 if (skb ) {
954956 mpext = skb_ext_find (skb , SKB_EXT_MPTCP );
@@ -959,12 +961,12 @@ static int mptcp_sendmsg_frag(struct sock *sk, struct sock *ssk,
959961 * queue management operation, to avoid breaking the ext <->
960962 * SSN association set here
961963 */
962- can_collapse = (size_goal - skb -> len > 0 ) &&
964+ can_collapse = (info -> size_goal - skb -> len > 0 ) &&
963965 mptcp_skb_can_collapse_to (* write_seq , skb , mpext );
964966 if (!can_collapse )
965967 TCP_SKB_CB (skb )-> eor = 1 ;
966968 else
967- avail_size = size_goal - skb -> len ;
969+ avail_size = info -> size_goal - skb -> len ;
968970 }
969971
970972 if (!retransmission ) {
@@ -1187,11 +1189,15 @@ static void ssk_check_wmem(struct mptcp_sock *msk)
11871189
11881190static int mptcp_sendmsg (struct sock * sk , struct msghdr * msg , size_t len )
11891191{
1190- int mss_now = 0 , size_goal = 0 , ret = 0 ;
11911192 struct mptcp_sock * msk = mptcp_sk (sk );
1193+ struct mptcp_sendmsg_info info = {
1194+ .mss_now = 0 ,
1195+ .size_goal = 0 ,
1196+ };
11921197 struct page_frag * pfrag ;
11931198 size_t copied = 0 ;
11941199 struct sock * ssk ;
1200+ int ret = 0 ;
11951201 u32 sndbuf ;
11961202 bool tx_ok ;
11971203 long timeo ;
@@ -1260,8 +1266,7 @@ static int mptcp_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)
12601266 lock_sock (ssk );
12611267 tx_ok = msg_data_left (msg );
12621268 while (tx_ok ) {
1263- ret = mptcp_sendmsg_frag (sk , ssk , msg , NULL , & timeo , & mss_now ,
1264- & size_goal );
1269+ ret = mptcp_sendmsg_frag (sk , ssk , msg , NULL , & info );
12651270 if (ret < 0 ) {
12661271 if (ret == - EAGAIN && timeo > 0 ) {
12671272 mptcp_set_timeout (sk , ssk );
@@ -1284,8 +1289,8 @@ static int mptcp_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)
12841289 if (!sk_stream_memory_free (ssk ) ||
12851290 !mptcp_page_frag_refill (ssk , pfrag ) ||
12861291 !mptcp_ext_cache_refill (msk )) {
1287- tcp_push (ssk , msg -> msg_flags , mss_now ,
1288- tcp_sk (ssk )-> nonagle , size_goal );
1292+ tcp_push (ssk , msg -> msg_flags , info . mss_now ,
1293+ tcp_sk (ssk )-> nonagle , info . size_goal );
12891294 mptcp_set_timeout (sk , ssk );
12901295 release_sock (ssk );
12911296 goto restart ;
@@ -1305,8 +1310,8 @@ static int mptcp_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)
13051310 * limits before we send more data.
13061311 */
13071312 if (unlikely (!sk_stream_memory_free (sk ))) {
1308- tcp_push (ssk , msg -> msg_flags , mss_now ,
1309- tcp_sk (ssk )-> nonagle , size_goal );
1313+ tcp_push (ssk , msg -> msg_flags , info . mss_now ,
1314+ tcp_sk (ssk )-> nonagle , info . size_goal );
13101315 mptcp_clean_una (sk );
13111316 if (!sk_stream_memory_free (sk )) {
13121317 /* can't send more for now, need to wait for
@@ -1323,8 +1328,8 @@ static int mptcp_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)
13231328
13241329 mptcp_set_timeout (sk , ssk );
13251330 if (copied ) {
1326- tcp_push (ssk , msg -> msg_flags , mss_now , tcp_sk ( ssk ) -> nonagle ,
1327- size_goal );
1331+ tcp_push (ssk , msg -> msg_flags , info . mss_now ,
1332+ tcp_sk ( ssk ) -> nonagle , info . size_goal );
13281333
13291334 /* start the timer, if it's not pending */
13301335 if (!mptcp_timer_pending (sk ))
@@ -1763,14 +1768,15 @@ static void mptcp_worker(struct work_struct *work)
17631768{
17641769 struct mptcp_sock * msk = container_of (work , struct mptcp_sock , work );
17651770 struct sock * ssk , * sk = & msk -> sk .icsk_inet .sk ;
1766- int orig_len , orig_offset , mss_now = 0 , size_goal = 0 ;
1771+ struct mptcp_sendmsg_info info = {} ;
17671772 struct mptcp_data_frag * dfrag ;
1773+ int orig_len , orig_offset ;
17681774 u64 orig_write_seq ;
17691775 size_t copied = 0 ;
17701776 struct msghdr msg = {
17711777 .msg_flags = MSG_DONTWAIT ,
17721778 };
1773- long timeo = 0 ;
1779+ int ret ;
17741780
17751781 lock_sock (sk );
17761782 mptcp_clean_una_wakeup (sk );
@@ -1809,8 +1815,7 @@ static void mptcp_worker(struct work_struct *work)
18091815 orig_offset = dfrag -> offset ;
18101816 orig_write_seq = dfrag -> data_seq ;
18111817 while (dfrag -> data_len > 0 ) {
1812- int ret = mptcp_sendmsg_frag (sk , ssk , & msg , dfrag , & timeo ,
1813- & mss_now , & size_goal );
1818+ ret = mptcp_sendmsg_frag (sk , ssk , & msg , dfrag , & info );
18141819 if (ret < 0 )
18151820 break ;
18161821
@@ -1823,8 +1828,8 @@ static void mptcp_worker(struct work_struct *work)
18231828 break ;
18241829 }
18251830 if (copied )
1826- tcp_push (ssk , msg . msg_flags , mss_now , tcp_sk (ssk )-> nonagle ,
1827- size_goal );
1831+ tcp_push (ssk , 0 , info . mss_now , tcp_sk (ssk )-> nonagle ,
1832+ info . size_goal );
18281833
18291834 dfrag -> data_seq = orig_write_seq ;
18301835 dfrag -> offset = orig_offset ;
0 commit comments