diff options
author | Marcelo Ricardo Leitner <marcelo.leitner@gmail.com> | 2017-10-03 19:20:11 -0300 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2017-10-03 16:27:28 -0700 |
commit | f952be79cebd49d04154781d99408867a069d375 (patch) | |
tree | ce68d2060940a95d6a8657bc44d261d856668bd5 /net/sctp/stream.c | |
parent | 1fdb8d8fefe2e7320ea15a65051758a4c4332f05 (diff) | |
download | linux-f952be79cebd49d04154781d99408867a069d375.tar.gz linux-f952be79cebd49d04154781d99408867a069d375.tar.bz2 linux-f952be79cebd49d04154781d99408867a069d375.zip |
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/stream.c')
-rw-r--r-- | net/sctp/stream.c | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/net/sctp/stream.c b/net/sctp/stream.c index 952437d656cc..055ca25bbc91 100644 --- a/net/sctp/stream.c +++ b/net/sctp/stream.c @@ -121,8 +121,24 @@ in: return 0; } +int sctp_stream_init_ext(struct sctp_stream *stream, __u16 sid) +{ + struct sctp_stream_out_ext *soute; + + soute = kzalloc(sizeof(*soute), GFP_KERNEL); + if (!soute) + return -ENOMEM; + stream->out[sid].ext = soute; + + return 0; +} + void sctp_stream_free(struct sctp_stream *stream) { + int i; + + for (i = 0; i < stream->outcnt; i++) + kfree(stream->out[i].ext); kfree(stream->out); kfree(stream->in); } |