aboutsummaryrefslogtreecommitdiffstats
path: root/net/sctp/outqueue.c
diff options
context:
space:
mode:
authorMarcelo Ricardo Leitner <marcelo.leitner@gmail.com>2017-10-03 18:20:11 -0400
committerDavid S. Miller <davem@davemloft.net>2017-10-03 19:27:28 -0400
commitf952be79cebd49d04154781d99408867a069d375 (patch)
treece68d2060940a95d6a8657bc44d261d856668bd5 /net/sctp/outqueue.c
parent1fdb8d8fefe2e7320ea15a65051758a4c4332f05 (diff)
sctp: introduce struct sctp_stream_out_ext
With the stream schedulers, sctp_stream_out will become too big to be allocated by kmalloc and as we need to allocate with BH disabled, we cannot use __vmalloc in sctp_stream_init(). This patch moves out the stats from sctp_stream_out to sctp_stream_out_ext, which will be allocated only when the application tries to sendmsg something on it. Just the introduction of sctp_stream_out_ext would already fix the issue described above by splitting the allocation in two. Moving the stats to it also reduces the pressure on the allocator as we will ask for less memory atomically when creating the socket and we will use GFP_KERNEL later. Then, for stream schedulers, we will just use sctp_stream_out_ext. Tested-by: Xin Long <lucien.xin@gmail.com> Signed-off-by: Marcelo Ricardo Leitner <marcelo.leitner@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/sctp/outqueue.c')
-rw-r--r--net/sctp/outqueue.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/net/sctp/outqueue.c b/net/sctp/outqueue.c
index 2966ff400755..746b07b7937d 100644
--- a/net/sctp/outqueue.c
+++ b/net/sctp/outqueue.c
@@ -366,7 +366,7 @@ static int sctp_prsctp_prune_sent(struct sctp_association *asoc,
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->ext->abandoned_sent[SCTP_PR_INDEX(PRIO)]++;
370 370
371 if (!chk->tsn_gap_acked) { 371 if (!chk->tsn_gap_acked) {
372 if (chk->transport) 372 if (chk->transport)
@@ -404,7 +404,7 @@ static int sctp_prsctp_prune_unsent(struct sctp_association *asoc,
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->ext->abandoned_unsent[SCTP_PR_INDEX(PRIO)]++;
408 } 408 }
409 409
410 msg_len -= SCTP_DATA_SNDSIZE(chk) + 410 msg_len -= SCTP_DATA_SNDSIZE(chk) +