summaryrefslogtreecommitdiffstats
path: root/net/sctp/stream_sched.c
diff options
context:
space:
mode:
authorMarcelo Ricardo Leitner <marcelo.leitner@gmail.com>2017-10-04 00:20:16 +0200
committerDavid S. Miller <davem@davemloft.net>2017-10-04 01:27:29 +0200
commit637784ade221a3c8a7ecd0f583eddd95d6276b9a (patch)
treef2ae2b8f52c227395fdce0d014318c0899e60776 /net/sctp/stream_sched.c
parentsctp: add sockopt to get/set stream scheduler parameters (diff)
downloadlinux-637784ade221a3c8a7ecd0f583eddd95d6276b9a.tar.xz
linux-637784ade221a3c8a7ecd0f583eddd95d6276b9a.zip
sctp: introduce priority based stream scheduler
This patch introduces RFC Draft ndata section 3.4 Priority Based Scheduler (SCTP_SS_PRIO). It works by having a struct sctp_stream_priority for each priority configured. This struct is then enlisted on a queue ordered per priority if, and only if, there is a stream with data queued, so that dequeueing is very straightforward: either finish current datamsg or simply dequeue from the highest priority queued, which is the next stream pointed, and that's it. If there are multiple streams assigned with the same priority and with data queued, it will do round robin amongst them while respecting datamsgs boundaries (when not using idata chunks), to be reasonably fair. We intentionally don't maintain a list of priorities nor a list of all streams with the same priority to save memory. The first would mean at least 2 other pointers per priority (which, for 1000 priorities, that can mean 16kB) and the second would also mean 2 other pointers but per stream. As SCTP supports up to 65535 streams on a given asoc, that's 1MB. This impacts when giving a priority to some stream, as we have to find out if the new priority is already being used and if we can free the old one, and also when tearing down. The new fields in struct sctp_stream_out_ext and sctp_stream are added under a union because that memory is to be shared with other schedulers. See-also: https://tools.ietf.org/html/draft-ietf-tsvwg-sctp-ndata-13 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_sched.c')
-rw-r--r--net/sctp/stream_sched.c3
1 files changed, 3 insertions, 0 deletions
diff --git a/net/sctp/stream_sched.c b/net/sctp/stream_sched.c
index 40a9a9de2b98..115ddb765169 100644
--- a/net/sctp/stream_sched.c
+++ b/net/sctp/stream_sched.c
@@ -121,8 +121,11 @@ static struct sctp_sched_ops sctp_sched_fcfs = {
/* API to other parts of the stack */
+extern struct sctp_sched_ops sctp_sched_prio;
+
struct sctp_sched_ops *sctp_sched_ops[] = {
&sctp_sched_fcfs,
+ &sctp_sched_prio,
};
int sctp_sched_set_sched(struct sctp_association *asoc,