| From foo@baz Thu Dec 21 09:02:40 CET 2017 |
| From: Xin Long <lucien.xin@gmail.com> |
| Date: Sat, 18 Mar 2017 20:03:59 +0800 |
| Subject: sctp: out_qlen should be updated when pruning unsent queue |
| |
| From: Xin Long <lucien.xin@gmail.com> |
| |
| |
| [ Upstream commit 23bb09cfbe04076ef647da3889a5a5ab6cbe6f15 ] |
| |
| This patch is to fix the issue that sctp_prsctp_prune_sent forgot |
| to update q->out_qlen when removing a chunk from unsent queue. |
| |
| 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@verizon.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| net/sctp/outqueue.c | 11 +++++------ |
| 1 file changed, 5 insertions(+), 6 deletions(-) |
| |
| --- a/net/sctp/outqueue.c |
| +++ b/net/sctp/outqueue.c |
| @@ -382,17 +382,18 @@ static int sctp_prsctp_prune_sent(struct |
| } |
| |
| static int sctp_prsctp_prune_unsent(struct sctp_association *asoc, |
| - struct sctp_sndrcvinfo *sinfo, |
| - struct list_head *queue, int msg_len) |
| + struct sctp_sndrcvinfo *sinfo, int msg_len) |
| { |
| + struct sctp_outq *q = &asoc->outqueue; |
| struct sctp_chunk *chk, *temp; |
| |
| - list_for_each_entry_safe(chk, temp, queue, list) { |
| + list_for_each_entry_safe(chk, temp, &q->out_chunk_list, list) { |
| if (!SCTP_PR_PRIO_ENABLED(chk->sinfo.sinfo_flags) || |
| chk->sinfo.sinfo_timetolive <= sinfo->sinfo_timetolive) |
| continue; |
| |
| list_del_init(&chk->list); |
| + q->out_qlen -= chk->skb->len; |
| asoc->sent_cnt_removable--; |
| asoc->abandoned_unsent[SCTP_PR_INDEX(PRIO)]++; |
| |
| @@ -431,9 +432,7 @@ void sctp_prsctp_prune(struct sctp_assoc |
| return; |
| } |
| |
| - sctp_prsctp_prune_unsent(asoc, sinfo, |
| - &asoc->outqueue.out_chunk_list, |
| - msg_len); |
| + sctp_prsctp_prune_unsent(asoc, sinfo, msg_len); |
| } |
| |
| /* Mark all the eligible packets on a transport for retransmission. */ |