lkml.org 
[lkml]   [2018]   [Feb]   [23]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.9 057/145] sctp: only update outstanding_bytes for transmitted queue when doing prsctp_prune
    Date
    4.9-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Xin Long <lucien.xin@gmail.com>


    [ Upstream commit d30fc5126efb0c33b7adf5966d3051db2c3d7721 ]

    Now outstanding_bytes is only increased when appending chunks into one
    packet and sending it at 1st time, while decreased when it is about to
    move into retransmit queue. It means outstanding_bytes value is already
    decreased for all chunks in retransmit queue.

    However sctp_prsctp_prune_sent is a common function to check the chunks
    in both transmitted and retransmit queue, it decrease outstanding_bytes
    when moving a chunk into abandoned queue from either of them.

    It could cause outstanding_bytes underflow, as it also decreases it's
    value for the chunks in retransmit queue.

    This patch fixes it by only updating outstanding_bytes for transmitted
    queue when pruning queues for prsctp prio policy, the same fix is also
    needed in sctp_check_transmitted.

    Fixes: 8dbdf1f5b09c ("sctp: implement prsctp PRIO policy")
    Signed-off-by: Xin Long <lucien.xin@gmail.com>
    Acked-by: Marcelo Ricardo Leitner <marcelo.leitner@gmail.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <alexander.levin@microsoft.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    net/sctp/outqueue.c | 6 ++++--
    1 file changed, 4 insertions(+), 2 deletions(-)

    --- a/net/sctp/outqueue.c
    +++ b/net/sctp/outqueue.c
    @@ -364,7 +364,8 @@ static int sctp_prsctp_prune_sent(struct
    asoc->sent_cnt_removable--;
    asoc->abandoned_sent[SCTP_PR_INDEX(PRIO)]++;

    - if (!chk->tsn_gap_acked) {
    + if (queue != &asoc->outqueue.retransmit &&
    + !chk->tsn_gap_acked) {
    if (chk->transport)
    chk->transport->flight_size -=
    sctp_data_size(chk);
    @@ -1409,7 +1410,8 @@ static void sctp_check_transmitted(struc
    /* If this chunk has not been acked, stop
    * considering it as 'outstanding'.
    */
    - if (!tchunk->tsn_gap_acked) {
    + if (transmitted_queue != &q->retransmit &&
    + !tchunk->tsn_gap_acked) {
    if (tchunk->transport)
    tchunk->transport->flight_size -=
    sctp_data_size(tchunk);

    \
     
     \ /
      Last update: 2018-02-23 19:45    [W:4.166 / U:0.544 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site