| From foo@baz Wed 29 Jul 2020 11:19:56 AM CEST |
| From: Xin Long <lucien.xin@gmail.com> |
| Date: Wed, 22 Jul 2020 23:52:11 +0800 |
| Subject: sctp: shrink stream outq only when new outcnt < old outcnt |
| |
| From: Xin Long <lucien.xin@gmail.com> |
| |
| [ Upstream commit 8f13399db22f909a35735bf8ae2f932e0c8f0e30 ] |
| |
| It's not necessary to go list_for_each for outq->out_chunk_list |
| when new outcnt >= old outcnt, as no chunk with higher sid than |
| new (outcnt - 1) exists in the outqueue. |
| |
| While at it, also move the list_for_each code in a new function |
| sctp_stream_shrink_out(), which will be used in the next patch. |
| |
| Signed-off-by: Xin Long <lucien.xin@gmail.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| net/sctp/stream.c | 21 ++++++++++++++------- |
| 1 file changed, 14 insertions(+), 7 deletions(-) |
| |
| --- a/net/sctp/stream.c |
| +++ b/net/sctp/stream.c |
| @@ -22,17 +22,11 @@ |
| #include <net/sctp/sm.h> |
| #include <net/sctp/stream_sched.h> |
| |
| -/* Migrates chunks from stream queues to new stream queues if needed, |
| - * but not across associations. Also, removes those chunks to streams |
| - * higher than the new max. |
| - */ |
| -static void sctp_stream_outq_migrate(struct sctp_stream *stream, |
| - struct sctp_stream *new, __u16 outcnt) |
| +static void sctp_stream_shrink_out(struct sctp_stream *stream, __u16 outcnt) |
| { |
| struct sctp_association *asoc; |
| struct sctp_chunk *ch, *temp; |
| struct sctp_outq *outq; |
| - int i; |
| |
| asoc = container_of(stream, struct sctp_association, stream); |
| outq = &asoc->outqueue; |
| @@ -56,6 +50,19 @@ static void sctp_stream_outq_migrate(str |
| |
| sctp_chunk_free(ch); |
| } |
| +} |
| + |
| +/* Migrates chunks from stream queues to new stream queues if needed, |
| + * but not across associations. Also, removes those chunks to streams |
| + * higher than the new max. |
| + */ |
| +static void sctp_stream_outq_migrate(struct sctp_stream *stream, |
| + struct sctp_stream *new, __u16 outcnt) |
| +{ |
| + int i; |
| + |
| + if (stream->outcnt > outcnt) |
| + sctp_stream_shrink_out(stream, outcnt); |
| |
| if (new) { |
| /* Here we actually move the old ext stuff into the new |