aboutsummaryrefslogtreecommitdiff
path: root/sys/conf/kern.opts.mk
diff options
context:
space:
mode:
authorHans Petter Selasky <hselasky@FreeBSD.org>2017-01-18 13:31:17 +0000
committerHans Petter Selasky <hselasky@FreeBSD.org>2017-01-18 13:31:17 +0000
commitf3e7afe2d7b262ab55ab818445d4dfdb6e0c70a9 (patch)
treef99cc015b93fe941bf2c9800511d277156c375d9 /sys/conf/kern.opts.mk
parentae69172343e8e6940510bf3cf7512fceaa479929 (diff)
downloadsrc-f3e7afe2d7b262ab55ab818445d4dfdb6e0c70a9.tar.gz
src-f3e7afe2d7b262ab55ab818445d4dfdb6e0c70a9.zip
Implement kernel support for hardware rate limited sockets.
- Add RATELIMIT kernel configuration keyword which must be set to enable the new functionality. - Add support for hardware driven, Receive Side Scaling, RSS aware, rate limited sendqueues and expose the functionality through the already established SO_MAX_PACING_RATE setsockopt(). The API support rates in the range from 1 to 4Gbytes/s which are suitable for regular TCP and UDP streams. The setsockopt(2) manual page has been updated. - Add rate limit function callback API to "struct ifnet" which supports the following operations: if_snd_tag_alloc(), if_snd_tag_modify(), if_snd_tag_query() and if_snd_tag_free(). - Add support to ifconfig to view, set and clear the IFCAP_TXRTLMT flag, which tells if a network driver supports rate limiting or not. - This patch also adds support for rate limiting through VLAN and LAGG intermediate network devices. - How rate limiting works: 1) The userspace application calls setsockopt() after accepting or making a new connection to set the rate which is then stored in the socket structure in the kernel. Later on when packets are transmitted a check is made in the transmit path for rate changes. A rate change implies a non-blocking ifp->if_snd_tag_alloc() call will be made to the destination network interface, which then sets up a custom sendqueue with the given rate limitation parameter. A "struct m_snd_tag" pointer is returned which serves as a "snd_tag" hint in the m_pkthdr for the subsequently transmitted mbufs. 2) When the network driver sees the "m->m_pkthdr.snd_tag" different from NULL, it will move the packets into a designated rate limited sendqueue given by the snd_tag pointer. It is up to the individual drivers how the rate limited traffic will be rate limited. 3) Route changes are detected by the NIC drivers in the ifp->if_transmit() routine when the ifnet pointer in the incoming snd_tag mismatches the one of the network interface. The network adapter frees the mbuf and returns EAGAIN which causes the ip_output() to release and clear the send tag. Upon next ip_output() a new "snd_tag" will be tried allocated. 4) When the PCB is detached the custom sendqueue will be released by a non-blocking ifp->if_snd_tag_free() call to the currently bound network interface. Reviewed by: wblock (manpages), adrian, gallatin, scottl (network) Differential Revision: https://reviews.freebsd.org/D3687 Sponsored by: Mellanox Technologies MFC after: 3 months
Notes
Notes: svn path=/head/; revision=312379
Diffstat (limited to 'sys/conf/kern.opts.mk')
-rw-r--r--sys/conf/kern.opts.mk1
1 files changed, 1 insertions, 0 deletions
diff --git a/sys/conf/kern.opts.mk b/sys/conf/kern.opts.mk
index 66d43b2ac511..8b793cf5184d 100644
--- a/sys/conf/kern.opts.mk
+++ b/sys/conf/kern.opts.mk
@@ -48,6 +48,7 @@ __DEFAULT_NO_OPTIONS = \
EXTRA_TCP_STACKS \
NAND \
OFED \
+ RATELIMIT \
REPRODUCIBLE_BUILD
# Some options are totally broken on some architectures. We disable