@@ -914,12 +914,16 @@ mptcp_carve_data_frag(const struct mptcp_sock *msk, struct page_frag *pfrag,
914
914
return dfrag ;
915
915
}
916
916
917
+ struct mptcp_sendmsg_info {
918
+ int mss_now ;
919
+ int size_goal ;
920
+ };
921
+
917
922
static int mptcp_sendmsg_frag (struct sock * sk , struct sock * ssk ,
918
923
struct msghdr * msg , struct mptcp_data_frag * dfrag ,
919
- long * timeo , int * pmss_now ,
920
- int * ps_goal )
924
+ struct mptcp_sendmsg_info * info )
921
925
{
922
- int mss_now , avail_size , size_goal , offset , ret , frag_truesize = 0 ;
926
+ int avail_size , offset , ret , frag_truesize = 0 ;
923
927
bool dfrag_collapsed , can_collapse = false;
924
928
struct mptcp_sock * msk = mptcp_sk (sk );
925
929
struct mptcp_ext * mpext = NULL ;
@@ -945,10 +949,8 @@ static int mptcp_sendmsg_frag(struct sock *sk, struct sock *ssk,
945
949
}
946
950
947
951
/* 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 ;
952
954
skb = tcp_write_queue_tail (ssk );
953
955
if (skb ) {
954
956
mpext = skb_ext_find (skb , SKB_EXT_MPTCP );
@@ -959,12 +961,12 @@ static int mptcp_sendmsg_frag(struct sock *sk, struct sock *ssk,
959
961
* queue management operation, to avoid breaking the ext <->
960
962
* SSN association set here
961
963
*/
962
- can_collapse = (size_goal - skb -> len > 0 ) &&
964
+ can_collapse = (info -> size_goal - skb -> len > 0 ) &&
963
965
mptcp_skb_can_collapse_to (* write_seq , skb , mpext );
964
966
if (!can_collapse )
965
967
TCP_SKB_CB (skb )-> eor = 1 ;
966
968
else
967
- avail_size = size_goal - skb -> len ;
969
+ avail_size = info -> size_goal - skb -> len ;
968
970
}
969
971
970
972
if (!retransmission ) {
@@ -1187,11 +1189,15 @@ static void ssk_check_wmem(struct mptcp_sock *msk)
1187
1189
1188
1190
static int mptcp_sendmsg (struct sock * sk , struct msghdr * msg , size_t len )
1189
1191
{
1190
- int mss_now = 0 , size_goal = 0 , ret = 0 ;
1191
1192
struct mptcp_sock * msk = mptcp_sk (sk );
1193
+ struct mptcp_sendmsg_info info = {
1194
+ .mss_now = 0 ,
1195
+ .size_goal = 0 ,
1196
+ };
1192
1197
struct page_frag * pfrag ;
1193
1198
size_t copied = 0 ;
1194
1199
struct sock * ssk ;
1200
+ int ret = 0 ;
1195
1201
u32 sndbuf ;
1196
1202
bool tx_ok ;
1197
1203
long timeo ;
@@ -1260,8 +1266,7 @@ static int mptcp_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)
1260
1266
lock_sock (ssk );
1261
1267
tx_ok = msg_data_left (msg );
1262
1268
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 );
1265
1270
if (ret < 0 ) {
1266
1271
if (ret == - EAGAIN && timeo > 0 ) {
1267
1272
mptcp_set_timeout (sk , ssk );
@@ -1284,8 +1289,8 @@ static int mptcp_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)
1284
1289
if (!sk_stream_memory_free (ssk ) ||
1285
1290
!mptcp_page_frag_refill (ssk , pfrag ) ||
1286
1291
!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 );
1289
1294
mptcp_set_timeout (sk , ssk );
1290
1295
release_sock (ssk );
1291
1296
goto restart ;
@@ -1305,8 +1310,8 @@ static int mptcp_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)
1305
1310
* limits before we send more data.
1306
1311
*/
1307
1312
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 );
1310
1315
mptcp_clean_una (sk );
1311
1316
if (!sk_stream_memory_free (sk )) {
1312
1317
/* 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)
1323
1328
1324
1329
mptcp_set_timeout (sk , ssk );
1325
1330
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 );
1328
1333
1329
1334
/* start the timer, if it's not pending */
1330
1335
if (!mptcp_timer_pending (sk ))
@@ -1763,14 +1768,15 @@ static void mptcp_worker(struct work_struct *work)
1763
1768
{
1764
1769
struct mptcp_sock * msk = container_of (work , struct mptcp_sock , work );
1765
1770
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 = {} ;
1767
1772
struct mptcp_data_frag * dfrag ;
1773
+ int orig_len , orig_offset ;
1768
1774
u64 orig_write_seq ;
1769
1775
size_t copied = 0 ;
1770
1776
struct msghdr msg = {
1771
1777
.msg_flags = MSG_DONTWAIT ,
1772
1778
};
1773
- long timeo = 0 ;
1779
+ int ret ;
1774
1780
1775
1781
lock_sock (sk );
1776
1782
mptcp_clean_una_wakeup (sk );
@@ -1809,8 +1815,7 @@ static void mptcp_worker(struct work_struct *work)
1809
1815
orig_offset = dfrag -> offset ;
1810
1816
orig_write_seq = dfrag -> data_seq ;
1811
1817
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 );
1814
1819
if (ret < 0 )
1815
1820
break ;
1816
1821
@@ -1823,8 +1828,8 @@ static void mptcp_worker(struct work_struct *work)
1823
1828
break ;
1824
1829
}
1825
1830
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 );
1828
1833
1829
1834
dfrag -> data_seq = orig_write_seq ;
1830
1835
dfrag -> offset = orig_offset ;
0 commit comments