aboutsummaryrefslogtreecommitdiffstats
path: root/net/sctp/outqueue.c
diff options
context:
space:
mode:
authorXin Long <lucien.xin@gmail.com>2017-05-31 04:36:31 -0400
committerDavid S. Miller <davem@davemloft.net>2017-06-02 13:56:26 -0400
commitcee360ab4dd66fc1de33a5fa1cb418fa21c27ce3 (patch)
treedb9b8575e7392b314e94a946590b71bb5c856e64 /net/sctp/outqueue.c
parent6e7da286e3513ac1e107ef8dffa5f254029d68e7 (diff)
sctp: define the member stream as an object instead of pointer in asoc
As Marcelo's suggestion, stream is a fixed size member of asoc and would not grow with more streams. To avoid an allocation for it, this patch is to define it as an object instead of pointer and update the places using it, also create sctp_stream_update() called in sctp_assoc_update() to migrate the stream info from one stream to another. Signed-off-by: Xin Long <lucien.xin@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/sctp/outqueue.c')
-rw-r--r--net/sctp/outqueue.c10
1 files changed, 5 insertions, 5 deletions
diff --git a/net/sctp/outqueue.c b/net/sctp/outqueue.c
index fe4c3d462f6e..20299df163b9 100644
--- a/net/sctp/outqueue.c
+++ b/net/sctp/outqueue.c
@@ -363,7 +363,7 @@ static int sctp_prsctp_prune_sent(struct sctp_association *asoc,
363 sctp_insert_list(&asoc->outqueue.abandoned, 363 sctp_insert_list(&asoc->outqueue.abandoned,
364 &chk->transmitted_list); 364 &chk->transmitted_list);
365 365
366 streamout = &asoc->stream->out[chk->sinfo.sinfo_stream]; 366 streamout = &asoc->stream.out[chk->sinfo.sinfo_stream];
367 asoc->sent_cnt_removable--; 367 asoc->sent_cnt_removable--;
368 asoc->abandoned_sent[SCTP_PR_INDEX(PRIO)]++; 368 asoc->abandoned_sent[SCTP_PR_INDEX(PRIO)]++;
369 streamout->abandoned_sent[SCTP_PR_INDEX(PRIO)]++; 369 streamout->abandoned_sent[SCTP_PR_INDEX(PRIO)]++;
@@ -400,9 +400,9 @@ static int sctp_prsctp_prune_unsent(struct sctp_association *asoc,
400 q->out_qlen -= chk->skb->len; 400 q->out_qlen -= chk->skb->len;
401 asoc->sent_cnt_removable--; 401 asoc->sent_cnt_removable--;
402 asoc->abandoned_unsent[SCTP_PR_INDEX(PRIO)]++; 402 asoc->abandoned_unsent[SCTP_PR_INDEX(PRIO)]++;
403 if (chk->sinfo.sinfo_stream < asoc->stream->outcnt) { 403 if (chk->sinfo.sinfo_stream < asoc->stream.outcnt) {
404 struct sctp_stream_out *streamout = 404 struct sctp_stream_out *streamout =
405 &asoc->stream->out[chk->sinfo.sinfo_stream]; 405 &asoc->stream.out[chk->sinfo.sinfo_stream];
406 406
407 streamout->abandoned_unsent[SCTP_PR_INDEX(PRIO)]++; 407 streamout->abandoned_unsent[SCTP_PR_INDEX(PRIO)]++;
408 } 408 }
@@ -1036,7 +1036,7 @@ static void sctp_outq_flush(struct sctp_outq *q, int rtx_timeout, gfp_t gfp)
1036 /* RFC 2960 6.5 Every DATA chunk MUST carry a valid 1036 /* RFC 2960 6.5 Every DATA chunk MUST carry a valid
1037 * stream identifier. 1037 * stream identifier.
1038 */ 1038 */
1039 if (chunk->sinfo.sinfo_stream >= asoc->stream->outcnt) { 1039 if (chunk->sinfo.sinfo_stream >= asoc->stream.outcnt) {
1040 1040
1041 /* Mark as failed send. */ 1041 /* Mark as failed send. */
1042 sctp_chunk_fail(chunk, SCTP_ERROR_INV_STRM); 1042 sctp_chunk_fail(chunk, SCTP_ERROR_INV_STRM);
@@ -1054,7 +1054,7 @@ static void sctp_outq_flush(struct sctp_outq *q, int rtx_timeout, gfp_t gfp)
1054 continue; 1054 continue;
1055 } 1055 }
1056 1056
1057 if (asoc->stream->out[sid].state == SCTP_STREAM_CLOSED) { 1057 if (asoc->stream.out[sid].state == SCTP_STREAM_CLOSED) {
1058 sctp_outq_head_data(q, chunk); 1058 sctp_outq_head_data(q, chunk);
1059 goto sctp_flush_out; 1059 goto sctp_flush_out;
1060 } 1060 }