From nobody Thu Apr 9 05:05:23 2026 Received: from mail-pf1-f172.google.com (mail-pf1-f172.google.com [209.85.210.172]) (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 BD4E838551B for ; Wed, 8 Apr 2026 23:06:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.172 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775689578; cv=none; b=XlhRm7a+Va1XMOCMYtMSuGchLv2Y/9ENGsH1gaQRvQvMnDOXJTGSoT9h42wkOuXyVBJ/0K7OVD4W6Z5//hj2YDNVl6fF95+b3YvzN0SV3Tch6Uibgq3NuuZAsE36aQS1+kp5CerEFtYlPcUsdiTwfgRxjlaG0YAbW6Oi9zWl5MQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775689578; c=relaxed/simple; bh=YIes5cU3SqmREM9iUpg+bn8ckA7b0K+MOnpTltjtgmQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=EcLrCxl2KsobJMU+nyUJVjbHVp2rjjA6knRp2yX8d40cR0MV147DvNh3d86R6sD+4FlHzk3NmNQJEdWyB/OlmCtvWvTGIOnRzqMMFK5LMiMn3NcXkEEiCohW9eiQqpRRBBptILtxjCC0MVnKyfmJz+DKjSZQ8rmFyKKgfejggl4= 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=v4Dpg1Iy; arc=none smtp.client-ip=209.85.210.172 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="v4Dpg1Iy" Received: by mail-pf1-f172.google.com with SMTP id d2e1a72fcca58-82a893d289bso178987b3a.0 for ; Wed, 08 Apr 2026 16:06:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dama-to.20251104.gappssmtp.com; s=20251104; t=1775689575; x=1776294375; 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=5AbroiW4NzUMkLQ+obPP91NPAmsnd+jvu/c9Q9osH/4=; b=v4Dpg1IyRyVP7lXSe1PBNSjeQ8JYr8faRJZnZh9y/ubcZAaEnhenFR4s/RXPW7uuKE acdBWXJFkXIy0n2wlbizwd391peOkyH/AnoFx6S+VTaWhOEyFvqM8B15c4kMAXZ+Av1V u98iciUoz1RQwAAvZRr+V8S0GM7UQFXsadHPzADNE85oj4giplEhTSEw33COuVD5r7od epSsL81yM2+erDSPq11N0AtZteVh0vx7NDt6LMnaEUmhyrxoyPGWk7ymv4baMPlshZNo mxA+J3B+a8XgvNX8t8dD9TvZj/E159mj9fRzkSS1THxn+Lrsla8QOMiKD+KxXl1m59q3 2taQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775689575; x=1776294375; 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=5AbroiW4NzUMkLQ+obPP91NPAmsnd+jvu/c9Q9osH/4=; b=fSV7jQGY8D1ZYvy5GEhIgNkXbUK3EB1Ay3pRSIS9QDFXh2HGb6eSKYHPK23QI0FLKC Ifusthf3/03qlaGHJy/vjx3ClnLS99AxWW7sVg8/2vzOc7YIRz2LMMheQlz+P9jbJIOe 2SAgguvr6iVMy3TH6gJ/5RKfqgrtDqIDY7I7FCwLI6zDyakHWFlgkIH6Usz4ZmPf5/wP 6ZvqSRR99D4AHOeMtNDWe+69p2Jljw4bMnj13seXUrq2o8JvJfMZI1O+gkrwY0Vp1Dfb 9yjC09sAEs4KOAc+UHhJaeOuUbQFK21VRgFqeuEX4D6pszpurU6LinoovzoL7AJBzE06 5b+A== X-Forwarded-Encrypted: i=1; AJvYcCXQpBHvviKQWlFCUYAMCnsPN/p8mMJH7suPDUdDvdEETPM7jxDuM8ayfEHAx6oKft+kORnM8QIBhOhT6qw=@vger.kernel.org X-Gm-Message-State: AOJu0YwdNSThOv9SJB92n/b/wqD7NfHceRgUARlEjOy671s6weqypipp OyGfS++R6iaPSN9grOXvtnoTL7j7V0JaLA5cITvofrOiBsY2ior+nW5skN3VblYxHLI= X-Gm-Gg: AeBDieud/OIE95G6W67zi/JDROE++G4xn+Nm8NAxKF2o4RefiN4nWJJ3lbXmSr9MvM0 GhuvypPLw1cTZ9UY/fBe2PpNbGn5o/SHx0ceI1vCyHpTR4fwU4a7/WPTwGyeyZoC9mJaflmc//O Hm5Q/7BAq0CSv7ek0U3JOdyo2mQAqGOKMLCg0+2LlGR06Gz3nhrDNhyRFtx+azWjILOPSQTK6jM OeKx8b1tQ3WzDOpW2ucALMxvzUFTfqy7y5LLzvuQtUh1C1CzgahIae/fStMIKOCv1bf0kEYezzh FkEN0Ph97UhiiXue0X8QEIsvltDulQQHktYkGypPI+NmLk6DnAWhyDmgKnxJAXHHANjsdQu9Euh gcLRQFb6JSVj8mkBJ9APTfahXCNYKXszG/uxewTDjARNyTpwVngX3IbzQT38bgyAB0jU0kXxofi ujM0gtgRTY61j18/A= X-Received: by 2002:a05:6a00:8018:b0:82c:215d:5e9d with SMTP id d2e1a72fcca58-82d0db6bfc5mr22050259b3a.32.1775689574978; Wed, 08 Apr 2026 16:06:14 -0700 (PDT) Received: from localhost ([2a03:2880:2ff:53::]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-82cf9c6fdd7sm21984579b3a.48.2026.04.08.16.06.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 08 Apr 2026 16:06:14 -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 v10 01/10] net: tso: Introduce tso_dma_map and helpers Date: Wed, 8 Apr 2026 16:05:50 -0700 Message-ID: <20260408230607.2019402-2-joe@dama.to> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260408230607.2019402-1-joe@dama.to> References: <20260408230607.2019402-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 --- v10: - Wrapped some long lines. No functional changes. 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..347b3856ddb9 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 Thu Apr 9 05:05:23 2026 Received: from mail-pg1-f177.google.com (mail-pg1-f177.google.com [209.85.215.177]) (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 6C88B3A2577 for ; Wed, 8 Apr 2026 23:06:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.177 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775689579; cv=none; b=PIKz2H8XRJ4+pYnufYfViFK1kKnOGaWDTXcZuFMWzWyk9TunkE7ETv8itKRMFeygTUl0fCHMY3jpcBkSqC6xj8qrgu4cwkXmchs01b2MohdS3qHl26zpTP3Sl69pVISQKigmLa6yxl0f1vqlflDk6Q5/HARORJ5mP8+EStOUILI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775689579; c=relaxed/simple; bh=iQ727465s3Aho370Tuxfm2rIvW+aDujPQFCVr+k8Ilk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=N47NrM8h/dTr+yPe/HED9mUAPirPB1JoqVfLT3EcaJJNbsQhAIcdnJkKMgd/ZJEpGdBGFl9IDn9txhD6UtwLR71uR7YlCdsaYuU51RCpSNyxxQ5U6BJ6LpplxeEZQ2S+RvyGV7+7nvftqRxSm1w8yrJoLj+PcIKTOK2Kd11jIzs= 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=oC7/0SVK; arc=none smtp.client-ip=209.85.215.177 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="oC7/0SVK" Received: by mail-pg1-f177.google.com with SMTP id 41be03b00d2f7-c76e702e01aso98695a12.3 for ; Wed, 08 Apr 2026 16:06:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dama-to.20251104.gappssmtp.com; s=20251104; t=1775689577; x=1776294377; 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=oC7/0SVKdwYANoxlUzEID2Ps3IGo4jPsKP7rVf0MT3E7ZvFzmHVIaxL9hjCYpEcGMu 9wKF6N4K2afil2v6nZwdlDf8b9pMutMwBd4LCKEUEW9tRtryughgWcAGosg6M/FneCFC j6a3byuyRecGkxJhUpx+CCxBEAiJRMIF+f5aLgx1N+yAZ/f7apAHCVSdu2gsAlahul2t 87QoIH/qxsIS8pdKsp0oJyMFUel3gXK1RzIHKmNFmut/gCC6ZpbBcIAhyvtOOxVsz90K 0P2DoX2BpQFOou2zHLQFex2oVLlQVcq2f8vbcRpl7ugXVPZZu9zJNHiJdwSjyOD3wUfA 2/2A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775689577; x=1776294377; 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=E5ZcO8jzk6PNQo7z7Hg0pEVPm6tij9wMaMYKI2UKVwslXz6sJL55Nu8kUiRj4qYbLL CGmabckAuiRRv2yc9YPrWtjI8P36hZHCesHpKmtK5Z6D2LD1vTIilnmrx3h5stapMUiz YdMG3995GXYYalWp9EU2u3c897NBnAqfM3ydYJg8Brg7lch24kT7/pciwzj1htS/nTjD 6opZMlzC7TtxfC1pNdUa3PJtjanYp8jn+N7e7a+HTNh50QvJdgQWjwJxKAyYTztPoOc0 HVvHpUM04W357xkXv5HZKiS6WNOlnEa5g5Gs1J2wRBr+vDs1d9U5b6tD9ClEWSAxqW5b 0vTQ== X-Forwarded-Encrypted: i=1; AJvYcCVS6uWeGClZZ6CokzowogmuT/v9hW7FKUDyt7z+7BQcpi5OQ7ITapg/1J7wrgRwjUgBfmIrdCTk986DVeI=@vger.kernel.org X-Gm-Message-State: AOJu0YzfTgKBa6dIdt0yyOwtfOzwD6veNRqjEccEPU2pmfHOkl/mgmnT mGjSOayVac0J8pUKMc7xxy48K9boMov2SA/TJXxchR5jRqrCVy45oHCqpxB9IlExjRU= X-Gm-Gg: AeBDiet5zQoNDIeR6UmAezRG+w8dCPeh59a/HJ6zDuOd/HM/npxRroQGzbSuX3gkCVA xRAr28LnlBv1OErErSMxC9qykmHWUSAbTZ60KUODOa28Q5Gub0Jc2omQr2j6sm+HIH0tyJaJfXK ccLScbj2q/HljOykMILMCLYJwa4bwkS1BiS8Hc3azYq4Q2Y+AGkzRIMFjZ/g+wSwMnuXo4Gp25Q bA/BH096VQE6o30dJ2qq40d0vrSprf00GXVSzcNAr+PWK1q+TaYpLnTQGDd6+K2TfNVz6dr5CR3 Qz1xVqUvyqS9NW+yy4lcM1ukbIZQBweLQSA8fItDaHqxc3uSIhuE/xmeocdGiQgqwj/R3hLJ/zX up7wq7f4F4nsrL/1P/RmNwh1Vl2yi7DRThZJgfeBtCtsXiuCH+2NtSRhyfPfL2CwD3/SuSjn1yg SfcgU= X-Received: by 2002:a05:6a20:1582:b0:39b:81bf:15e9 with SMTP id adf61e73a8af0-39fc836ad66mr1704962637.51.1775689576830; Wed, 08 Apr 2026 16:06:16 -0700 (PDT) Received: from localhost ([2a03:2880:2ff:7::]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-c76c657e5f3sm18819347a12.23.2026.04.08.16.06.16 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 08 Apr 2026 16:06:16 -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 v10 02/10] net: bnxt: Export bnxt_xmit_get_cfa_action Date: Wed, 8 Apr 2026 16:05:51 -0700 Message-ID: <20260408230607.2019402-3-joe@dama.to> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260408230607.2019402-1-joe@dama.to> References: <20260408230607.2019402-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 Thu Apr 9 05:05:23 2026 Received: from mail-pl1-f170.google.com (mail-pl1-f170.google.com [209.85.214.170]) (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 489CC3A3E82 for ; Wed, 8 Apr 2026 23:06:19 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.170 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775689580; cv=none; b=o+VoCXfxg4MCyRjYIwE4cxMqOTUQNVJYPXAJQvZ8pT3kmE4sT3mYCrGMek3b3bxC3EnR84ahj4kUstvZq3JCUNySU8kbB0sqigIZZSsttgeAnBpLrxW7OWOX2OaOl2QaPgEJVTidUlkvQ2340t3v7Bz/U47umr8lwFd2FIUTjGA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775689580; c=relaxed/simple; bh=QNzOKPdiy8cSJfr1mCdxlpDpX0PCIjFpk/12ymL9Mjs=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=rzWybe6VzLdAckihHkLLxjFMDfGxfLR1oe4w2OoFHlL1GI7jp/5YCoXM20aHJPFkkrsYoWvPBm+18TxpXn3vehdqPbRLCNYdSlOczLLJ0FIXt0nSXuZ3eJL+ssQYrYGo8ESiUdzdj3qy4q0eIpSZ9vCuRAPDxnhEOSbjTdUK1JE= 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=Yu4GHqHx; arc=none smtp.client-ip=209.85.214.170 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="Yu4GHqHx" Received: by mail-pl1-f170.google.com with SMTP id d9443c01a7336-2b23fcf90b2so3077885ad.3 for ; Wed, 08 Apr 2026 16:06:19 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dama-to.20251104.gappssmtp.com; s=20251104; t=1775689579; x=1776294379; 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=Yu4GHqHxwec14DKmN/vD3ZDMghhh3b8/fpdhJW3CzVn2/ZZynrjyffrP9qS/qyt6bt cCyrxKMTCHlUV4bpGlxoadz7xiA6MQ92YHDlnJ1BrYBEGfC8FBj/I6hLUVlkh7LUx/bM IctFAKFeGb6yI3ba9TaSVnf5uP0jnDN288G6lMypytDnLUtoQQ1aBDjkFJJdbpJSC4Cv K/DS4qad+nWlnnzCDNvSNyQlZogULfB10/q9KLS38dwGxbRJCxKs4Q63H7bJYiuFrv9A YpX03turW7SXUmMXIkkeKfDXRFkrgAsqDmOzcBl23G9dDMMgn/SFxIi5t8hrDgN/DP5x /oIQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775689579; x=1776294379; 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=mm4Tg9Za/bbC5CxZImjvRMjF+/HVGLIpVdtzJLvKTtrVHOgTYCwCJRIcV47DE4+yyo 4r6PLrEnAOhfs/USbdTvFco6q9R3zK4DyO1bTIzTBXNc7iNZ50oFTJbUVFqnA4f/mNDN 6CpucvfkcWmuyA68Tcdp/AjZ0wdIb+Fe0NliSPPUZIUCiwvLVriu++zjxRNUrFeSg2KV Nt73BRxLiduqNdK9oyht6IUmTS+eQmz4T8YySdfpnVe9Y6gmMNsnMixvAf1p2bAc6AFy yJf2KIOCkEt32osLKI7/F9URkmNF8oKNfw5kkZrMGcJgbxRI+PcYc6TlCZLAZysliZcx eJFg== X-Forwarded-Encrypted: i=1; AJvYcCUM4ysnNa7UmdlNfVjXTGysrQ7rJOJa8HuPsFmpitGkP6LsHXtffVaqaw0KR8+2i+eLr8lHinp4147oy5Y=@vger.kernel.org X-Gm-Message-State: AOJu0YzMeKCr95KtyKL9OhUtKb+qPCIABAkFvGChX2O8pBMhXHpsTyvo 6shDctv7HeXkyryXvp1GWBlE4l9v2MAG/wQ/vRivWfAV21hoeunZlprjfjwJUnOQzSg= X-Gm-Gg: AeBDieuH8TGPuRCAVvE0WhobQUN8EaOTgwoLImzhbeVUSbGah5QP5qQA88e/911m1qe VddLI6+3CZ41xTH90TMx+IeQ/MsTnUqLxcxuzu4WCQfC5O8cvk//IOVsZgI5Xm1XpKNM3676OC8 sFr9lZ46PqhyrXxrJx181aSMV7KDobwTwPLtp8B5pVw2iBISITaoydqA0s1b/naXaT9r2d7bQEY PyDjbyJU+Lm5qukcPMkLdJmaeQUBFKATAzBl+NHFg35XjDqadVTPdCf8NhIc2yRkwWQPMYBGnvU zwi2TH1Ja7R+eNBXXNN/lcGuD6N+jQCi6MOt8Qg8DeSCNmCdep1/8UoiTAN3vinYjCeGl+G+/HP BkkXThZoEnQiCwRi2AIV4LqPT8SU5mjaSiHgHkmFOSbEWiv9MOl4BB5OHzBDPJseHANdt5xBmJL baHjOk X-Received: by 2002:a17:902:cec3:b0:2b2:42da:25cd with SMTP id d9443c01a7336-2b2c73b7809mr11898445ad.45.1775689578634; Wed, 08 Apr 2026 16:06:18 -0700 (PDT) Received: from localhost ([2a03:2880:2ff:43::]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2b2ae05991bsm67534355ad.70.2026.04.08.16.06.17 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 08 Apr 2026 16:06:18 -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 v10 03/10] net: bnxt: Add a helper for tx_bd_ext Date: Wed, 8 Apr 2026 16:05:52 -0700 Message-ID: <20260408230607.2019402-4-joe@dama.to> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260408230607.2019402-1-joe@dama.to> References: <20260408230607.2019402-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 Thu Apr 9 05:05:23 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 DE8E93A3837 for ; Wed, 8 Apr 2026 23:06:20 +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=1775689582; cv=none; b=JKITqIrYdzVRoulrvZYKlQUxlR/5twDFodzE5SazRy2svOPkYCERr3pAe42Xqcch5xxBExyfaPU32f3TsjiRpc3rcu8oqXDoI65VeyTjghRaTxIp0qL7Is6JTxTw3msxt0+ApMXo1QLYlliBsuzTkY0nypD1WKquGt/sFZfXBO4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775689582; c=relaxed/simple; bh=fXVVTuT2LucDBjgyvLhod33t9NcbQmFzfj2SceXVkGQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Zvz2M2AhH8z/FCXaOmlEvpQ4iR02viPaYkoOxkhWelzHhZJ6wd1YBuWf9ec06wL5d0mNCr3HqTFi7Y1meeOeC/vN613VCjKJzblOSnc+DfpOsDw4B8DiHKOh5HGlsG3l5Q5wuwjtnScbrW+l5s3Cxy7bGFhOrEpfimBAj+ZBWZ0= 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=0FU0a03W; 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="0FU0a03W" Received: by mail-pg1-f174.google.com with SMTP id 41be03b00d2f7-c76b9efc299so174906a12.0 for ; Wed, 08 Apr 2026 16:06:20 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dama-to.20251104.gappssmtp.com; s=20251104; t=1775689580; x=1776294380; 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=4/0tFpaFbzTo1zya3B3vdal6d8UBkMJIZuCoRs4U+Ow=; b=0FU0a03WRI75cxkvdthe80YSvRngikXJfXcF/vO0IgMSuzN1ObHZHTcYGWKtBxeO1/ WnUYSXE9dHLHXtGHBmq4MYoD93oWshmkQ/ttm/mEEJaOQEr4XdWj+w+M5Hi3YFjMAQzv +8e1rbJ7vFP8RwEcKfwbkSG7pCQYqtXG4006FZNyco0MrO9aqnZixcE78eMro7SjWDy8 OsYg8G0Mmsfykz/nSlQo+t0tySBvBcoddRhg4yMouRNj4a/4YHU3d26yNPcn8yTxGWai VvGbEBIrcoocNwYwFx48ypLKvOwr4fRlzuIUEr9Er1jKF9FOB6LVLYs5aekOUkSmU8S2 7B+Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775689580; x=1776294380; 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=4/0tFpaFbzTo1zya3B3vdal6d8UBkMJIZuCoRs4U+Ow=; b=Fljh76IYnaKLcwAKSZsdEvl3iBFkY2IGde0obJxncZ4vuzMLP664OJqyl4MbgpHmCj tOe2k4hpJxam3Pf9uUt0rur9IR2v4eT+l4P6gar72z7mBuWc4QFE55DR5dywdHHoKpkj 4KqreRctZ4Zq0ElB+WZ2KJ6MuO+ehvqx1BGAKr3uHmFbVUDgx6gkvGtjkdA7lGomEAKu ZoiGNLbiCwVm4uoFtAsPc6tsebLt2CkeAooHacLgxcvu8Fam0ew8qBZPz6UljY+ZPTmK UK3KdVc8IF7CC/nKVbvqf2Q0ucwrpIRanOcZFTXbcGD27FXmtdQ7iSy21QuomoYv10Vs tL1g== X-Forwarded-Encrypted: i=1; AJvYcCUmrrisweR8JKWbhwdyEtKA8Rer1O+ZgIEjqUjT0FAM2kTWXkB4r0yAKVx8fUeT5yYM9ezhHPZ6ru7mYCo=@vger.kernel.org X-Gm-Message-State: AOJu0YxiGk59zujgn98dlW0xY8augEFPHbDsEHa6IOQm+Kx/56QEKCNI 3/lyuafbyjF3IexwCpvn1pwZqlMPfWIazCsLSu72AHgxHpT0zOfYE82LTOTiH8xdwFE= X-Gm-Gg: AeBDietKdKtBChA2oj91RiJf7DwDmR4xrK6hJ2ryyfAPRoiMZBWlFi/VmB4SHqEvOwz 6E099iB/43fI0c3jryp3A7zlcccpNziBjPmjl9ft3PkEX5CT7RjIQbYpqE7tGQkqZQlwl7rCOPb qrYAizAD1CFs3Qc3T5tGib6m05TO5eGDTbttFbIKLoFs0AxuQZ7iK90bP+zdduTxIGcF0OUyeM5 zPsNXScvEWl+vY5BvvqiQKDM2tUgImbxk0UgxUscNeyB4RST3y7iWQj6iDGSDePoZs/TUz/1cVD yOoLo1cJJ6AQFQ9UsuUmya34jbXvWl02LxqTxyDV/Fy72SEqouClnF4kaPKJqh2q4u0KuUIlgEy 6/rR0nirRVJ3el08JRbN1oU8uDWmdUi2/zehbRUX5JLEImd2LbeIjZ8dZeTXlfluIFlvqOcEqXO 8vl9A= X-Received: by 2002:a05:6a21:e098:b0:39c:235:c5d7 with SMTP id adf61e73a8af0-39fc8335cf0mr1635427637.39.1775689580393; Wed, 08 Apr 2026 16:06:20 -0700 (PDT) Received: from localhost ([2a03:2880:2ff:5::]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-c76c65935cbsm19886380a12.26.2026.04.08.16.06.19 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 08 Apr 2026 16:06:19 -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 v10 04/10] net: bnxt: Use dma_unmap_len for TX completion unmapping Date: Wed, 8 Apr 2026 16:05:53 -0700 Message-ID: <20260408230607.2019402-5-joe@dama.to> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260408230607.2019402-1-joe@dama.to> References: <20260408230607.2019402-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 --- v10: - Wrapped some long lines. No functional changes. 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, 41 insertions(+), 22 deletions(-) diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethern= et/broadcom/bnxt/bnxt.c index d1f0969b781c..bc2dac2f137d 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,9 +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_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; @@ -3429,23 +3443,28 @@ 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 Thu Apr 9 05:05:23 2026 Received: from mail-pj1-f41.google.com (mail-pj1-f41.google.com [209.85.216.41]) (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 E36413A5E82 for ; Wed, 8 Apr 2026 23:06:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.41 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775689586; cv=none; b=axU0ufeBMbDukiUFM8c3jPKEu5s2X991P6Hdh9jd15c9eS5GY9Srgeh77nINhr43fhP9zfIIMrFKnH8yiU64nUKr89BeEmGbPxxOs/83fB9lxCPbLR5/wN07XIBGPNu9MQb8YV89zT6jOvi9fs3mph7XKkLwHsma+gYVW70jDYg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775689586; c=relaxed/simple; bh=8w1yvo40Mcow3i5mEHFfEWtVjjXczfx9WgRXGd/eCtU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=bS+7baK5bXCJ8YJRmTtknTEgpYmFuufSx/cKO9KmQoknozQK3I0AvlW+OpOp32WQ4HjkzU7kbInySrQYwGpHE110t3/IdT3loiqIf7HRPWygs7tNtUh3XZEAMh3/U2yFKdAKgl5rk79BoHSEJM1jWOWzRTt7CFxLWE5jN75X6UY= 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=ugwuwA1A; arc=none smtp.client-ip=209.85.216.41 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="ugwuwA1A" Received: by mail-pj1-f41.google.com with SMTP id 98e67ed59e1d1-354a18c48b5so288925a91.1 for ; Wed, 08 Apr 2026 16:06:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dama-to.20251104.gappssmtp.com; s=20251104; t=1775689582; x=1776294382; 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=MnRAQ5V4t4u8fZFyOBxhZgdMrI5z8qJPA9QEsYZg+gU=; b=ugwuwA1ArHv8bLM+5ew3jp4RuUYzJo0dV+3d12eR7KOmqrxmaIWy1lOk5FNaFgoX03 vIAKL5slMaQ+g86G7DwYW3Kl8bitULZMpdihbE3bXx6AW6BHkI5w3oTNOLi+zoDftCVt mWUQcfc+1MvKtXfE84CjCDsp0+er+ZOgf7UcS15SBMryJoVT0ECVuHIF0QqoQsBaEu+T m3KFUO/eVGUYARNJgikUT99hjNT5naWUyiyF6sad5ZTT+98Wbl5O4iPJhbPOYLYIr8EH r43pPhp6ApzR4L7hhzVxVLjjNdbh+N5uPI1C5rRQqKfOo/CgZaby+2piKmlPjtlZPNqJ Ntog== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775689582; x=1776294382; 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=MnRAQ5V4t4u8fZFyOBxhZgdMrI5z8qJPA9QEsYZg+gU=; b=Zhv/1uZ0jHs3NCjv1FWs6b9gk16ZX2z5dY3h4Hsznq7LmxDKsl3b+a0q3avuMws/Sp bDvvJw9GwKkS7RLpYkU/4QsUJs606mpfUUNuU8hdNw0rF5fXln94SzoIfOShUtDxzBHf i8sVfDRTomczYZwIiYGYpbFNOVD5M4wq15rpDEbmwXEGTbelT9AJ9oxec6I7wcUkfNd+ 0jt9Do749HpSqw8cOBDlgPk5is9GEENMB1tMi2tmyu+7F9TfzDcDV8r60BDCBtFxoGHA Bcmy0bJeJJJmByB4vz1dvTWUmqQnUJUqtuoeS1l9fKAa0fWXDaj1mpx/JxAbDDnx64M2 wt5Q== X-Forwarded-Encrypted: i=1; AJvYcCViqUo5fQhengE91uT5XUJzUuEuA1t0DeCbzsg/bAISxHvp/wetv/FlKd1qbKOdCPeyCNSmlU7zZrrq4bk=@vger.kernel.org X-Gm-Message-State: AOJu0YxmMIWCvtG63JzeXG6IG92067R9A+vIK4aHFbLC45a1yMsjB6Vg 064mnS3svsO4SUltSEKKIVO/4I8pvt3mx4hgPyQf6mxJfP5ekL6/x911DtNLb75/fJI= X-Gm-Gg: AeBDietHENDZXQrqHJyzMakUlK0SRRG0E/M+szPl0OfeCdDY+MQahlInaGbzIjwpbod 3EGxe01cGJNA4/yLtjw2gKp4Zs56Rhh6rAcC3qqljG/IvteQSTrslYrXgxyBl/WrtGUGtO3wA3o GN2CsmOKW/PvA/HXgu6qsPz6/p0Z2vs697QTwJBgtFHmvGXIQitpM9NcdniHTnfb1LXOv/yxslN TXymHdxl0tcfZFczq9cqgPxJZoFIYOzLnHyBq9Mh9q4rM5aZGdqAVFPZHAZJjmcgk55bEwET4gj utXyJ5ppPPqRQxHarSrpLwqv/Z64WrDxSFIirMMFfTXtqZh7VEFm8cpVvHE5I+63f/tNOHJjm8r wq1DQZlABoGDfnNmBa25eLx+mQrvDqT3znXe9IZv6soijb3IR4vTabHQVCzM8hYcw4yRYauj2bJ v1jv4= X-Received: by 2002:a17:90b:4a48:b0:35d:a861:36dd with SMTP id 98e67ed59e1d1-35de691b2fdmr22131751a91.25.1775689582234; Wed, 08 Apr 2026 16:06:22 -0700 (PDT) Received: from localhost ([2a03:2880:2ff:9::]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2b274756621sm210947835ad.20.2026.04.08.16.06.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 08 Apr 2026 16:06:21 -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 v10 05/10] net: bnxt: Add TX inline buffer infrastructure Date: Wed, 8 Apr 2026 16:05:54 -0700 Message-ID: <20260408230607.2019402-6-joe@dama.to> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260408230607.2019402-1-joe@dama.to> References: <20260408230607.2019402-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 bc2dac2f137d..bd93edb09ee0 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c @@ -3979,6 +3979,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; @@ -3997,6 +4030,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 Thu Apr 9 05:05:23 2026 Received: from mail-pl1-f173.google.com (mail-pl1-f173.google.com [209.85.214.173]) (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 2612E38551B for ; Wed, 8 Apr 2026 23:06:24 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.173 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775689590; cv=none; b=j/NZmH4lelSOS6dkxldVJ3lUbE7SXaTvcjzAGr/EwSw4/6k5Mi589vsseSc/+qMoMGZA8A0rV0cRuGkV0zISGgYZEWbjksFnTzBqrStFj1yrbthgmZ8T9ZzKqRrKRYirYzQCjEne8I4FaxQbqoxGDFgioJB5pU/VvooGKirs6zg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775689590; c=relaxed/simple; bh=imhnP3c90RnqduwmC0Bs7sD+WwiHek5Y56xEli2D4zw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=cGxp6aTXNR8vTJ4Qv0c+7RRx/l0jJwenWuX8UptfrVSSbjRHt62g8oivIPpy6kSLPxZgTPGVAyPOqtEC9fYoHMPXV/ArCU5SoH+khH0tlyY7wJVRgja0zX6/8dQ28112Y6MPXmUaMK509mdHCbNXa1ZUnE7oMUGF/pwMOZ3ofAs= 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=PCd+W6uJ; arc=none smtp.client-ip=209.85.214.173 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="PCd+W6uJ" Received: by mail-pl1-f173.google.com with SMTP id d9443c01a7336-2aae146b604so2431135ad.3 for ; Wed, 08 Apr 2026 16:06:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dama-to.20251104.gappssmtp.com; s=20251104; t=1775689584; x=1776294384; 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=PCd+W6uJyv2pSwLleizYtKZImlVCVQPf/pogGHl2I7eZ2DxxDTOxNVSvGxCY9SS6ZQ r+8YaKQF1EPKNkgasH/o2IWcrNPOt71q8hGdUZg2h7/3waFbPEkVcUNFDuVrzLLo0aaA waQDL+GhBEIcc1BK8xDqW1vEKviepj2fL0N0xkDCHsGcy00suldpTPr3BVDU5RwIzkhU O7adZvmjYZrSu2IdW2ZyMaKGcQGVia2VK68WlnCHGIKv9PNd4gH7NcuzNTxVCDf5425X Jelil90Arem91upK4tJBr3TVJWfd5LcyffdDsssWJoLVw52WdH02quewebC58FhLgk6k Ddbw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775689584; x=1776294384; 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=TpZvpi0QWQ5Ht2wR8kxSEuzn8KJDibMDTE0YtOw0PY0X378k9kOcPepcgpSlSkyZJ4 sxqoHnbg3F0XNpXn8cu8y4t72BfddLa5TGCW8RvtRO0Mr3outnfuKrY3H2LPtyHnefqN xTlndeiBemkIkOVMwESjrF+JDt0H1AvzkMjZR2z71qwR+0eahIG5iQVdFtffn4gxK7s4 HrrYDLOXZ0jxAPAiBdWepGphy4UaOwph5V6MfB6edId2wgxpL+o7ZsLkkCSnzY2PWQ+s tZ+2Ol9Tmo2wv6xky+cLwtb4UxPWa+CHa858ohM0ULZnSGfofO5A71AvQFV11m/E0wBN S5OA== X-Forwarded-Encrypted: i=1; AJvYcCU2TXyUDllc4KwIQyTYf4yI87Ynm723i52fn28PX03v584ML2vYeV4DJZRj6Pe3UQ17Bn2mgiTLLAgkAr0=@vger.kernel.org X-Gm-Message-State: AOJu0YzdebHwd6PDcnKFTq3rhVInN6pigZHJQ9OialJzPAU7362cE+iN hma6zxFmsy/tmo7hnTmFMJeKsMJf1Rr51BJfjLfH5WCLgiaaUkXsCjoM9gU4ppUyjfQ= X-Gm-Gg: AeBDietZKoMrRVXcrLXxmS0oRFFdtpTsr69dwqylQOKOaNdP5OQzAwL+dazCUAhb/5y bZ0MVhP8vwJS6MfZds0OrjzhvpMl1two4o4UghGdct+AynlZrgmzi4hmyZtaNXxvod6DOXTMhdI 7xX1Jxuj1t2mz5P95WjYKvFDsKz0LFCVjWE+riBqewABgAoPZMHQ7++RDxXvOiyjm4F8oOXwdsa lPUQrUS182DsMsC7Vgs3kAOHFdp9urShi8lfga9nCnBzamaRXOooQJ4UZNoC2I3CRH2Gm+JAJ/N jM/02l612Uw0xq5ia5uwK4dVjbiPpCmKBIFuSdv5xgnL+dS0QW+1smLXZ0P/FEs7d2WLl5/DJKq NDVop8F4nVRnT0vYl6pEL5qLq2Kmfy8Dl6dTsdDV7FvwjwDavZhszSIlBZGNB8FRsZqOD+qKSOY pFlvhz X-Received: by 2002:a17:903:287:b0:2b0:c2d9:270a with SMTP id d9443c01a7336-2b28198d6e9mr235351495ad.42.1775689584518; Wed, 08 Apr 2026 16:06:24 -0700 (PDT) Received: from localhost ([2a03:2880:2ff:5e::]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2b27475ff56sm213190295ad.22.2026.04.08.16.06.23 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 08 Apr 2026 16:06:24 -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 v10 06/10] net: bnxt: Add boilerplate GSO code Date: Wed, 8 Apr 2026 16:05:55 -0700 Message-ID: <20260408230607.2019402-7-joe@dama.to> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260408230607.2019402-1-joe@dama.to> References: <20260408230607.2019402-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 Thu Apr 9 05:05:23 2026 Received: from mail-pl1-f182.google.com (mail-pl1-f182.google.com [209.85.214.182]) (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 619933A4F57 for ; Wed, 8 Apr 2026 23:06:27 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.182 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775689590; cv=none; b=LokL9P7z3PWJ00bX/It7pEHu91KPfnSw1ZyRqNszUClqDlwdluVMVby3INock7ezIwrV2v9rFUBsjMTFOTiLwIXU7SVAu7j+6bLlWfNTcMJeN7S1M5SxOebbNkZJKdeYwuaSQ4h0aG5ZwAJwO2EHgaDOQIayP37Vr78rUCtAyzk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775689590; c=relaxed/simple; bh=oxJ3LwxSwwc0LnddS9sQc1dmXDbXx5hORvtiE2/j/DA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=neOPdz82A8iThrpYw5rsuEPnTJpWcNU+Wthq/tWdk1+JfYk9SFouDW1m1el1TRnVdR09guQwnnRNN7tv4YMUgpBLM7+YdvmSRmBo/XDyVTIAsRY06c1L+cjCF7B6ZEFUOMPZ0MaOY2Hb0HKzK8/EOtpj8gNQeSwC0FW7SNJXUzs= 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=eeA1a6jl; arc=none smtp.client-ip=209.85.214.182 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="eeA1a6jl" Received: by mail-pl1-f182.google.com with SMTP id d9443c01a7336-2ad9a9be502so2127415ad.0 for ; Wed, 08 Apr 2026 16:06:27 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dama-to.20251104.gappssmtp.com; s=20251104; t=1775689587; x=1776294387; 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=t7bTsPTNXSPKGGJZeRPb0v0fjH1kEH3FFQpQ70Mka9c=; b=eeA1a6jlLrwZvctAWLaRvCSWfbPfwZXqfe3fUYFS0fpz1ZmuQAK/aU1YYmul4Gg8Pl zWfLtT/+xv0+AgmMXMbV6ZmzTQFsh4pdVCQTKhR61iB6uqmyJJk+LvzK+/lDt495OSMq +LZ4qaTuScoicc5DAQsrd2GIehlGEMGvmEJhcAgyaTi4YqCO9AB1u+SUNSCXofUcfKKt 2WjFsVan27MKDYUNQhiZbAkl5VuByjoLaXpJZiKUK2VDN91UCwOC33yj+8NhaWuuGnQG 78YfdJTURBllFa60n4fxxXE25LytAGv7r0sUtU7TjrPJa12qgQaLTBOB4WtXlmgEgJSV 6yfw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775689587; x=1776294387; 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=t7bTsPTNXSPKGGJZeRPb0v0fjH1kEH3FFQpQ70Mka9c=; b=jZrGNk0Z/fghZe/1hHWZt/8gDhA3CyYxxdopnJygd1KS/z+ifFrBYPAdxDbU1dzwtq P0xmCEh6D5GRb9YV+6bkQZ6sQlxAMRI6XvjuRpAMaLNcKtLaI4atlqDTXEgFAar6Wdfz TJeN9awQGsKmhSYa0JubcBBK0TzYHeVky4BEna6EQJYJqcvU3ntmdE3psRhuk741nurB D+0NiZae56H3brLi11IGqfNY4w6iSG6k02HOoNamd9NVYwHTNr0VOQYV51ooB/+27ojw Qv0KiLZibsWvt33oLxMEL86A6x3exJvak0iVJ3m58ADuUMXeX8fOAVMpCa1pMjE01V8B p74w== X-Forwarded-Encrypted: i=1; AJvYcCVjFWdN0Ayc3pZI288l5hbAqCzzuvV+vQ3fHqoxKhD+AFAnui2fYX5QnlNVbDcB8FGBb4BMadP7P8jMs1A=@vger.kernel.org X-Gm-Message-State: AOJu0Yw6VZ02m+JXpgXWiTunIKegzbLIQnjdSMj8vNuD8Vq6U85tvEjX W1lEIqeZf52v3xu0oz6Ix05nJBvhINPBdjQrxccIymJoEiIxU/+d9hVzB475Sjnwky1A+AYBeZa 5lvii5Mg= X-Gm-Gg: AeBDievXDK3EFC+4e6YD4Ft4noZz7visC89A2el/wgBUJHKxTTBipERjCMUemoZ4xf/ f701snGzvR3MqfK81tLXxRg1o+9PDHaJaup1n5HjGwdBviQZSZE1KecAkDcraWyMlpe9C5/fBmb 3PluRLolCIb7qIs71Fp6PB8pJWYrryYmCEix8RRl/2Wk3/ZGkgeG/AbTICUGBRGg7vHQ73A12aN Xwm6TeUKc6Imyxpw1RJ3JOb9Zk1cpqm7ncyrZcdarqJSJpWR9DQh/cD9QLnKvqdP2285KXxw/PS 4VZPZ3GIRS9o4fJpL1jlZUgV+w8+yH7+k6yTBsKsCRT3gl3Qe780cFQd0cb1WgblxS2s5MKLv8z 7/rZx2jFYQOsp2FopBVyB4bU6MFJEYmMlQ+bV5Gceda4iNsqQpWKEzdwXXG1x6IUj74kcyxTbyv gIKr/D X-Received: by 2002:a17:903:1aab:b0:2b0:72c7:3ed8 with SMTP id d9443c01a7336-2b2c7340a5bmr13462005ad.25.1775689586629; Wed, 08 Apr 2026 16:06:26 -0700 (PDT) Received: from localhost ([2a03:2880:2ff:53::]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2b27475ff56sm213190855ad.22.2026.04.08.16.06.25 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 08 Apr 2026 16:06: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 v10 07/10] net: bnxt: Implement software USO Date: Wed, 8 Apr 2026 16:05:56 -0700 Message-ID: <20260408230607.2019402-8-joe@dama.to> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260408230607.2019402-1-joe@dama.to> References: <20260408230607.2019402-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 --- v10: - Fixes the inline slot check added in the v9. Uses netif_txq_maybe_stop and an inline helper. 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 | 210 ++++++++++++++++++ drivers/net/ethernet/broadcom/bnxt/bnxt_gso.h | 6 + 3 files changed, 219 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..f317f60414e8 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt_gso.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_gso.c @@ -19,11 +19,221 @@ #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 cfa_action; + __le32 csum; + u16 prod; + + 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. + */ + if (!netif_txq_maybe_stop(txq, bnxt_inline_avail(txr), + num_segs, 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; diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_gso.h b/drivers/net/et= hernet/broadcom/bnxt/bnxt_gso.h index f01e8102dcd7..6ba8ccc451de 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt_gso.h +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_gso.h @@ -23,6 +23,12 @@ */ #define BNXT_SW_USO_MAX_DESCS (3 * BNXT_SW_USO_MAX_SEGS + MAX_SKB_FRAGS + = 1) =20 +static inline u16 bnxt_inline_avail(struct bnxt_tx_ring_info *txr) +{ + return BNXT_SW_USO_MAX_SEGS - + (u16)(txr->tx_inline_prod - READ_ONCE(txr->tx_inline_cons)); +} + 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 Thu Apr 9 05:05:23 2026 Received: from mail-pl1-f175.google.com (mail-pl1-f175.google.com [209.85.214.175]) (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 505D53A2577 for ; Wed, 8 Apr 2026 23:06:29 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.175 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775689594; cv=none; b=OhbGdluV1vewuLkgJF41gh2gIhgt2t7N05IE57QqDDNuNAA3oXFl9tJuDO6OSKQpwMSdHf0iM+B/h2IutLF9G2GKBZ4ThqBTMeSZ3gtnf9biTsn60R6TmLSFNMMh8mvgf8VLybRzNcqepneH2ZCPLpzoSOxGPv13iYt6yrfqZzg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775689594; c=relaxed/simple; bh=r0znbPiRamQbWgnOeDNrPZwKEc4KFxR7p34H/kzdSl8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=YvZtz5XxXCcektV+yiLtoxSvkGqtqbtsgFpqbrybfSpj5vAIElnNIlUVTYzq4+p672n8m4vpJbkSSD/xE/2JK1mprhVU9v60Ke35Ylex7ly39gk9YbV6OKThqk1tq2UvVgWUGkSjUE3b3E2SMrFb42g0WE/ZYxYdtDu0Qa+sM4E= 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=QPJhXZhT; arc=none smtp.client-ip=209.85.214.175 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="QPJhXZhT" Received: by mail-pl1-f175.google.com with SMTP id d9443c01a7336-2a7a9b8ed69so2764935ad.2 for ; Wed, 08 Apr 2026 16:06:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dama-to.20251104.gappssmtp.com; s=20251104; t=1775689589; x=1776294389; 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=ilY9w1UZiWm/ILI/BayVivC49jozyBguzBsmp+OC5C8=; b=QPJhXZhTMkQRWPUOBwd3lU6ZKyD2JQ0nGDZ7nxhfh5XpxfOWideCVxEZAT5E5IJLpK 9n9HtY9nvHxb++LHwsQFDn5idkpVF/U67cR1CQUYuHlyNLwpizw4nYGtSWFX8m4ySHIs pjvmSxLX5Basax2WPImq9hFoZv55LOTIpjB+rJ/OVS8LMVgYqiEktOqbldWs8xtxHpn7 SZLzJMMbuP8a9AoOynd29xiNkSkHMYDHVmvA3NE4pKU7u5bHn/lIYk4vqsy5MYf57lzY jqnj1gmjWyQVPY5NnURaxsRCbgaKFAdezcfV5fJb5OBO5k+hS5Ta2zSUxpT5yNZA4YuC 2jBQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775689589; x=1776294389; 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=ilY9w1UZiWm/ILI/BayVivC49jozyBguzBsmp+OC5C8=; b=FPIdEqu7BP1LY5aNfp/Zxq7A9QCH7tSEUvV48zC1Y1CwWl4gkA/kFh2uxKgzgZOiSz e/FFsmiRxqZY9zihcprMkw4I0GIR1Yw5x9uGp4Kyf2UucH+kW5Wvz+k8Puz/jVIALo1c 74pbtYqxFKx/UlN7Jx6L7Yo0Y6fH75HRu3xM39xZ5jxpQd2VheckdERhcUpHLR5vHrtS hm8fBuRPBEC0wRFPFwzgsjBHusVBrZT3khKZcDbKIyofU3J1HFoDFEQKRlJs7ATlLhiO kkXdphTk7xC6JjA4OCFcxImoO9vCSj1aqsfg05y/tIgdXTBSX8xx21faexH732ToAtZG Tz2g== X-Forwarded-Encrypted: i=1; AJvYcCUKYrPLHlQIZ2BguVyzhtDaamo4AfDNuWbYVWmD/4frqzzS1xcEKtjSiqTDusoB5RwlABGAuzSA3Qoz9r8=@vger.kernel.org X-Gm-Message-State: AOJu0Yyq8MlGinheNanBbR4CKUSvm4OZrGRc8xz87soTxTLT6SFfXSc8 lsLV3rfZJuonrtbyekTYcgAVF4GXFqojL28yBIlvSaLk6W8DUcWCaS9EWTOo3BZjHjg= X-Gm-Gg: AeBDiet3cPIUqnSgNCJXngddwWxj8siSrqGGKLR37b4VfM+ykjGI8BB0YzVpF9KaRNs 8wdZ1Cr/n+UGhBcRaXR19rYBD5W3oKOCvXYXd5DUfy4U6iA6op4cU/cfcBSNhbSrxC1PA9ZgOHM E4VDtXc41rh7jGQ+fFVj0ubWrWqPb2tit8Cw0C8/HG1dZeOk8CPXkvnRWiWv24bqqCqX0Y3cD3Z AoOjwItL6R378SGJg3YywzwqRHdxJFwhV9tK0/271vlK8Mvu0oVUoobeLF0TncTsiasiGce1xkw ZkGQKmtuohEt19WAOxHC4rL8HfI0qG8hswyZ2mNfybBe9bHMqtroGBjuaHSMPKo+dNhrP/9DL87 vtp/4AzFTSjDWbNezfLZuh7e8/7ypzEaihrvzUfjEBcsov5Sth8iFj0GirsOASa+zIzzg0B59+D N6wF8= X-Received: by 2002:a17:902:ccc9:b0:2b2:42da:25c4 with SMTP id d9443c01a7336-2b2816ca44emr266936545ad.14.1775689588753; Wed, 08 Apr 2026 16:06:28 -0700 (PDT) Received: from localhost ([2a03:2880:2ff:4::]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2b2a488caa2sm127336085ad.14.2026.04.08.16.06.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 08 Apr 2026 16:06: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 v10 08/10] net: bnxt: Add SW GSO completion and teardown support Date: Wed, 8 Apr 2026 16:05:57 -0700 Message-ID: <20260408230607.2019402-9-joe@dama.to> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260408230607.2019402-1-joe@dama.to> References: <20260408230607.2019402-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 Reviewed-by: Pavan Chebbi Signed-off-by: Joe Damato --- v10: - Wrap tx_inline_cons in WRITE_ONCE to pair with READ_ONCE in bnxt_inline_avail. 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 | 75 ++++++++++++++++--- .../net/ethernet/broadcom/bnxt/bnxt_ethtool.c | 19 ++++- drivers/net/ethernet/broadcom/bnxt/bnxt_gso.h | 9 +++ 3 files changed, 92 insertions(+), 11 deletions(-) diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethern= et/broadcom/bnxt/bnxt.c index bd93edb09ee0..26aae48a7d0e 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,22 @@ 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)) { + u16 inline_cons =3D txr->tx_inline_cons + 1; + + WRITE_ONCE(txr->tx_inline_cons, 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 +3431,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 @@ -3466,7 +3486,20 @@ 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) { + u16 inline_cons =3D txr->tx_inline_cons + 1; + + WRITE_ONCE(txr->tx_inline_cons, 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; + } + head_buf->is_sw_gso =3D 0; + } + if (skb) + dev_kfree_skb(skb); } netdev_tx_reset_queue(netdev_get_tx_queue(bp->dev, idx)); } @@ -3992,9 +4025,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) @@ -4097,6 +4130,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); @@ -4635,10 +4675,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]; @@ -13837,6 +13880,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 @@ -13882,6 +13930,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; @@ -16907,8 +16958,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; @@ -16941,8 +16991,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 6ba8ccc451de..47528c20f311 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt_gso.h +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_gso.h @@ -29,6 +29,15 @@ static inline u16 bnxt_inline_avail(struct bnxt_tx_ring_= info *txr) (u16)(txr->tx_inline_prod - READ_ONCE(txr->tx_inline_cons)); } =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 Thu Apr 9 05:05:23 2026 Received: from mail-pl1-f170.google.com (mail-pl1-f170.google.com [209.85.214.170]) (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 B86D33A4516 for ; Wed, 8 Apr 2026 23:06:30 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.170 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775689603; cv=none; b=V1Xjnai54iTdPe66z6ip/NjjAIDagPtVoSE3hCdOd7JoYOFc5GSnB8mRi4PXspiGAVBWVqNEu+z2lW11wWSM6GnJczoeUGAx+DWlMuvfBOhS9Oqj4Hga2yo8UBfz9qrSO2TTsmIfvAEnTbjIQb4IY5ZeUSxENHfENFkD/2flgdA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775689603; c=relaxed/simple; bh=ZEmHHdgCIKjmFksdw5ABxjeqzQWen/sEYMEcE4ycvlo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=M7xsTwrv8KsxufQLJYrk+Dj9zzaUwPQp48jO2bjoZZUR4N6SD7wQIbNSSUgAy0FmuK/OZsLtNLBdi/RkfsXVJZRcHHMkZSXqZKnR3vmAy7wWHZ0Veu1r/iI/htK8Pws4y42xNuXkQ3ox360vNEDFTfI4ZhiAZ4DaX4xyTBKAwro= 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=qc1S/qEH; arc=none smtp.client-ip=209.85.214.170 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="qc1S/qEH" Received: by mail-pl1-f170.google.com with SMTP id d9443c01a7336-2b23f90f53aso3338415ad.0 for ; Wed, 08 Apr 2026 16:06:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dama-to.20251104.gappssmtp.com; s=20251104; t=1775689590; x=1776294390; 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=V8bNxSkLagGjMoaapqryA9wYOiBX4DR7keg4lmWMnD8=; b=qc1S/qEH6ySpkEXXLMh0uPY5aq1ZTBmF7V3y9dSYb/GdRIUFA7SiqD9lvY+FH9MXmY 98VonNh6Q96Zb69zwB4YN3DiYB+MfklS6SK0Eu7LgQcQZEgsWJ7V85fvqBUwqRgGDCfV z8qE7WVbHFJr95p71YzgOXIwVGj2CP/HkwzjM+kOcNBKlAnki9sweh0uhfrpbB+8xjm9 5CBSH+W3kYhCIlpUPGp2F/6cwr6TWh3DqhivcKl0XTu1d5Pgl5mHbU+lsEH9FVnxxTMS XJBqVn2oNwY2DTnclBNbO6eYY23deTWhkI8Pb2R12qOX+cXDEwn7/87Nj3ESdXfHgDy7 rrQQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775689590; x=1776294390; 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=V8bNxSkLagGjMoaapqryA9wYOiBX4DR7keg4lmWMnD8=; b=dkBAK91kJvd0OYYAathbXNqHNJNcj/Kz1ac/dhxbkbGxr7o8ib0WZ611WeP3q2GAvr ec3V16ALmqerU+du3ATuO6r8owAv505sMPrdSFEufhOcbvVwF8sx39uDeQYHtiui0ym1 HJ8iQv4GToBlIhstnLWWkvo7fWgZQhNfkdDXgLJP67v5pUJtHzoxkDVPynA2nfvldS7s s6bRFlgZ2s3Cd5ynVHkowTLoysS2zfSZceWxBoqDsU2jErLtD0MivAw0iSaoyRtoXp4b 9KA4lf0QMDezzmLANYkVdQ085T2TAPa94X1qNLV47fHSGOhv04AtpAAATA4TMfXNXA+o 5dPg== X-Forwarded-Encrypted: i=1; AJvYcCWz8WM2znOFA29GavwOr3YNHTnVTLKUX3XiVdiy5PJFd+CmkGn8XBlXEMZxv96zoNtLDlsc4xHDvoRq2vk=@vger.kernel.org X-Gm-Message-State: AOJu0Yzre3kwbTwyG+4Z64oWgOd4E3bCucO6olpER/avktXi4No7wI2u YgB3a4EN0SdyHtGicBjFDg9D/+vrw7c5nFfvQwhaOfXFlsPBxu5roXYGGG/5lXI9fDw= X-Gm-Gg: AeBDiesBvQkWhgnGT50v3spubOeaA3/h7DIIuscwEYY4sB8RXTmGuZ12avAGc9iie9r EUhNII0s8JTyOKCP6FOsPIvx8CVQ45VBQ+FCm1RHgzWbHgRA9IXdXctOhmUY3AhTbTaWIQXbU/e lvV6mgZyaOlNIHLXLBZQHQkUhlxiyXFaM/SbGbUXqrbpD5T/R4C+gK53/ouvIV7DTHT6xV1jkVH 0nz/4RZvq7/kHEio+1tSfzKM2bj/mMpGe58Sz7UNhgBUYYcGoabx3xB3qYmp81ExpJ+DFkmRV0S L3rqOqelbl+YiffJUSQ9a3lGH8g9D4NcZdRol2FxmrSznNIhnc20Z8L8nqT02prOlUyJXxF1OPS 638eE4XZYkgz/fkgseCjQJyYURIYKjWs8beY7t7HWe+1yd+Dm/mW3R/fXLxCV1gHt98i10P98oa kT1/V4B0mnhGl6yf4= X-Received: by 2002:a17:902:ccc9:b0:2b2:42da:25c4 with SMTP id d9443c01a7336-2b2816ca44emr266937355ad.14.1775689590308; Wed, 08 Apr 2026 16:06:30 -0700 (PDT) Received: from localhost ([2a03:2880:2ff:5f::]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2b2749cbd9fsm211336425ad.75.2026.04.08.16.06.29 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 08 Apr 2026 16:06:29 -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 v10 09/10] net: bnxt: Dispatch to SW USO Date: Wed, 8 Apr 2026 16:05:58 -0700 Message-ID: <20260408230607.2019402-10-joe@dama.to> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260408230607.2019402-1-joe@dama.to> References: <20260408230607.2019402-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 26aae48a7d0e..2715632115a5 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 Thu Apr 9 05:05:23 2026 Received: from mail-pg1-f173.google.com (mail-pg1-f173.google.com [209.85.215.173]) (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 C753037A493 for ; Wed, 8 Apr 2026 23:06:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.173 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775689612; cv=none; b=DYhSrx+yZYONjc0m/Oi5eqjYSiVueWIzoIIc5HIMDT7QDZHJISOXuYyyXce0Evu6CUJpZelp8Lrmw2N629vf5jEYrH8F7jYldxkXlb1g+vZZ6H1FhF5HC/Au25VbCiqGSKOte3Helobx4j/s1oCnfJUbFO+VK+/Tk0ayOmNExic= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775689612; c=relaxed/simple; bh=eavrLBchN8fm9XIu1vqukYxkvy5howdAitN/UagQmIk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=SilflrM6UAZsQLAKA1WEkJqmPdR4Y5GC1DsAX8AdJYL8+CWJqkwqmNpvQd2SvPin7/YLfn9ku6uP7/kBoJ4kU0qWQKA3Nw7g991FzcC44NqaK9ZF67U4EhsOoGTN4r1fQe3xs1+Day2yyz/YcL+T2LgqSBHtbzPS6TRlzENTTUE= 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=lxP6H9ib; arc=none smtp.client-ip=209.85.215.173 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="lxP6H9ib" Received: by mail-pg1-f173.google.com with SMTP id 41be03b00d2f7-c648bc907ebso183034a12.3 for ; Wed, 08 Apr 2026 16:06:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dama-to.20251104.gappssmtp.com; s=20251104; t=1775689592; x=1776294392; 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=RaI/8wTi1iXn0q/44Vh7ATr+prNCrN7zaPdtxJM69Ko=; b=lxP6H9ib/yxziiVSV5eUcStMTXg6xPl7bTt/AwD1Ib5uGElTb3dfZ7gFwz68PtJjhR K1BPBNN7ixBemH6aFegfukdaDLMPgb77P8qQM75sA7ZAKWhBUbq78/5BkiuyYZ0HXgRp Nk92WEpuZ+bVZK9CnBS8NbOKKMMH9KU8b/882XhvJ8jW1IBy9PPArBKGqxG9/ZducAzh M81eVMdEE7k1NqR8hTSiTk+sc4IKfm3RWUy4aR2MxJ4Lf9IbyqerEDJ560PZp9ZpvPdN osL0VrnPWkkh4sWnknvP+zC1457GX+qbqqo7YY2RSEG5hgCTfOreo3pl+PlPSQM7VtMT O9Bw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775689592; x=1776294392; 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=RaI/8wTi1iXn0q/44Vh7ATr+prNCrN7zaPdtxJM69Ko=; b=NYRUPdPocsSH1foVxh8YxRd1Fd67GBiOxkel961xRf6ZHyXSa+T5dW5+HNnLDtiu1M 04NaLSKcNw+je93NpaH1TdDj/HZpdW0AdADnkwcmlSP72zw0ZgRhUc3Pbczg2cIY+mrX n9JATldVMpj5XZIjoFi4P2RyDgc0XtqA4xD+/XLoCAE9QjhnrpETmRdUIXGf/7kJoPMj +I9CKZhe4JpDpaNl/sN2ejcse+s+2g7Jin3x9zW2FFDLy5UEahx092+1Quo9ei71uYFf zAp42eo3icpGSHRrMJpvdAlcGFJBn6P6rzisfGD7c0/hq2txo9/tEPc2ZOYvGfH+FxfD 6pqw== X-Forwarded-Encrypted: i=1; AJvYcCXUDVaWlnskhOdEgcQ4wIA4YXrCM6O1ZbguoEoJYZRP32uU5kEcMZbZzYlpsYL0Vn1EvbQpci36LOI9qIw=@vger.kernel.org X-Gm-Message-State: AOJu0YzBtlsydC7TEAcJEU+s3oNeBRGznoGgmwRpJlyGlboEm+eYXWbN BhPsKm2fGXQGFfDJMVjD3CXnriNIvT6lQTUPXoGK26XRNWrQXBYBMQIoILU6VcR1SaU= X-Gm-Gg: AeBDieuH3x8+xBk4n0OYbXhhKQrRHg6zt3ibRPhjAQ8evWevPuspUTmGeMXFfZWHkmk t1NR0YRcaUj2cj1KV0YeJait3Ar/CUidieHPjbhEuCiZXXkK1LBz9EJKYJrtV4BxIfBpjSxlpBf SR3i4wSecW1dxleNMMeuAJnIXuDmsNrwi6Wj7LeoSRsjB+joqwMGA7ngEAJbfgDO8S2RhOzLZI9 M2kJvbjwxzvUFrJIZuM78asECbXCLbf5QCqeoyM1dout+Ea+ipurxo2gJiV7T+/Ru3dql6ZMAzr itbae+Q8hG3ZlZwYFzO73v8e1+/f9/uG2tIhTTP4aBxOnRZzURLAjtVsKWwWhaY1QIP2RbDbweu KagWBVhX5aBglKDDGK8M0K/MksXP+SIlJaZhj3G4GfaKweceS3ngl/YS8OqM3v/z3wuK/EYB1JO fKdjU= X-Received: by 2002:a05:6a20:94c8:b0:398:7998:8300 with SMTP id adf61e73a8af0-39f2f179df6mr22822579637.58.1775689592275; Wed, 08 Apr 2026 16:06:32 -0700 (PDT) Received: from localhost ([2a03:2880:2ff:4::]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-82cf9c6ad8asm22239635b3a.40.2026.04.08.16.06.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 08 Apr 2026 16:06:31 -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 v10 10/10] selftests: drv-net: Add USO test Date: Wed, 8 Apr 2026 16:05:59 -0700 Message-ID: <20260408230607.2019402-11-joe@dama.to> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260408230607.2019402-1-joe@dama.to> References: <20260408230607.2019402-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 --- v10: - Moved test from drivers/net/ to drivers/net/hw/ since it requires real hardware. No functional changes. 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 .../testing/selftests/drivers/net/hw/Makefile | 1 + tools/testing/selftests/drivers/net/hw/uso.py | 103 ++++++++++++++++++ 2 files changed, 104 insertions(+) create mode 100755 tools/testing/selftests/drivers/net/hw/uso.py diff --git a/tools/testing/selftests/drivers/net/hw/Makefile b/tools/testin= g/selftests/drivers/net/hw/Makefile index deeca3f8d080..5c348c8d72ae 100644 --- a/tools/testing/selftests/drivers/net/hw/Makefile +++ b/tools/testing/selftests/drivers/net/hw/Makefile @@ -43,6 +43,7 @@ TEST_PROGS =3D \ rss_input_xfrm.py \ toeplitz.py \ tso.py \ + uso.py \ xdp_metadata.py \ xsk_reconfig.py \ # diff --git a/tools/testing/selftests/drivers/net/hw/uso.py b/tools/testing/= selftests/drivers/net/hw/uso.py new file mode 100755 index 000000000000..6d61e56cab3c --- /dev/null +++ b/tools/testing/selftests/drivers/net/hw/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