On Fri, Oct 22, 2021 at 12:01:41PM +0200, Hrvoje Popovski wrote:
> On 22.10.2021. 11:25, Jan Klemkow wrote:
> > this diff add hardware checksum offloading for the receive path of
> > ixl(4) interfaces.
> >
> > Tested on:
> > ixl1 at pci3 dev 0 function 1 "Intel X710 SFP+" rev 0x02: port 1, FW
> > 6.0.48442 API 1.7, msix, 8 queues, address 40:a6:b7:02:38:3d
> >
> > OK?
>
> I've applied this diff and i can't see anything regarding offload with
> ifconfig ixl hwfeatures?
Hi Hrvoje,
Thats because, you only see this flags, if the checksum offloading is
enabled for "sending". I'm still working/debugging on the sending side.
Thus, I just send a diff with the receiving part for now.
You can see if its working for your card with the netstat(8) statistics.
# netstat -s | grep software-checksummed
These counters should not raise much on the receive side if you put some
traffic over the interface.
Thanks for testing,
Jan
> smc24# ifconfig ixl0 hwfeatures
> ixl0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
> hwfeatures=10<VLAN_MTU> hardmtu 9712
> lladdr 3c:fd:fe:04:0d:64
> index 7 priority 0 llprio 3
> media: Ethernet autoselect (10GSFP+Cu full-duplex)
> status: active
> inet 192.168.15.1 netmask 0xffffff00 broadcast 192.168.15.255
>
> smc24# dmesg | grep ixl
> ixl0 at pci21 dev 0 function 0 "Intel X710 SFP+" rev 0x01: port 0, FW
> 8.2.64244 API 1.13, msix, 8 queues, address 3c:fd:fe:04:0d:64
> ixl1 at pci21 dev 0 function 1 "Intel X710 SFP+" rev 0x01: port 1, FW
> 8.2.64244 API 1.13, msix, 8 queues, address 3c:fd:fe:04:0d:66
>
> > Index: dev/pci/if_ixl.c
> > ===================================================================
> > RCS file: /cvs/src/sys/dev/pci/if_ixl.c,v
> > retrieving revision 1.75
> > diff -u -p -r1.75 if_ixl.c
> > --- dev/pci/if_ixl.c 23 Jul 2021 00:29:14 -0000 1.75
> > +++ dev/pci/if_ixl.c 22 Oct 2021 09:20:59 -0000
> > @@ -1388,6 +1388,7 @@ static int ixl_rxeof(struct ixl_softc *,
> > static void ixl_rxfill(struct ixl_softc *, struct ixl_rx_ring *);
> > static void ixl_rxrefill(void *);
> > static int ixl_rxrinfo(struct ixl_softc *, struct if_rxrinfo *);
> > +static void ixl_rx_checksum(struct mbuf *, uint64_t);
> >
> > #if NKSTAT > 0
> > static void ixl_kstat_attach(struct ixl_softc *);
> > @@ -3190,6 +3191,7 @@ ixl_rxeof(struct ixl_softc *sc, struct i
> > m->m_pkthdr.csum_flags |= M_FLOWID;
> > }
> >
> > + ixl_rx_checksum(m, word);
> > ml_enqueue(&ml, m);
> > } else {
> > ifp->if_ierrors++; /* XXX */
> > @@ -3320,6 +3322,23 @@ ixl_rxrinfo(struct ixl_softc *sc, struct
> > free(ifr, M_TEMP, ixl_nqueues(sc) * sizeof(*ifr));
> >
> > return (rv);
> > +}
> > +
> > +static void
> > +ixl_rx_checksum(struct mbuf *m, uint64_t word)
> > +{
> > + if (!ISSET(word, IXL_RX_DESC_L3L4P))
> > + return;
> > +
> > + if (ISSET(word, IXL_RX_DESC_IPE))
> > + return;
> > +
> > + m->m_pkthdr.csum_flags |= M_IPV4_CSUM_IN_OK;
> > +
> > + if (ISSET(word, IXL_RX_DESC_L4E))
> > + return;
> > +
> > + m->m_pkthdr.csum_flags |= M_TCP_CSUM_IN_OK | M_UDP_CSUM_IN_OK;
> > }
> >
> > static int