From: Jan Klemkow Subject: ice(4): SoftLRO To: tech@openbsd.org Date: Thu, 26 Jun 2025 23:33:16 +0200 Hi, This diff add SoftLRO support to ice(4) like its done in ixl(4). It doesn't use the ice_decode_rx_desc_ptype() function, because we just want two specific cases of TCP inner protocols for our SoftLRO mechanism. ok? bye, Jan Index: dev/pci/if_ice.c =================================================================== RCS file: /cvs/src/sys/dev/pci/if_ice.c,v diff -u -p -r1.51 if_ice.c --- dev/pci/if_ice.c 23 Jun 2025 08:03:22 -0000 1.51 +++ dev/pci/if_ice.c 26 Jun 2025 20:43:15 -0000 @@ -29152,6 +29152,7 @@ ice_rxeof(struct ice_softc *sc, struct i struct ice_rx_map *rxm; bus_dmamap_t map; unsigned int cons, prod; + struct mbuf_list mltcp = MBUF_LIST_INITIALIZER(); struct mbuf_list ml = MBUF_LIST_INITIALIZER(); struct mbuf *m; uint16_t status0, ptype; @@ -29235,7 +29236,14 @@ ice_rxeof(struct ice_softc *sc, struct i ICE_RX_FLEX_DESC_PTYPE_M; ice_rx_checksum(m, status0, ptype); - ml_enqueue(&ml, m); +#ifndef SMALL_KERNEL + if (ISSET(ifp->if_xflags, IFXF_LRO) && + (ptype == ICE_RX_FLEX_DECS_PTYPE_MAC_IPV4_TCP || + ptype == ICE_RX_FLEX_DECS_PTYPE_MAC_IPV6_TCP)) + tcp_softlro_glue(&mltcp, m, ifp); + else +#endif + ml_enqueue(&ml, m); rxq->rxq_m_head = NULL; rxq->rxq_m_tail = &rxq->rxq_m_head; @@ -29248,8 +29256,15 @@ ice_rxeof(struct ice_softc *sc, struct i } while (cons != prod); if (done) { + int livelocked = 0; + rxq->rxq_cons = cons; + if (ifiq_input(ifiq, &mltcp)) + livelocked = 1; if (ifiq_input(ifiq, &ml)) + livelocked = 1; + + if (livelocked) if_rxr_livelocked(&rxq->rxq_acct); ice_rxfill(sc, rxq); } @@ -30419,6 +30434,11 @@ ice_attach_hook(struct device *self) IFCAP_CSUM_TCPv4 | IFCAP_CSUM_UDPv4 | IFCAP_CSUM_TCPv6 | IFCAP_CSUM_UDPv6 | IFCAP_TSOv4 | IFCAP_TSOv6; + ifp->if_capabilities |= IFCAP_LRO; +#if notyet + /* for now tcplro at ice(4) is default off */ + ifp->if_xflags |= IFXF_LRO; +#endif if_attach(ifp); ether_ifattach(ifp); Index: dev/pci/if_icereg.h =================================================================== RCS file: /cvs/src/sys/dev/pci/if_icereg.h,v diff -u -p -r1.2 if_icereg.h --- dev/pci/if_icereg.h 25 Nov 2024 12:50:47 -0000 1.2 +++ dev/pci/if_icereg.h 26 Jun 2025 20:34:50 -0000 @@ -13676,6 +13676,8 @@ enum ice_umbcast_dest_addr_types { /* for ice_32byte_rx_flex_desc.ptype_flexi_flags0 member */ #define ICE_RX_FLEX_DESC_PTYPE_M (0x3FF) /* 10-bits */ +#define ICE_RX_FLEX_DECS_PTYPE_MAC_IPV4_TCP 26 +#define ICE_RX_FLEX_DECS_PTYPE_MAC_IPV6_TCP 92 enum ice_rx_flex_desc_flexi_flags0_bits { /* field is 6 bits long */ ICE_RX_FLEX_DESC_FLEXI_FLAGS0_S = 10,