On July 2, 2023 2:33:41 PM GMT+02:00, Claudio Jeker <cje...@diehard.n-r-g.com> 
wrote:
>On Sun, Jul 02, 2023 at 02:28:17PM +0200, Alexander Bluhm wrote:
>> anyone?
>
>Was not able to test yet but I like the diff.
>Right now this is a noop since LRO is not on by default for lo(4).
>Because of that OK claudio@

The diff works fine in my sparc64 setup.
ok jan@

>> On Fri, Jun 23, 2023 at 06:06:16PM +0200, Alexander Bluhm wrote:
>> > Hi,
>> > 
>> > Claudio@ mentioned the idea to use TSO and LRO on the loopback
>> > interface to transfer TCP faster.
>> > 
>> > I see a performance effect with this diff, but more importantly it
>> > gives us more test coverage.  Currently LRO on lo(4) is default
>> > off.
>> > 
>> > Future plan is:
>> > - Fix some corner cases for LRO/TSO with TCP path-MTU discovery
>> >   and IP forwarding when LRO is enabled.
>> > - Enable LRO/TSO for lo(4) and ix(4) per default.
>> > - Jan@ commits his ixl(4) TSO diff.
>> > 
>> > ok for lo(4) LRO/TSO with default off?
>> > 
>> > bluhm
>> > 
>> > Index: sys/net/if.c
>> > ===================================================================
>> > RCS file: /data/mirror/openbsd/cvs/src/sys/net/if.c,v
>> > retrieving revision 1.700
>> > diff -u -p -r1.700 if.c
>> > --- sys/net/if.c   12 Jun 2023 21:19:54 -0000      1.700
>> > +++ sys/net/if.c   23 Jun 2023 15:48:27 -0000
>> > @@ -106,6 +106,9 @@
>> >  #ifdef MROUTING
>> >  #include <netinet/ip_mroute.h>
>> >  #endif
>> > +#include <netinet/tcp.h>
>> > +#include <netinet/tcp_timer.h>
>> > +#include <netinet/tcp_var.h>
>> >  
>> >  #ifdef INET6
>> >  #include <netinet6/in6_var.h>
>> > @@ -802,12 +805,29 @@ if_input_local(struct ifnet *ifp, struct
>> >     * is now incorrect, will be calculated before sending.
>> >     */
>> >    keepcksum = m->m_pkthdr.csum_flags & (M_IPV4_CSUM_OUT |
>> > -      M_TCP_CSUM_OUT | M_UDP_CSUM_OUT | M_ICMP_CSUM_OUT);
>> > +      M_TCP_CSUM_OUT | M_UDP_CSUM_OUT | M_ICMP_CSUM_OUT |
>> > +      M_TCP_TSO);
>> >    m_resethdr(m);
>> >    m->m_flags |= M_LOOP | keepflags;
>> >    m->m_pkthdr.csum_flags = keepcksum;
>> >    m->m_pkthdr.ph_ifidx = ifp->if_index;
>> >    m->m_pkthdr.ph_rtableid = ifp->if_rdomain;
>> > +
>> > +  if (ISSET(keepcksum, M_TCP_TSO) && m->m_pkthdr.len > ifp->if_mtu) {
>> > +          if (ifp->if_mtu > 0 &&
>> > +              ((af == AF_INET &&
>> > +              ISSET(ifp->if_capabilities, IFCAP_TSOv4)) ||
>> > +              (af == AF_INET6 &&
>> > +              ISSET(ifp->if_capabilities, IFCAP_TSOv6)))) {
>> > +                  tcpstat_inc(tcps_inswlro);
>> > +                  tcpstat_add(tcps_inpktlro,
>> > +                      (m->m_pkthdr.len + ifp->if_mtu - 1) / ifp->if_mtu);
>> > +          } else {
>> > +                  tcpstat_inc(tcps_inbadlro);
>> > +                  m_freem(m);
>> > +                  return (EPROTONOSUPPORT);
>> > +          }
>> > +  }
>> >  
>> >    if (ISSET(keepcksum, M_TCP_CSUM_OUT))
>> >            m->m_pkthdr.csum_flags |= M_TCP_CSUM_IN_OK;
>> > Index: sys/net/if_loop.c
>> > ===================================================================
>> > RCS file: /data/mirror/openbsd/cvs/src/sys/net/if_loop.c,v
>> > retrieving revision 1.94
>> > diff -u -p -r1.94 if_loop.c
>> > --- sys/net/if_loop.c      5 Jun 2023 11:35:46 -0000       1.94
>> > +++ sys/net/if_loop.c      23 Jun 2023 15:48:27 -0000
>> > @@ -175,7 +175,8 @@ loop_clone_create(struct if_clone *ifc, 
>> >    ifp->if_xflags = IFXF_CLONED;
>> >    ifp->if_capabilities = IFCAP_CSUM_IPv4 |
>> >        IFCAP_CSUM_TCPv4 | IFCAP_CSUM_UDPv4 |
>> > -      IFCAP_CSUM_TCPv6 | IFCAP_CSUM_UDPv6;
>> > +      IFCAP_CSUM_TCPv6 | IFCAP_CSUM_UDPv6 |
>> > +      IFCAP_LRO;
>> >    ifp->if_rtrequest = lortrequest;
>> >    ifp->if_ioctl = loioctl;
>> >    ifp->if_input = loinput;
>> > @@ -281,6 +282,10 @@ loioctl(struct ifnet *ifp, u_long cmd, c
>> >  
>> >    switch (cmd) {
>> >    case SIOCSIFFLAGS:
>> > +          if (ISSET(ifp->if_xflags, IFXF_LRO))
>> > +                  SET(ifp->if_capabilities, IFCAP_TSOv4 | IFCAP_TSOv6);
>> > +          else
>> > +                  CLR(ifp->if_capabilities, IFCAP_TSOv4 | IFCAP_TSOv6);
>> >            break;
>> >  
>> >    case SIOCSIFADDR:
>> > Index: sys/netinet/tcp_usrreq.c
>> > ===================================================================
>> > RCS file: /data/mirror/openbsd/cvs/src/sys/netinet/tcp_usrreq.c,v
>> > retrieving revision 1.219
>> > diff -u -p -r1.219 tcp_usrreq.c
>> > --- sys/netinet/tcp_usrreq.c       23 May 2023 09:16:16 -0000      1.219
>> > +++ sys/netinet/tcp_usrreq.c       23 Jun 2023 15:48:27 -0000
>> > @@ -1340,6 +1340,7 @@ tcp_sysctl_tcpstat(void *oldp, size_t *o
>> >    ASSIGN(tcps_outhwtso);
>> >    ASSIGN(tcps_outpkttso);
>> >    ASSIGN(tcps_outbadtso);
>> > +  ASSIGN(tcps_inswlro);
>> >    ASSIGN(tcps_inhwlro);
>> >    ASSIGN(tcps_inpktlro);
>> >    ASSIGN(tcps_inbadlro);
>> > Index: sys/netinet/tcp_var.h
>> > ===================================================================
>> > RCS file: /data/mirror/openbsd/cvs/src/sys/netinet/tcp_var.h,v
>> > retrieving revision 1.167
>> > diff -u -p -r1.167 tcp_var.h
>> > --- sys/netinet/tcp_var.h  23 May 2023 09:16:16 -0000      1.167
>> > +++ sys/netinet/tcp_var.h  23 Jun 2023 15:48:27 -0000
>> > @@ -447,6 +447,7 @@ struct tcpstat {
>> >    u_int32_t tcps_outhwtso;        /* output tso processed by hardware */
>> >    u_int32_t tcps_outpkttso;       /* packets generated by tso */
>> >    u_int32_t tcps_outbadtso;       /* output tso failed, packet dropped */
>> > +  u_int32_t tcps_inswlro;         /* input lro on pseudo device */
>> >    u_int32_t tcps_inhwlro;         /* input lro from hardware */
>> >    u_int32_t tcps_inpktlro;        /* packets coalesced by hardware lro */
>> >    u_int32_t tcps_inbadlro;        /* input bad lro packets */
>> > @@ -628,6 +629,7 @@ enum tcpstat_counters {
>> >    tcps_outhwtso,
>> >    tcps_outpkttso,
>> >    tcps_outbadtso,
>> > +  tcps_inswlro,
>> >    tcps_inhwlro,
>> >    tcps_inpktlro,
>> >    tcps_inbadlro,
>> > Index: usr.bin/netstat/inet.c
>> > ===================================================================
>> > RCS file: /data/mirror/openbsd/cvs/src/usr.bin/netstat/inet.c,v
>> > retrieving revision 1.176
>> > diff -u -p -r1.176 inet.c
>> > --- usr.bin/netstat/inet.c 23 May 2023 09:16:16 -0000      1.176
>> > +++ usr.bin/netstat/inet.c 23 Jun 2023 15:55:55 -0000
>> > @@ -439,9 +439,12 @@ tcp_stats(char *name)
>> >    p(tcps_inswcsum, "\t\t%u packet%s software-checksummed\n");
>> >    p(tcps_rcvbadsig, "\t\t%u bad/missing md5 checksum%s\n");
>> >    p(tcps_rcvgoodsig, "\t\t%llu good md5 checksum%s\n");
>> > +  p(tcps_inswlro,
>> > +      "\t\t%u input LRO packet%s passed through pseudo device\n");
>> >    p(tcps_inhwlro, "\t\t%u input LRO generated packet%s from hardware\n");
>> > -  p(tcps_inpktlro, "\t\t%u input LRO coalesced packet%s by hardware\n");
>> > -  p(tcps_inbadlro, "\t\t%u input bad LRO packet%s\n");
>> > +  p(tcps_inpktlro,
>> > +      "\t\t%u input LRO coalesced packet%s by network device\n");
>> > +  p(tcps_inbadlro, "\t\t%u input bad LRO packet%s dropped\n");
>> >    p(tcps_connattempt, "\t%u connection request%s\n");
>> >    p(tcps_accepts, "\t%u connection accept%s\n");
>> >    p(tcps_connects, "\t%u connection%s established (including accepts)\n");
>> 
>

Reply via email to