From nobody Wed Apr 8 01:18:01 2026 Received: from mail-pf1-f174.google.com (mail-pf1-f174.google.com [209.85.210.174]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 05ACD37DE9B for ; Tue, 7 Apr 2026 22:03:25 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.174 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775599407; cv=none; b=mTBSl5LqtLywKpno/QF3zO1vww8XBAf6of9PoFnr1eOJfyzHlBPfr4otsdJeP9AOpDDs0L6OJkCxRHnSxRyo5QGQrLOWa6ce8kLqzLmOpfs4g/7ZgLh7w1ZU0h09jSEGbYzj3MY0VeR6Xk0lHLFTZzK7DLd7c2Qwd6NUvPJ6q3o= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775599407; c=relaxed/simple; bh=5GFETYoU02nG7EWR5eh5kmOoAIFHa6l4ll5PYIX6DtE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=f0yhdFVoog3xOZdlQzZLg/S8fZHKJ40J+qGK+Cl/6eWMa0W9/0cmi0ow9a2vgnXBZbiv4VsoCOxYEo+NbC9uS4Y9bHotwseyoAGGFl50cMblix3LxqSoMYx0iaD0n7NO9lMxmd4OKon6pnkh7IIUi+fxUqcOlAd26xgBzEFX/fs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=dama.to; spf=none smtp.mailfrom=dama.to; dkim=pass (2048-bit key) header.d=dama-to.20251104.gappssmtp.com header.i=@dama-to.20251104.gappssmtp.com header.b=mXwIJ+8F; arc=none smtp.client-ip=209.85.210.174 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=dama.to Authentication-Results: smtp.subspace.kernel.org; spf=none smtp.mailfrom=dama.to Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=dama-to.20251104.gappssmtp.com header.i=@dama-to.20251104.gappssmtp.com header.b="mXwIJ+8F" Received: by mail-pf1-f174.google.com with SMTP id d2e1a72fcca58-82cf636dac8so2566301b3a.3 for ; Tue, 07 Apr 2026 15:03:25 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dama-to.20251104.gappssmtp.com; s=20251104; t=1775599405; x=1776204205; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=+AOsn3XglOC6/p9r47PNMALxzWgbZtcj0yKtfwqA2Ns=; b=mXwIJ+8FJiyiqA0HVLZTIbIbodZ8HFncSzRTFwxqOUcCoIyD5hNBErQw8SsYBbrQFL xa5rpzsZZzH8MJUEuV02ijDxOus7RPnQ/3PezRgSMe9+WeH9qdDlI+y+VY0MAHZg3B8O 83jZw7bs4WYR9l7mR1eGZMf+cbUEajhJNZEe9n0wlnJW4tvgz9J/iqEO/JZk3f3NhbN6 cyFiKBIQHe+s2jmXJ2BAOaEPbIV8AAEg3gt5REp+FGjXS4BIfjuM1se+4WSj9liJrSaE NuSMLyDrxGzqaJpDxchnaVxkDD0UxN2Dg8+utspaE+AvYgUbZyjB9LfDsCkC+x+GfT5b f5dg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775599405; x=1776204205; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=+AOsn3XglOC6/p9r47PNMALxzWgbZtcj0yKtfwqA2Ns=; b=jy2GUAFH3HPR84iMt+SbeESkD5Lm8zmj8CrNBijHKI/pihPo43q/l9eivoNviYP/aG 6PTSCv/J1gohExNWxtVOQBVdcuDF69XO06NSx1E6gulP6QIxJdregTwiEbBZ0MvvN3Fq q27GNQNyMDk3gNyXnlCgW3geDr0WCucVdMVGfesJSxceDWHZayLH4JWm6kJrH75Sh8Ht agKSoLfm4XCbwgwnJBDNjNBF+4YKgcuJ4K3bHEcLUN4DYsLiHwBjg65Gu85es22MPTFw mKhYQ05pTybPfgkBV58SuJcZXj9IIEhbBQGzj4jrg3pCrhFaVKt6+e05n3Udk5OVLj9o ibbg== X-Forwarded-Encrypted: i=1; AJvYcCXJ1dU/lr1bGmTMmsmlM9efHQpLTjd4EcDv3O/Rjhg8oAFzVIjTCUhj4JcYUmbpHOar1fKzmqoucCaH1io=@vger.kernel.org X-Gm-Message-State: AOJu0Yxcjmtlycrm5AOiXdDBWNngEqvxBRWTERY1AVjRNdFJlseDavfM LRAQw7HzzXfneFGlN2koywQspQUUXWN3iZbRK9f1iFxMUKJOj5bSMdrurS8ef7MkD0BF5IING9Z KBqc7 X-Gm-Gg: AeBDietEqvMFtLoRGmox6Xu9C2/bHCPTUdDjz8wCLC/SOgjcTVW7csnRgcggjXHW2ff U++jn3nQnpxer0hwmhwz1fjCUx9ngEfH9o/eylN5hPVnVWxsNf3Q0CK6CuOOKrX77eQwPp/KkqQ ZTQc7oxzBkdXl7TMED3wes/NyAefzIi5/zWK1J59T7ZznsfxuC9jbj9k6ri7UI2lIKfjwCkkIUZ +s2l2ZAs7fQuWEnAqhYqIkEGB++FsuEo17jYD2gzv8J/wEdkMILYllRWroIRhK3F9Kpr6kLsszI nmICjw/ZmI81l0dsc/VwkYtAwgb5xVB0IEv6bwtCCOTlLNRN43PaMOAJqOyBv9C4W7qrFb6XEvr wkp2DmBt9z6EwDRFxazcPjm19LoRtPy0uiUl4Im/HHwBb7Ji2Gr9koTYCuPNNxxkjdNFS/FJrUm hvHm0= X-Received: by 2002:a05:6a00:14c3:b0:829:88e7:c88b with SMTP id d2e1a72fcca58-82d0da8edccmr18324783b3a.19.1775599405361; Tue, 07 Apr 2026 15:03:25 -0700 (PDT) Received: from localhost ([2a03:2880:2ff:6::]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-82cf9b21c92sm19850197b3a.11.2026.04.07.15.03.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 07 Apr 2026 15:03:24 -0700 (PDT) From: Joe Damato To: netdev@vger.kernel.org, "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman Cc: andrew+netdev@lunn.ch, michael.chan@broadcom.com, pavan.chebbi@broadcom.com, linux-kernel@vger.kernel.org, leon@kernel.org, Joe Damato Subject: [net-next v9 01/10] net: tso: Introduce tso_dma_map and helpers Date: Tue, 7 Apr 2026 15:02:57 -0700 Message-ID: <20260407220313.3990909-2-joe@dama.to> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260407220313.3990909-1-joe@dama.to> References: <20260407220313.3990909-1-joe@dama.to> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add struct tso_dma_map to tso.h for tracking DMA addresses of mapped GSO payload data and tso_dma_map_completion_state. The tso_dma_map combines DMA mapping storage with iterator state, allowing drivers to walk pre-mapped DMA regions linearly. Includes fields for the DMA IOVA path (iova_state, iova_offset, total_len) and a fallback per-region path (linear_dma, frags[], frag_idx, offset). The tso_dma_map_completion_state makes the IOVA completion state opaque for drivers. Drivers are expected to allocate this and use the added helpers to update the completion state. Adds skb_frag_phys() to skbuff.h, returning the physical address of a paged fragment's data, which is used by the tso_dma_map helpers introduced in this commit described below. The added TSO DMA map helpers are: tso_dma_map_init(): DMA-maps the linear payload region and all frags upfront. Prefers the DMA IOVA API for a single contiguous mapping with one IOTLB sync; falls back to per-region dma_map_phys() otherwise. Returns 0 on success, cleans up partial mappings on failure. tso_dma_map_cleanup(): Handles both IOVA and fallback teardown paths. tso_dma_map_count(): counts how many descriptors the next N bytes of payload will need. Returns 1 if IOVA is used since the mapping is contiguous. tso_dma_map_next(): yields the next (dma_addr, chunk_len) pair. On the IOVA path, each segment is a single contiguous chunk. On the fallback path, indicates when a chunk starts a new DMA mapping so the driver can set dma_unmap_len on that descriptor for completion-time unmapping. tso_dma_map_completion_save(): updates the completion state. Drivers will call this at xmit time. tso_dma_map_complete(): tears down the mapping at completion time and returns true if the IOVA path was used. If it was not used, this is a no-op and returns false. Suggested-by: Jakub Kicinski Signed-off-by: Joe Damato --- v9: - Fix typo in commit message. - Fix kdoc. - Initialize tso_dma_map before early return in tso_dma_map_init (suggested by AI). v7: - Squashed the struct and helpers (patch 1 and 2 from v6) into this one patch. - Added tso_dma_map_completion_state and helpers tso_dma_map_completion_save and tso_dma_map_complete to operate on the struct and keep the DMA IOVA completely opaque from drivers. - Removed unnecessary duplicated code in tso_dma_map_next and tso_dma_map_cleanup. v4: - Fix the kdoc for the TSO helpers. No functional changes. v3: - struct tso_dma_map extended to track IOVA state and a fallback per-region path. - Added skb_frag_phys helper include/linux/skbuff.h. - Added tso_dma_map_use_iova() inline helper in tso.h. - Updated the helpers to use the DMA IOVA API and falls back to per-regi= on mapping instead. include/linux/skbuff.h | 11 ++ include/net/tso.h | 100 +++++++++++++++ net/core/tso.c | 269 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 380 insertions(+) diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h index 26fe18bcfad8..2bcf78a4de7b 100644 --- a/include/linux/skbuff.h +++ b/include/linux/skbuff.h @@ -3763,6 +3763,17 @@ static inline void *skb_frag_address_safe(const skb_= frag_t *frag) return ptr + skb_frag_off(frag); } =20 +/** + * skb_frag_phys - gets the physical address of the data in a paged fragme= nt + * @frag: the paged fragment buffer + * + * Returns: the physical address of the data within @frag. + */ +static inline phys_addr_t skb_frag_phys(const skb_frag_t *frag) +{ + return page_to_phys(skb_frag_page(frag)) + skb_frag_off(frag); +} + /** * skb_frag_page_copy() - sets the page in a fragment from another fragment * @fragto: skb fragment where page is set diff --git a/include/net/tso.h b/include/net/tso.h index e7e157ae0526..da82aabd1d48 100644 --- a/include/net/tso.h +++ b/include/net/tso.h @@ -3,6 +3,7 @@ #define _TSO_H =20 #include +#include #include =20 #define TSO_HEADER_SIZE 256 @@ -28,4 +29,103 @@ void tso_build_hdr(const struct sk_buff *skb, char *hdr= , struct tso_t *tso, void tso_build_data(const struct sk_buff *skb, struct tso_t *tso, int size= ); int tso_start(struct sk_buff *skb, struct tso_t *tso); =20 +/** + * struct tso_dma_map - DMA mapping state for GSO payload + * @dev: device used for DMA mapping + * @skb: the GSO skb being mapped + * @hdr_len: per-segment header length + * @iova_state: DMA IOVA state (when IOMMU available) + * @iova_offset: global byte offset into IOVA range (IOVA path only) + * @total_len: total payload length + * @frag_idx: current region (-1 =3D linear, 0..nr_frags-1 =3D frag) + * @offset: byte offset within current region + * @linear_dma: DMA address of the linear payload + * @linear_len: length of the linear payload + * @nr_frags: number of frags successfully DMA-mapped + * @frags: per-frag DMA address and length + * + * DMA-maps the payload regions of a GSO skb (linear data + frags). + * Prefers the DMA IOVA API for a single contiguous mapping with one + * IOTLB sync; falls back to per-region dma_map_phys() otherwise. + */ +struct tso_dma_map { + struct device *dev; + const struct sk_buff *skb; + unsigned int hdr_len; + /* IOVA path */ + struct dma_iova_state iova_state; + size_t iova_offset; + size_t total_len; + /* Fallback path if IOVA path fails */ + int frag_idx; + unsigned int offset; + dma_addr_t linear_dma; + unsigned int linear_len; + unsigned int nr_frags; + struct { + dma_addr_t dma; + unsigned int len; + } frags[MAX_SKB_FRAGS]; +}; + +/** + * struct tso_dma_map_completion_state - Completion-time cleanup state + * @iova_state: DMA IOVA state (when IOMMU available) + * @total_len: total payload length of the IOVA mapping + * + * Drivers store this on their SW ring at xmit time via + * tso_dma_map_completion_save(), then call tso_dma_map_complete() at + * completion time. + */ +struct tso_dma_map_completion_state { + struct dma_iova_state iova_state; + size_t total_len; +}; + +int tso_dma_map_init(struct tso_dma_map *map, struct device *dev, + const struct sk_buff *skb, unsigned int hdr_len); +void tso_dma_map_cleanup(struct tso_dma_map *map); +unsigned int tso_dma_map_count(struct tso_dma_map *map, unsigned int len); +bool tso_dma_map_next(struct tso_dma_map *map, dma_addr_t *addr, + unsigned int *chunk_len, unsigned int *mapping_len, + unsigned int seg_remaining); + +/** + * tso_dma_map_completion_save - save state needed for completion-time cle= anup + * @map: the xmit-time DMA map + * @cstate: driver-owned storage that persists until completion + * + * Should be called at xmit time to update the completion state and later = passed + * to tso_dma_map_complete(). + */ +static inline void +tso_dma_map_completion_save(const struct tso_dma_map *map, + struct tso_dma_map_completion_state *cstate) +{ + cstate->iova_state =3D map->iova_state; + cstate->total_len =3D map->total_len; +} + +/** + * tso_dma_map_complete - tear down mapping at completion time + * @dev: the device that owns the mapping + * @cstate: state saved by tso_dma_map_completion_save() + * + * Return: true if the IOVA path was used and the mapping has been + * destroyed; false if the fallback per-region path was used and the + * driver must unmap via its normal completion path. + */ +static inline bool +tso_dma_map_complete(struct device *dev, + struct tso_dma_map_completion_state *cstate) +{ + if (dma_use_iova(&cstate->iova_state)) { + dma_iova_destroy(dev, &cstate->iova_state, cstate->total_len, + DMA_TO_DEVICE, 0); + return true; + } + + return false; +} + #endif /* _TSO_H */ diff --git a/net/core/tso.c b/net/core/tso.c index 6df997b9076e..f2e625e7b64f 100644 --- a/net/core/tso.c +++ b/net/core/tso.c @@ -3,6 +3,7 @@ #include #include #include +#include #include =20 void tso_build_hdr(const struct sk_buff *skb, char *hdr, struct tso_t *tso, @@ -87,3 +88,271 @@ int tso_start(struct sk_buff *skb, struct tso_t *tso) return hdr_len; } EXPORT_SYMBOL(tso_start); + +static int tso_dma_iova_try(struct device *dev, struct tso_dma_map *map, + phys_addr_t phys, size_t linear_len, size_t total_len, + size_t *offset) +{ + const struct sk_buff *skb; + unsigned int nr_frags; + int i; + + if (!dma_iova_try_alloc(dev, &map->iova_state, phys, total_len)) + return 1; + + skb =3D map->skb; + nr_frags =3D skb_shinfo(skb)->nr_frags; + + if (linear_len) { + if (dma_iova_link(dev, &map->iova_state, + phys, *offset, linear_len, + DMA_TO_DEVICE, 0)) + goto iova_fail; + map->linear_len =3D linear_len; + *offset +=3D linear_len; + } + + for (i =3D 0; i < nr_frags; i++) { + skb_frag_t *frag =3D &skb_shinfo(skb)->frags[i]; + unsigned int frag_len =3D skb_frag_size(frag); + + if (dma_iova_link(dev, &map->iova_state, + skb_frag_phys(frag), *offset, + frag_len, DMA_TO_DEVICE, 0)) { + map->nr_frags =3D i; + goto iova_fail; + } + map->frags[i].len =3D frag_len; + *offset +=3D frag_len; + map->nr_frags =3D i + 1; + } + + if (dma_iova_sync(dev, &map->iova_state, 0, total_len)) + goto iova_fail; + + return 0; + +iova_fail: + dma_iova_destroy(dev, &map->iova_state, *offset, + DMA_TO_DEVICE, 0); + memset(&map->iova_state, 0, sizeof(map->iova_state)); + + /* reset map state */ + map->frag_idx =3D -1; + map->offset =3D 0; + map->linear_len =3D 0; + map->nr_frags =3D 0; + + return 1; +} + +/** + * tso_dma_map_init - DMA-map GSO payload regions + * @map: map struct to initialize + * @dev: device for DMA mapping + * @skb: the GSO skb + * @hdr_len: per-segment header length in bytes + * + * DMA-maps the linear payload (after headers) and all frags. + * Prefers the DMA IOVA API (one contiguous mapping, one IOTLB sync); + * falls back to per-region dma_map_phys() when IOVA is not available. + * Positions the iterator at byte 0 of the payload. + * + * Return: 0 on success, -ENOMEM on DMA mapping failure (partial mappings + * are cleaned up internally). + */ +int tso_dma_map_init(struct tso_dma_map *map, struct device *dev, + const struct sk_buff *skb, unsigned int hdr_len) +{ + unsigned int linear_len =3D skb_headlen(skb) - hdr_len; + unsigned int nr_frags =3D skb_shinfo(skb)->nr_frags; + size_t total_len =3D skb->len - hdr_len; + size_t offset =3D 0; + phys_addr_t phys; + int i; + + map->dev =3D dev; + map->skb =3D skb; + map->hdr_len =3D hdr_len; + map->frag_idx =3D -1; + map->offset =3D 0; + map->iova_offset =3D 0; + map->total_len =3D total_len; + map->linear_len =3D 0; + map->nr_frags =3D 0; + memset(&map->iova_state, 0, sizeof(map->iova_state)); + + if (!total_len) + return 0; + + if (linear_len) + phys =3D virt_to_phys(skb->data + hdr_len); + else + phys =3D skb_frag_phys(&skb_shinfo(skb)->frags[0]); + + if (tso_dma_iova_try(dev, map, phys, linear_len, total_len, &offset)) { + /* IOVA path failed, map state was reset. Fallback to + * per-region dma_map_phys() + */ + if (linear_len) { + map->linear_dma =3D dma_map_phys(dev, phys, linear_len, + DMA_TO_DEVICE, 0); + if (dma_mapping_error(dev, map->linear_dma)) + return -ENOMEM; + map->linear_len =3D linear_len; + } + + for (i =3D 0; i < nr_frags; i++) { + skb_frag_t *frag =3D &skb_shinfo(skb)->frags[i]; + unsigned int frag_len =3D skb_frag_size(frag); + + map->frags[i].len =3D frag_len; + map->frags[i].dma =3D dma_map_phys(dev, skb_frag_phys(frag), + frag_len, DMA_TO_DEVICE, 0); + if (dma_mapping_error(dev, map->frags[i].dma)) { + tso_dma_map_cleanup(map); + return -ENOMEM; + } + map->nr_frags =3D i + 1; + } + } + + if (linear_len =3D=3D 0 && nr_frags > 0) + map->frag_idx =3D 0; + + return 0; +} +EXPORT_SYMBOL(tso_dma_map_init); + +/** + * tso_dma_map_cleanup - unmap all DMA regions in a tso_dma_map + * @map: the map to clean up + * + * Handles both IOVA and fallback paths. For IOVA, calls + * dma_iova_destroy(). For fallback, unmaps each region individually. + */ +void tso_dma_map_cleanup(struct tso_dma_map *map) +{ + int i; + + if (dma_use_iova(&map->iova_state)) { + dma_iova_destroy(map->dev, &map->iova_state, map->total_len, + DMA_TO_DEVICE, 0); + memset(&map->iova_state, 0, sizeof(map->iova_state)); + } else { + if (map->linear_len) + dma_unmap_phys(map->dev, map->linear_dma, map->linear_len, + DMA_TO_DEVICE, 0); + + for (i =3D 0; i < map->nr_frags; i++) + dma_unmap_phys(map->dev, map->frags[i].dma, map->frags[i].len, + DMA_TO_DEVICE, 0); + } + + map->linear_len =3D 0; + map->nr_frags =3D 0; +} +EXPORT_SYMBOL(tso_dma_map_cleanup); + +/** + * tso_dma_map_count - count descriptors for a payload range + * @map: the payload map + * @len: number of payload bytes in this segment + * + * Counts how many contiguous DMA region chunks the next @len bytes + * will span, without advancing the iterator. On the IOVA path this + * is always 1 (contiguous). On the fallback path, uses region sizes + * from the current position. + * + * Return: the number of descriptors needed for @len bytes of payload. + */ +unsigned int tso_dma_map_count(struct tso_dma_map *map, unsigned int len) +{ + unsigned int offset =3D map->offset; + int idx =3D map->frag_idx; + unsigned int count =3D 0; + + if (!len) + return 0; + + if (dma_use_iova(&map->iova_state)) + return 1; + + while (len > 0) { + unsigned int region_len, chunk; + + if (idx =3D=3D -1) + region_len =3D map->linear_len; + else + region_len =3D map->frags[idx].len; + + chunk =3D min(len, region_len - offset); + len -=3D chunk; + count++; + offset =3D 0; + idx++; + } + + return count; +} +EXPORT_SYMBOL(tso_dma_map_count); + +/** + * tso_dma_map_next - yield the next DMA address range + * @map: the payload map + * @addr: output DMA address + * @chunk_len: output chunk length + * @mapping_len: full DMA mapping length when this chunk starts a new + * mapping region, or 0 when continuing a previous one. + * On the IOVA path this is always 0 (driver must not + * do per-region unmaps; use tso_dma_map_cleanup instead). + * @seg_remaining: bytes left in current segment + * + * Yields the next (dma_addr, chunk_len) pair and advances the iterator. + * On the IOVA path, the entire payload is contiguous so each segment + * is always a single chunk. + * + * Return: true if a chunk was yielded, false when @seg_remaining is 0. + */ +bool tso_dma_map_next(struct tso_dma_map *map, dma_addr_t *addr, + unsigned int *chunk_len, unsigned int *mapping_len, + unsigned int seg_remaining) +{ + unsigned int region_len, chunk; + + if (!seg_remaining) + return false; + + /* IOVA path: contiguous DMA range, no region boundaries */ + if (dma_use_iova(&map->iova_state)) { + *addr =3D map->iova_state.addr + map->iova_offset; + *chunk_len =3D seg_remaining; + *mapping_len =3D 0; + map->iova_offset +=3D seg_remaining; + return true; + } + + /* Fallback path: per-region iteration */ + + if (map->frag_idx =3D=3D -1) { + region_len =3D map->linear_len; + chunk =3D min(seg_remaining, region_len - map->offset); + *addr =3D map->linear_dma + map->offset; + } else { + region_len =3D map->frags[map->frag_idx].len; + chunk =3D min(seg_remaining, region_len - map->offset); + *addr =3D map->frags[map->frag_idx].dma + map->offset; + } + + *mapping_len =3D (map->offset =3D=3D 0) ? region_len : 0; + *chunk_len =3D chunk; + map->offset +=3D chunk; + + if (map->offset >=3D region_len) { + map->frag_idx++; + map->offset =3D 0; + } + + return true; +} +EXPORT_SYMBOL(tso_dma_map_next); --=20 2.52.0 From nobody Wed Apr 8 01:18:01 2026 Received: from mail-pl1-f174.google.com (mail-pl1-f174.google.com [209.85.214.174]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B1BBE37F731 for ; Tue, 7 Apr 2026 22:03:27 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.174 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775599408; cv=none; b=mvfMLBMFOtfhdMdGoJeywIMA0En5QQUHYKLHtuGmQTQV+hZ2k2/HB2uHtxO+ap+658Yfqvap+0xKAONQTMf2zaAwsPhYvMTasgotAC4d4mhY8+RP4rW4v24iZaNTDKtUp+FbhLaWUezjHIaF6CYdsbwpYna8RgduJlFBmJsL4tk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775599408; c=relaxed/simple; bh=iQ727465s3Aho370Tuxfm2rIvW+aDujPQFCVr+k8Ilk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=CGy509rca+7ZHNUOfbK6gET5Z7kB/c0YRdZm14ihdxn5zecJJJKhujTCmrtJYmX1TcYNe7mDBK2wcPbx0Wiy3W1x2my+OEPKh8DVnKTipAzRIBuBcAoY9avpeBK0+ngODiQMbi3CNy+GPWD7oILGxEo3elxVtesQXjxeJAan9yY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=dama.to; spf=none smtp.mailfrom=dama.to; dkim=pass (2048-bit key) header.d=dama-to.20251104.gappssmtp.com header.i=@dama-to.20251104.gappssmtp.com header.b=rymIBVDN; arc=none smtp.client-ip=209.85.214.174 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=dama.to Authentication-Results: smtp.subspace.kernel.org; spf=none smtp.mailfrom=dama.to Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=dama-to.20251104.gappssmtp.com header.i=@dama-to.20251104.gappssmtp.com header.b="rymIBVDN" Received: by mail-pl1-f174.google.com with SMTP id d9443c01a7336-2b24fdac394so54717195ad.3 for ; Tue, 07 Apr 2026 15:03:27 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dama-to.20251104.gappssmtp.com; s=20251104; t=1775599407; x=1776204207; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=GgEhIXxIJA8MtEOelbwwhwA4rZuHaEy+H8Ivt4MY40w=; b=rymIBVDNITZ+5tfuWYYdoS5xarPBYN7CyLLWn1xtA4IrO/baSQljV1k93rqPt6V1Ib 9GcuX4wZiQuj/aKtpI5IpLzzQhz9vAMmBBC3CIejY9a10y1L7iRJ4NUiGMh3IUnAHf6s gq4Vda8yCtXpNvGp0WEUIFf/dFLb8gLOa9XY/wTDVe7a72CVwiN6TI5pKUntF2Z6pUJ2 PryTE9r2zxFVWZbhzKP9kXMb+U4KwqExR2/vp/IKS6WAcoTi34r3Idroo4GOf4DISFiD FMZs18vx7IGAX7QOsbwCTnxhm/bYoyG/YyuxBko41cBRgoilq6DVt4vXFt2Qzb4bl6vO 9RhA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775599407; x=1776204207; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=GgEhIXxIJA8MtEOelbwwhwA4rZuHaEy+H8Ivt4MY40w=; b=Bk5pgQ2zqmvdxlhB55JVN9BoZwpVBRgBFpruw3xQ8I9UCe9jL788Dd4uNSYsuVZVVC b0HaGxbGSs84JrAPBY7Rxvc68Jn0KnpKTxNF/hU+CsTN6vy+NeovZQxaRg5PI+tr5Kx8 JceweqMpIaEfz/WVga/Q49g9qPtnBRrvEMbV6kPfm8VT7SjohC+M7NLn/wvFtFAQqqj3 Nm8gAm6oEtaDQUMdnlpKZ3FqT8MpGbtk+PkRmPch1rcVCXdfzuNcUQwxtc7qvaEEGf7v DMh961SfZtIVIqvnbl9vO/t7dCfMQOAqDVQHn0jrJDN38L4WS4uhf7VGZAjowTI3Qlit 6awg== X-Forwarded-Encrypted: i=1; AJvYcCV+nDMQEpG/gvksxA826G5ALrbJDNEiTu+jSHY0/J4MH1EnQj0pLxyx4DaBCeddMDsl7U8SlUABkkeaVA0=@vger.kernel.org X-Gm-Message-State: AOJu0YzJJ92TAZhDlVzwStrh+R/0fN4sxUjnxE93AJz2mofFeRM6Qj+6 1urmuctk8WdcpPWDmePDt8tYrXmd2aLPw6a1Kt00NlCBAcUSo0+bForbm6XKuMaYAEs= X-Gm-Gg: AeBDiet3amkqjT2JZOhYFFQuGPsAfFYkiQBx2/QmVJPbAbVvyXCx+jq+06bVcJviGIE lzd2nuXVtU5WZ/x/bn1GdcJBZ4y2fQDofIMGgSSxVzPO7z3QIrJacjpyoLXLn+qTAUbn4yv17bQ fP3lXExDvQHxCjhra1go3nMBN3O80zuyjkPfk1sLUr8XpwVQ+84sQh5ZWxADo2D3VLrjrIcukEv vpHbnlLrd/X84CwSiP1HABzJwtKW08Qf8Wb4LhwD30nDWSrHf7aJDY0+VDRDkFhdEgETWYsPQh5 kaBzGqeSuO0h2YrwKRxtFkST5v2TruWHi+1bgNlFNGlsWuqLv2M80ihW8lnVE0SzRW1g/Ved3VI 17oXoWUD0dlMvEhx3d4I0O2gaK+D3kVzAz98Jyv20jl0+//mhlWrHJ4r0pwGWdsgG0yj9BZ2QR8 JQHd4n X-Received: by 2002:a17:902:ce06:b0:2b0:5cb3:e4bc with SMTP id d9443c01a7336-2b2816d0934mr182992775ad.16.1775599407271; Tue, 07 Apr 2026 15:03:27 -0700 (PDT) Received: from localhost ([2a03:2880:2ff:41::]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2b27497c0f3sm190425905ad.41.2026.04.07.15.03.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 07 Apr 2026 15:03:26 -0700 (PDT) From: Joe Damato To: netdev@vger.kernel.org, Michael Chan , Pavan Chebbi , Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni Cc: horms@kernel.org, linux-kernel@vger.kernel.org, leon@kernel.org, Joe Damato Subject: [net-next v9 02/10] net: bnxt: Export bnxt_xmit_get_cfa_action Date: Tue, 7 Apr 2026 15:02:58 -0700 Message-ID: <20260407220313.3990909-3-joe@dama.to> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260407220313.3990909-1-joe@dama.to> References: <20260407220313.3990909-1-joe@dama.to> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Export bnxt_xmit_get_cfa_action so that it can be used in future commits which add software USO support to bnxt. Suggested-by: Jakub Kicinski Reviewed-by: Pavan Chebbi Signed-off-by: Joe Damato --- v4: - Added Pavan's Reviewed-by tag. No functional changes. drivers/net/ethernet/broadcom/bnxt/bnxt.c | 2 +- drivers/net/ethernet/broadcom/bnxt/bnxt.h | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethern= et/broadcom/bnxt/bnxt.c index fe8b886ff82e..d4288c458576 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c @@ -447,7 +447,7 @@ const u16 bnxt_lhint_arr[] =3D { TX_BD_FLAGS_LHINT_2048_AND_LARGER, }; =20 -static u16 bnxt_xmit_get_cfa_action(struct sk_buff *skb) +u16 bnxt_xmit_get_cfa_action(struct sk_buff *skb) { struct metadata_dst *md_dst =3D skb_metadata_dst(skb); =20 diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.h b/drivers/net/ethern= et/broadcom/bnxt/bnxt.h index 3558a36ece12..2b40a5bd57af 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.h +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.h @@ -2969,6 +2969,7 @@ unsigned int bnxt_get_avail_cp_rings_for_en(struct bn= xt *bp); int bnxt_reserve_rings(struct bnxt *bp, bool irq_re_init); void bnxt_tx_disable(struct bnxt *bp); void bnxt_tx_enable(struct bnxt *bp); +u16 bnxt_xmit_get_cfa_action(struct sk_buff *skb); void bnxt_sched_reset_txr(struct bnxt *bp, struct bnxt_tx_ring_info *txr, u16 curr); void bnxt_report_link(struct bnxt *bp); --=20 2.52.0 From nobody Wed Apr 8 01:18:01 2026 Received: from mail-pj1-f48.google.com (mail-pj1-f48.google.com [209.85.216.48]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7D63237F015 for ; Tue, 7 Apr 2026 22:03:29 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.48 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775599410; cv=none; b=rp7zuIQ6PY/aTRbXA41eJBkbimQ4Mme+MVTPl7HEx5DxWZWu/wmLaTNcTxR2FA01bbKY75Nyrpqsvv39qBOoBe1DsHGlSKLhryq2nFoKLDQdESBhpnn175qKmXChRx6mYBp6j0mLlvIF1SPWxwRsL43Mvt6Rd3/sKGAY/GHO5j0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775599410; c=relaxed/simple; bh=QNzOKPdiy8cSJfr1mCdxlpDpX0PCIjFpk/12ymL9Mjs=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=UNuec7hxDLdo6cAWI32lrppwehz9U0oMSY6jiArTnX4YYgsHSbaCOD9uBfetlokvzpQLabql2Eelge60n5xm1fR1zTDwgGzmLXSO69a0/iQF777PxiGv9SbchTXi0m2rZp8kEz1TyAotaSymyIPvGXXCnX0KiqIvziAkV/b6LEw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=dama.to; spf=none smtp.mailfrom=dama.to; dkim=pass (2048-bit key) header.d=dama-to.20251104.gappssmtp.com header.i=@dama-to.20251104.gappssmtp.com header.b=bRkpStui; arc=none smtp.client-ip=209.85.216.48 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=dama.to Authentication-Results: smtp.subspace.kernel.org; spf=none smtp.mailfrom=dama.to Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=dama-to.20251104.gappssmtp.com header.i=@dama-to.20251104.gappssmtp.com header.b="bRkpStui" Received: by mail-pj1-f48.google.com with SMTP id 98e67ed59e1d1-35d94f4ee36so3186410a91.3 for ; Tue, 07 Apr 2026 15:03:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dama-to.20251104.gappssmtp.com; s=20251104; t=1775599409; x=1776204209; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=zg+/QcI8r5Qwsw6nUEc3qwhDPUQV4lyYXGZbebKcjco=; b=bRkpStuipj5keikD7FmBOUNoW0RhKV9wJBw8DwrMcsi7keymgVLWC9ctbOyekjGTYs DWERBBDaXxoPokE+3H1RurOHsdnGN/hTb6k3wIozIU/wol9DI81TiuX+JLtHLGlXRCBs K5oNz9YMLTCXIic2TchL3G24eenLQY7rAz7k6vkNl4CdN4gWMY84kv487pzC1uH0ZefQ Oy1wBkT85NvW7G2AtK6yYKa5oPvYiy4enA8SjK5YMUM1/MJUcZ1XBGjH+M8k4x9w2T30 YdU7ON0HQyA2NlOsPozFcrjlDYOnmB5occam7Oe32chdo6G8nFtZEzAQYQtSA0akG9om M90w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775599409; x=1776204209; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=zg+/QcI8r5Qwsw6nUEc3qwhDPUQV4lyYXGZbebKcjco=; b=syQKgVPJgudvZB6IpcdXyH8x9xoXmnSsSSuk88XOZS3tCINjbYaNcAaLJcZ4x+v1RF DMb7EwHaZpB/ILuQvba1brWsjR3gbVRbsa8uJonBSWNHD1g5VMjwsDJYWgRTA92IEsHD kboq9Z0y25mymp9Z56sGxKG3cfeSYspKyIYBdhimbmH2k8zDol3pgNTnfmQX0UHkM6yO nbmfu3KkkSWCtFLufTSymCyw9hrG0d3Dwzi48YrndhgpX9MB4LzSAbR9jhL4p/GhClHs xmIhM5j7BCUXucHzZl2avJIlY4ZQ15gB5GXL43t2zmzH5r7s9Gr4uELv/dDgTf50N5pA JAfg== X-Forwarded-Encrypted: i=1; AJvYcCVMncnYJ9CveSYEnoWU50YiidWSjQZAMM6dH7UmmZNd0184YjKbpQ1QJz4Pf0P6HTR+Xpsxm8u8wXn3Hts=@vger.kernel.org X-Gm-Message-State: AOJu0YwcaEwQBo97K8EdgcpYTx21taKmhpXA/2wp3y1K+MWfmNVsXvkc sVoqti2xGbX2eQ70YKNwJvk5DZ1iG6v1FAqgApOIdw1Q3ZxEf1dqeRi7zLaVFzLqS+4= X-Gm-Gg: AeBDiev0H5ghZk7P/Ne75q+pZZjvp8EJCAkvhs5kUyTd6jNqiSPj98VGYz1OLCVDRBH qI4TmbT69FBRElAmJAgcdSIq+2BVB9/3HExXIxa2BQvCRJcTKPneom+BYOTV4sHsh7ojjTgnNmO oahLtRTnqhtTL1hF+YyGQvVvbGC9VUTvQaS+BPvP8/isMgfpYHwAk8xmmo4YM6v8GQ4pxXMxWi4 Qz6Mdx7Hy40S6vhCwRrTec8rjEgD6/sCjzojDASLbMz9PykdhMGGcT3frTILd04zTTbPcBToe2B nwzVsV7aKC6ZSu7taocB5s9Qt2Q1LP1Jkd7SLOEuHykt3SuIHrRgyqevIYSqYL5MNgRfT54SkpD PaFTZcbCo5algtA8eM7KVyET7FV048j6diaIkMJ3PrsvV+7BRw/0CZREhPvkGIsyKKoliu/oO66 mk8TqW X-Received: by 2002:a17:903:fa6:b0:2b0:673a:7c90 with SMTP id d9443c01a7336-2b28176a3dbmr200029855ad.28.1775599408982; Tue, 07 Apr 2026 15:03:28 -0700 (PDT) Received: from localhost ([2a03:2880:2ff:44::]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2b27473583dsm182385395ad.9.2026.04.07.15.03.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 07 Apr 2026 15:03:28 -0700 (PDT) From: Joe Damato To: netdev@vger.kernel.org, Michael Chan , Pavan Chebbi , Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni Cc: horms@kernel.org, linux-kernel@vger.kernel.org, leon@kernel.org, Joe Damato Subject: [net-next v9 03/10] net: bnxt: Add a helper for tx_bd_ext Date: Tue, 7 Apr 2026 15:02:59 -0700 Message-ID: <20260407220313.3990909-4-joe@dama.to> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260407220313.3990909-1-joe@dama.to> References: <20260407220313.3990909-1-joe@dama.to> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Factor out some code to setup tx_bd_exts into a helper function. This helper will be used by SW USO implementation in the following commits. Suggested-by: Jakub Kicinski Reviewed-by: Pavan Chebbi Signed-off-by: Joe Damato --- v4: - Added Pavan's Reviewed-by tag. No functional changes. drivers/net/ethernet/broadcom/bnxt/bnxt.c | 9 ++------- drivers/net/ethernet/broadcom/bnxt/bnxt.h | 18 ++++++++++++++++++ 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethern= et/broadcom/bnxt/bnxt.c index d4288c458576..d1f0969b781c 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c @@ -663,10 +663,9 @@ static netdev_tx_t bnxt_start_xmit(struct sk_buff *skb= , struct net_device *dev) txbd->tx_bd_opaque =3D SET_TX_OPAQUE(bp, txr, prod, 2 + last_frag); =20 prod =3D NEXT_TX(prod); - txbd1 =3D (struct tx_bd_ext *) - &txr->tx_desc_ring[TX_RING(bp, prod)][TX_IDX(prod)]; + txbd1 =3D bnxt_init_ext_bd(bp, txr, prod, lflags, vlan_tag_flags, + cfa_action); =20 - txbd1->tx_bd_hsize_lflags =3D lflags; if (skb_is_gso(skb)) { bool udp_gso =3D !!(skb_shinfo(skb)->gso_type & SKB_GSO_UDP_L4); u32 hdr_len; @@ -693,7 +692,6 @@ static netdev_tx_t bnxt_start_xmit(struct sk_buff *skb,= struct net_device *dev) } else if (skb->ip_summed =3D=3D CHECKSUM_PARTIAL) { txbd1->tx_bd_hsize_lflags |=3D cpu_to_le32(TX_BD_FLAGS_TCP_UDP_CHKSUM); - txbd1->tx_bd_mss =3D 0; } =20 length >>=3D 9; @@ -706,9 +704,6 @@ static netdev_tx_t bnxt_start_xmit(struct sk_buff *skb,= struct net_device *dev) flags |=3D bnxt_lhint_arr[length]; txbd->tx_bd_len_flags_type =3D cpu_to_le32(flags); =20 - txbd1->tx_bd_cfa_meta =3D cpu_to_le32(vlan_tag_flags); - txbd1->tx_bd_cfa_action =3D - cpu_to_le32(cfa_action << TX_BD_CFA_ACTION_SHIFT); txbd0 =3D txbd; for (i =3D 0; i < last_frag; i++) { frag =3D &skb_shinfo(skb)->frags[i]; diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.h b/drivers/net/ethern= et/broadcom/bnxt/bnxt.h index 2b40a5bd57af..83b4136ccd31 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.h +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.h @@ -2836,6 +2836,24 @@ static inline u32 bnxt_tx_avail(struct bnxt *bp, return bp->tx_ring_size - (used & bp->tx_ring_mask); } =20 +static inline struct tx_bd_ext * +bnxt_init_ext_bd(struct bnxt *bp, struct bnxt_tx_ring_info *txr, + u16 prod, __le32 lflags, u32 vlan_tag_flags, + u32 cfa_action) +{ + struct tx_bd_ext *txbd1; + + txbd1 =3D (struct tx_bd_ext *) + &txr->tx_desc_ring[TX_RING(bp, prod)][TX_IDX(prod)]; + txbd1->tx_bd_hsize_lflags =3D lflags; + txbd1->tx_bd_mss =3D 0; + txbd1->tx_bd_cfa_meta =3D cpu_to_le32(vlan_tag_flags); + txbd1->tx_bd_cfa_action =3D + cpu_to_le32(cfa_action << TX_BD_CFA_ACTION_SHIFT); + + return txbd1; +} + static inline void bnxt_writeq(struct bnxt *bp, u64 val, volatile void __iomem *addr) { --=20 2.52.0 From nobody Wed Apr 8 01:18:01 2026 Received: from mail-pf1-f169.google.com (mail-pf1-f169.google.com [209.85.210.169]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5D2EA3806B8 for ; Tue, 7 Apr 2026 22:03:31 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.169 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775599412; cv=none; b=hXeUjo8WK+PvDxWZ5dL5MDV6LTLlj6ompgXznyeGhlyElTihB+j+Nd2roQBJDHwtKgrOlAyDhRJMVuCF2HcHuOYTGXEbWucgV+t0QsRuyJ3xPj1kxb7yAvFsiP/So+v2czNurEC2fEZWMrMi+lSHtb/50B+yyP1tv6qXSMPw1Lw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775599412; c=relaxed/simple; bh=OUk9q5Arkhanj5HtzwfH5k7t5KwEKJDygKJt0djc3kM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=txI5OARiSSfcyjozxh2gmQZ6H+6AyYPE15GqxrF9h1l+L74XkHll5x4L/bKofYmRRoSLrsIqzpmjh4yh6MVEUO84LvN7vg5gRvnklmLr1VexK3d7DMTisRNEbg4c2/aImXnwytqO9BSumBKc+RpUF+B6uTxrrgJm3M3J0vBVWJ8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=dama.to; spf=none smtp.mailfrom=dama.to; dkim=pass (2048-bit key) header.d=dama-to.20251104.gappssmtp.com header.i=@dama-to.20251104.gappssmtp.com header.b=GYJQ7ruw; arc=none smtp.client-ip=209.85.210.169 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=dama.to Authentication-Results: smtp.subspace.kernel.org; spf=none smtp.mailfrom=dama.to Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=dama-to.20251104.gappssmtp.com header.i=@dama-to.20251104.gappssmtp.com header.b="GYJQ7ruw" Received: by mail-pf1-f169.google.com with SMTP id d2e1a72fcca58-82c70e4654eso2545286b3a.2 for ; Tue, 07 Apr 2026 15:03:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dama-to.20251104.gappssmtp.com; s=20251104; t=1775599411; x=1776204211; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=ErHvbnQsFM396o0wOypHE+KSBfNaqH86ZoLPZibNI5c=; b=GYJQ7ruwj8IuMz0Ozwm723RHbKUTVZ23OG13rvyllVTHaaryQmAsf1hvM/pSl4U65t ULDS74axnhxO+Yq40kH/wqqd33KRL7CFNAd1bd2yBDgmsd5JP94RG4R/8nC4ehT2vk1p pUPA47U317MgZBVIS+bEEAy/gQQdMnezwA8o+ZpBf11PQwLwM+0VkExjyIANHHLvUa/m vSmF7V4dRzjuftm2i13Ib6ZLqoOM8A5jFebyZsFBoQA4LkxeZrTQGprCwnCOU6d115aG A0qQAh53wIASHt37tbevBgSTA2g00NKC55qw2ORQzZlOSHGPod5OdILi3QGFqVfoM0Cf JVOA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775599411; x=1776204211; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=ErHvbnQsFM396o0wOypHE+KSBfNaqH86ZoLPZibNI5c=; b=AwGlCc64pgtuvviSZluzb6qZRki8EwN9WNSc+IKCnH0q2MZQDrrn3wDo36NIkyuAxi B1O/w1GpRlx5IoHq726PhGXC0B3hk2yaeatgFP54Qo65F2T/x90GTvV+vy9OVtU4db94 Ca6XZUM9HPIeMXquLtU4ybm4cnuVqibHDDpqbcjURjrM0uXwgOUROtPxJG3zu85ogw1V DsJl4ThFRbRGjNYOusiiy1YA/2h1r5ler8arnK9C3WmOwUNUxtK56ttGUOLYe8GZ7AJz 6NyAG0eC5Nx4w8jEM32AvsM7fPF/zuWb4u/qa3FpvS65esulfE7n1ytU1GFw2djG3g2n 2IgA== X-Forwarded-Encrypted: i=1; AJvYcCWPUmqB2y34DZ9LAcyK7jCkXmwbqwKCyxqG8uEfsJ0okiKLRk+YbBQ8OPQ+DoTViU8NNC6grMdtVv9B8kg=@vger.kernel.org X-Gm-Message-State: AOJu0Yy5S87zZKTZoPd+8Zn7ZD/ssCL5FVGXA/HT3pckxwc2SqZapuHv 26woDvWkmWrHnPt4xgwlq23M3utF3C7iSNkMmYNWlCh6lfYZfKTFP5I58TNIeNfQ9p4= X-Gm-Gg: AeBDiev8x/doa6xaRupRhXaOu6LV4wuo9NICiUZ2/nT09o/d7VYbguRAiqrOumKwDOE 4OecMOMUmmPn6poj+bwJazz6Cjgj1ZQ8bwnY066auRipGI1u9YERy/Cf4qUbTJMNcqOjSsKa2CW rciNnvKyBJDuxIWr00eV9tMeJN/DfscwJFJYZxP19JgFUDnU2rvvg+SPA6L9vzzd45jlZWhgOJk zUUa7Try618ErxpomZ8aoD6N/2NrRrGvIM2ELCoPzNSreSy8ReW8En8hAy9KZYDfCHMRDlUI88r WYPuZ+KhrsATdpEVbydZkcugTzTueQksz0yGfDKPWA7+ITN4i6K/feeuuJFjmcDzhBWJVbg6O3T QfnGdYS8aBk4MSGKNg/1B+lVG0zVO/iXskZiCx2bClOsCxowrFdVxNZMp4ZbnepVH6J+xYeJOX6 klMXs= X-Received: by 2002:a05:6a00:3e15:b0:82c:2241:ab71 with SMTP id d2e1a72fcca58-82d0db9b250mr18799352b3a.42.1775599410724; Tue, 07 Apr 2026 15:03:30 -0700 (PDT) Received: from localhost ([2a03:2880:2ff:6::]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-82cf9b27064sm23353085b3a.9.2026.04.07.15.03.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 07 Apr 2026 15:03:30 -0700 (PDT) From: Joe Damato To: netdev@vger.kernel.org, Michael Chan , Pavan Chebbi , Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni Cc: horms@kernel.org, linux-kernel@vger.kernel.org, leon@kernel.org, Joe Damato Subject: [net-next v9 04/10] net: bnxt: Use dma_unmap_len for TX completion unmapping Date: Tue, 7 Apr 2026 15:03:00 -0700 Message-ID: <20260407220313.3990909-5-joe@dama.to> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260407220313.3990909-1-joe@dama.to> References: <20260407220313.3990909-1-joe@dama.to> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Store the DMA mapping length in each TX buffer descriptor via dma_unmap_len_set at submit time, and use dma_unmap_len at completion time. This is a no-op for normal packets but prepares for software USO, where header BDs set dma_unmap_len to 0 because the header buffer is unmapped collectively rather than per-segment. Suggested-by: Jakub Kicinski Reviewed-by: Pavan Chebbi Signed-off-by: Joe Damato --- v4: - Added Pavan's Reviewed-by tag. No functional changes. rfcv2: - Use some local variables to shorten long lines. No functional change f= rom rfcv1. drivers/net/ethernet/broadcom/bnxt/bnxt.c | 63 ++++++++++++++--------- 1 file changed, 40 insertions(+), 23 deletions(-) diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethern= et/broadcom/bnxt/bnxt.c index d1f0969b781c..32a0e71e9fb7 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c @@ -656,6 +656,7 @@ static netdev_tx_t bnxt_start_xmit(struct sk_buff *skb,= struct net_device *dev) goto tx_free; =20 dma_unmap_addr_set(tx_buf, mapping, mapping); + dma_unmap_len_set(tx_buf, len, len); flags =3D (len << TX_BD_LEN_SHIFT) | TX_BD_TYPE_LONG_TX_BD | TX_BD_CNT(last_frag + 2); =20 @@ -720,6 +721,7 @@ static netdev_tx_t bnxt_start_xmit(struct sk_buff *skb,= struct net_device *dev) tx_buf =3D &txr->tx_buf_ring[RING_TX(bp, prod)]; netmem_dma_unmap_addr_set(skb_frag_netmem(frag), tx_buf, mapping, mapping); + dma_unmap_len_set(tx_buf, len, len); =20 txbd->tx_bd_haddr =3D cpu_to_le64(mapping); =20 @@ -809,7 +811,8 @@ static bool __bnxt_tx_int(struct bnxt *bp, struct bnxt_= tx_ring_info *txr, u16 hw_cons =3D txr->tx_hw_cons; unsigned int tx_bytes =3D 0; u16 cons =3D txr->tx_cons; - skb_frag_t *frag; + unsigned int dma_len; + dma_addr_t dma_addr; int tx_pkts =3D 0; bool rc =3D false; =20 @@ -844,19 +847,27 @@ static bool __bnxt_tx_int(struct bnxt *bp, struct bnx= t_tx_ring_info *txr, goto next_tx_int; } =20 - dma_unmap_single(&pdev->dev, dma_unmap_addr(tx_buf, mapping), - skb_headlen(skb), DMA_TO_DEVICE); + if (dma_unmap_len(tx_buf, len)) { + dma_addr =3D dma_unmap_addr(tx_buf, mapping); + dma_len =3D dma_unmap_len(tx_buf, len); + + dma_unmap_single(&pdev->dev, dma_addr, dma_len, + DMA_TO_DEVICE); + } + last =3D tx_buf->nr_frags; =20 for (j =3D 0; j < last; j++) { - frag =3D &skb_shinfo(skb)->frags[j]; cons =3D NEXT_TX(cons); tx_buf =3D &txr->tx_buf_ring[RING_TX(bp, cons)]; - netmem_dma_unmap_page_attrs(&pdev->dev, - dma_unmap_addr(tx_buf, - mapping), - skb_frag_size(frag), - DMA_TO_DEVICE, 0); + if (dma_unmap_len(tx_buf, len)) { + dma_addr =3D dma_unmap_addr(tx_buf, mapping); + dma_len =3D dma_unmap_len(tx_buf, len); + + netmem_dma_unmap_page_attrs(&pdev->dev, + dma_addr, dma_len, + DMA_TO_DEVICE, 0); + } } if (unlikely(is_ts_pkt)) { if (BNXT_CHIP_P5(bp)) { @@ -3394,6 +3405,8 @@ static void bnxt_free_one_tx_ring_skbs(struct bnxt *b= p, { int i, max_idx; struct pci_dev *pdev =3D bp->pdev; + unsigned int dma_len; + dma_addr_t dma_addr; =20 max_idx =3D bp->tx_nr_pages * TX_DESC_CNT; =20 @@ -3404,10 +3417,10 @@ static void bnxt_free_one_tx_ring_skbs(struct bnxt = *bp, =20 if (idx < bp->tx_nr_rings_xdp && tx_buf->action =3D=3D XDP_REDIRECT) { - dma_unmap_single(&pdev->dev, - dma_unmap_addr(tx_buf, mapping), - dma_unmap_len(tx_buf, len), - DMA_TO_DEVICE); + dma_addr =3D dma_unmap_addr(tx_buf, mapping); + dma_len =3D dma_unmap_len(tx_buf, len); + + dma_unmap_single(&pdev->dev, dma_addr, dma_len, DMA_TO_DEVICE); xdp_return_frame(tx_buf->xdpf); tx_buf->action =3D 0; tx_buf->xdpf =3D NULL; @@ -3429,23 +3442,27 @@ static void bnxt_free_one_tx_ring_skbs(struct bnxt = *bp, continue; } =20 - dma_unmap_single(&pdev->dev, - dma_unmap_addr(tx_buf, mapping), - skb_headlen(skb), - DMA_TO_DEVICE); + if (dma_unmap_len(tx_buf, len)) { + dma_addr =3D dma_unmap_addr(tx_buf, mapping); + dma_len =3D dma_unmap_len(tx_buf, len); + + dma_unmap_single(&pdev->dev, dma_addr, dma_len, DMA_TO_DEVICE); + } =20 last =3D tx_buf->nr_frags; i +=3D 2; for (j =3D 0; j < last; j++, i++) { int ring_idx =3D i & bp->tx_ring_mask; - skb_frag_t *frag =3D &skb_shinfo(skb)->frags[j]; =20 tx_buf =3D &txr->tx_buf_ring[ring_idx]; - netmem_dma_unmap_page_attrs(&pdev->dev, - dma_unmap_addr(tx_buf, - mapping), - skb_frag_size(frag), - DMA_TO_DEVICE, 0); + if (dma_unmap_len(tx_buf, len)) { + dma_addr =3D dma_unmap_addr(tx_buf, mapping); + dma_len =3D dma_unmap_len(tx_buf, len); + + netmem_dma_unmap_page_attrs(&pdev->dev, + dma_addr, dma_len, + DMA_TO_DEVICE, 0); + } } dev_kfree_skb(skb); } --=20 2.52.0 From nobody Wed Apr 8 01:18:01 2026 Received: from mail-pf1-f169.google.com (mail-pf1-f169.google.com [209.85.210.169]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3CE033815F7 for ; Tue, 7 Apr 2026 22:03:33 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.169 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775599414; cv=none; b=NCi31Wm4qw3/wVS0n33/FPvtqKcrqr/LfeMtXQWFQdhBFXlWOTjvYIiO1F/ZsAgETUYJg5f+D0hdqyyvfzM4KEOgDuNIMMIDjzU1+LGDzb2gXMU+e8RlcZiGYmPQCj/ueg6HAzVuIOEzMuP8t4ULM/d6n6tgFyuzz4DnzAoXpF0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775599414; c=relaxed/simple; bh=cC+5Wx7mvSuD5TmmI90JQNyOVlCxmvA8yGpUrQItxjA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=qxe9ULMfpywqGzQZmc48cmrlbixrfCGzup1x/+ObZUT0Me4hc9LkxQ6fk3V2rPyTV8i0rwk4EipzBZjYsOxRYunGI076YLFvPZ+2cAsfKDWhniRUNzRSZAy5OEFqAwSBum7aAm9UN9zeQbOzqBtiR86oF5CCdAwWMAoTMuFC5dE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=dama.to; spf=none smtp.mailfrom=dama.to; dkim=pass (2048-bit key) header.d=dama-to.20251104.gappssmtp.com header.i=@dama-to.20251104.gappssmtp.com header.b=lAu3VoqJ; arc=none smtp.client-ip=209.85.210.169 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=dama.to Authentication-Results: smtp.subspace.kernel.org; spf=none smtp.mailfrom=dama.to Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=dama-to.20251104.gappssmtp.com header.i=@dama-to.20251104.gappssmtp.com header.b="lAu3VoqJ" Received: by mail-pf1-f169.google.com with SMTP id d2e1a72fcca58-82ce2e2880cso3879233b3a.0 for ; Tue, 07 Apr 2026 15:03:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dama-to.20251104.gappssmtp.com; s=20251104; t=1775599412; x=1776204212; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=NgieY5sH43uwA7fRoCGN+5l2gJuDhD3AI8cPry4udUQ=; b=lAu3VoqJkSMdWORDehjCWd30zTPXUrBtZaAAtl4GPsnjJW2JBDWIC+aQYTV815FNi9 Vjkfq5BgV2yIc8BcdsXhjbIwFB+csUyLHrY87rvXuzYOBejNpGhqY1wVuq/qt8QVHE7l 0qGmKbkcdtqqxFUKBVLBV7UnVfvOK2T6TPq/zTGsxAcOAnfzXlkG8E4WiWT0hUWuFHYB L+dF9oyZqlQ72kibXLiYX5LCauBhWCgF+40FO0pKwFnDwKmV/3mQFDVZxubvXslBl1w/ dBh185zUkx8OCTtrLI+b5t3EAZOngU8pU2kLiaZ53WwXIIvYEANdLn8fcP+J8mUtKIWI WLbA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775599412; x=1776204212; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=NgieY5sH43uwA7fRoCGN+5l2gJuDhD3AI8cPry4udUQ=; b=jMKe36CmVWBHIzX+bDcLczXI7AeMu9EVlBJi68Mg2kAe/2OAZjhyUAAhvtsgnTyrwG MzrrH5vdTJai3RURzFJOaGglP/+lCaGARhjkaTxd8vmHEMHz1+VskHApnv4C59u8MyF+ HHzXsk71XsAYnmD2aL01wOtYvF4Ewe/mx8+Urb6E8jl2JayMf+E+cCv/tY0+3nZBllqV bLcQBVUgFZCZ6T6w/y7WHJr0WFXgkXaOPgpuiuKKq1tpwItnKd6s9vpEMzThUDXMsIsi rO33FZvJC15hl9/13fLsJdUzxVIPFD6E4ppNhHqosWaMTL5rp4JeHICRWR7FbqAYmlJK E8EQ== X-Forwarded-Encrypted: i=1; AJvYcCUfZIxvbcm0cAQbmgNHtwB3+07MURMELzyvaw6MuWcX4KyyqK3sORO34EtO27vJSfPvIjEbYgdf0T0LQLU=@vger.kernel.org X-Gm-Message-State: AOJu0YxeGF1Y4B1ml5vQ9TUkiW7cvTAqEVm6zi3ZJ5hVsA2dS+TipdaQ l2aywsx8a2wgDFBzQXg/dXFjxOgJYw7rs58FlscGsHVtHI1RDL1R6PXtV5T8gaNqJn0= X-Gm-Gg: AeBDieu7xg45YayY1oD/cw0BTDokL4VNRfAGoSexyDF9KXPukm1x4en5EonspWzZdDi /Pfj5N8P9sXlbM5B1q1DQ1wopLNg5OqPkXcuAOLIuAp7t2c3JeJ7CVWK3bxswm1l0KvY2ciQ5BH flsR1Ao1i7AuUV3LiKan9u8+7YdDujh5ZjB5lBv5S8jGUk3A2qfGacQUDQDTD6t0ITfJ9vhxN7P 9yFFO/12rM+eay9bmAiMN+sTlC2GY4M0izq5BjB4VeNbgKFK/G0Q+5gUAyXIyVosNagnJXefQRT 1PutXaMd2tBY77LR+KThm3DKRU50vsptbd/LMG3+hLATACwEQ8DcRe+0Q/DTd3NBx4mgsH7qlVf IkM+VdM6gWpZm0Aff73Zg8+s5Hm4LGcx6Kgh8a31l0FtbaDdf4tFiS9pvnnKb6M7D8FGtClgf1/ gRJvGn X-Received: by 2002:a05:6a00:3cd3:b0:82c:df25:fbd9 with SMTP id d2e1a72fcca58-82d0dbaf921mr18749972b3a.50.1775599412604; Tue, 07 Apr 2026 15:03:32 -0700 (PDT) Received: from localhost ([2a03:2880:2ff:4d::]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-82cf9b272bdsm19487562b3a.12.2026.04.07.15.03.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 07 Apr 2026 15:03:32 -0700 (PDT) From: Joe Damato To: netdev@vger.kernel.org, Michael Chan , Pavan Chebbi , Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni Cc: horms@kernel.org, linux-kernel@vger.kernel.org, leon@kernel.org, Joe Damato Subject: [net-next v9 05/10] net: bnxt: Add TX inline buffer infrastructure Date: Tue, 7 Apr 2026 15:03:01 -0700 Message-ID: <20260407220313.3990909-6-joe@dama.to> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260407220313.3990909-1-joe@dama.to> References: <20260407220313.3990909-1-joe@dama.to> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add per-ring pre-allocated inline buffer fields (tx_inline_buf, tx_inline_dma, tx_inline_size) to bnxt_tx_ring_info and helpers to allocate and free them. A producer and consumer (tx_inline_prod, tx_inline_cons) are added to track which slot(s) of the inline buffer are in-use. The inline buffer will be used by the SW USO path for pre-allocated, pre-DMA-mapped per-segment header copies. In the future, this could be extended to support TX copybreak. Allocation helper is marked __maybe_unused in this commit because it will be wired in later. Suggested-by: Jakub Kicinski Reviewed-by: Pavan Chebbi Signed-off-by: Joe Damato --- v5: - Added Pavan's Reviewed-by. No functional changes. rfcv2: - Added a producer and consumer to correctly track the in use header slo= ts. drivers/net/ethernet/broadcom/bnxt/bnxt.c | 35 +++++++++++++++++++++++ drivers/net/ethernet/broadcom/bnxt/bnxt.h | 6 ++++ 2 files changed, 41 insertions(+) diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethern= et/broadcom/bnxt/bnxt.c index 32a0e71e9fb7..74968ca1f4e2 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c @@ -3977,6 +3977,39 @@ static int bnxt_alloc_rx_rings(struct bnxt *bp) return rc; } =20 +static void bnxt_free_tx_inline_buf(struct bnxt_tx_ring_info *txr, + struct pci_dev *pdev) +{ + if (!txr->tx_inline_buf) + return; + + dma_unmap_single(&pdev->dev, txr->tx_inline_dma, + txr->tx_inline_size, DMA_TO_DEVICE); + kfree(txr->tx_inline_buf); + txr->tx_inline_buf =3D NULL; + txr->tx_inline_size =3D 0; +} + +static int __maybe_unused bnxt_alloc_tx_inline_buf(struct bnxt_tx_ring_inf= o *txr, + struct pci_dev *pdev, + unsigned int size) +{ + txr->tx_inline_buf =3D kmalloc(size, GFP_KERNEL); + if (!txr->tx_inline_buf) + return -ENOMEM; + + txr->tx_inline_dma =3D dma_map_single(&pdev->dev, txr->tx_inline_buf, + size, DMA_TO_DEVICE); + if (dma_mapping_error(&pdev->dev, txr->tx_inline_dma)) { + kfree(txr->tx_inline_buf); + txr->tx_inline_buf =3D NULL; + return -ENOMEM; + } + txr->tx_inline_size =3D size; + + return 0; +} + static void bnxt_free_tx_rings(struct bnxt *bp) { int i; @@ -3995,6 +4028,8 @@ static void bnxt_free_tx_rings(struct bnxt *bp) txr->tx_push =3D NULL; } =20 + bnxt_free_tx_inline_buf(txr, pdev); + ring =3D &txr->tx_ring_struct; =20 bnxt_free_ring(bp, &ring->ring_mem); diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.h b/drivers/net/ethern= et/broadcom/bnxt/bnxt.h index 83b4136ccd31..d98a58aa30f6 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.h +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.h @@ -996,6 +996,12 @@ struct bnxt_tx_ring_info { dma_addr_t tx_push_mapping; __le64 data_mapping; =20 + void *tx_inline_buf; + dma_addr_t tx_inline_dma; + unsigned int tx_inline_size; + u16 tx_inline_prod; + u16 tx_inline_cons; + #define BNXT_DEV_STATE_CLOSING 0x1 u32 dev_state; =20 --=20 2.52.0 From nobody Wed Apr 8 01:18:01 2026 Received: from mail-pj1-f51.google.com (mail-pj1-f51.google.com [209.85.216.51]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9C78C383C93 for ; Tue, 7 Apr 2026 22:03:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.51 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775599416; cv=none; b=DGx7XtFhTFRwDGxlkT3TGS2Wxtfn+7YPtYP/BYkpaLJmF2A4YiET+ASbVxLz/KlIxM4kkZ5lvSk53PrGz1R7zmHC2fM6d1uObGeeIbGzM+zMBH7ClWqB8oNVyjN9mMJL2YUF1DcOEjkqvrE42hJ9wWvEHRGhMXlHvw8YU3H9U8M= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775599416; c=relaxed/simple; bh=imhnP3c90RnqduwmC0Bs7sD+WwiHek5Y56xEli2D4zw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=NqE4+4eCDJX+/8bL2Jg6Q2wRFrlYQYsdWJ17rRQueMvF6ZA+q8INI2gEH9EuufArPpYHrnh3c2/Wl1ruGjq29aQX7aeRfigF0f01pDzOFAAbFCpU9DigDCSqC3oq2EEmKtyzauI5HjYnJ2ukUneMF0xEsULGWkg4BUBPctN2nWs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=dama.to; spf=none smtp.mailfrom=dama.to; dkim=pass (2048-bit key) header.d=dama-to.20251104.gappssmtp.com header.i=@dama-to.20251104.gappssmtp.com header.b=OeaIq4w1; arc=none smtp.client-ip=209.85.216.51 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=dama.to Authentication-Results: smtp.subspace.kernel.org; spf=none smtp.mailfrom=dama.to Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=dama-to.20251104.gappssmtp.com header.i=@dama-to.20251104.gappssmtp.com header.b="OeaIq4w1" Received: by mail-pj1-f51.google.com with SMTP id 98e67ed59e1d1-3567e2b4159so3463167a91.0 for ; Tue, 07 Apr 2026 15:03:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dama-to.20251104.gappssmtp.com; s=20251104; t=1775599415; x=1776204215; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=gILlFOgGbo5p4rommdyZj12/KVIzsVhqUzxLDwWsXoM=; b=OeaIq4w1UWsmJt2SS/SwaRN0lm/dL8rp/v6RBkDZr2H+IoVRDQEPY3g8xhrtaNyWJw Sw250wO19OUFzNrIjXJfp83zWGZGhwE/pE5bvWzGpVjfC3ViGZVm6yOmLmJ4eBTilgxC eoTci1LPniiAVp5308znOoyzQav/VVAWANZ9JL0sFlJJarXO4xHf6TBRSiDmcAezOivk jyVGWOOhY6bWNnFIM1ATf5Dn/7zVXJAidLgcauo4Ucs+zoWd1OzskIY6zTIixAm8EBoT M0Z0zUT0yAOmWN13UoBZSBH3tb0Kp+RToVC3F9qWb0aUaShKJdYnTIhTbrCphGKR8G4g ktvQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775599415; x=1776204215; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=gILlFOgGbo5p4rommdyZj12/KVIzsVhqUzxLDwWsXoM=; b=dl9AMiGa36mC+oq+JsxMmi2Y0XVEKqf4Hkz4zJZlTqrSJmJkohTNDszqd5uLuueuKj FBIkOxSRHw0Ai4gIIjJx3m5OKgS7IP3O7CGC4SPh+5/WCs2VXGAVM0mEbqknAnGXN0Uv cQvEH1KcVnXQEPNDxAAqL9v7dWn9OnflaH7ZoUqPWF6DNHt+Ss5OTAvWgD6r1uU4q1tq ldde8fXmB9APCLCc/OoEQ9yCR8DJhKCakM7AopDUJZubKQnctShfPc88JhntfBopXaNm PAv42vXL+XC/VxolLMEMGfG+/UzGy1cs+Q/WugiR4cVWf5OcqlNk53Xe9DzWyEHJWZJQ Mclw== X-Forwarded-Encrypted: i=1; AJvYcCU1sY7nWW9GSvSaXClq9SEaoypUjI20lgUEdlJsYsxz8itJUYZlIgQxjaNQQ+B9Ra+WMBH5Afcbszpbpc8=@vger.kernel.org X-Gm-Message-State: AOJu0YxoGi95Vv+WxiIaDIL67NCfdyt7aRjjweXKNEgrxjUhqCI33hvL y57bQr6hSmtIKj94z7kwfaKjhylZJN9+qd2mbCVAKEkq9DTy881htm50AvyHRXBNzcg= X-Gm-Gg: AeBDieutJH1+MDXdiRIvuj7hwgfpRz8rt/JO6I+PyPQf0uJgCm+oUm0kBDzYF0wK80U mvyrMivdyhJxP1IWu14YpWwLmq464uwKWrdOOAh2R7OlN7BfMyCk73npBFHZRV4MIzwWyS+iyfK fnqDMvV9imHVvUwA9QGWpiF/tzSEmrRW/zjePC3sPJ29RDMBV/Irx49q5EKVLrhfG0io3k0UZqQ 6J6Pf/sN4Xg1b0Wc7a3yM5872tFGvKqkmYmZ5vAQImyDWxAGnfBFsbdhvNYKqkWLN1wbpJgEHKH 74f+tNY0CP0sD5ppge3QnR19SkGF0rPPyw9GPfn06HgKeFq2WP7qmX6s1zxqtc2kL0Usf1PB+di 7bzAc53R8EykL7fLS3ElHaxfsugBjgpG32oQuc2iR9aJXDoIJYItWMO0tETmlwyfUkiJpRVdE7p PrBQoQ X-Received: by 2002:a17:90b:48c1:b0:35d:a542:2dc5 with SMTP id 98e67ed59e1d1-35de67d6247mr15710132a91.2.1775599415062; Tue, 07 Apr 2026 15:03:35 -0700 (PDT) Received: from localhost ([2a03:2880:2ff:4f::]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-35dd367c142sm18408801a91.11.2026.04.07.15.03.34 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 07 Apr 2026 15:03:34 -0700 (PDT) From: Joe Damato To: netdev@vger.kernel.org, Michael Chan , Pavan Chebbi , Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Richard Cochran , Alexei Starovoitov , Daniel Borkmann , Jesper Dangaard Brouer , John Fastabend , Stanislav Fomichev Cc: horms@kernel.org, linux-kernel@vger.kernel.org, leon@kernel.org, Joe Damato , bpf@vger.kernel.org Subject: [net-next v9 06/10] net: bnxt: Add boilerplate GSO code Date: Tue, 7 Apr 2026 15:03:02 -0700 Message-ID: <20260407220313.3990909-7-joe@dama.to> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260407220313.3990909-1-joe@dama.to> References: <20260407220313.3990909-1-joe@dama.to> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add bnxt_gso.c and bnxt_gso.h with a stub bnxt_sw_udp_gso_xmit() function, SW USO constants (BNXT_SW_USO_MAX_SEGS, BNXT_SW_USO_MAX_DESCS), and the is_sw_gso field in bnxt_sw_tx_bd with BNXT_SW_GSO_MID/LAST markers. The full SW USO implementation will be added in a future commit. Suggested-by: Jakub Kicinski Reviewed-by: Pavan Chebbi Signed-off-by: Joe Damato --- v7: - Changed the placement of is_sw_gso in struct bnxt_sw_tx_bd to be near other is_* fields. - No functional changes. v5: - Added Pavan's Reviewed-by. No functional changes. drivers/net/ethernet/broadcom/bnxt/Makefile | 2 +- drivers/net/ethernet/broadcom/bnxt/bnxt.h | 4 +++ drivers/net/ethernet/broadcom/bnxt/bnxt_gso.c | 30 ++++++++++++++++++ drivers/net/ethernet/broadcom/bnxt/bnxt_gso.h | 31 +++++++++++++++++++ 4 files changed, 66 insertions(+), 1 deletion(-) create mode 100644 drivers/net/ethernet/broadcom/bnxt/bnxt_gso.c create mode 100644 drivers/net/ethernet/broadcom/bnxt/bnxt_gso.h diff --git a/drivers/net/ethernet/broadcom/bnxt/Makefile b/drivers/net/ethe= rnet/broadcom/bnxt/Makefile index ba6c239d52fa..debef78c8b6d 100644 --- a/drivers/net/ethernet/broadcom/bnxt/Makefile +++ b/drivers/net/ethernet/broadcom/bnxt/Makefile @@ -1,7 +1,7 @@ # SPDX-License-Identifier: GPL-2.0-only obj-$(CONFIG_BNXT) +=3D bnxt_en.o =20 -bnxt_en-y :=3D bnxt.o bnxt_hwrm.o bnxt_sriov.o bnxt_ethtool.o bnxt_dcb.o b= nxt_ulp.o bnxt_xdp.o bnxt_ptp.o bnxt_vfr.o bnxt_devlink.o bnxt_dim.o bnxt_c= oredump.o +bnxt_en-y :=3D bnxt.o bnxt_hwrm.o bnxt_sriov.o bnxt_ethtool.o bnxt_dcb.o b= nxt_ulp.o bnxt_xdp.o bnxt_ptp.o bnxt_vfr.o bnxt_devlink.o bnxt_dim.o bnxt_c= oredump.o bnxt_gso.o bnxt_en-$(CONFIG_BNXT_FLOWER_OFFLOAD) +=3D bnxt_tc.o bnxt_en-$(CONFIG_DEBUG_FS) +=3D bnxt_debugfs.o bnxt_en-$(CONFIG_BNXT_HWMON) +=3D bnxt_hwmon.o diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.h b/drivers/net/ethern= et/broadcom/bnxt/bnxt.h index d98a58aa30f6..6b38b84924e0 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.h +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.h @@ -892,6 +892,7 @@ struct bnxt_sw_tx_bd { struct page *page; u8 is_ts_pkt; u8 is_push; + u8 is_sw_gso; u8 action; unsigned short nr_frags; union { @@ -900,6 +901,9 @@ struct bnxt_sw_tx_bd { }; }; =20 +#define BNXT_SW_GSO_MID 1 +#define BNXT_SW_GSO_LAST 2 + struct bnxt_sw_rx_bd { void *data; u8 *data_ptr; diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_gso.c b/drivers/net/et= hernet/broadcom/bnxt/bnxt_gso.c new file mode 100644 index 000000000000..b296769ee4fe --- /dev/null +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_gso.c @@ -0,0 +1,30 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* Broadcom NetXtreme-C/E network driver. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "bnxt.h" +#include "bnxt_gso.h" + +netdev_tx_t bnxt_sw_udp_gso_xmit(struct bnxt *bp, + struct bnxt_tx_ring_info *txr, + struct netdev_queue *txq, + struct sk_buff *skb) +{ + dev_kfree_skb_any(skb); + dev_core_stats_tx_dropped_inc(bp->dev); + return NETDEV_TX_OK; +} diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_gso.h b/drivers/net/et= hernet/broadcom/bnxt/bnxt_gso.h new file mode 100644 index 000000000000..f01e8102dcd7 --- /dev/null +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_gso.h @@ -0,0 +1,31 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * Broadcom NetXtreme-C/E network driver. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation. + */ + +#ifndef BNXT_GSO_H +#define BNXT_GSO_H + +/* Maximum segments the stack may send in a single SW USO skb. + * This caps gso_max_segs for NICs without HW USO support. + */ +#define BNXT_SW_USO_MAX_SEGS 64 + +/* Worst-case TX descriptors consumed by one SW USO packet: + * Each segment: 1 long BD + 1 ext BD + payload BDs. + * Total payload BDs across all segs <=3D num_segs + nr_frags (each frag + * boundary crossing adds at most 1 extra BD). + * So: 3 * max_segs + MAX_SKB_FRAGS + 1 =3D 3 * 64 + 17 + 1 =3D 210. + */ +#define BNXT_SW_USO_MAX_DESCS (3 * BNXT_SW_USO_MAX_SEGS + MAX_SKB_FRAGS + = 1) + +netdev_tx_t bnxt_sw_udp_gso_xmit(struct bnxt *bp, + struct bnxt_tx_ring_info *txr, + struct netdev_queue *txq, + struct sk_buff *skb); + +#endif --=20 2.52.0 From nobody Wed Apr 8 01:18:01 2026 Received: from mail-pg1-f174.google.com (mail-pg1-f174.google.com [209.85.215.174]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id CC8E13859EE for ; Tue, 7 Apr 2026 22:03:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.174 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775599419; cv=none; b=kQrG4epfEjFD0auN3XLh9eNwmd2H9Byi3gjF/Yp270HvNLJ43Hy/4Sc2opviHP9QeR6d4EDgguc5ySH8XTEwY0eyTVBkMHcj4AewrOaPR7hWzi6L0pZcFTB69Mk/7TOIhisckDGRufe9O94uEUn0oRT4XbvcRNN0T7HNiQHgL88= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775599419; c=relaxed/simple; bh=B7I8cCWDzhUdGf6UqiSRvQaJMsLwdy5sI9Ijne0R970=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=cMG2U5dbPZMfFVyM5kIDu+JoVVdqNkXL7fbrJj19I04KZZrvPcWi7xolXIpZ21rAavqX298+OnEi3sCfN9Db5FKuKDd63ZNPu7C2lI8MihD2kAMpRLSdwwaFxIMojS4um41IQg8hVknFDXxuta+NMM5wp54WSAodv6CHbk+K7Gs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=dama.to; spf=none smtp.mailfrom=dama.to; dkim=pass (2048-bit key) header.d=dama-to.20251104.gappssmtp.com header.i=@dama-to.20251104.gappssmtp.com header.b=QS6MXqjL; arc=none smtp.client-ip=209.85.215.174 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=dama.to Authentication-Results: smtp.subspace.kernel.org; spf=none smtp.mailfrom=dama.to Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=dama-to.20251104.gappssmtp.com header.i=@dama-to.20251104.gappssmtp.com header.b="QS6MXqjL" Received: by mail-pg1-f174.google.com with SMTP id 41be03b00d2f7-c757a9251faso1947815a12.1 for ; Tue, 07 Apr 2026 15:03:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dama-to.20251104.gappssmtp.com; s=20251104; t=1775599417; x=1776204217; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=iveK1Up5GWkb/fUAX7CrBw5jY1NKh9uiQG+zXPUUS+Y=; b=QS6MXqjLwBdUEj70JylkLdty7wnpX2wy9JfHx1bQTFnbbviWidnAnk9iW4OSp9aeVU 4RsVvVNp+9r+5ZMKqgK5dLCrVcPkEYHsxSd7EU/xb1EMXdCVWRtjtZDZ4uUck7jpL7o0 zJXgw9GEixfpFm3cPEEA9UM73xHcWX2vaiofGPjMZos1ZyjfteCZA51qlge0EkAxbimd fI9KD+vRitIgAuOBIMCXlAaGdEDsr3WHmfuTgCdfXyE4iPa0e/1Ds/5o4Z+C0eaRbxtu +t/RnT+i4GQMCjTqZh5AbL9Z8mF7BDma91Kh0nnyFWYgMJ6r2/Xq3Q+2sUnf+scami+3 J4fw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775599417; x=1776204217; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=iveK1Up5GWkb/fUAX7CrBw5jY1NKh9uiQG+zXPUUS+Y=; b=eSG7HoKvsUJ1zSK7QkZyQmZcURSq2TMApfvuY8O/FQB9JBsLyv10zTMofJ0w7vEmxk oI2P41n2wdTpZ8cVBnrcxlX16xsRe3caLzOoE5dX8N+XhVPup5Lz3UhCOvlkteem7lvK 9tOVCvih0UMi5uyCHfh2T2olkl2krso92FiGoeTr2EJm+bx9cQb7M61r3h5u1xPoDaUa YyN+PdnqBSYY8gHDq4HC7Dply5N6spBF0IDisJpspFkNnX8tgTvLt8gIHglAIHKCMsLb sWWLqySpe6nbtLDbizxveZCKbTck3Xz3ok8dXBHt/XM3alKeVKnl/b9RxUbFhFPGa2dK jJZA== X-Forwarded-Encrypted: i=1; AJvYcCUvcALN424IiWWokYZuXinBHHatpNt8sAEsMV/BhmTb/+KWfVzA+Tod527sFwvNWZfgSkX6JYLy0iADUBM=@vger.kernel.org X-Gm-Message-State: AOJu0YwkeNyDd5pkoxD29yrTioBZ+J26qE8X2aeKfHWlXX0gMOX1a2/y HJ0ILInDy0E8eZD0JIBEdKXXeTSXTFF04EJXUIb5gF4ogYhkwCIEeB+m5DZI+ZPpSVQ= X-Gm-Gg: AeBDies9eWGqkhsWZFNH6JIlM9gcT+Ic9rcNTpxBnvN79530cwtFjF/BbNlaELpRyt7 w7IVq4Wd4Xue1BDOZzFW9pOcJxq0h7Fl18zDkEK95rplHRbCMzkmgM2Efcop7Ps4uf/pbA4s6Q+ y15w+QRUFjOHoTZLGcEfIsYIAZCxX0bhHORBs8XOOMJzAkxsL8/s2pLmxR1GRBc+tB3KMcIfSmA 0MstiebPqOpaLuqPiLtpvmsiz/3etRef4TUSOGSk1oe7pAB/+7b8KQA6YOYcx7rv0RFhT+W8tYp aZU6u39Gcp1BIyuEDY5wcOXnFdrSQINQmKEOMebJuua12LNOh9kyAw/fKWBok3Wx8qmORZxkuqo SsKKgOWvFEWwUtwpsO2lfEmEXonOTfncXolyA9PZCsnPO9LNBIZdDuLXEDZVojIxmXdJ8FYc57G ATpLU= X-Received: by 2002:a05:6a20:ca3:b0:398:98f2:743d with SMTP id adf61e73a8af0-39f2f372a67mr14329053637.57.1775599417082; Tue, 07 Apr 2026 15:03:37 -0700 (PDT) Received: from localhost ([2a03:2880:2ff:9::]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-82cf9c3dd6bsm19393605b3a.32.2026.04.07.15.03.36 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 07 Apr 2026 15:03:36 -0700 (PDT) From: Joe Damato To: netdev@vger.kernel.org, Michael Chan , Pavan Chebbi , Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni Cc: horms@kernel.org, linux-kernel@vger.kernel.org, leon@kernel.org, Joe Damato Subject: [net-next v9 07/10] net: bnxt: Implement software USO Date: Tue, 7 Apr 2026 15:03:03 -0700 Message-ID: <20260407220313.3990909-8-joe@dama.to> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260407220313.3990909-1-joe@dama.to> References: <20260407220313.3990909-1-joe@dama.to> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Implement bnxt_sw_udp_gso_xmit() using the core tso_dma_map API and the pre-allocated TX inline buffer for per-segment headers. The xmit path: 1. Calls tso_start() to initialize TSO state 2. Stack-allocates a tso_dma_map and calls tso_dma_map_init() to DMA-map the linear payload and all frags upfront. 3. For each segment: - Copies and patches headers via tso_build_hdr() into the pre-allocated tx_inline_buf (DMA-synced per segment) - Counts payload BDs via tso_dma_map_count() - Emits long BD (header) + ext BD + payload BDs - Payload BDs use tso_dma_map_next() which yields (dma_addr, chunk_len, mapping_len) tuples. Header BDs set dma_unmap_len=3D0 since the inline buffer is pre-allocated and unmapped only at ring teardown. Completion state is updated by calling tso_dma_map_completion_save() for the last segment. Suggested-by: Jakub Kicinski Signed-off-by: Joe Damato --- v9: - Added inline slot check to prevent possible overwriting of in-flight headers (suggested by AI). - Set TX_BD_FLAGS_IP_CKSUM conditionally on !tso.ipv6 (suggested by AI). v8: - Zero csum fields on per-segment header copy after tso_build_hdr() instead of on the original skb, avoiding the need for skb_cow_head, as suggested by Eric Dumazet. v7: - Dropped Pavan's Reviewed-by as some changes were made. - Updated struct bnxt_sw_tx_bd to embed a tso_dma_map_completion_state struct for tracking completion state. - Dropped an unnecessary slot check. - Eliminated an ugly looking ternary to simplify the code. - Call tso_dma_map_completion_save to update completion state. v6: - Addressed Paolo's feedback where the IOVA API could fail transiently, leaving stale state in iova_state. Fix this by always copying the stat= e, noting that dma_iova_try_alloc is called unconditionally in the tso_dma_map_init function (via tso_dma_iova_try), which zeroes the sta= te even if the API can't be used. - Since this was a very minor change, I retained Pavan's Reviewed-by. v5: - Added __maybe_unused to last_unmap_len and last_unmap_addr to silence a build warning when CONFIG_NEED_DMA_MAP_STATE is disabled. No functional changes. - Added Pavan's Reviewed-by. v4: - Fixed the early return issue Pavan pointed out when num_segs <=3D 1; u= se the drop label instead of returning. v3: - Added iova_state and iova_total_len to struct bnxt_sw_tx_bd. - Stores iova_state on the last segment's tx_buf during xmit. rfcv2: - set the unmap len on the last descriptor, so that when completions fire only the last completion unmaps the region. drivers/net/ethernet/broadcom/bnxt/bnxt.h | 3 + drivers/net/ethernet/broadcom/bnxt/bnxt_gso.c | 214 ++++++++++++++++++ 2 files changed, 217 insertions(+) diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.h b/drivers/net/ethern= et/broadcom/bnxt/bnxt.h index 6b38b84924e0..fe50576ae525 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.h +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.h @@ -11,6 +11,8 @@ #ifndef BNXT_H #define BNXT_H =20 +#include + #define DRV_MODULE_NAME "bnxt_en" =20 /* DO NOT CHANGE DRV_VER_* defines @@ -899,6 +901,7 @@ struct bnxt_sw_tx_bd { u16 rx_prod; u16 txts_prod; }; + struct tso_dma_map_completion_state sw_gso_cstate; }; =20 #define BNXT_SW_GSO_MID 1 diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_gso.c b/drivers/net/et= hernet/broadcom/bnxt/bnxt_gso.c index b296769ee4fe..0d4a59aae88e 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt_gso.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_gso.c @@ -19,11 +19,225 @@ #include "bnxt.h" #include "bnxt_gso.h" =20 +static u32 bnxt_sw_gso_lhint(unsigned int len) +{ + if (len <=3D 512) + return TX_BD_FLAGS_LHINT_512_AND_SMALLER; + else if (len <=3D 1023) + return TX_BD_FLAGS_LHINT_512_TO_1023; + else if (len <=3D 2047) + return TX_BD_FLAGS_LHINT_1024_TO_2047; + else + return TX_BD_FLAGS_LHINT_2048_AND_LARGER; +} + netdev_tx_t bnxt_sw_udp_gso_xmit(struct bnxt *bp, struct bnxt_tx_ring_info *txr, struct netdev_queue *txq, struct sk_buff *skb) { + unsigned int last_unmap_len __maybe_unused =3D 0; + dma_addr_t last_unmap_addr __maybe_unused =3D 0; + struct bnxt_sw_tx_bd *last_unmap_buf =3D NULL; + unsigned int hdr_len, mss, num_segs; + struct pci_dev *pdev =3D bp->pdev; + unsigned int total_payload; + struct tso_dma_map map; + u32 vlan_tag_flags =3D 0; + int i, bds_needed; + struct tso_t tso; + u16 prod, slots; + u16 cfa_action; + __le32 csum; + + hdr_len =3D tso_start(skb, &tso); + mss =3D skb_shinfo(skb)->gso_size; + total_payload =3D skb->len - hdr_len; + num_segs =3D DIV_ROUND_UP(total_payload, mss); + + if (unlikely(num_segs <=3D 1)) + goto drop; + + /* Upper bound on the number of descriptors needed. + * + * Each segment uses 1 long BD + 1 ext BD + payload BDs, which is + * at most num_segs + nr_frags (each frag boundary crossing adds at + * most 1 extra BD). + */ + bds_needed =3D 3 * num_segs + skb_shinfo(skb)->nr_frags + 1; + + if (unlikely(bnxt_tx_avail(bp, txr) < bds_needed)) { + netif_txq_try_stop(txq, bnxt_tx_avail(bp, txr), + bp->tx_wake_thresh); + return NETDEV_TX_BUSY; + } + + /* BD backpressure alone cannot prevent overwriting in-flight + * headers in the inline buffer. Check slot availability directly. + */ + slots =3D txr->tx_inline_prod - txr->tx_inline_cons; + slots =3D BNXT_SW_USO_MAX_SEGS - slots; + + if (unlikely(slots < num_segs)) { + netif_txq_try_stop(txq, slots, num_segs); + return NETDEV_TX_BUSY; + } + + if (unlikely(tso_dma_map_init(&map, &pdev->dev, skb, hdr_len))) + goto drop; + + cfa_action =3D bnxt_xmit_get_cfa_action(skb); + if (skb_vlan_tag_present(skb)) { + vlan_tag_flags =3D TX_BD_CFA_META_KEY_VLAN | + skb_vlan_tag_get(skb); + if (skb->vlan_proto =3D=3D htons(ETH_P_8021Q)) + vlan_tag_flags |=3D 1 << TX_BD_CFA_META_TPID_SHIFT; + } + + csum =3D cpu_to_le32(TX_BD_FLAGS_TCP_UDP_CHKSUM); + if (!tso.ipv6) + csum |=3D cpu_to_le32(TX_BD_FLAGS_IP_CKSUM); + + prod =3D txr->tx_prod; + + for (i =3D 0; i < num_segs; i++) { + unsigned int seg_payload =3D min_t(unsigned int, mss, + total_payload - i * mss); + u16 slot =3D (txr->tx_inline_prod + i) & + (BNXT_SW_USO_MAX_SEGS - 1); + struct bnxt_sw_tx_bd *tx_buf; + unsigned int mapping_len; + dma_addr_t this_hdr_dma; + unsigned int chunk_len; + unsigned int offset; + dma_addr_t dma_addr; + struct tx_bd *txbd; + struct udphdr *uh; + void *this_hdr; + int bd_count; + bool last; + u32 flags; + + last =3D (i =3D=3D num_segs - 1); + offset =3D slot * TSO_HEADER_SIZE; + this_hdr =3D txr->tx_inline_buf + offset; + this_hdr_dma =3D txr->tx_inline_dma + offset; + + tso_build_hdr(skb, this_hdr, &tso, seg_payload, last); + + /* Zero stale csum fields copied from the original skb; + * HW offload recomputes from scratch. + */ + uh =3D this_hdr + skb_transport_offset(skb); + uh->check =3D 0; + if (!tso.ipv6) { + struct iphdr *iph =3D this_hdr + skb_network_offset(skb); + + iph->check =3D 0; + } + + dma_sync_single_for_device(&pdev->dev, this_hdr_dma, + hdr_len, DMA_TO_DEVICE); + + bd_count =3D tso_dma_map_count(&map, seg_payload); + + tx_buf =3D &txr->tx_buf_ring[RING_TX(bp, prod)]; + txbd =3D &txr->tx_desc_ring[TX_RING(bp, prod)][TX_IDX(prod)]; + + tx_buf->skb =3D skb; + tx_buf->nr_frags =3D bd_count; + tx_buf->is_push =3D 0; + tx_buf->is_ts_pkt =3D 0; + + dma_unmap_addr_set(tx_buf, mapping, this_hdr_dma); + dma_unmap_len_set(tx_buf, len, 0); + + if (last) { + tx_buf->is_sw_gso =3D BNXT_SW_GSO_LAST; + tso_dma_map_completion_save(&map, &tx_buf->sw_gso_cstate); + } else { + tx_buf->is_sw_gso =3D BNXT_SW_GSO_MID; + } + + flags =3D (hdr_len << TX_BD_LEN_SHIFT) | + TX_BD_TYPE_LONG_TX_BD | + TX_BD_CNT(2 + bd_count); + + flags |=3D bnxt_sw_gso_lhint(hdr_len + seg_payload); + + txbd->tx_bd_len_flags_type =3D cpu_to_le32(flags); + txbd->tx_bd_haddr =3D cpu_to_le64(this_hdr_dma); + txbd->tx_bd_opaque =3D SET_TX_OPAQUE(bp, txr, prod, + 2 + bd_count); + + prod =3D NEXT_TX(prod); + bnxt_init_ext_bd(bp, txr, prod, csum, + vlan_tag_flags, cfa_action); + + /* set dma_unmap_len on the LAST BD touching each + * region. Since completions are in-order, the last segment + * completes after all earlier ones, so the unmap is safe. + */ + while (tso_dma_map_next(&map, &dma_addr, &chunk_len, + &mapping_len, seg_payload)) { + prod =3D NEXT_TX(prod); + txbd =3D &txr->tx_desc_ring[TX_RING(bp, prod)][TX_IDX(prod)]; + tx_buf =3D &txr->tx_buf_ring[RING_TX(bp, prod)]; + + txbd->tx_bd_haddr =3D cpu_to_le64(dma_addr); + dma_unmap_addr_set(tx_buf, mapping, dma_addr); + dma_unmap_len_set(tx_buf, len, 0); + tx_buf->skb =3D NULL; + tx_buf->is_sw_gso =3D 0; + + if (mapping_len) { + if (last_unmap_buf) { + dma_unmap_addr_set(last_unmap_buf, + mapping, + last_unmap_addr); + dma_unmap_len_set(last_unmap_buf, + len, + last_unmap_len); + } + last_unmap_addr =3D dma_addr; + last_unmap_len =3D mapping_len; + } + last_unmap_buf =3D tx_buf; + + flags =3D chunk_len << TX_BD_LEN_SHIFT; + txbd->tx_bd_len_flags_type =3D cpu_to_le32(flags); + txbd->tx_bd_opaque =3D 0; + + seg_payload -=3D chunk_len; + } + + txbd->tx_bd_len_flags_type |=3D + cpu_to_le32(TX_BD_FLAGS_PACKET_END); + + prod =3D NEXT_TX(prod); + } + + if (last_unmap_buf) { + dma_unmap_addr_set(last_unmap_buf, mapping, last_unmap_addr); + dma_unmap_len_set(last_unmap_buf, len, last_unmap_len); + } + + txr->tx_inline_prod +=3D num_segs; + + netdev_tx_sent_queue(txq, skb->len); + + WRITE_ONCE(txr->tx_prod, prod); + /* Sync BDs before doorbell */ + wmb(); + bnxt_db_write(bp, &txr->tx_db, prod); + + if (unlikely(bnxt_tx_avail(bp, txr) <=3D bp->tx_wake_thresh)) + netif_txq_try_stop(txq, bnxt_tx_avail(bp, txr), + bp->tx_wake_thresh); + + return NETDEV_TX_OK; + +drop: dev_kfree_skb_any(skb); dev_core_stats_tx_dropped_inc(bp->dev); return NETDEV_TX_OK; --=20 2.52.0 From nobody Wed Apr 8 01:18:01 2026 Received: from mail-pl1-f174.google.com (mail-pl1-f174.google.com [209.85.214.174]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id F15D71FF7C7 for ; Tue, 7 Apr 2026 22:03:39 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.174 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775599421; cv=none; b=E2HJ2J3JeCzNKA3cpe/rKmzQE+jGRqBKXzZsBb75U8ghJZWipX8dfOjRTZ+1bdhYfXly7a/QZQNoIVMcSeP9GqYcEON7hu8Aj4NtyNtcPLweDl4QGuUSpHLEhUNst5lfrArSX+44r3/mPBp8CyH6SCQkVw5RcT9wUT9mumZKJoo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775599421; c=relaxed/simple; bh=HYlvd4hdkKKiXCo5HphlpZZZNWfu5yEtf/3fSFF+HlQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=RpsPcLTMwMYTqRaXf+zAuPIthcqsstECHN4D+oazpNYl3irrkMY9KkSeJWLVpwahAyKDZ/ji9N9OIQuqrN1ERe733y8wOanS742X8x+9wUUq3G0gm16j0GIAHo/2gRaHqr9rRiDP6XTV3Ek6Win89MI7XVkm3hCkibURnLUI89s= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=dama.to; spf=none smtp.mailfrom=dama.to; dkim=pass (2048-bit key) header.d=dama-to.20251104.gappssmtp.com header.i=@dama-to.20251104.gappssmtp.com header.b=jFnpD/d0; arc=none smtp.client-ip=209.85.214.174 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=dama.to Authentication-Results: smtp.subspace.kernel.org; spf=none smtp.mailfrom=dama.to Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=dama-to.20251104.gappssmtp.com header.i=@dama-to.20251104.gappssmtp.com header.b="jFnpD/d0" Received: by mail-pl1-f174.google.com with SMTP id d9443c01a7336-2b24fede2acso30627335ad.3 for ; Tue, 07 Apr 2026 15:03:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dama-to.20251104.gappssmtp.com; s=20251104; t=1775599419; x=1776204219; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=5Qw+qkEZgXflo58O5g+5pEjkieZdH1X7wxaS+/Ig/Ls=; b=jFnpD/d0eBgEV8JX7EwxoSSzRhI4TaXgyZ+l9n7Qg/fako059vvnDJuQ8n6OJahULr 9CbZgqGO//mJRtl5BgPjguagu2AyrJ8CF4oKjU7KgR1S2ktWynXqFyVGNOXmMFjvTCWl KqIa4UivMKDAJNDNHuRh6X1/2J4ZOoLFKWVuzHSWNsTfPl7IAgZJ102zPBLXCXovQaVZ lKhJPXEd00C022tlZroT+AKKjwciX8fFhlHvx3dy+fv9EJ5C21bfj54OSUR5RKPSOFGv PgynRyQcK8bwFH357yc7cmmcEr/1xz+vHwMkUNJEBa8KTmL8bsSsZLroHplSK0il4kzq 8cbg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775599419; x=1776204219; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=5Qw+qkEZgXflo58O5g+5pEjkieZdH1X7wxaS+/Ig/Ls=; b=P+5KZLz7yf0Mb/PUiWoOYBHJbo+iuw1MMiEn6gOk6wSgo6gISaLGaOcbLq+n0O0ogt 28YgzHC6r+5awH5P2gkwbl38shW82x0OEuAvE0hndDzfKiaXVo2hr545r31zWqJCzzsR USEaIPSgKSUAV+jWndGtNFCsiAkhP1mwsGTRvrDFvhxBzpCIa6mIfjVmBpisQzuP0vCr sotrgZ1EXY+ZRFbCRwOsgNzQ6P2ChP0Vl/FcpAen2BzcjZ1T9JZPOZslOybfh37guaK4 fqP3oPa9zDzjTn7qEGYdhVkdqqdaztsAL293zXiAPL+T9Joq4jbt2kkX8TTqb/cg5B2t 7UCQ== X-Forwarded-Encrypted: i=1; AJvYcCXCuzLMqESh6MjNPqdH3iZ/12IkNljOz5NGd1KvI28HrWqVH56JoQGs1sZBtgLSOhjrM2zbuQednwZkduU=@vger.kernel.org X-Gm-Message-State: AOJu0Yx6jmHNHU2jGaBAojiehisQMuPIctVWh+xSo2q8UMmgpPzHAbVv sJOCaTJoT4HkTzYSt6ZK6fKh408A/ndJ033M1q0g163TE5OddxZJ25f54EYosseBKvo= X-Gm-Gg: AeBDievM2l7lKbZEr9eUxQqeXrpVCHRCwPIwosgSmjBjnYusKEdEAiyV7IJM52tLtzz 0Z94nC+Lz6mCvkR9ucuB9VnvGD9At8B78edA9mmXWj0RLMDgwLS+Spn/4s2zAa4++tiyWy66twd mXcj/G5njPBrAgKYS+HZqRL9YL9A/hUzaavLg+tu3ISaQcZ5uCQtvjTzUzRO1/qibV2sse0GYW8 tldIPPcjVW8lOLnzpSXZjUk0oQgDxnDTbV0k6QmNnG6t+Rex4Ih2vXDnL1+zBlmGDobLvVIDQdu E2NxuTH4HEMTRt2/LFl8T8Thw+wpOO1UtmkRTOzKV7E+Up+atYfKR/LjOD0GVTvjlbxLlGCAyEL Pp8iESqko89c/H3C698t0VFq1BujBAY4td2NKMVO9WbF+9IMZrD81qBbIasEoElFK83tzfeoMh6 jPIBq7 X-Received: by 2002:a17:902:c409:b0:2b0:b290:f2f4 with SMTP id d9443c01a7336-2b2818e31femr206668765ad.32.1775599419175; Tue, 07 Apr 2026 15:03:39 -0700 (PDT) Received: from localhost ([2a03:2880:2ff:48::]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2b27472d618sm175379465ad.12.2026.04.07.15.03.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 07 Apr 2026 15:03:38 -0700 (PDT) From: Joe Damato To: netdev@vger.kernel.org, Michael Chan , Pavan Chebbi , Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni Cc: horms@kernel.org, linux-kernel@vger.kernel.org, leon@kernel.org, Joe Damato Subject: [net-next v9 08/10] net: bnxt: Add SW GSO completion and teardown support Date: Tue, 7 Apr 2026 15:03:04 -0700 Message-ID: <20260407220313.3990909-9-joe@dama.to> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260407220313.3990909-1-joe@dama.to> References: <20260407220313.3990909-1-joe@dama.to> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Update __bnxt_tx_int and bnxt_free_one_tx_ring_skbs to handle SW GSO segments: - MID segments: adjust tx_pkts/tx_bytes accounting and skip skb free (the skb is shared across all segments and freed only once) - LAST segments: call tso_dma_map_complete() to tear down the IOVA mapping if one was used. On the fallback path, payload DMA unmapping is handled by the existing per-BD dma_unmap_len walk. Both MID and LAST completions advance tx_inline_cons to release the segment's inline header slot back to the ring. is_sw_gso is initialized to zero, so the new code paths are not run. Add logic for feature advertisement and guardrails for ring sizing. Suggested-by: Jakub Kicinski Signed-off-by: Joe Damato --- v9: - Always allocate header buffer for non-HW-USO NICs. Avoids a possible NULL deref if USO is toggled off and the device is brought down, up, and USO is re-enabled (suggested by AI). - Adjust bnxt_min_tx_desc_cnt to take a feature parameter. This is needed to prevent stale features from being examined (suggested by AI). v7: - Dropped Pavan's Reviewed-by because some changes were made. - Added helper bnxt_min_tx_desc_cnt to avoid repeated code computing descriptor counts. - Updated to use tso_dma_map_complete helper instead of calling the DMA IOVA API directly. v5: - Added Pavan's Reviewed-by. No functional changes. v3: - completion paths updated to use DMA IOVA APIs to teardown mappings. rfcv2: - Update the shared header buffer consumer on TX completion. drivers/net/ethernet/broadcom/bnxt/bnxt.c | 70 ++++++++++++++++--- .../net/ethernet/broadcom/bnxt/bnxt_ethtool.c | 19 ++++- drivers/net/ethernet/broadcom/bnxt/bnxt_gso.h | 9 +++ 3 files changed, 87 insertions(+), 11 deletions(-) diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethern= et/broadcom/bnxt/bnxt.c index 74968ca1f4e2..73e692ae2253 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c @@ -74,6 +74,8 @@ #include "bnxt_debugfs.h" #include "bnxt_coredump.h" #include "bnxt_hwmon.h" +#include "bnxt_gso.h" +#include =20 #define BNXT_TX_TIMEOUT (5 * HZ) #define BNXT_DEF_MSG_ENABLE (NETIF_MSG_DRV | NETIF_MSG_HW | \ @@ -817,12 +819,13 @@ static bool __bnxt_tx_int(struct bnxt *bp, struct bnx= t_tx_ring_info *txr, bool rc =3D false; =20 while (RING_TX(bp, cons) !=3D hw_cons) { - struct bnxt_sw_tx_bd *tx_buf; + struct bnxt_sw_tx_bd *tx_buf, *head_buf; struct sk_buff *skb; bool is_ts_pkt; int j, last; =20 tx_buf =3D &txr->tx_buf_ring[RING_TX(bp, cons)]; + head_buf =3D tx_buf; skb =3D tx_buf->skb; =20 if (unlikely(!skb)) { @@ -869,6 +872,20 @@ static bool __bnxt_tx_int(struct bnxt *bp, struct bnxt= _tx_ring_info *txr, DMA_TO_DEVICE, 0); } } + + if (unlikely(head_buf->is_sw_gso)) { + txr->tx_inline_cons++; + if (head_buf->is_sw_gso =3D=3D BNXT_SW_GSO_LAST) { + tso_dma_map_complete(&pdev->dev, + &head_buf->sw_gso_cstate); + } else { + tx_pkts--; + tx_bytes -=3D skb->len; + skb =3D NULL; + } + head_buf->is_sw_gso =3D 0; + } + if (unlikely(is_ts_pkt)) { if (BNXT_CHIP_P5(bp)) { /* PTP worker takes ownership of the skb */ @@ -3412,6 +3429,7 @@ static void bnxt_free_one_tx_ring_skbs(struct bnxt *b= p, =20 for (i =3D 0; i < max_idx;) { struct bnxt_sw_tx_bd *tx_buf =3D &txr->tx_buf_ring[i]; + struct bnxt_sw_tx_bd *head_buf =3D tx_buf; struct sk_buff *skb; int j, last; =20 @@ -3464,7 +3482,17 @@ static void bnxt_free_one_tx_ring_skbs(struct bnxt *= bp, DMA_TO_DEVICE, 0); } } - dev_kfree_skb(skb); + if (head_buf->is_sw_gso) { + txr->tx_inline_cons++; + if (head_buf->is_sw_gso =3D=3D BNXT_SW_GSO_LAST) { + tso_dma_map_complete(&pdev->dev, + &head_buf->sw_gso_cstate); + } else { + skb =3D NULL; + } + } + if (skb) + dev_kfree_skb(skb); } netdev_tx_reset_queue(netdev_get_tx_queue(bp->dev, idx)); } @@ -3990,9 +4018,9 @@ static void bnxt_free_tx_inline_buf(struct bnxt_tx_ri= ng_info *txr, txr->tx_inline_size =3D 0; } =20 -static int __maybe_unused bnxt_alloc_tx_inline_buf(struct bnxt_tx_ring_inf= o *txr, - struct pci_dev *pdev, - unsigned int size) +static int bnxt_alloc_tx_inline_buf(struct bnxt_tx_ring_info *txr, + struct pci_dev *pdev, + unsigned int size) { txr->tx_inline_buf =3D kmalloc(size, GFP_KERNEL); if (!txr->tx_inline_buf) @@ -4095,6 +4123,13 @@ static int bnxt_alloc_tx_rings(struct bnxt *bp) sizeof(struct tx_push_bd); txr->data_mapping =3D cpu_to_le64(mapping); } + if (!(bp->flags & BNXT_FLAG_UDP_GSO_CAP)) { + rc =3D bnxt_alloc_tx_inline_buf(txr, pdev, + BNXT_SW_USO_MAX_SEGS * + TSO_HEADER_SIZE); + if (rc) + return rc; + } qidx =3D bp->tc_to_qidx[j]; ring->queue_id =3D bp->q_info[qidx].queue_id; spin_lock_init(&txr->xdp_tx_lock); @@ -4633,10 +4668,13 @@ static int bnxt_init_rx_rings(struct bnxt *bp) =20 static int bnxt_init_tx_rings(struct bnxt *bp) { + netdev_features_t features; u16 i; =20 + features =3D bp->dev->features; + bp->tx_wake_thresh =3D max_t(int, bp->tx_ring_size / 2, - BNXT_MIN_TX_DESC_CNT); + bnxt_min_tx_desc_cnt(bp, features)); =20 for (i =3D 0; i < bp->tx_nr_rings; i++) { struct bnxt_tx_ring_info *txr =3D &bp->tx_ring[i]; @@ -13835,6 +13873,11 @@ static netdev_features_t bnxt_fix_features(struct = net_device *dev, if ((features & NETIF_F_NTUPLE) && !bnxt_rfs_capable(bp, false)) features &=3D ~NETIF_F_NTUPLE; =20 + if ((features & NETIF_F_GSO_UDP_L4) && + !(bp->flags & BNXT_FLAG_UDP_GSO_CAP) && + bp->tx_ring_size < 2 * BNXT_SW_USO_MAX_DESCS) + features &=3D ~NETIF_F_GSO_UDP_L4; + if ((bp->flags & BNXT_FLAG_NO_AGG_RINGS) || bp->xdp_prog) features &=3D ~(NETIF_F_LRO | NETIF_F_GRO_HW); =20 @@ -13880,6 +13923,9 @@ static int bnxt_set_features(struct net_device *dev= , netdev_features_t features) int rc =3D 0; bool re_init =3D false; =20 + bp->tx_wake_thresh =3D max_t(int, bp->tx_ring_size / 2, + bnxt_min_tx_desc_cnt(bp, features)); + flags &=3D ~BNXT_FLAG_ALL_CONFIG_FEATS; if (features & NETIF_F_GRO_HW) flags |=3D BNXT_FLAG_GRO; @@ -16905,8 +16951,7 @@ static int bnxt_init_one(struct pci_dev *pdev, cons= t struct pci_device_id *ent) NETIF_F_GSO_UDP_TUNNEL_CSUM | NETIF_F_GSO_GRE_CSUM | NETIF_F_GSO_PARTIAL | NETIF_F_RXHASH | NETIF_F_RXCSUM | NETIF_F_GRO; - if (bp->flags & BNXT_FLAG_UDP_GSO_CAP) - dev->hw_features |=3D NETIF_F_GSO_UDP_L4; + dev->hw_features |=3D NETIF_F_GSO_UDP_L4; =20 if (BNXT_SUPPORTS_TPA(bp)) dev->hw_features |=3D NETIF_F_LRO; @@ -16939,8 +16984,15 @@ static int bnxt_init_one(struct pci_dev *pdev, con= st struct pci_device_id *ent) dev->priv_flags |=3D IFF_UNICAST_FLT; =20 netif_set_tso_max_size(dev, GSO_MAX_SIZE); - if (bp->tso_max_segs) + if (!(bp->flags & BNXT_FLAG_UDP_GSO_CAP)) { + u16 max_segs =3D BNXT_SW_USO_MAX_SEGS; + + if (bp->tso_max_segs) + max_segs =3D min_t(u16, max_segs, bp->tso_max_segs); + netif_set_tso_max_segs(dev, max_segs); + } else if (bp->tso_max_segs) { netif_set_tso_max_segs(dev, bp->tso_max_segs); + } =20 dev->xdp_features =3D NETDEV_XDP_ACT_BASIC | NETDEV_XDP_ACT_REDIRECT | NETDEV_XDP_ACT_RX_SG; diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c b/drivers/ne= t/ethernet/broadcom/bnxt/bnxt_ethtool.c index 6826bf762d26..9ded88196bb4 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c @@ -33,6 +33,7 @@ #include "bnxt_xdp.h" #include "bnxt_ptp.h" #include "bnxt_ethtool.h" +#include "bnxt_gso.h" #include "bnxt_nvm_defs.h" /* NVRAM content constant and structure defs */ #include "bnxt_fw_hdr.h" /* Firmware hdr constant and structure defs */ #include "bnxt_coredump.h" @@ -852,12 +853,18 @@ static int bnxt_set_ringparam(struct net_device *dev, u8 tcp_data_split =3D kernel_ering->tcp_data_split; struct bnxt *bp =3D netdev_priv(dev); u8 hds_config_mod; + int rc; =20 if ((ering->rx_pending > BNXT_MAX_RX_DESC_CNT) || (ering->tx_pending > BNXT_MAX_TX_DESC_CNT) || (ering->tx_pending < BNXT_MIN_TX_DESC_CNT)) return -EINVAL; =20 + if ((dev->features & NETIF_F_GSO_UDP_L4) && + !(bp->flags & BNXT_FLAG_UDP_GSO_CAP) && + ering->tx_pending < 2 * BNXT_SW_USO_MAX_DESCS) + return -EINVAL; + hds_config_mod =3D tcp_data_split !=3D dev->cfg->hds_config; if (tcp_data_split =3D=3D ETHTOOL_TCP_DATA_SPLIT_DISABLED && hds_config_m= od) return -EINVAL; @@ -882,9 +889,17 @@ static int bnxt_set_ringparam(struct net_device *dev, bp->tx_ring_size =3D ering->tx_pending; bnxt_set_ring_params(bp); =20 - if (netif_running(dev)) - return bnxt_open_nic(bp, false, false); + if (netif_running(dev)) { + rc =3D bnxt_open_nic(bp, false, false); + if (rc) + return rc; + } =20 + /* ring size changes may affect features (SW USO requires a minimum + * ring size), so recalculate features to ensure the correct features + * are blocked/available. + */ + netdev_update_features(dev); return 0; } =20 diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_gso.h b/drivers/net/et= hernet/broadcom/bnxt/bnxt_gso.h index f01e8102dcd7..3bee626a6303 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt_gso.h +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_gso.h @@ -23,6 +23,15 @@ */ #define BNXT_SW_USO_MAX_DESCS (3 * BNXT_SW_USO_MAX_SEGS + MAX_SKB_FRAGS + = 1) =20 +static inline int bnxt_min_tx_desc_cnt(struct bnxt *bp, + netdev_features_t features) +{ + if (!(bp->flags & BNXT_FLAG_UDP_GSO_CAP) && + (features & NETIF_F_GSO_UDP_L4)) + return BNXT_SW_USO_MAX_DESCS; + return BNXT_MIN_TX_DESC_CNT; +} + netdev_tx_t bnxt_sw_udp_gso_xmit(struct bnxt *bp, struct bnxt_tx_ring_info *txr, struct netdev_queue *txq, --=20 2.52.0 From nobody Wed Apr 8 01:18:01 2026 Received: from mail-pg1-f176.google.com (mail-pg1-f176.google.com [209.85.215.176]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5BFAA386C2D for ; Tue, 7 Apr 2026 22:03:41 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.176 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775599422; cv=none; b=L1RqPcRawS4M2XSayjDX8SKKyhO4rmWvxuzZ82/p+OPwr2RozOiDxnjQ1wEYXVdPr+bYACECft+0s35xdDkZo3yaiNwuF5AMNtz1GkHB9yIzRlWfVhHNg9Bfgu0O9K49ubUXtV+hWD0yCRHd1euXbPxSItxFPUHRFR7K66Z13fc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775599422; c=relaxed/simple; bh=ONLdhr/Y4nYX7wFkQ8sXxf6B9vapCHPAGDs65Lf1O6U=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Qhv78AL6SCn1uWpPnELek7FiwWEn94KNrVGPhBWP//C/7cLNpB3i5lX3HQ6bopj7khYzJDR3pumSC98ccedu9cZbQjbvmgVI0eHk5sC+05XYAE5JQKP+TNGNBLEtYGC1flBtc15HdvPrOG3wPtXpRILk+UpfK61CXohzaNfwegc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=dama.to; spf=none smtp.mailfrom=dama.to; dkim=pass (2048-bit key) header.d=dama-to.20251104.gappssmtp.com header.i=@dama-to.20251104.gappssmtp.com header.b=LdbHomI8; arc=none smtp.client-ip=209.85.215.176 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=dama.to Authentication-Results: smtp.subspace.kernel.org; spf=none smtp.mailfrom=dama.to Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=dama-to.20251104.gappssmtp.com header.i=@dama-to.20251104.gappssmtp.com header.b="LdbHomI8" Received: by mail-pg1-f176.google.com with SMTP id 41be03b00d2f7-c76eea1672aso875353a12.1 for ; Tue, 07 Apr 2026 15:03:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dama-to.20251104.gappssmtp.com; s=20251104; t=1775599421; x=1776204221; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=THgAywrnhldemc4bjm/czm0V3psmUXX0LHAppTDJAMk=; b=LdbHomI81dlBOweQG2TAPXazkivkug1ZppJIER0wdSn0o71XnJiV1aKxDxFjNwweAa PBfQsAi3bdiCuyiq8IGdpOmDyED88JmZk3pUaAX40QVvjoDXul/oB0dxWlKiBbZ0LaX/ oCWLGtlKyQW8gZdxZlxPOMppd5sRme+FsxqZFAcJ0m3P+GefNfBg18lLTWt0PFPsJw2x H+CxHhLmkgL3tNqJe+pq0bDrlXG4R1BPh0HIStBMXj6SqO4BBPE51FxCzF93+En4Eus0 1kkg+fHgTxL8LfmKQQdr7OxxqFSRVWa8PMq1aEcbLB+bRZ2jmMI0QOlqi9aJoHf1bOPv jZ6Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775599421; x=1776204221; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=THgAywrnhldemc4bjm/czm0V3psmUXX0LHAppTDJAMk=; b=FCdlp6A/o66W9NMylKPte/MYC+xDPe52PPlE34jBAdtOeVABrP5LS8lhk3C1NHRWXs K9fyut7LMVpJGl5h9kcmL/685j4ejhAapc0jZ+CUvGNSCb6lh0YkuXeoXI5UBvlFqazF TmcZXXfgVx/n6yktxKmP4fUs8PCi14v+IP3dY//szonN2KZH+yfHx6L8y0sDb72Wia3Z kh0p5QVDNmDsNaIAge/Qwbx1xOShKYU4/nvsPNnQHOJXJ38IhaqvBZN0SML9qCq6GXo0 j6agvWIejRQR3CLQl3GdZbZPIgXAwyO/XeoaF/KvPat/PTiuDpieE+UgHQ0FEzVy6H6b L99w== X-Forwarded-Encrypted: i=1; AJvYcCVLqoo9R0zaN8FP15ukkrakrkjvF6upz8KzqcaqbSOWLmUxK42S3WwvlkOEOuDu1FEd4ppOMsMnX5h1W0w=@vger.kernel.org X-Gm-Message-State: AOJu0YzHsjTLUebqymE0cyCoIt0G1TySA4bTAPq0ml6MlRk8YO8piMtF 7ztYxkEeC5YONnBwijhzoQ5wHtHKAv6e2LyV5Yt0/oxO1ORkLX+dMfZVYHJkqMd0DL4= X-Gm-Gg: AeBDieu8MYifnjJ5jPxjBQUUqCjle/WK0II95P0vasvy5/4Q7ibHkLyztJ267JJdmqz Gn/lNFG4wjAp+eiVz/bNNn9jqJ0Hb7Xgug/xO+JurnVGDN5KNOXY7ebRT7DvqmBaOG9fw0BVb9F xPX72rmEC7gZRM/kPthyOgMoSfSTySDlzG71Z/oRmbYjwvqCC1q7ZJKmeLAt0+R3Oj8a5WpYfzU x0o0mA+pzI3kkpySeSC0q0PY5E4MDPc1ZGj2TZJd50r2pFx1GHIjVZUh33jkHtdnU4uxy02fPG7 zmfiy320c8QlGAWwX7lyzKUGz3K43Bt0aw6NqfdwEeBG8NUmOLY3JoYtPG2o8nb1eqIsC+i0h/+ SEpv9RxE4zoZ9ddzF55FjVOj/WS7Dkv1tz7ktmZrGtU9ScazMlRMcFD0Vsf0bk2Vo5fLjyBrkMo vdc+Li X-Received: by 2002:a17:903:b8d:b0:2ae:fc60:2650 with SMTP id d9443c01a7336-2b2817b24c3mr185205665ad.39.1775599420843; Tue, 07 Apr 2026 15:03:40 -0700 (PDT) Received: from localhost ([2a03:2880:2ff:5e::]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2b274757fa7sm179153485ad.21.2026.04.07.15.03.40 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 07 Apr 2026 15:03:40 -0700 (PDT) From: Joe Damato To: netdev@vger.kernel.org, Michael Chan , Pavan Chebbi , Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni Cc: horms@kernel.org, linux-kernel@vger.kernel.org, leon@kernel.org, Joe Damato Subject: [net-next v9 09/10] net: bnxt: Dispatch to SW USO Date: Tue, 7 Apr 2026 15:03:05 -0700 Message-ID: <20260407220313.3990909-10-joe@dama.to> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260407220313.3990909-1-joe@dama.to> References: <20260407220313.3990909-1-joe@dama.to> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Wire in the SW USO path added in preceding commits when hardware USO is not possible. When a GSO skb with SKB_GSO_UDP_L4 arrives and the NIC lacks HW USO capability, redirect to bnxt_sw_udp_gso_xmit() which handles software segmentation into individual UDP frames submitted directly to the TX ring. Suggested-by: Jakub Kicinski Reviewed-by: Pavan Chebbi Signed-off-by: Joe Damato --- v5: - Added Pavan's Reviewed-by. No functional changes. drivers/net/ethernet/broadcom/bnxt/bnxt.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethern= et/broadcom/bnxt/bnxt.c index 73e692ae2253..68cad2951fe0 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c @@ -508,6 +508,11 @@ static netdev_tx_t bnxt_start_xmit(struct sk_buff *skb= , struct net_device *dev) } } #endif + if (skb_is_gso(skb) && + (skb_shinfo(skb)->gso_type & SKB_GSO_UDP_L4) && + !(bp->flags & BNXT_FLAG_UDP_GSO_CAP)) + return bnxt_sw_udp_gso_xmit(bp, txr, txq, skb); + free_size =3D bnxt_tx_avail(bp, txr); if (unlikely(free_size < skb_shinfo(skb)->nr_frags + 2)) { /* We must have raced with NAPI cleanup */ --=20 2.52.0 From nobody Wed Apr 8 01:18:01 2026 Received: from mail-pj1-f52.google.com (mail-pj1-f52.google.com [209.85.216.52]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 692C5387584 for ; Tue, 7 Apr 2026 22:03:43 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.52 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775599426; cv=none; b=tTrnpbOIIPnAIgKF2Y0ebPGmN/uCLMIphkXvXghbhZeEq7fS3BsEeNBq0mmZ7iTZGPc28ieCfYQsa+vrv9hJaDCrVud6cZv+ejQv6VqGNkCh69udbzZThho2EVtL4bFdRR8Sun9w/+ogr2Oq8LprEnq4OPubfYA5IDomeouBPOk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775599426; c=relaxed/simple; bh=o/NtSsecFTNFsiPqiNCLzmEF05SSxO9/5XaAXM7arIk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=gdn50UgEXl1LYw9vLkOVzx2GCbScoxBtCLO2JViEXy13Ccg260qp6Hy8ixMjVNI+kY57AZKSvza72pK6LQCt03A5DvjQq6mEudvrabuSHU4KxWo+VaZMtaBmZezj+czP1JdypVqlBP4E1CoM2XSj+07QDcqDNunn+rPOikD1re0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=dama.to; spf=none smtp.mailfrom=dama.to; dkim=pass (2048-bit key) header.d=dama-to.20251104.gappssmtp.com header.i=@dama-to.20251104.gappssmtp.com header.b=A8F05xPr; arc=none smtp.client-ip=209.85.216.52 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=dama.to Authentication-Results: smtp.subspace.kernel.org; spf=none smtp.mailfrom=dama.to Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=dama-to.20251104.gappssmtp.com header.i=@dama-to.20251104.gappssmtp.com header.b="A8F05xPr" Received: by mail-pj1-f52.google.com with SMTP id 98e67ed59e1d1-35da8d037a5so2201381a91.0 for ; Tue, 07 Apr 2026 15:03:43 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dama-to.20251104.gappssmtp.com; s=20251104; t=1775599423; x=1776204223; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=kmD0I3pcx04Mtpj/oo4F+jl+//3G3jRQHwrxWNrdT1Y=; b=A8F05xPr23ZAyBRW50hOtfIKI5FaNNvrIL2+XslcNalgNgrdz3GFTSF3zo0Hd7d9ZU lHmtk/eYMJIKI52ZVn5Y4282qTNAIuMBr0FDeHgK2Ebg60R9vt4U8qK4f0NIRskcD4bK milGHICq9G8hdnR7N+tZovni7XLJkl3YU6RmbKMbcL5mD4OFr1P3LsChDGnM2P6ua/e0 y6rgI2JPGS1je+uLccTK9OiKljSX6O7cLEJuKjwKHbI67foidwCQWnbS0y5KoVh38IWf sVaPiiyPGJzwtFnq8WQYMMwYOoht+LPpNLE1pQ/goG/lStKHPqVQVnozasuEVZuigLD6 cuxg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775599423; x=1776204223; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=kmD0I3pcx04Mtpj/oo4F+jl+//3G3jRQHwrxWNrdT1Y=; b=SwC2V2fqzkp7shFipxCIlqdCHkpqNT7ULNA3OiGJRqoKSe3qUUDj+pVO+aXSP8v3k1 ALnfiANdSC3yKEikek2fiVC+No526CmaXnSWDlc0mAdbi79nlPseLYzDAJ0y4ZxBYJ3V PcpBPwsf+oiJkr5ejm1+grOBbN+6okNW6fCdfwj/aan6qji1v3ip9nQHeoyG69a2Pzvu SlcKTm1XJkpKh2ORneA5UktSmR5UZ6xzsrtdxquGxZEveUjJt9nUjUUUMOltlITP8fXL tUdWos/1QDdl1rxubwJGL20btg+9i03gFo5/7tZwgEYFGYw6tatwPso1CSQZ2oHPM6qd a15g== X-Forwarded-Encrypted: i=1; AJvYcCXLLwiHLoEdsGEutgQG1DFIYbbqW+AHNDX1JsNhAq/rOvSeux0QtHM/eCv5hiE5yu+CnPX0mAMmo1TDUKA=@vger.kernel.org X-Gm-Message-State: AOJu0YyHaB21qR0LJiZ1iv6XHx2tHiFEo6iPDhJ+J9ukst5IwsVvlmCq qcW6B60j1e2dg9aQZRxPiRVBm55Goz1fJ0NgpkmOXNeJAi+zi/NqTa8F9FhIrWDD6dE= X-Gm-Gg: AeBDiescN/FZ/HpFkdRUkL5GbsSbnyuEi3/PPTVgQXp0/1ilLsElOCQN62lpfUjCdPT W0ohruq5dDsCYGcnNVQrJ/q1LdPOe3Ano9lcXzv7LTjSvSlDXOxUsbftYXvArhSCnwXu5NjFRzS UuAEOty+TC9Y2hxY8l6JuFkCxX2I/bJHnCyYyLCUPSMVk9P0K3T4wXLiscjtfaqie5cz7atkEOP tPohBmmpfLj48cONqltRNss0kmUdC+FY5kVCmUqMeVR50sO7+zaJkX88LA/wxe2urGfpVMB8FiH 7gaF284Eev1Q4kJXJhdMdYzImXZoWJG+EzsH7RDyOaitrNvzw0gezAoZO/pDOxtzOV2TOm8nzPC hFfmiS/g+Q9tspSCktq4LirxS0pDkU1YIIWC+TfwcOvT4K+D8icgLpbdUHSPIMU8vN2D98N6CY9 Dmw6ty X-Received: by 2002:a17:90b:2251:b0:35d:b00a:3c54 with SMTP id 98e67ed59e1d1-35de69acf35mr18090837a91.22.1775599422777; Tue, 07 Apr 2026 15:03:42 -0700 (PDT) Received: from localhost ([2a03:2880:2ff:40::]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-35dd35f7229sm19645039a91.7.2026.04.07.15.03.42 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 07 Apr 2026 15:03:42 -0700 (PDT) From: Joe Damato To: netdev@vger.kernel.org, Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Shuah Khan Cc: horms@kernel.org, michael.chan@broadcom.com, pavan.chebbi@broadcom.com, linux-kernel@vger.kernel.org, leon@kernel.org, Joe Damato , linux-kselftest@vger.kernel.org Subject: [net-next v9 10/10] selftests: drv-net: Add USO test Date: Tue, 7 Apr 2026 15:03:06 -0700 Message-ID: <20260407220313.3990909-11-joe@dama.to> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260407220313.3990909-1-joe@dama.to> References: <20260407220313.3990909-1-joe@dama.to> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add a simple test for USO. Tests both ipv4 and ipv6 with several full segments and a partial segment. Suggested-by: Jakub Kicinski Signed-off-by: Joe Damato --- v9: - Use UDP-LISTEN instead of UDP-RECV in socat receiver (suggested by AI). - Fixed stale docstring. - Removed unused return value. v7: - Dropped Pavan's Reviewed-by as there were changes. - Update to use ksft_variants with a generator and a parameterized test_= uso function. - Save original USO state and restore it at the end of the test. - Replace sleep with cfg.wait_hw_stats_settle - Use a socat receiver and check tx stats locally instead of rx on the remote. v5: - Added Pavan's Reviewed-by. No functional changes. v4: - Fix python linter issues (unused imports, docstring, etc). rfcv2: - new in rfcv2 tools/testing/selftests/drivers/net/Makefile | 1 + tools/testing/selftests/drivers/net/uso.py | 103 +++++++++++++++++++ 2 files changed, 104 insertions(+) create mode 100755 tools/testing/selftests/drivers/net/uso.py diff --git a/tools/testing/selftests/drivers/net/Makefile b/tools/testing/s= elftests/drivers/net/Makefile index 7c7fa75b80c2..335c2ce4b9ab 100644 --- a/tools/testing/selftests/drivers/net/Makefile +++ b/tools/testing/selftests/drivers/net/Makefile @@ -21,6 +21,7 @@ TEST_PROGS :=3D \ ring_reconfig.py \ shaper.py \ stats.py \ + uso.py \ xdp.py \ # end of TEST_PROGS =20 diff --git a/tools/testing/selftests/drivers/net/uso.py b/tools/testing/sel= ftests/drivers/net/uso.py new file mode 100755 index 000000000000..6d61e56cab3c --- /dev/null +++ b/tools/testing/selftests/drivers/net/uso.py @@ -0,0 +1,103 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: GPL-2.0 + +"""Test USO + +Sends large UDP datagrams with UDP_SEGMENT and verifies that the peer +receives the expected total payload and that the NIC transmitted at least +the expected number of segments. +""" +import random +import socket +import string + +from lib.py import ksft_run, ksft_exit, KsftSkipEx +from lib.py import ksft_eq, ksft_ge, ksft_variants, KsftNamedVariant +from lib.py import NetDrvEpEnv +from lib.py import bkg, defer, ethtool, ip, rand_port, wait_port_listen + +# python doesn't expose this constant, so we need to hardcode it to enable= UDP +# segmentation for large payloads +UDP_SEGMENT =3D 103 + + +def _send_uso(cfg, ipver, mss, total_payload, port): + if ipver =3D=3D "4": + sock =3D socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + dst =3D (cfg.remote_addr_v["4"], port) + else: + sock =3D socket.socket(socket.AF_INET6, socket.SOCK_DGRAM) + dst =3D (cfg.remote_addr_v["6"], port) + + sock.setsockopt(socket.IPPROTO_UDP, UDP_SEGMENT, mss) + payload =3D ''.join(random.choice(string.ascii_lowercase) + for _ in range(total_payload)) + sock.sendto(payload.encode(), dst) + sock.close() + + +def _get_tx_packets(cfg): + stats =3D ip(f"-s link show dev {cfg.ifname}", json=3DTrue)[0] + return stats['stats64']['tx']['packets'] + + +def _test_uso(cfg, ipver, mss, total_payload): + cfg.require_ipver(ipver) + cfg.require_cmd("socat", remote=3DTrue) + + features =3D ethtool(f"-k {cfg.ifname}", json=3DTrue) + uso_was_on =3D features[0]["tx-udp-segmentation"]["active"] + + try: + ethtool(f"-K {cfg.ifname} tx-udp-segmentation on") + except Exception as exc: + raise KsftSkipEx( + "Device does not support tx-udp-segmentation") from exc + if not uso_was_on: + defer(ethtool, f"-K {cfg.ifname} tx-udp-segmentation off") + + expected_segs =3D (total_payload + mss - 1) // mss + + port =3D rand_port(stype=3Dsocket.SOCK_DGRAM) + rx_cmd =3D f"socat -{ipver} -T 2 -u UDP-LISTEN:{port},reuseport STDOUT" + + tx_before =3D _get_tx_packets(cfg) + + with bkg(rx_cmd, host=3Dcfg.remote, exit_wait=3DTrue) as rx: + wait_port_listen(port, proto=3D"udp", host=3Dcfg.remote) + _send_uso(cfg, ipver, mss, total_payload, port) + + ksft_eq(len(rx.stdout), total_payload, + comment=3Df"Received {len(rx.stdout)}B, expected {total_payloa= d}B") + + cfg.wait_hw_stats_settle() + + tx_after =3D _get_tx_packets(cfg) + tx_delta =3D tx_after - tx_before + + ksft_ge(tx_delta, expected_segs, + comment=3Df"Expected >=3D {expected_segs} tx packets, got {tx_= delta}") + + +def _uso_variants(): + for ipver in ["4", "6"]: + yield KsftNamedVariant(f"v{ipver}_partial", ipver, 1400, 1400 * 10= + 500) + yield KsftNamedVariant(f"v{ipver}_exact", ipver, 1400, 1400 * 5) + + +@ksft_variants(_uso_variants()) +def test_uso(cfg, ipver, mss, total_payload): + """Send a USO datagram and verify the peer receives the expected segme= nts.""" + _test_uso(cfg, ipver, mss, total_payload) + + +def main() -> None: + """Run USO tests.""" + with NetDrvEpEnv(__file__) as cfg: + ksft_run([test_uso], + args=3D(cfg, )) + ksft_exit() + + +if __name__ =3D=3D "__main__": + main() --=20 2.52.0