Commit f6591733 authored by David S. Miller's avatar David S. Miller

Merge branch 'sctp-shrink-stream-outq-in-the-right-place'

Xin Long says:

====================
sctp: shrink stream outq in the right place

Patch 1 is an improvement, and Patch 2 is a bug fix.
====================
Acked-by: default avatarMarcelo Ricardo Leitner <marcelo.leitner@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 2f2a7ffa 3ecdda3e
...@@ -22,17 +22,11 @@ ...@@ -22,17 +22,11 @@
#include <net/sctp/sm.h> #include <net/sctp/sm.h>
#include <net/sctp/stream_sched.h> #include <net/sctp/stream_sched.h>
/* Migrates chunks from stream queues to new stream queues if needed, static void sctp_stream_shrink_out(struct sctp_stream *stream, __u16 outcnt)
* 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)
{ {
struct sctp_association *asoc; struct sctp_association *asoc;
struct sctp_chunk *ch, *temp; struct sctp_chunk *ch, *temp;
struct sctp_outq *outq; struct sctp_outq *outq;
int i;
asoc = container_of(stream, struct sctp_association, stream); asoc = container_of(stream, struct sctp_association, stream);
outq = &asoc->outqueue; outq = &asoc->outqueue;
...@@ -56,6 +50,19 @@ static void sctp_stream_outq_migrate(struct sctp_stream *stream, ...@@ -56,6 +50,19 @@ static void sctp_stream_outq_migrate(struct sctp_stream *stream,
sctp_chunk_free(ch); 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) { if (new) {
/* Here we actually move the old ext stuff into the new /* Here we actually move the old ext stuff into the new
...@@ -1037,11 +1044,13 @@ struct sctp_chunk *sctp_process_strreset_resp( ...@@ -1037,11 +1044,13 @@ struct sctp_chunk *sctp_process_strreset_resp(
nums = ntohs(addstrm->number_of_streams); nums = ntohs(addstrm->number_of_streams);
number = stream->outcnt - nums; number = stream->outcnt - nums;
if (result == SCTP_STRRESET_PERFORMED) if (result == SCTP_STRRESET_PERFORMED) {
for (i = number; i < stream->outcnt; i++) for (i = number; i < stream->outcnt; i++)
SCTP_SO(stream, i)->state = SCTP_STREAM_OPEN; SCTP_SO(stream, i)->state = SCTP_STREAM_OPEN;
else } else {
sctp_stream_shrink_out(stream, number);
stream->outcnt = number; stream->outcnt = number;
}
*evp = sctp_ulpevent_make_stream_change_event(asoc, flags, *evp = sctp_ulpevent_make_stream_change_event(asoc, flags,
0, nums, GFP_ATOMIC); 0, nums, GFP_ATOMIC);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment