Index | Thread | Search

From:
jan@openbsd.org
Subject:
Re: igc(4) tso
To:
Moritz Buhl <mbuhl@openbsd.org>
Cc:
tech@openbsd.org, bket@openbsd.org, bluhm@openbsd.org
Date:
Thu, 2 May 2024 23:23:03 +0200

Download raw body.

Thread
    • jan@openbsd.org:

      igc(4) tso

      • Alexander Bluhm:

        igc(4) tso

      • jan@openbsd.org:

        igc(4) tso

  • Alexander Bluhm:

    igc(4) tso

  • On Thu, May 02, 2024 at 09:35:56PM GMT, jan@openbsd.org wrote:
    > On Thu, May 02, 2024 at 09:27:07PM GMT, jan@openbsd.org wrote:
    > > On Thu, May 02, 2024 at 08:51:26PM GMT, Moritz Buhl wrote:
    > > > I addressed your comment and also noticed that the diff broke with
    > > > previous convention of using the ISSET macro.
    > > > 
    > > > Is this ok?
    > > 
    > > After talking with bluhm.  We come to the conclusion, that this diff
    > > is better:
    
    > @@ -2056,6 +2063,9 @@ igc_tx_ctx_setup(struct tx_ring *txr, st
    >  	} else if (ext.ip6) {
    >  		type_tucmd_mlhl |= IGC_ADVTXD_TUCMD_IPV6;
    >  #endif
    > +	} else {
    > +		if (mp->m_pkthdr.csum_flags & M_TCP_TSO)
    > +			tcpstat_inc(tcps_outbadtso);
    >  	}
    >  
    >  	vlan_macip_lens |= ext.iphlen;
    
    The additional condition causes a double count of tcps_outbadtso.
    It increments run in the else-case of if (ext.tcp) below anyway.
    So, I removed it here:
    
    Index: dev/pci/if_igc.c
    ===================================================================
    RCS file: /cvs/src/sys/dev/pci/if_igc.c,v
    diff -u -p -r1.20 if_igc.c
    --- dev/pci/if_igc.c	12 Apr 2024 19:27:43 -0000	1.20
    +++ dev/pci/if_igc.c	2 May 2024 21:16:46 -0000
    @@ -44,10 +44,14 @@
     
     #include <net/if.h>
     #include <net/if_media.h>
    +#include <net/route.h>
     #include <net/toeplitz.h>
     
     #include <netinet/in.h>
     #include <netinet/if_ether.h>
    +#include <netinet/tcp.h>
    +#include <netinet/tcp_timer.h>
    +#include <netinet/tcp_var.h>
     
     #if NBPFILTER > 0
     #include <net/bpf.h>
    @@ -796,6 +800,7 @@ igc_setup_interface(struct igc_softc *sc
     	ifp->if_capabilities |= IFCAP_CSUM_IPv4;
     	ifp->if_capabilities |= IFCAP_CSUM_TCPv4 | IFCAP_CSUM_UDPv4;
     	ifp->if_capabilities |= IFCAP_CSUM_TCPv6 | IFCAP_CSUM_UDPv6;
    +	ifp->if_capabilities |= IFCAP_TSOv4 | IFCAP_TSOv6;
     
     	/* Initialize ifmedia structures. */
     	ifmedia_init(&sc->media, IFM_IMASK, igc_media_change, igc_media_status);
    @@ -2025,13 +2030,11 @@ igc_tx_ctx_setup(struct tx_ring *txr, st
     {
     	struct ether_extracted ext;
     	struct igc_adv_tx_context_desc *txdesc;
    +	uint32_t mss_l4len_idx = 0;
     	uint32_t type_tucmd_mlhl = 0;
     	uint32_t vlan_macip_lens = 0;
     	int off = 0;
     
    -	ether_extract_headers(mp, &ext);
    -	vlan_macip_lens |= (sizeof(*ext.eh) << IGC_ADVTXD_MACLEN_SHIFT);
    -
     	/*
     	 * In advanced descriptors the vlan tag must
     	 * be placed into the context descriptor. Hence
    @@ -2046,6 +2049,10 @@ igc_tx_ctx_setup(struct tx_ring *txr, st
     	}
     #endif
     
    +	ether_extract_headers(mp, &ext);
    +
    +	vlan_macip_lens |= (sizeof(*ext.eh) << IGC_ADVTXD_MACLEN_SHIFT);
    +
     	if (ext.ip4) {
     		type_tucmd_mlhl |= IGC_ADVTXD_TUCMD_IPV4;
     		if (ISSET(mp->m_pkthdr.csum_flags, M_IPV4_CSUM_OUT)) {
    @@ -2075,6 +2082,30 @@ igc_tx_ctx_setup(struct tx_ring *txr, st
     		}
     	}
     
    +	if (mp->m_pkthdr.csum_flags & M_TCP_TSO) {
    +		if (ext.tcp) {
    +			uint32_t hdrlen, thlen, paylen, outlen;
    +
    +			thlen = ext.tcphlen;
    +
    +			outlen = mp->m_pkthdr.ph_mss;
    +			mss_l4len_idx |= outlen << IGC_ADVTXD_MSS_SHIFT;
    +			mss_l4len_idx |= thlen << IGC_ADVTXD_L4LEN_SHIFT;
    +
    +			hdrlen = sizeof(*ext.eh) + ext.iphlen + thlen;
    +			paylen = mp->m_pkthdr.len - hdrlen;
    +			CLR(*olinfo_status, IGC_ADVTXD_PAYLEN_MASK);
    +			*olinfo_status |= paylen << IGC_ADVTXD_PAYLEN_SHIFT;
    +
    +			*cmd_type_len |= IGC_ADVTXD_DCMD_TSE;
    +			off = 1;
    +
    +			tcpstat_add(tcps_outpkttso,
    +			    (paylen + outlen - 1) / outlen);
    +		} else
    +			tcpstat_inc(tcps_outbadtso);
    +	}
    +
     	if (off == 0)
     		return 0;
     
    @@ -2085,7 +2116,7 @@ igc_tx_ctx_setup(struct tx_ring *txr, st
     	htolem32(&txdesc->vlan_macip_lens, vlan_macip_lens);
     	htolem32(&txdesc->type_tucmd_mlhl, type_tucmd_mlhl);
     	htolem32(&txdesc->seqnum_seed, 0);
    -	htolem32(&txdesc->mss_l4len_idx, 0);
    +	htolem32(&txdesc->mss_l4len_idx, mss_l4len_idx);
     
     	return 1;
     }
    Index: dev/pci/igc_base.h
    ===================================================================
    RCS file: /cvs/src/sys/dev/pci/igc_base.h,v
    diff -u -p -r1.2 igc_base.h
    --- dev/pci/igc_base.h	25 Mar 2024 20:25:13 -0000	1.2
    +++ dev/pci/igc_base.h	2 May 2024 19:20:23 -0000
    @@ -66,6 +66,7 @@ struct igc_adv_tx_context_desc {
     #define IGC_ADVTXD_POPTS_ISCO_FULL	0x00001800
     #define IGC_ADVTXD_POPTS_IPSEC	0x00000400 /* IPSec offload request */
     #define IGC_ADVTXD_PAYLEN_SHIFT	14 /* Adv desc PAYLEN shift */
    +#define IGC_ADVTXD_PAYLEN_MASK	0xFFFFD000 /* Adv desc PAYLEN shift */
     
     /* Advanced Transmit Context Descriptor Config */
     #define IGC_ADVTXD_MACLEN_SHIFT		9 /* Adv ctxt desc mac len shift */
    
    
    
  • Alexander Bluhm:

    igc(4) tso