On 27.5.2022. 18:25, Jan Klemkow wrote:
> Hi,
>
> The following diff enables the TCP Large Receive Offloading feature for
> ix(4) interfaces. It also includes a default off sysctl(2) switch.
>
> The TCP single stream receiving performance increased from 3.6 Gbit/s to
> 9.4 Gbit/s. Measured from Linux to OpenBSD with tcpbench.
>
> I tested the diff with:
> ix0 at pci3 dev 0 function 0 "Intel 82599" rev 0x01, msix, 12 queues, address
> 00:1b:21:87:fb:2c
>
> If you want to test the diff:
>
> 1. Apply the diff
> 2. Rebuild the kernel
> 3. Rebuild header files
> # cd /usr/src && make includes
Hi,
I'm sorry but I' stuck here.
smc24# cd /usr/src && make includes
cd /usr/src/include && su build -c 'exec make prereq' && exec make
includes
preparing in /usr/src/include/../lib/libcrypto
cat /usr/src/lib/libcrypto/objects/obj_mac.num > obj_mac.num.tmp
/bin/sh: cannot create obj_mac.num.tmp: Permission denied
*** Error 1 in lib/libcrypto (Makefile:460 'obj_mac.h')
*** Error 2 in include (Makefile:81 'prereq': @for i in ../lib/libcrypto
../lib/librpcsvc; do echo preparing in /usr/src/include/$i; cd /u...)
*** Error 2 in /usr/src (Makefile:55 'includes')
I'm doing "make includes" as root ..
> 4. Rebuild sysctl(8)
> # cd /usr/src/sbin/sysctl && make && make install
> 5. Reboot
> 6. Enable the feature
> # sysctl net.inet.tcp.large_recv_offload=1
> # ifconfig ix0 down && ifconfig ix0 up
>
> I tested this diff for a while in different scenarios (receiving,
> routing, relaying) without noticing any problems yet.
>
> bluhm@ already suggested that I could change the feature switch from a
> global sysctl(2) to an per interface ifconfig(8) option. This would
> give the user more control.
>
> Tests with other ix(4) NICs are welcome and needed!
>
> bye,
> Jan
>
> Index: dev/pci/if_ix.c
> ===================================================================
> RCS file: /cvs/src/sys/dev/pci/if_ix.c,v
> retrieving revision 1.185
> diff -u -p -r1.185 if_ix.c
> --- dev/pci/if_ix.c 15 Mar 2022 11:22:10 -0000 1.185
> +++ dev/pci/if_ix.c 23 May 2022 14:39:45 -0000
> @@ -2870,7 +2870,7 @@ ixgbe_initialize_receive_units(struct ix
> {
> struct rx_ring *rxr = sc->rx_rings;
> struct ixgbe_hw *hw = &sc->hw;
> - uint32_t bufsz, fctrl, srrctl, rxcsum;
> + uint32_t bufsz, fctrl, srrctl, rxcsum, rdrxctl;
> uint32_t hlreg;
> int i;
>
> @@ -2894,6 +2894,14 @@ ixgbe_initialize_receive_units(struct ix
> hlreg |= IXGBE_HLREG0_JUMBOEN;
> IXGBE_WRITE_REG(hw, IXGBE_HLREG0, hlreg);
>
> + if (tcp_lro) {
> + /* enable RSCACKC for RSC */
> + rdrxctl = IXGBE_READ_REG(hw, IXGBE_RDRXCTL);
> + rdrxctl |= IXGBE_RDRXCTL_RSCACKC;
> + rdrxctl |= IXGBE_RDRXCTL_FCOE_WRFIX;
> + IXGBE_WRITE_REG(hw, IXGBE_RDRXCTL, rdrxctl);
> + }
> +
> bufsz = (sc->rx_mbuf_sz - ETHER_ALIGN) >> IXGBE_SRRCTL_BSIZEPKT_SHIFT;
>
> for (i = 0; i < sc->num_queues; i++, rxr++) {
> @@ -2909,6 +2917,12 @@ ixgbe_initialize_receive_units(struct ix
> /* Set up the SRRCTL register */
> srrctl = bufsz | IXGBE_SRRCTL_DESCTYPE_ADV_ONEBUF;
> IXGBE_WRITE_REG(hw, IXGBE_SRRCTL(i), srrctl);
> +
> + if (tcp_lro) {
> + /* Enable Receive Side Coalescing */
> + IXGBE_WRITE_REG(hw, IXGBE_RSCCTL(i),
> + IXGBE_RSCCTL_RSCEN|IXGBE_RSCCTL_MAXDESC_16);
> + }
>
> /* Setup the HW Rx Head and Tail Descriptor Pointers */
> IXGBE_WRITE_REG(hw, IXGBE_RDH(i), 0);
> Index: dev/pci/ixgbe.h
> ===================================================================
> RCS file: /cvs/src/sys/dev/pci/ixgbe.h,v
> retrieving revision 1.33
> diff -u -p -r1.33 ixgbe.h
> --- dev/pci/ixgbe.h 8 Feb 2022 03:38:00 -0000 1.33
> +++ dev/pci/ixgbe.h 23 May 2022 14:53:59 -0000
> @@ -61,11 +61,16 @@
> #include <net/if.h>
> #include <net/if_media.h>
> #include <net/toeplitz.h>
> +#include <net/route.h>
>
> #include <netinet/in.h>
> #include <netinet/if_ether.h>
> #include <netinet/ip.h>
> +#include <netinet/ip_ipsp.h>
> #include <netinet/ip6.h>
> +#include <netinet/tcp.h>
> +#include <netinet/tcp_timer.h>
> +#include <netinet/tcp_var.h>
>
> #if NBPFILTER > 0
> #include <net/bpf.h>
> Index: netinet/tcp_input.c
> ===================================================================
> RCS file: /cvs/src/sys/netinet/tcp_input.c,v
> retrieving revision 1.375
> diff -u -p -r1.375 tcp_input.c
> --- netinet/tcp_input.c 4 Jan 2022 06:32:39 -0000 1.375
> +++ netinet/tcp_input.c 23 May 2022 14:41:59 -0000
> @@ -126,6 +126,7 @@ struct timeval tcp_rst_ppslim_last;
> int tcp_ackdrop_ppslim = 100; /* 100pps */
> int tcp_ackdrop_ppslim_count = 0;
> struct timeval tcp_ackdrop_ppslim_last;
> +int tcp_lro = 0; /* TCP Large Receive Offload */
>
> #define TCP_PAWS_IDLE (24 * 24 * 60 * 60 * PR_SLOWHZ)
>
> Index: netinet/tcp_usrreq.c
> ===================================================================
> RCS file: /cvs/src/sys/netinet/tcp_usrreq.c,v
> retrieving revision 1.183
> diff -u -p -r1.183 tcp_usrreq.c
> --- netinet/tcp_usrreq.c 25 Feb 2022 23:51:03 -0000 1.183
> +++ netinet/tcp_usrreq.c 23 May 2022 14:43:41 -0000
> @@ -128,6 +128,7 @@ const struct sysctl_bounded_args tcpctl_
> { TCPCTL_SYN_BUCKET_LIMIT, &tcp_syn_bucket_limit, 1, INT_MAX },
> { TCPCTL_RFC3390, &tcp_do_rfc3390, 0, 2 },
> { TCPCTL_ALWAYS_KEEPALIVE, &tcp_always_keepalive, 0, 1 },
> + { TCPCTL_LRO, &tcp_lro, 0, 1 },
> };
>
> struct inpcbtable tcbtable;
> Index: netinet/tcp_var.h
> ===================================================================
> RCS file: /cvs/src/sys/netinet/tcp_var.h,v
> retrieving revision 1.139
> diff -u -p -r1.139 tcp_var.h
> --- netinet/tcp_var.h 25 Feb 2022 23:51:03 -0000 1.139
> +++ netinet/tcp_var.h 23 May 2022 14:47:49 -0000
> @@ -465,7 +465,8 @@ struct tcpstat {
> #define TCPCTL_SYN_USE_LIMIT 23 /* number of uses before reseeding
> hash */
> #define TCPCTL_ROOTONLY 24 /* return root only port bitmap */
> #define TCPCTL_SYN_HASH_SIZE 25 /* number of buckets in the hash */
> -#define TCPCTL_MAXID 26
> +#define TCPCTL_LRO 26 /* en/disable TCP Large Receive
> Offloading */
> +#define TCPCTL_MAXID 27
>
> #define TCPCTL_NAMES { \
> { 0, 0 }, \
> @@ -494,6 +495,7 @@ struct tcpstat {
> { "synuselimit", CTLTYPE_INT }, \
> { "rootonly", CTLTYPE_STRUCT }, \
> { "synhashsize", CTLTYPE_INT }, \
> + { "large_recv_offload", CTLTYPE_INT }, \
> }
>
> struct tcp_ident_mapping {
> @@ -652,6 +654,7 @@ extern int tcp_syn_bucket_limit;/* max e
> extern int tcp_syn_use_limit; /* number of uses before reseeding
> hash */
> extern struct syn_cache_set tcp_syn_cache[];
> extern int tcp_syn_cache_active; /* active syn cache, may be 0 or 1 */
> +extern int tcp_lro; /* en/disable large receive offloading
> */
>
> void tcp_canceltimers(struct tcpcb *);
> struct tcpcb *
>