diff options
author | Xin Long <lucien.xin@gmail.com> | 2020-07-22 23:52:11 +0800 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2020-07-22 18:00:12 -0700 |
commit | 8f13399db22f909a35735bf8ae2f932e0c8f0e30 (patch) | |
tree | 076d3e3508f1f1b7f8fe8f219ff3b3066459e0e9 /net/sctp | |
parent | 2f2a7ffad5c6cbf3d438e813cfdc88230e185ba6 (diff) | |
download | linux-8f13399db22f909a35735bf8ae2f932e0c8f0e30.tar.gz linux-8f13399db22f909a35735bf8ae2f932e0c8f0e30.tar.bz2 linux-8f13399db22f909a35735bf8ae2f932e0c8f0e30.zip |
sctp: shrink stream outq only when new outcnt < old outcnt
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>
Diffstat (limited to 'net/sctp')
-rw-r--r-- | net/sctp/stream.c | 21 |
1 files changed, 14 insertions, 7 deletions
diff --git a/net/sctp/stream.c b/net/sctp/stream.c index 67f7e71f9129..4f87693cc036 100644 --- 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(struct sctp_stream *stream, 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 |