Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

selftests: mptcp_join.sh -l: copyfd_io_poll: poll timed out error #226

Closed
matttbe opened this issue Aug 13, 2021 · 5 comments
Closed

selftests: mptcp_join.sh -l: copyfd_io_poll: poll timed out error #226

matttbe opened this issue Aug 13, 2021 · 5 comments
Assignees
Projects

Comments

@matttbe
Copy link
Member

matttbe commented Aug 13, 2021

When working on a fix for #221, @pabeni found another issue:

Created /tmp/tmp.ymYKoCZcr5 (size 1 KB) containing data sent by client
Created /tmp/tmp.XnBMr2pbV9 (size 1 KB) containing data sent by server
Created /tmp/tmp.gNeabekyFq (size 9033 KB) containing data sent by client
Capturing traffic for test 1 into mp_join-01-ns1-0-XFbQqp.pcap
dropped privs to tcpdump
tcpdump: listening on any, link-type LINUX_SLL (Linux cooked v1), capture size 65535 bytes
13285 packets captured
13285 packets received by filter
0 packets dropped by kernel
01 multiple flows, signal, link failure syn[ ok ] - synack[ ok ] - ack[ ok ]
                                        add[ ok ] - echo  [ ok ]
                                        stale             [ ok ]
Created /tmp/tmp.rqTkAUCJd0 (size 32768 KB) containing data sent by server
Capturing traffic for test 2 into mp_join-02-ns1-0-cFABhL.pcap
dropped privs to tcpdump
tcpdump: listening on any, link-type LINUX_SLL (Linux cooked v1), capture size 65535 bytes
35441 packets captured
35441 packets received by filter
0 packets dropped by kernel
02 multi flows, signal, bidi, link fail syn[ ok ] - synack[ ok ] - ack[ ok ]
                                        add[ ok ] - echo  [ ok ]
                                        stale             [ ok ]
Capturing traffic for test 3 into mp_join-03-ns1-0-FngGUf.pcap
dropped privs to tcpdump
tcpdump: listening on any, link-type LINUX_SLL (Linux cooked v1), capture size 65535 bytes
13305 packets captured
13306 packets received by filter
0 packets dropped by kernel
03 backup subflow unused, link failure  syn[ ok ] - synack[ ok ] - ack[ ok ]
                                        add[ ok ] - echo  [ ok ]
                                        link usage        [ ok ]
Capturing traffic for test 4 into mp_join-04-ns1-0-bGZ8CA.pcap
dropped privs to tcpdump
tcpdump: listening on any, link-type LINUX_SLL (Linux cooked v1), capture size 65535 bytes
12748 packets captured
12749 packets received by filter
0 packets dropped by kernel
04 backup flow used, multi links fail   syn[ ok ] - synack[ ok ] - ack[ ok ]
                                        add[ ok ] - echo  [ ok ]
                                        stale             [ ok ]
                                        link usage        [ ok ]
Capturing traffic for test 5 into mp_join-05-ns1-0-1aCDtS.pcap
copyfd_io_poll: poll timed out (events: POLLIN 1, POLLOUT 0)
copyfd_io_poll: poll timed out (events: POLLIN 0, POLLOUT 4)
 client exit code 2, server 2

netns ns1-0-1aCDtS socket stat for 10004:
Failed to find cgroup2 mount
TcpPassiveOpens                 3                  0.0
TcpInSegs                       9069               0.0
TcpOutSegs                      12624              0.0
TcpRetransSegs                  2                  0.0
TcpExtTCPPureAcks               2787               0.0
TcpExtTCPSackRecovery           1                  0.0
TcpExtTCPSACKReorder            1                  0.0
TcpExtTCPTSReorder              1                  0.0
TcpExtTCPPartialUndo            1                  0.0
TcpExtTCPFastRetrans            1                  0.0
TcpExtTCPLossProbes             2                  0.0
TcpExtTCPDSACKRecv              2                  0.0
TcpExtTCPDSACKIgnoredNoUndo     2                  0.0
TcpExtTCPSackShiftFallback      1                  0.0
TcpExtTCPOrigDataSent           7208               0.0
TcpExtTCPHystartTrainDetect     1                  0.0
TcpExtTCPHystartTrainCwnd       29                 0.0
TcpExtTCPHystartDelayDetect     1                  0.0
TcpExtTCPHystartDelayCwnd       76                 0.0
TcpExtTCPWinProbe               7                  0.0
TcpExtTCPDelivered              7210               0.0
TcpExtTCPDSACKRecvSegs          2                  0.0
MPTcpExtMPCapableSYNRX          1                  0.0
MPTcpExtMPCapableACKRX          1                  0.0
MPTcpExtMPTCPRetrans            9                  0.0
MPTcpExtMPJoinSynRx             2                  0.0
MPTcpExtMPJoinAckRx             2                  0.0
MPTcpExtOFOQueueTail            1678               0.0
MPTcpExtOFOQueue                1684               0.0
MPTcpExtOFOMerge                265                0.0
MPTcpExtEchoAdd                 1                  0.0
MPTcpExtSubflowStale            2                  0.0
MPTcpExtSubflowRecover          1                  0.0

netns ns2-0-1aCDtS socket stat for 10004:
Failed to find cgroup2 mount
TcpActiveOpens                  3                  0.0
TcpInSegs                       9117               0.0
TcpOutSegs                      15960              0.0
TcpRetransSegs                  24                 0.0
TcpExtPAWSEstab                 9                  0.0
TcpExtDelayedACKs               10                 0.0
TcpExtDelayedACKLocked          1                  0.0
TcpExtDelayedACKLost            2                  0.0
TcpExtTCPPureAcks               5361               0.0
TcpExtTCPLostRetransmit         22                 0.0
TcpExtTCPTimeouts               29                 0.0
TcpExtTCPLossProbes             3                  0.0
TcpExtTCPDSACKOldSent           2                  0.0
TcpExtTCPOFOQueue               1                  0.0
TcpExtTCPSpuriousRtxHostQueues  6                  0.0
TcpExtTCPFromZeroWindowAdv      1                  0.0
TcpExtTCPToZeroWindowAdv        1                  0.0
TcpExtTCPWantZeroWindowAdv      158                0.0
TcpExtTCPOrigDataSent           13165              0.0
TcpExtTCPHystartTrainDetect     1                  0.0
TcpExtTCPHystartTrainCwnd       16                 0.0
TcpExtTCPHystartDelayDetect     2                  0.0
TcpExtTCPHystartDelayCwnd       557                0.0
TcpExtTCPACKSkippedPAWS         7                  0.0
TcpExtTCPDelivered              13108              0.0
TcpExtTcpTimeoutRehash          29                 0.0
MPTcpExtMPCapableSYNTX          1                  0.0
MPTcpExtMPCapableSYNACKRX       1                  0.0
MPTcpExtMPTCPRetrans            3                  0.0
MPTcpExtMPJoinSynAckRx          2                  0.0
MPTcpExtOFOQueueTail            1504               0.0
MPTcpExtOFOQueue                1544               0.0
MPTcpExtOFOMerge                813                0.0
MPTcpExtDuplicateData           35                 0.0
MPTcpExtAddAddr                 1                  0.0
MPTcpExtRcvPruned               58                 0.0
MPTcpExtSubflowStale            2                  0.0

The root cause seems to be here:

MPTcpExtSubflowStale            2                  0.0
MPTcpExtSubflowRecover          1                  0.0

From Paolo;

On one side it does not detect correctly both link being stale and got stuck; instead of using the backup subflow. MPTcpExtSubflowRecover should be 2.

@matttbe matttbe added this to Needs triage in MPTCP Bugs via automation Aug 13, 2021
@fw-strlen
Copy link

fw-strlen commented Aug 24, 2021

Looks like at least following sequence leads to hang:

  1. mptcp_pm_nl_subflow_chk_stale() -> __mptcp_retransmit_pending_data -> sets rtx_head->data_ready = 0
  2. mptcp_pm_nl_subflow_chk_stale -> __mptcp_push_pending() -> makes no more progress
  3. next retrans event makes no progress either since info.limit will be 0.

I'm testing with this change:

@@ -2407,6 +2417,13 @@ static void __mptcp_retrans(struct sock *sk)
        /* limit retransmission to the bytes already sent on some subflows */
        info.sent = 0;
        info.limit = READ_ONCE(msk->csum_enabled) ? dfrag->data_len : dfrag->already_sent;
+       if (info.limit == 0 && msk->recovery) {
+               info.limit = dfrag->data_len;
+               pr_info("%s: raised limit to %u\n", __func__, info.limit);
+       }

... it appears to greatly reduce the poll timeout frequency, currently on re-run 67 whereas it would normally trigger within 20 runs or so.

@matttbe
Copy link
Member Author

matttbe commented Aug 25, 2021

@fw-strlen thank you for looking at that, it looks great!
Do you mind if I assign you to this issue? (not to have multiple people looking at it, just in case :) )

@pabeni
Copy link

pabeni commented Aug 25, 2021

> @@ -2407,6 +2417,13 @@ static void __mptcp_retrans(struct sock *sk)
>         /* limit retransmission to the bytes already sent on some subflows */
>         info.sent = 0;
>         info.limit = READ_ONCE(msk->csum_enabled) ? dfrag->data_len : dfrag->already_sent;
> +       if (info.limit == 0 && msk->recovery) {
> +               info.limit = dfrag->data_len;
> +               pr_info("%s: raised limit to %u\n", __func__, info.limit);
> +       }

If we want to limit the retransmit to the already xmittted data, I think something alike the following should do:

    if (msk->recovery && before64(dfrag->data_seq, msk->recovery_snd_nxt)) {
        u64 xmtted_data = msk->recovery_send_nxt - dfrag->data_seq;
        
        info.limit = min(dfrag->data_len, xmitted_data);
    }

I'm also wondering if there is real need to enforce the above constraint. If not, we could always set

info->limit = dfrag->data_len;

regardless of msk->recovery

@matttbe
Copy link
Member Author

matttbe commented Aug 25, 2021

I think my CI just managed to reproduce this issue with a non debug kernel. I'm sharing the output just in case:

00:09:20.049 # 18 backup flow used, multi links fail   syn[ ok ] - synack[ ok ] - ack[ ok ]
00:09:20.081 #                                         add[ ok ] - echo  [ ok ]
00:09:20.115 #                                         stale             [ ok ]
00:09:20.145 #                                         link usage        [ ok ]
00:09:20.399 [  243.972277] IPv6: ADDRCONF(NETDEV_CHANGE): ns1eth1: link becomes ready
00:09:20.490 [  244.064124] IPv6: ADDRCONF(NETDEV_CHANGE): ns1eth2: link becomes ready
00:09:20.579 [  244.153246] IPv6: ADDRCONF(NETDEV_CHANGE): ns1eth3: link becomes ready
00:09:20.673 [  244.246278] IPv6: ADDRCONF(NETDEV_CHANGE): ns1eth4: link becomes ready
00:09:21.387 [  244.960706] IPv6: ADDRCONF(NETDEV_CHANGE): ns2eth1: link becomes ready
00:10:01.187 # copyfd_io_poll: poll timed out (events: POLLIN 1, POLLOUT 0)
00:10:01.990 # copyfd_io_poll: poll timed out (events: POLLIN 0, POLLOUT 4)
00:10:02.035 #  client exit code 2, server 2
00:10:02.035 # 
00:10:02.035 # netns ns1-0-f26wED socket stat for 10018:
00:10:02.149 # Netid State    Recv-Q Send-Q Local Address:Port  Peer Address:Port Process                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     
00:10:02.150 # tcp   ESTAB    0      0           10.0.1.1:10018     10.0.3.2:57903 ino:0 sk:1 <->
00:10:02.158 # 	 ts sack cubic wscale:7,7 rto:204 rtt:3.181/2.66 ato:40 mss:1448 pmtu:1500 rcvmss:1420 advmss:1448 cwnd:27 bytes_sent:33136 bytes_acked:33136 bytes_received:10839068 segs_out:3455 segs_in:7644 data_segs_out:25 data_segs_in:7635 send 98323798bps lastsnd:35236 lastrcv:30158 lastack:30158 pacing_rate 196601240bps delivery_rate 16812768bps delivered:26 busy:14ms rcv_rtt:412.671 rcv_space:14600 rcv_ssthresh:2138508 minrtt:1 tcp-ulp-mptcp flags:JBec token:0000(id:1)/99fbecc6(id:0) seq:8faf4d3c69081d8d sfseq:a534c5 ssnoff:aaadf8e maplen:2f58                                                                                                                                                               
00:10:02.160 # tcp   ESTAB    0      7168        10.0.1.1:10018     10.0.1.2:56592 timer:(persist,3.046ms,4) ino:0 sk:2 <->
00:10:02.167 # 	 ts sack cubic wscale:7,7 rto:308 backoff:6 rtt:75.617/41.092 ato:40 mss:1448 pmtu:1500 rcvmss:1420 advmss:1448 cwnd:233 ssthresh:16 bytes_sent:6231737 bytes_acked:6231737 bytes_received:5461834 segs_out:5065 segs_in:4661 data_segs_out:4461 data_segs_in:3907 send 35693984bps lastsnd:37010 lastrcv:37660 lastack:35930 pacing_rate 42832352bps delivery_rate 724688bps delivered:4462 busy:39897ms rwnd_limited:36866ms(92.4%) sndbuf_limited:222ms(0.6%) rcv_rtt:119.608 rcv_space:14600 rcv_ssthresh:1453754 notsent:7168 minrtt:0.108 tcp-ulp-mptcp flags:Mec token:0000(id:0)/99fbecc6(id:0) seq:8faf4d3c68629e49 sfseq:530ccb ssnoff:4868d256 maplen:4a80                            
00:10:02.169 # tcp   ESTAB    0      317168      10.0.2.1:10018     10.0.2.2:45099 timer:(persist,102ms,6) ino:0 sk:3 <->
00:10:02.178 # 	 ts sack cubic wscale:7,7 rto:278 backoff:6 rtt:77.805/35.047 ato:40 mss:36 pmtu:68 rcvmss:1420 advmss:1448 cwnd:59 ssthresh:178 bytes_sent:6450887 bytes_retrans:136 bytes_acked:6450271 bytes_received:5377234 segs_out:5102 segs_in:4606 data_segs_out:4673 data_segs_in:3850 send 218392bps lastsnd:17690 lastrcv:37683 lastack:36056 pacing_rate 42699808bps delivery_rate 332736bps delivered:4614 busy:39682ms rwnd_limited:699ms(1.8%) sndbuf_limited:837ms(2.1%) retrans:0/2 dsack_dups:2 rcv_rtt:120.403 rcv_space:14600 rcv_ssthresh:1407548 notsent:317168 minrtt:1 tcp-ulp-mptcp flags:Jec token:0000(id:0)/99fbecc6(id:1) seq:8faf4d3c68619e49 sfseq:52066f ssnoff:2486416 maplen:664
00:10:02.179 # mptcp LAST-ACK 0      0           10.0.1.1:10018     10.0.1.2:56592 timer:(keepalive,59sec,0) ino:0 sk:4 ---
00:10:02.184 # 	 subflows:2 add_addr_signal:1 subflows_max:2 add_addr_signal_max:1 remote_key token:99fbecc6 write_seq:9429233e85d1d0e1 snd_una:9429233e85bc98e8 rcv_nxt:8faf4d3c69084ce6                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        
00:10:02.185 # TcpPassiveOpens                 3                  0.0
00:10:02.186 # TcpInSegs                       9211               0.0
00:10:02.187 # TcpOutSegs                      13623              0.0
00:10:02.188 # TcpRetransSegs                  2                  0.0
00:10:02.189 # TcpExtTCPPureAcks               1516               0.0
00:10:02.190 # TcpExtTCPLossProbes             4                  0.0
00:10:02.190 # TcpExtTCPDSACKRecv              2                  0.0
00:10:02.191 # TcpExtTCPDSACKIgnoredNoUndo     2                  0.0
00:10:02.192 # TcpExtTCPOrigDataSent           9097               0.0
00:10:02.193 # TcpExtTCPHystartTrainDetect     2                  0.0
00:10:02.193 # TcpExtTCPHystartTrainCwnd       36                 0.0
00:10:02.194 # TcpExtTCPWinProbe               6                  0.0
00:10:02.195 # TcpExtTCPDelivered              9099               0.0
00:10:02.196 # TcpExtTCPDSACKRecvSegs          2                  0.0
00:10:02.197 # MPTcpExtMPCapableSYNRX          1                  0.0
00:10:02.198 # MPTcpExtMPCapableACKRX          1                  0.0
00:10:02.199 # MPTcpExtMPTCPRetrans            11                 0.0
00:10:02.201 # MPTcpExtMPJoinSynRx             2                  0.0
00:10:02.202 # MPTcpExtMPJoinAckRx             2                  0.0
00:10:02.203 # MPTcpExtOFOQueueTail            1796               0.0
00:10:02.204 # MPTcpExtOFOQueue                1932               0.0
00:10:02.205 # MPTcpExtOFOMerge                113                0.0
00:10:02.207 # MPTcpExtEchoAdd                 1                  0.0
00:10:02.208 # MPTcpExtSubflowStale            2                  0.0
00:10:02.209 # MPTcpExtSubflowRecover          1                  0.0
00:10:02.209 # 
00:10:02.210 # netns ns2-0-f26wED socket stat for 10018:
00:10:02.222 # Netid State      Recv-Q Send-Q     Local Address:Port  Peer Address:Port Process                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 
00:10:02.224 # tcp   ESTAB      0      1622016         10.0.2.2:45099     10.0.2.1:10018 timer:(on,4.249ms,15) ino:0 sk:1001 <->
00:10:02.236 # 	 ts sack cubic wscale:7,7 rto:5168 backoff:4 rtt:122.707/1.886 ato:80 mss:1448 pmtu:1500 rcvmss:1420 advmss:1448 cwnd:1 ssthresh:7 bytes_sent:5410986 bytes_retrans:18460 bytes_acked:5377235 bytes_received:6450271 segs_out:4631 segs_in:5042 data_segs_out:3874 data_segs_in:4613 send 94404bps lastsnd:919 lastrcv:36144 lastack:36144 pacing_rate 23903024bps delivery_rate 4281760bps delivered:3851 busy:38387ms sndbuf_limited:18ms(0.0%) unacked:11 retrans:1/13 lost:11 rcv_rtt:59.729 rcv_space:14480 rcv_ssthresh:1547988 notsent:1606724 minrtt:0.133 tcp-ulp-mptcp flags:Jjecv token:99fbecc6(id:1)/328ffa2d(id:0) seq:9429233e85b971b0 sfseq:621f18 ssnoff:d90b086a maplen:f99c
00:10:02.238 # tcp   ESTAB      0      573440          10.0.1.2:56592     10.0.1.1:10018 timer:(on,3.001ms,15) ino:0 sk:1002 <->
00:10:02.248 # 	 ts sack cubic wscale:7,7 rto:5136 backoff:4 rtt:120.763/2.249 ato:182 mss:1448 pmtu:1500 rcvmss:1420 advmss:1448 cwnd:1 ssthresh:7 bytes_sent:5483134 bytes_retrans:15620 bytes_acked:5461835 bytes_received:6231737 segs_out:4678 segs_in:5061 data_segs_out:3922 data_segs_in:4461 send 95923bps lastsnd:2135 lastrcv:37068 lastack:37068 pacing_rate 24287680bps delivery_rate 5455160bps delivered:3908 busy:38398ms unacked:4 retrans:1/11 lost:4 rcv_rtt:84.867 rcv_space:14480 rcv_ssthresh:1547948 notsent:567760 minrtt:0.159 tcp-ulp-mptcp flags:Mmec token:0000(id:0)/328ffa2d(id:0) seq:9429233e85b77e78 sfseq:5efaba ssnoff:44298079 maplen:1c00                                
00:10:02.250 # tcp   ESTAB      0      0       10.0.3.2%ns2eth3:57903     10.0.1.1:10018 ino:0 sk:1003 <->
00:10:02.258 # 	 ts sack cubic wscale:7,7 rto:613 rtt:412.754/0.394 ato:40 mss:1448 pmtu:1500 rcvmss:1420 advmss:1448 cwnd:717 ssthresh:354 bytes_sent:10839068 bytes_acked:10839069 bytes_received:33136 segs_out:7644 segs_in:3456 data_segs_out:7635 data_segs_in:25 send 20122707bps lastsnd:30632 lastrcv:35292 lastack:30219 pacing_rate 24147208bps delivery_rate 19140008bps delivered:7636 busy:4621ms rcv_rtt:6.75 rcv_space:14480 rcv_ssthresh:130224 minrtt:0.143 tcp-ulp-mptcp flags:JjBbec token:99fbecc6(id:0)/328ffa2d(id:1) seq:9429233e85bc3378 sfseq:1c01 ssnoff:ba42baa8 maplen:6570                                                                                                                            
00:10:02.260 # mptcp FIN-WAIT-2 0      0               10.0.1.2:56592     10.0.1.1:10018 timer:(keepalive,59sec,0) ino:0 sk:1004 ---
00:10:02.273 # 	 subflows:2 add_addr_accepted:1 subflows_max:3 add_addr_accepted_max:1 remote_key token:328ffa2d write_seq:8faf4d3c69084ce6 snd_una:8faf4d3c69084ce6 rcv_nxt:9429233e85bc98e8                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             
00:10:02.274 # TcpActiveOpens                  3                  0.0
00:10:02.275 # TcpInSegs                       9093               0.0
00:10:02.277 # TcpOutSegs                      16929              0.0
00:10:02.278 # TcpRetransSegs                  24                 0.0
00:10:02.279 # TcpExtDelayedACKs               14                 0.0
00:10:02.280 # TcpExtDelayedACKLost            2                  0.0
00:10:02.281 # TcpExtTCPPureAcks               4455               0.0
00:10:02.282 # TcpExtTCPLostRetransmit         22                 0.0
00:10:02.282 # TcpExtTCPTimeouts               30                 0.0
00:10:02.283 # TcpExtTCPLossProbes             2                  0.0
00:10:02.284 # TcpExtTCPDSACKOldSent           2                  0.0
00:10:02.285 # TcpExtTCPRcvCoalesce            14                 0.0
00:10:02.286 # TcpExtTCPSpuriousRtxHostQueues  6                  0.0
00:10:02.287 # TcpExtTCPFromZeroWindowAdv      1                  0.0
00:10:02.289 # TcpExtTCPToZeroWindowAdv        1                  0.0
00:10:02.290 # TcpExtTCPWantZeroWindowAdv      74                 0.0
00:10:02.292 # TcpExtTCPOrigDataSent           15407              0.0
00:10:02.294 # TcpExtTCPHystartTrainDetect     2                  0.0
00:10:02.296 # TcpExtTCPHystartTrainCwnd       36                 0.0
00:10:02.297 # TcpExtTCPHystartDelayDetect     1                  0.0
00:10:02.299 # TcpExtTCPHystartDelayCwnd       354                0.0
00:10:02.300 # TcpExtTCPDelivered              15395              0.0
00:10:02.301 # TcpExtTcpTimeoutRehash          30                 0.0
00:10:02.302 # MPTcpExtMPCapableSYNTX          1                  0.0
00:10:02.304 # MPTcpExtMPCapableSYNACKRX       1                  0.0
00:10:02.305 # MPTcpExtMPTCPRetrans            3                  0.0
00:10:02.306 # MPTcpExtMPJoinSynAckRx          2                  0.0
00:10:02.308 # MPTcpExtOFOQueueTail            1991               0.0
00:10:02.309 # MPTcpExtOFOQueue                2116               0.0
00:10:02.309 # MPTcpExtOFOMerge                195                0.0
00:10:02.310 # MPTcpExtDuplicateData           47                 0.0
00:10:02.311 # MPTcpExtAddAddr                 1                  0.0
00:10:02.311 # MPTcpExtRcvPruned               79                 0.0
00:10:02.312 # MPTcpExtSubflowStale            2                  0.0
00:10:02.315 # 19 backup flow used, bidi, link failure syn[ ok ] - synack[ ok ] - ack[ ok ]
00:10:02.334 #                                         add[ ok ] - echo  [ ok ]
00:10:02.373 #                                         stale             [ ok ]
00:10:02.403 #                                         link usage        [ ok ]

What is "funny" is that all items are marked as [ ok ] :)

@pabeni
Copy link

pabeni commented Aug 25, 2021

I think my CI just managed to reproduce this issue with a non debug kernel. I'm sharing the output just in case:
[...]
What is "funny" is that all items are marked as [ ok ] :)

The problem, I think, is that in this case the stale/recover mismatch (stale - recover != 2) happens in the opposite direction, and currently we do such check only in one netns.

fengguang pushed a commit to 0day-ci/linux that referenced this issue Sep 6, 2021
The retransmit head will be NULL in case there is no in-flight data
(meaning all data injected into network has been acked).

In that case the retransmit timer is stopped.

This is only correct if there is no more pending, not-yet-sent data.

If there is, the retransmit timer needs to set the PENDING bit again so
that mptcp tries to send the remaining (new) data once a subflow can accept
more data.

Also, mptcp_subflow_get_retrans() has to be called unconditionally.

This function checks for subflows that have become unresponsive and marks
them as stale, so in the case where the rtx queue is empty, subflows
will never be marked stale which prevents available backup subflows from
becoming eligible for transmit.

Closes: multipath-tcp/mptcp_net-next#226
Signed-off-by: Florian Westphal <fw@strlen.de>
matttbe pushed a commit that referenced this issue Sep 11, 2021
The retransmit head will be NULL in case there is no in-flight data
(meaning all data injected into network has been acked).

In that case the retransmit timer is stopped.

This is only correct if there is no more pending, not-yet-sent data.

If there is, the retransmit timer needs to set the PENDING bit again so
that mptcp tries to send the remaining (new) data once a subflow can accept
more data.

Also, mptcp_subflow_get_retrans() has to be called unconditionally.

This function checks for subflows that have become unresponsive and marks
them as stale, so in the case where the rtx queue is empty, subflows
will never be marked stale which prevents available backup subflows from
becoming eligible for transmit.

Closes: #226
Acked-by: Paolo Abeni <pabeni@redhat.com>
Reviewed-by: Mat Martineau <mathew.j.martineau@linux.intel.com>
Signed-off-by: Florian Westphal <fw@strlen.de>
MPTCP Bugs automation moved this from Needs triage to Closed Sep 11, 2021
matttbe pushed a commit that referenced this issue Sep 11, 2021
The retransmit head will be NULL in case there is no in-flight data
(meaning all data injected into network has been acked).

In that case the retransmit timer is stopped.

This is only correct if there is no more pending, not-yet-sent data.

If there is, the retransmit timer needs to set the PENDING bit again so
that mptcp tries to send the remaining (new) data once a subflow can accept
more data.

Also, mptcp_subflow_get_retrans() has to be called unconditionally.

This function checks for subflows that have become unresponsive and marks
them as stale, so in the case where the rtx queue is empty, subflows
will never be marked stale which prevents available backup subflows from
becoming eligible for transmit.

Closes: #226
Acked-by: Paolo Abeni <pabeni@redhat.com>
Reviewed-by: Mat Martineau <mathew.j.martineau@linux.intel.com>
Signed-off-by: Florian Westphal <fw@strlen.de>
matttbe pushed a commit that referenced this issue Sep 11, 2021
The retransmit head will be NULL in case there is no in-flight data
(meaning all data injected into network has been acked).

In that case the retransmit timer is stopped.

This is only correct if there is no more pending, not-yet-sent data.

If there is, the retransmit timer needs to set the PENDING bit again so
that mptcp tries to send the remaining (new) data once a subflow can accept
more data.

Also, mptcp_subflow_get_retrans() has to be called unconditionally.

This function checks for subflows that have become unresponsive and marks
them as stale, so in the case where the rtx queue is empty, subflows
will never be marked stale which prevents available backup subflows from
becoming eligible for transmit.

Closes: #226
Acked-by: Paolo Abeni <pabeni@redhat.com>
Reviewed-by: Mat Martineau <mathew.j.martineau@linux.intel.com>
Signed-off-by: Florian Westphal <fw@strlen.de>
jenkins-tessares pushed a commit that referenced this issue Sep 14, 2021
The retransmit head will be NULL in case there is no in-flight data
(meaning all data injected into network has been acked).

In that case the retransmit timer is stopped.

This is only correct if there is no more pending, not-yet-sent data.

If there is, the retransmit timer needs to set the PENDING bit again so
that mptcp tries to send the remaining (new) data once a subflow can accept
more data.

Also, mptcp_subflow_get_retrans() has to be called unconditionally.

This function checks for subflows that have become unresponsive and marks
them as stale, so in the case where the rtx queue is empty, subflows
will never be marked stale which prevents available backup subflows from
becoming eligible for transmit.

Closes: #226
Acked-by: Paolo Abeni <pabeni@redhat.com>
Reviewed-by: Mat Martineau <mathew.j.martineau@linux.intel.com>
Signed-off-by: Florian Westphal <fw@strlen.de>
jenkins-tessares pushed a commit that referenced this issue Sep 15, 2021
The retransmit head will be NULL in case there is no in-flight data
(meaning all data injected into network has been acked).

In that case the retransmit timer is stopped.

This is only correct if there is no more pending, not-yet-sent data.

If there is, the retransmit timer needs to set the PENDING bit again so
that mptcp tries to send the remaining (new) data once a subflow can accept
more data.

Also, mptcp_subflow_get_retrans() has to be called unconditionally.

This function checks for subflows that have become unresponsive and marks
them as stale, so in the case where the rtx queue is empty, subflows
will never be marked stale which prevents available backup subflows from
becoming eligible for transmit.

Closes: #226
Acked-by: Paolo Abeni <pabeni@redhat.com>
Reviewed-by: Mat Martineau <mathew.j.martineau@linux.intel.com>
Signed-off-by: Florian Westphal <fw@strlen.de>
jenkins-tessares pushed a commit that referenced this issue Sep 16, 2021
The retransmit head will be NULL in case there is no in-flight data
(meaning all data injected into network has been acked).

In that case the retransmit timer is stopped.

This is only correct if there is no more pending, not-yet-sent data.

If there is, the retransmit timer needs to set the PENDING bit again so
that mptcp tries to send the remaining (new) data once a subflow can accept
more data.

Also, mptcp_subflow_get_retrans() has to be called unconditionally.

This function checks for subflows that have become unresponsive and marks
them as stale, so in the case where the rtx queue is empty, subflows
will never be marked stale which prevents available backup subflows from
becoming eligible for transmit.

Closes: #226
Acked-by: Paolo Abeni <pabeni@redhat.com>
Reviewed-by: Mat Martineau <mathew.j.martineau@linux.intel.com>
Signed-off-by: Florian Westphal <fw@strlen.de>
matttbe pushed a commit that referenced this issue Sep 16, 2021
The retransmit head will be NULL in case there is no in-flight data
(meaning all data injected into network has been acked).

In that case the retransmit timer is stopped.

This is only correct if there is no more pending, not-yet-sent data.

If there is, the retransmit timer needs to set the PENDING bit again so
that mptcp tries to send the remaining (new) data once a subflow can accept
more data.

Also, mptcp_subflow_get_retrans() has to be called unconditionally.

This function checks for subflows that have become unresponsive and marks
them as stale, so in the case where the rtx queue is empty, subflows
will never be marked stale which prevents available backup subflows from
becoming eligible for transmit.

Closes: #226
Acked-by: Paolo Abeni <pabeni@redhat.com>
Reviewed-by: Mat Martineau <mathew.j.martineau@linux.intel.com>
Signed-off-by: Florian Westphal <fw@strlen.de>
matttbe pushed a commit that referenced this issue Sep 18, 2021
The retransmit head will be NULL in case there is no in-flight data
(meaning all data injected into network has been acked).

In that case the retransmit timer is stopped.

This is only correct if there is no more pending, not-yet-sent data.

If there is, the retransmit timer needs to set the PENDING bit again so
that mptcp tries to send the remaining (new) data once a subflow can accept
more data.

Also, mptcp_subflow_get_retrans() has to be called unconditionally.

This function checks for subflows that have become unresponsive and marks
them as stale, so in the case where the rtx queue is empty, subflows
will never be marked stale which prevents available backup subflows from
becoming eligible for transmit.

Closes: #226
Acked-by: Paolo Abeni <pabeni@redhat.com>
Reviewed-by: Mat Martineau <mathew.j.martineau@linux.intel.com>
Signed-off-by: Florian Westphal <fw@strlen.de>
matttbe pushed a commit that referenced this issue Sep 18, 2021
The retransmit head will be NULL in case there is no in-flight data
(meaning all data injected into network has been acked).

In that case the retransmit timer is stopped.

This is only correct if there is no more pending, not-yet-sent data.

If there is, the retransmit timer needs to set the PENDING bit again so
that mptcp tries to send the remaining (new) data once a subflow can accept
more data.

Also, mptcp_subflow_get_retrans() has to be called unconditionally.

This function checks for subflows that have become unresponsive and marks
them as stale, so in the case where the rtx queue is empty, subflows
will never be marked stale which prevents available backup subflows from
becoming eligible for transmit.

Closes: #226
Acked-by: Paolo Abeni <pabeni@redhat.com>
Reviewed-by: Mat Martineau <mathew.j.martineau@linux.intel.com>
Signed-off-by: Florian Westphal <fw@strlen.de>
jenkins-tessares pushed a commit that referenced this issue Sep 19, 2021
The retransmit head will be NULL in case there is no in-flight data
(meaning all data injected into network has been acked).

In that case the retransmit timer is stopped.

This is only correct if there is no more pending, not-yet-sent data.

If there is, the retransmit timer needs to set the PENDING bit again so
that mptcp tries to send the remaining (new) data once a subflow can accept
more data.

Also, mptcp_subflow_get_retrans() has to be called unconditionally.

This function checks for subflows that have become unresponsive and marks
them as stale, so in the case where the rtx queue is empty, subflows
will never be marked stale which prevents available backup subflows from
becoming eligible for transmit.

Closes: #226
Acked-by: Paolo Abeni <pabeni@redhat.com>
Reviewed-by: Mat Martineau <mathew.j.martineau@linux.intel.com>
Signed-off-by: Florian Westphal <fw@strlen.de>
matttbe pushed a commit that referenced this issue Sep 19, 2021
The retransmit head will be NULL in case there is no in-flight data
(meaning all data injected into network has been acked).

In that case the retransmit timer is stopped.

This is only correct if there is no more pending, not-yet-sent data.

If there is, the retransmit timer needs to set the PENDING bit again so
that mptcp tries to send the remaining (new) data once a subflow can accept
more data.

Also, mptcp_subflow_get_retrans() has to be called unconditionally.

This function checks for subflows that have become unresponsive and marks
them as stale, so in the case where the rtx queue is empty, subflows
will never be marked stale which prevents available backup subflows from
becoming eligible for transmit.

Closes: #226
Acked-by: Paolo Abeni <pabeni@redhat.com>
Reviewed-by: Mat Martineau <mathew.j.martineau@linux.intel.com>
Signed-off-by: Florian Westphal <fw@strlen.de>
jenkins-tessares pushed a commit that referenced this issue Sep 20, 2021
The retransmit head will be NULL in case there is no in-flight data
(meaning all data injected into network has been acked).

In that case the retransmit timer is stopped.

This is only correct if there is no more pending, not-yet-sent data.

If there is, the retransmit timer needs to set the PENDING bit again so
that mptcp tries to send the remaining (new) data once a subflow can accept
more data.

Also, mptcp_subflow_get_retrans() has to be called unconditionally.

This function checks for subflows that have become unresponsive and marks
them as stale, so in the case where the rtx queue is empty, subflows
will never be marked stale which prevents available backup subflows from
becoming eligible for transmit.

Closes: #226
Acked-by: Paolo Abeni <pabeni@redhat.com>
Reviewed-by: Mat Martineau <mathew.j.martineau@linux.intel.com>
Signed-off-by: Florian Westphal <fw@strlen.de>
matttbe pushed a commit that referenced this issue Sep 20, 2021
The retransmit head will be NULL in case there is no in-flight data
(meaning all data injected into network has been acked).

In that case the retransmit timer is stopped.

This is only correct if there is no more pending, not-yet-sent data.

If there is, the retransmit timer needs to set the PENDING bit again so
that mptcp tries to send the remaining (new) data once a subflow can accept
more data.

Also, mptcp_subflow_get_retrans() has to be called unconditionally.

This function checks for subflows that have become unresponsive and marks
them as stale, so in the case where the rtx queue is empty, subflows
will never be marked stale which prevents available backup subflows from
becoming eligible for transmit.

Closes: #226
Acked-by: Paolo Abeni <pabeni@redhat.com>
Reviewed-by: Mat Martineau <mathew.j.martineau@linux.intel.com>
Signed-off-by: Florian Westphal <fw@strlen.de>
jenkins-tessares pushed a commit that referenced this issue Sep 21, 2021
The retransmit head will be NULL in case there is no in-flight data
(meaning all data injected into network has been acked).

In that case the retransmit timer is stopped.

This is only correct if there is no more pending, not-yet-sent data.

If there is, the retransmit timer needs to set the PENDING bit again so
that mptcp tries to send the remaining (new) data once a subflow can accept
more data.

Also, mptcp_subflow_get_retrans() has to be called unconditionally.

This function checks for subflows that have become unresponsive and marks
them as stale, so in the case where the rtx queue is empty, subflows
will never be marked stale which prevents available backup subflows from
becoming eligible for transmit.

Closes: #226
Acked-by: Paolo Abeni <pabeni@redhat.com>
Reviewed-by: Mat Martineau <mathew.j.martineau@linux.intel.com>
Signed-off-by: Florian Westphal <fw@strlen.de>
jenkins-tessares pushed a commit that referenced this issue Sep 22, 2021
The retransmit head will be NULL in case there is no in-flight data
(meaning all data injected into network has been acked).

In that case the retransmit timer is stopped.

This is only correct if there is no more pending, not-yet-sent data.

If there is, the retransmit timer needs to set the PENDING bit again so
that mptcp tries to send the remaining (new) data once a subflow can accept
more data.

Also, mptcp_subflow_get_retrans() has to be called unconditionally.

This function checks for subflows that have become unresponsive and marks
them as stale, so in the case where the rtx queue is empty, subflows
will never be marked stale which prevents available backup subflows from
becoming eligible for transmit.

Closes: #226
Acked-by: Paolo Abeni <pabeni@redhat.com>
Reviewed-by: Mat Martineau <mathew.j.martineau@linux.intel.com>
Signed-off-by: Florian Westphal <fw@strlen.de>
jenkins-tessares pushed a commit that referenced this issue Sep 23, 2021
The retransmit head will be NULL in case there is no in-flight data
(meaning all data injected into network has been acked).

In that case the retransmit timer is stopped.

This is only correct if there is no more pending, not-yet-sent data.

If there is, the retransmit timer needs to set the PENDING bit again so
that mptcp tries to send the remaining (new) data once a subflow can accept
more data.

Also, mptcp_subflow_get_retrans() has to be called unconditionally.

This function checks for subflows that have become unresponsive and marks
them as stale, so in the case where the rtx queue is empty, subflows
will never be marked stale which prevents available backup subflows from
becoming eligible for transmit.

Closes: #226
Acked-by: Paolo Abeni <pabeni@redhat.com>
Reviewed-by: Mat Martineau <mathew.j.martineau@linux.intel.com>
Signed-off-by: Florian Westphal <fw@strlen.de>
matttbe pushed a commit that referenced this issue Sep 23, 2021
The retransmit head will be NULL in case there is no in-flight data
(meaning all data injected into network has been acked).

In that case the retransmit timer is stopped.

This is only correct if there is no more pending, not-yet-sent data.

If there is, the retransmit timer needs to set the PENDING bit again so
that mptcp tries to send the remaining (new) data once a subflow can accept
more data.

Also, mptcp_subflow_get_retrans() has to be called unconditionally.

This function checks for subflows that have become unresponsive and marks
them as stale, so in the case where the rtx queue is empty, subflows
will never be marked stale which prevents available backup subflows from
becoming eligible for transmit.

Closes: #226
Acked-by: Paolo Abeni <pabeni@redhat.com>
Reviewed-by: Mat Martineau <mathew.j.martineau@linux.intel.com>
Signed-off-by: Florian Westphal <fw@strlen.de>
matttbe pushed a commit that referenced this issue Sep 23, 2021
The retransmit head will be NULL in case there is no in-flight data
(meaning all data injected into network has been acked).

In that case the retransmit timer is stopped.

This is only correct if there is no more pending, not-yet-sent data.

If there is, the retransmit timer needs to set the PENDING bit again so
that mptcp tries to send the remaining (new) data once a subflow can accept
more data.

Also, mptcp_subflow_get_retrans() has to be called unconditionally.

This function checks for subflows that have become unresponsive and marks
them as stale, so in the case where the rtx queue is empty, subflows
will never be marked stale which prevents available backup subflows from
becoming eligible for transmit.

Closes: #226
Acked-by: Paolo Abeni <pabeni@redhat.com>
Reviewed-by: Mat Martineau <mathew.j.martineau@linux.intel.com>
Signed-off-by: Florian Westphal <fw@strlen.de>
surajjs95 pushed a commit to amazonlinux/linux that referenced this issue Jan 9, 2024
commit 3241a9c upstream.

The retransmit head will be NULL in case there is no in-flight data
(meaning all data injected into network has been acked).

In that case the retransmit timer is stopped.

This is only correct if there is no more pending, not-yet-sent data.

If there is, the retransmit timer needs to set the PENDING bit again so
that mptcp tries to send the remaining (new) data once a subflow can accept
more data.

Also, mptcp_subflow_get_retrans() has to be called unconditionally.

This function checks for subflows that have become unresponsive and marks
them as stale, so in the case where the rtx queue is empty, subflows
will never be marked stale which prevents available backup subflows from
becoming eligible for transmit.

Closes: multipath-tcp/mptcp_net-next#226
Acked-by: Paolo Abeni <pabeni@redhat.com>
Signed-off-by: Florian Westphal <fw@strlen.de>
Signed-off-by: Mat Martineau <mathew.j.martineau@linux.intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
(cherry picked from commit 3241a9c)
shaoyingxu pushed a commit to amazonlinux/linux that referenced this issue Jan 10, 2024
commit 3241a9c upstream.

The retransmit head will be NULL in case there is no in-flight data
(meaning all data injected into network has been acked).

In that case the retransmit timer is stopped.

This is only correct if there is no more pending, not-yet-sent data.

If there is, the retransmit timer needs to set the PENDING bit again so
that mptcp tries to send the remaining (new) data once a subflow can accept
more data.

Also, mptcp_subflow_get_retrans() has to be called unconditionally.

This function checks for subflows that have become unresponsive and marks
them as stale, so in the case where the rtx queue is empty, subflows
will never be marked stale which prevents available backup subflows from
becoming eligible for transmit.

Closes: multipath-tcp/mptcp_net-next#226
Acked-by: Paolo Abeni <pabeni@redhat.com>
Signed-off-by: Florian Westphal <fw@strlen.de>
Signed-off-by: Mat Martineau <mathew.j.martineau@linux.intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
(cherry picked from commit 3241a9c)
abuehaze14 pushed a commit to amazonlinux/linux that referenced this issue Jan 10, 2024
commit 3241a9c upstream.

The retransmit head will be NULL in case there is no in-flight data
(meaning all data injected into network has been acked).

In that case the retransmit timer is stopped.

This is only correct if there is no more pending, not-yet-sent data.

If there is, the retransmit timer needs to set the PENDING bit again so
that mptcp tries to send the remaining (new) data once a subflow can accept
more data.

Also, mptcp_subflow_get_retrans() has to be called unconditionally.

This function checks for subflows that have become unresponsive and marks
them as stale, so in the case where the rtx queue is empty, subflows
will never be marked stale which prevents available backup subflows from
becoming eligible for transmit.

Closes: multipath-tcp/mptcp_net-next#226
Acked-by: Paolo Abeni <pabeni@redhat.com>
Signed-off-by: Florian Westphal <fw@strlen.de>
Signed-off-by: Mat Martineau <mathew.j.martineau@linux.intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
(cherry picked from commit 3241a9c)
shaoyingxu pushed a commit to amazonlinux/linux that referenced this issue Jan 11, 2024
commit 3241a9c upstream.

The retransmit head will be NULL in case there is no in-flight data
(meaning all data injected into network has been acked).

In that case the retransmit timer is stopped.

This is only correct if there is no more pending, not-yet-sent data.

If there is, the retransmit timer needs to set the PENDING bit again so
that mptcp tries to send the remaining (new) data once a subflow can accept
more data.

Also, mptcp_subflow_get_retrans() has to be called unconditionally.

This function checks for subflows that have become unresponsive and marks
them as stale, so in the case where the rtx queue is empty, subflows
will never be marked stale which prevents available backup subflows from
becoming eligible for transmit.

Closes: multipath-tcp/mptcp_net-next#226
Acked-by: Paolo Abeni <pabeni@redhat.com>
Signed-off-by: Florian Westphal <fw@strlen.de>
Signed-off-by: Mat Martineau <mathew.j.martineau@linux.intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
(cherry picked from commit 3241a9c)
shaoyingxu pushed a commit to amazonlinux/linux that referenced this issue Jan 11, 2024
commit 3241a9c upstream.

The retransmit head will be NULL in case there is no in-flight data
(meaning all data injected into network has been acked).

In that case the retransmit timer is stopped.

This is only correct if there is no more pending, not-yet-sent data.

If there is, the retransmit timer needs to set the PENDING bit again so
that mptcp tries to send the remaining (new) data once a subflow can accept
more data.

Also, mptcp_subflow_get_retrans() has to be called unconditionally.

This function checks for subflows that have become unresponsive and marks
them as stale, so in the case where the rtx queue is empty, subflows
will never be marked stale which prevents available backup subflows from
becoming eligible for transmit.

Closes: multipath-tcp/mptcp_net-next#226
Acked-by: Paolo Abeni <pabeni@redhat.com>
Signed-off-by: Florian Westphal <fw@strlen.de>
Signed-off-by: Mat Martineau <mathew.j.martineau@linux.intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
(cherry picked from commit 3241a9c)
shaoyingxu pushed a commit to amazonlinux/linux that referenced this issue Jan 12, 2024
commit 3241a9c upstream.

The retransmit head will be NULL in case there is no in-flight data
(meaning all data injected into network has been acked).

In that case the retransmit timer is stopped.

This is only correct if there is no more pending, not-yet-sent data.

If there is, the retransmit timer needs to set the PENDING bit again so
that mptcp tries to send the remaining (new) data once a subflow can accept
more data.

Also, mptcp_subflow_get_retrans() has to be called unconditionally.

This function checks for subflows that have become unresponsive and marks
them as stale, so in the case where the rtx queue is empty, subflows
will never be marked stale which prevents available backup subflows from
becoming eligible for transmit.

Closes: multipath-tcp/mptcp_net-next#226
Acked-by: Paolo Abeni <pabeni@redhat.com>
Signed-off-by: Florian Westphal <fw@strlen.de>
Signed-off-by: Mat Martineau <mathew.j.martineau@linux.intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
(cherry picked from commit 3241a9c)
abuehaze14 pushed a commit to amazonlinux/linux that referenced this issue Jan 15, 2024
commit 3241a9c upstream.

The retransmit head will be NULL in case there is no in-flight data
(meaning all data injected into network has been acked).

In that case the retransmit timer is stopped.

This is only correct if there is no more pending, not-yet-sent data.

If there is, the retransmit timer needs to set the PENDING bit again so
that mptcp tries to send the remaining (new) data once a subflow can accept
more data.

Also, mptcp_subflow_get_retrans() has to be called unconditionally.

This function checks for subflows that have become unresponsive and marks
them as stale, so in the case where the rtx queue is empty, subflows
will never be marked stale which prevents available backup subflows from
becoming eligible for transmit.

Closes: multipath-tcp/mptcp_net-next#226
Acked-by: Paolo Abeni <pabeni@redhat.com>
Signed-off-by: Florian Westphal <fw@strlen.de>
Signed-off-by: Mat Martineau <mathew.j.martineau@linux.intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
(cherry picked from commit 3241a9c)
abuehaze14 pushed a commit to amazonlinux/linux that referenced this issue Jan 26, 2024
commit 3241a9c upstream.

The retransmit head will be NULL in case there is no in-flight data
(meaning all data injected into network has been acked).

In that case the retransmit timer is stopped.

This is only correct if there is no more pending, not-yet-sent data.

If there is, the retransmit timer needs to set the PENDING bit again so
that mptcp tries to send the remaining (new) data once a subflow can accept
more data.

Also, mptcp_subflow_get_retrans() has to be called unconditionally.

This function checks for subflows that have become unresponsive and marks
them as stale, so in the case where the rtx queue is empty, subflows
will never be marked stale which prevents available backup subflows from
becoming eligible for transmit.

Closes: multipath-tcp/mptcp_net-next#226
Acked-by: Paolo Abeni <pabeni@redhat.com>
Signed-off-by: Florian Westphal <fw@strlen.de>
Signed-off-by: Mat Martineau <mathew.j.martineau@linux.intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
(cherry picked from commit 3241a9c)
abuehaze14 pushed a commit to amazonlinux/linux that referenced this issue Jan 29, 2024
commit 3241a9c upstream.

The retransmit head will be NULL in case there is no in-flight data
(meaning all data injected into network has been acked).

In that case the retransmit timer is stopped.

This is only correct if there is no more pending, not-yet-sent data.

If there is, the retransmit timer needs to set the PENDING bit again so
that mptcp tries to send the remaining (new) data once a subflow can accept
more data.

Also, mptcp_subflow_get_retrans() has to be called unconditionally.

This function checks for subflows that have become unresponsive and marks
them as stale, so in the case where the rtx queue is empty, subflows
will never be marked stale which prevents available backup subflows from
becoming eligible for transmit.

Closes: multipath-tcp/mptcp_net-next#226
Acked-by: Paolo Abeni <pabeni@redhat.com>
Signed-off-by: Florian Westphal <fw@strlen.de>
Signed-off-by: Mat Martineau <mathew.j.martineau@linux.intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
(cherry picked from commit 3241a9c)
sj-aws pushed a commit to amazonlinux/linux that referenced this issue Feb 8, 2024
commit 3241a9c upstream.

The retransmit head will be NULL in case there is no in-flight data
(meaning all data injected into network has been acked).

In that case the retransmit timer is stopped.

This is only correct if there is no more pending, not-yet-sent data.

If there is, the retransmit timer needs to set the PENDING bit again so
that mptcp tries to send the remaining (new) data once a subflow can accept
more data.

Also, mptcp_subflow_get_retrans() has to be called unconditionally.

This function checks for subflows that have become unresponsive and marks
them as stale, so in the case where the rtx queue is empty, subflows
will never be marked stale which prevents available backup subflows from
becoming eligible for transmit.

Closes: multipath-tcp/mptcp_net-next#226
Acked-by: Paolo Abeni <pabeni@redhat.com>
Signed-off-by: Florian Westphal <fw@strlen.de>
Signed-off-by: Mat Martineau <mathew.j.martineau@linux.intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
(cherry picked from commit 3241a9c)
shaoyingxu pushed a commit to amazonlinux/linux that referenced this issue Feb 12, 2024
commit 3241a9c upstream.

The retransmit head will be NULL in case there is no in-flight data
(meaning all data injected into network has been acked).

In that case the retransmit timer is stopped.

This is only correct if there is no more pending, not-yet-sent data.

If there is, the retransmit timer needs to set the PENDING bit again so
that mptcp tries to send the remaining (new) data once a subflow can accept
more data.

Also, mptcp_subflow_get_retrans() has to be called unconditionally.

This function checks for subflows that have become unresponsive and marks
them as stale, so in the case where the rtx queue is empty, subflows
will never be marked stale which prevents available backup subflows from
becoming eligible for transmit.

Closes: multipath-tcp/mptcp_net-next#226
Acked-by: Paolo Abeni <pabeni@redhat.com>
Signed-off-by: Florian Westphal <fw@strlen.de>
Signed-off-by: Mat Martineau <mathew.j.martineau@linux.intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
(cherry picked from commit 3241a9c)
abuehaze14 pushed a commit to amazonlinux/linux that referenced this issue Feb 12, 2024
commit 3241a9c upstream.

The retransmit head will be NULL in case there is no in-flight data
(meaning all data injected into network has been acked).

In that case the retransmit timer is stopped.

This is only correct if there is no more pending, not-yet-sent data.

If there is, the retransmit timer needs to set the PENDING bit again so
that mptcp tries to send the remaining (new) data once a subflow can accept
more data.

Also, mptcp_subflow_get_retrans() has to be called unconditionally.

This function checks for subflows that have become unresponsive and marks
them as stale, so in the case where the rtx queue is empty, subflows
will never be marked stale which prevents available backup subflows from
becoming eligible for transmit.

Closes: multipath-tcp/mptcp_net-next#226
Acked-by: Paolo Abeni <pabeni@redhat.com>
Signed-off-by: Florian Westphal <fw@strlen.de>
Signed-off-by: Mat Martineau <mathew.j.martineau@linux.intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
(cherry picked from commit 3241a9c)
sj-aws pushed a commit to amazonlinux/linux that referenced this issue Feb 22, 2024
commit 3241a9c upstream.

The retransmit head will be NULL in case there is no in-flight data
(meaning all data injected into network has been acked).

In that case the retransmit timer is stopped.

This is only correct if there is no more pending, not-yet-sent data.

If there is, the retransmit timer needs to set the PENDING bit again so
that mptcp tries to send the remaining (new) data once a subflow can accept
more data.

Also, mptcp_subflow_get_retrans() has to be called unconditionally.

This function checks for subflows that have become unresponsive and marks
them as stale, so in the case where the rtx queue is empty, subflows
will never be marked stale which prevents available backup subflows from
becoming eligible for transmit.

Closes: multipath-tcp/mptcp_net-next#226
Acked-by: Paolo Abeni <pabeni@redhat.com>
Signed-off-by: Florian Westphal <fw@strlen.de>
Signed-off-by: Mat Martineau <mathew.j.martineau@linux.intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
(cherry picked from commit 3241a9c)
abuehaze14 pushed a commit to amazonlinux/linux that referenced this issue Feb 27, 2024
commit 3241a9c upstream.

The retransmit head will be NULL in case there is no in-flight data
(meaning all data injected into network has been acked).

In that case the retransmit timer is stopped.

This is only correct if there is no more pending, not-yet-sent data.

If there is, the retransmit timer needs to set the PENDING bit again so
that mptcp tries to send the remaining (new) data once a subflow can accept
more data.

Also, mptcp_subflow_get_retrans() has to be called unconditionally.

This function checks for subflows that have become unresponsive and marks
them as stale, so in the case where the rtx queue is empty, subflows
will never be marked stale which prevents available backup subflows from
becoming eligible for transmit.

Closes: multipath-tcp/mptcp_net-next#226
Acked-by: Paolo Abeni <pabeni@redhat.com>
Signed-off-by: Florian Westphal <fw@strlen.de>
Signed-off-by: Mat Martineau <mathew.j.martineau@linux.intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
(cherry picked from commit 3241a9c)
puranjaymohan pushed a commit to amazonlinux/linux that referenced this issue Mar 12, 2024
commit 3241a9c upstream.

The retransmit head will be NULL in case there is no in-flight data
(meaning all data injected into network has been acked).

In that case the retransmit timer is stopped.

This is only correct if there is no more pending, not-yet-sent data.

If there is, the retransmit timer needs to set the PENDING bit again so
that mptcp tries to send the remaining (new) data once a subflow can accept
more data.

Also, mptcp_subflow_get_retrans() has to be called unconditionally.

This function checks for subflows that have become unresponsive and marks
them as stale, so in the case where the rtx queue is empty, subflows
will never be marked stale which prevents available backup subflows from
becoming eligible for transmit.

Closes: multipath-tcp/mptcp_net-next#226
Acked-by: Paolo Abeni <pabeni@redhat.com>
Signed-off-by: Florian Westphal <fw@strlen.de>
Signed-off-by: Mat Martineau <mathew.j.martineau@linux.intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
(cherry picked from commit 3241a9c)
abuehaze14 pushed a commit to amazonlinux/linux that referenced this issue Mar 22, 2024
commit 3241a9c upstream.

The retransmit head will be NULL in case there is no in-flight data
(meaning all data injected into network has been acked).

In that case the retransmit timer is stopped.

This is only correct if there is no more pending, not-yet-sent data.

If there is, the retransmit timer needs to set the PENDING bit again so
that mptcp tries to send the remaining (new) data once a subflow can accept
more data.

Also, mptcp_subflow_get_retrans() has to be called unconditionally.

This function checks for subflows that have become unresponsive and marks
them as stale, so in the case where the rtx queue is empty, subflows
will never be marked stale which prevents available backup subflows from
becoming eligible for transmit.

Closes: multipath-tcp/mptcp_net-next#226
Acked-by: Paolo Abeni <pabeni@redhat.com>
Signed-off-by: Florian Westphal <fw@strlen.de>
Signed-off-by: Mat Martineau <mathew.j.martineau@linux.intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
(cherry picked from commit 3241a9c)
heynemax pushed a commit to amazonlinux/linux that referenced this issue Mar 26, 2024
commit 3241a9c upstream.

The retransmit head will be NULL in case there is no in-flight data
(meaning all data injected into network has been acked).

In that case the retransmit timer is stopped.

This is only correct if there is no more pending, not-yet-sent data.

If there is, the retransmit timer needs to set the PENDING bit again so
that mptcp tries to send the remaining (new) data once a subflow can accept
more data.

Also, mptcp_subflow_get_retrans() has to be called unconditionally.

This function checks for subflows that have become unresponsive and marks
them as stale, so in the case where the rtx queue is empty, subflows
will never be marked stale which prevents available backup subflows from
becoming eligible for transmit.

Closes: multipath-tcp/mptcp_net-next#226
Acked-by: Paolo Abeni <pabeni@redhat.com>
Signed-off-by: Florian Westphal <fw@strlen.de>
Signed-off-by: Mat Martineau <mathew.j.martineau@linux.intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
(cherry picked from commit 3241a9c
 mheyne: fixed contextual conflicts due to upstream commit f6909dc
   ("mptcp: rename timer related helper to less confusing names"))
abuehaze14 pushed a commit to amazonlinux/linux that referenced this issue Apr 5, 2024
commit 3241a9c upstream.

The retransmit head will be NULL in case there is no in-flight data
(meaning all data injected into network has been acked).

In that case the retransmit timer is stopped.

This is only correct if there is no more pending, not-yet-sent data.

If there is, the retransmit timer needs to set the PENDING bit again so
that mptcp tries to send the remaining (new) data once a subflow can accept
more data.

Also, mptcp_subflow_get_retrans() has to be called unconditionally.

This function checks for subflows that have become unresponsive and marks
them as stale, so in the case where the rtx queue is empty, subflows
will never be marked stale which prevents available backup subflows from
becoming eligible for transmit.

Closes: multipath-tcp/mptcp_net-next#226
Acked-by: Paolo Abeni <pabeni@redhat.com>
Signed-off-by: Florian Westphal <fw@strlen.de>
Signed-off-by: Mat Martineau <mathew.j.martineau@linux.intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
(cherry picked from commit 3241a9c
 mheyne: fixed contextual conflicts due to upstream commit f6909dc
   ("mptcp: rename timer related helper to less confusing names"))
mngyadam pushed a commit to amazonlinux/linux that referenced this issue Apr 8, 2024
commit 3241a9c upstream.

The retransmit head will be NULL in case there is no in-flight data
(meaning all data injected into network has been acked).

In that case the retransmit timer is stopped.

This is only correct if there is no more pending, not-yet-sent data.

If there is, the retransmit timer needs to set the PENDING bit again so
that mptcp tries to send the remaining (new) data once a subflow can accept
more data.

Also, mptcp_subflow_get_retrans() has to be called unconditionally.

This function checks for subflows that have become unresponsive and marks
them as stale, so in the case where the rtx queue is empty, subflows
will never be marked stale which prevents available backup subflows from
becoming eligible for transmit.

Closes: multipath-tcp/mptcp_net-next#226
Acked-by: Paolo Abeni <pabeni@redhat.com>
Signed-off-by: Florian Westphal <fw@strlen.de>
Signed-off-by: Mat Martineau <mathew.j.martineau@linux.intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
(cherry picked from commit 3241a9c
 mheyne: fixed contextual conflicts due to upstream commit f6909dc
   ("mptcp: rename timer related helper to less confusing names"))
prati0100 pushed a commit to amazonlinux/linux that referenced this issue Apr 8, 2024
commit 3241a9c upstream.

The retransmit head will be NULL in case there is no in-flight data
(meaning all data injected into network has been acked).

In that case the retransmit timer is stopped.

This is only correct if there is no more pending, not-yet-sent data.

If there is, the retransmit timer needs to set the PENDING bit again so
that mptcp tries to send the remaining (new) data once a subflow can accept
more data.

Also, mptcp_subflow_get_retrans() has to be called unconditionally.

This function checks for subflows that have become unresponsive and marks
them as stale, so in the case where the rtx queue is empty, subflows
will never be marked stale which prevents available backup subflows from
becoming eligible for transmit.

Closes: multipath-tcp/mptcp_net-next#226
Acked-by: Paolo Abeni <pabeni@redhat.com>
Signed-off-by: Florian Westphal <fw@strlen.de>
Signed-off-by: Mat Martineau <mathew.j.martineau@linux.intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
(cherry picked from commit 3241a9c)
prati0100 pushed a commit to amazonlinux/linux that referenced this issue Apr 8, 2024
The retransmit head will be NULL in case there is no in-flight data
(meaning all data injected into network has been acked).

In that case the retransmit timer is stopped.

This is only correct if there is no more pending, not-yet-sent data.

If there is, the retransmit timer needs to set the PENDING bit again so
that mptcp tries to send the remaining (new) data once a subflow can accept
more data.

Also, mptcp_subflow_get_retrans() has to be called unconditionally.

This function checks for subflows that have become unresponsive and marks
them as stale, so in the case where the rtx queue is empty, subflows
will never be marked stale which prevents available backup subflows from
becoming eligible for transmit.

Closes: multipath-tcp/mptcp_net-next#226
Acked-by: Paolo Abeni <pabeni@redhat.com>
Signed-off-by: Florian Westphal <fw@strlen.de>
Signed-off-by: Mat Martineau <mathew.j.martineau@linux.intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
prati0100 pushed a commit to amazonlinux/linux that referenced this issue Apr 8, 2024
The retransmit head will be NULL in case there is no in-flight data
(meaning all data injected into network has been acked).

In that case the retransmit timer is stopped.

This is only correct if there is no more pending, not-yet-sent data.

If there is, the retransmit timer needs to set the PENDING bit again so
that mptcp tries to send the remaining (new) data once a subflow can accept
more data.

Also, mptcp_subflow_get_retrans() has to be called unconditionally.

This function checks for subflows that have become unresponsive and marks
them as stale, so in the case where the rtx queue is empty, subflows
will never be marked stale which prevents available backup subflows from
becoming eligible for transmit.

Closes: multipath-tcp/mptcp_net-next#226
Acked-by: Paolo Abeni <pabeni@redhat.com>
Signed-off-by: Florian Westphal <fw@strlen.de>
Signed-off-by: Mat Martineau <mathew.j.martineau@linux.intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
mngyadam pushed a commit to amazonlinux/linux that referenced this issue Apr 9, 2024
commit 3241a9c upstream.

The retransmit head will be NULL in case there is no in-flight data
(meaning all data injected into network has been acked).

In that case the retransmit timer is stopped.

This is only correct if there is no more pending, not-yet-sent data.

If there is, the retransmit timer needs to set the PENDING bit again so
that mptcp tries to send the remaining (new) data once a subflow can accept
more data.

Also, mptcp_subflow_get_retrans() has to be called unconditionally.

This function checks for subflows that have become unresponsive and marks
them as stale, so in the case where the rtx queue is empty, subflows
will never be marked stale which prevents available backup subflows from
becoming eligible for transmit.

Closes: multipath-tcp/mptcp_net-next#226
Acked-by: Paolo Abeni <pabeni@redhat.com>
Signed-off-by: Florian Westphal <fw@strlen.de>
Signed-off-by: Mat Martineau <mathew.j.martineau@linux.intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
(cherry picked from commit 3241a9c
 mheyne: fixed contextual conflicts due to upstream commit f6909dc
   ("mptcp: rename timer related helper to less confusing names"))
mngyadam pushed a commit to amazonlinux/linux that referenced this issue Apr 12, 2024
commit 3241a9c upstream.

The retransmit head will be NULL in case there is no in-flight data
(meaning all data injected into network has been acked).

In that case the retransmit timer is stopped.

This is only correct if there is no more pending, not-yet-sent data.

If there is, the retransmit timer needs to set the PENDING bit again so
that mptcp tries to send the remaining (new) data once a subflow can accept
more data.

Also, mptcp_subflow_get_retrans() has to be called unconditionally.

This function checks for subflows that have become unresponsive and marks
them as stale, so in the case where the rtx queue is empty, subflows
will never be marked stale which prevents available backup subflows from
becoming eligible for transmit.

Closes: multipath-tcp/mptcp_net-next#226
Acked-by: Paolo Abeni <pabeni@redhat.com>
Signed-off-by: Florian Westphal <fw@strlen.de>
Signed-off-by: Mat Martineau <mathew.j.martineau@linux.intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
(cherry picked from commit 3241a9c
 mheyne: fixed contextual conflicts due to upstream commit f6909dc
   ("mptcp: rename timer related helper to less confusing names"))
mngyadam pushed a commit to amazonlinux/linux that referenced this issue Apr 18, 2024
commit 3241a9c upstream.

The retransmit head will be NULL in case there is no in-flight data
(meaning all data injected into network has been acked).

In that case the retransmit timer is stopped.

This is only correct if there is no more pending, not-yet-sent data.

If there is, the retransmit timer needs to set the PENDING bit again so
that mptcp tries to send the remaining (new) data once a subflow can accept
more data.

Also, mptcp_subflow_get_retrans() has to be called unconditionally.

This function checks for subflows that have become unresponsive and marks
them as stale, so in the case where the rtx queue is empty, subflows
will never be marked stale which prevents available backup subflows from
becoming eligible for transmit.

Closes: multipath-tcp/mptcp_net-next#226
Acked-by: Paolo Abeni <pabeni@redhat.com>
Signed-off-by: Florian Westphal <fw@strlen.de>
Signed-off-by: Mat Martineau <mathew.j.martineau@linux.intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
(cherry picked from commit 3241a9c
 mheyne: fixed contextual conflicts due to upstream commit f6909dc
   ("mptcp: rename timer related helper to less confusing names"))
mngyadam pushed a commit to amazonlinux/linux that referenced this issue Apr 19, 2024
commit 3241a9c upstream.

The retransmit head will be NULL in case there is no in-flight data
(meaning all data injected into network has been acked).

In that case the retransmit timer is stopped.

This is only correct if there is no more pending, not-yet-sent data.

If there is, the retransmit timer needs to set the PENDING bit again so
that mptcp tries to send the remaining (new) data once a subflow can accept
more data.

Also, mptcp_subflow_get_retrans() has to be called unconditionally.

This function checks for subflows that have become unresponsive and marks
them as stale, so in the case where the rtx queue is empty, subflows
will never be marked stale which prevents available backup subflows from
becoming eligible for transmit.

Closes: multipath-tcp/mptcp_net-next#226
Acked-by: Paolo Abeni <pabeni@redhat.com>
Signed-off-by: Florian Westphal <fw@strlen.de>
Signed-off-by: Mat Martineau <mathew.j.martineau@linux.intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
(cherry picked from commit 3241a9c
 mheyne: fixed contextual conflicts due to upstream commit f6909dc
   ("mptcp: rename timer related helper to less confusing names"))
mngyadam pushed a commit to amazonlinux/linux that referenced this issue Apr 19, 2024
commit 3241a9c upstream.

The retransmit head will be NULL in case there is no in-flight data
(meaning all data injected into network has been acked).

In that case the retransmit timer is stopped.

This is only correct if there is no more pending, not-yet-sent data.

If there is, the retransmit timer needs to set the PENDING bit again so
that mptcp tries to send the remaining (new) data once a subflow can accept
more data.

Also, mptcp_subflow_get_retrans() has to be called unconditionally.

This function checks for subflows that have become unresponsive and marks
them as stale, so in the case where the rtx queue is empty, subflows
will never be marked stale which prevents available backup subflows from
becoming eligible for transmit.

Closes: multipath-tcp/mptcp_net-next#226
Acked-by: Paolo Abeni <pabeni@redhat.com>
Signed-off-by: Florian Westphal <fw@strlen.de>
Signed-off-by: Mat Martineau <mathew.j.martineau@linux.intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
(cherry picked from commit 3241a9c
 mheyne: fixed contextual conflicts due to upstream commit f6909dc
   ("mptcp: rename timer related helper to less confusing names"))
mngyadam pushed a commit to amazonlinux/linux that referenced this issue Apr 19, 2024
commit 3241a9c upstream.

The retransmit head will be NULL in case there is no in-flight data
(meaning all data injected into network has been acked).

In that case the retransmit timer is stopped.

This is only correct if there is no more pending, not-yet-sent data.

If there is, the retransmit timer needs to set the PENDING bit again so
that mptcp tries to send the remaining (new) data once a subflow can accept
more data.

Also, mptcp_subflow_get_retrans() has to be called unconditionally.

This function checks for subflows that have become unresponsive and marks
them as stale, so in the case where the rtx queue is empty, subflows
will never be marked stale which prevents available backup subflows from
becoming eligible for transmit.

Closes: multipath-tcp/mptcp_net-next#226
Acked-by: Paolo Abeni <pabeni@redhat.com>
Signed-off-by: Florian Westphal <fw@strlen.de>
Signed-off-by: Mat Martineau <mathew.j.martineau@linux.intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
(cherry picked from commit 3241a9c
 mheyne: fixed contextual conflicts due to upstream commit f6909dc
   ("mptcp: rename timer related helper to less confusing names"))
mngyadam pushed a commit to amazonlinux/linux that referenced this issue Apr 22, 2024
commit 3241a9c upstream.

The retransmit head will be NULL in case there is no in-flight data
(meaning all data injected into network has been acked).

In that case the retransmit timer is stopped.

This is only correct if there is no more pending, not-yet-sent data.

If there is, the retransmit timer needs to set the PENDING bit again so
that mptcp tries to send the remaining (new) data once a subflow can accept
more data.

Also, mptcp_subflow_get_retrans() has to be called unconditionally.

This function checks for subflows that have become unresponsive and marks
them as stale, so in the case where the rtx queue is empty, subflows
will never be marked stale which prevents available backup subflows from
becoming eligible for transmit.

Closes: multipath-tcp/mptcp_net-next#226
Acked-by: Paolo Abeni <pabeni@redhat.com>
Signed-off-by: Florian Westphal <fw@strlen.de>
Signed-off-by: Mat Martineau <mathew.j.martineau@linux.intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
(cherry picked from commit 3241a9c
 mheyne: fixed contextual conflicts due to upstream commit f6909dc
   ("mptcp: rename timer related helper to less confusing names"))
mngyadam pushed a commit to amazonlinux/linux that referenced this issue Apr 23, 2024
commit 3241a9c upstream.

The retransmit head will be NULL in case there is no in-flight data
(meaning all data injected into network has been acked).

In that case the retransmit timer is stopped.

This is only correct if there is no more pending, not-yet-sent data.

If there is, the retransmit timer needs to set the PENDING bit again so
that mptcp tries to send the remaining (new) data once a subflow can accept
more data.

Also, mptcp_subflow_get_retrans() has to be called unconditionally.

This function checks for subflows that have become unresponsive and marks
them as stale, so in the case where the rtx queue is empty, subflows
will never be marked stale which prevents available backup subflows from
becoming eligible for transmit.

Closes: multipath-tcp/mptcp_net-next#226
Acked-by: Paolo Abeni <pabeni@redhat.com>
Signed-off-by: Florian Westphal <fw@strlen.de>
Signed-off-by: Mat Martineau <mathew.j.martineau@linux.intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
(cherry picked from commit 3241a9c
 mheyne: fixed contextual conflicts due to upstream commit f6909dc
   ("mptcp: rename timer related helper to less confusing names"))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
No open projects
MPTCP Bugs
  
Closed
Development

No branches or pull requests

3 participants