From nobody Fri Apr 3 17:37:39 2026 Received: from mail-pf1-f182.google.com (mail-pf1-f182.google.com [209.85.210.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 CE7B42ECD3A for ; Mon, 23 Mar 2026 18:39:01 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.182 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774291144; cv=none; b=M0TA/LpQ4MoxPuLAH8vL+ln75dEVkJitlp5EHLWOA56gOUMe7/41lPoNZ4Lr26LbIWPoLcs63XtKT8oNG27+sdttdESHRLomPKo0it2MdbaV6o1Urng/ssXWGVdGfMfEn81c9bXzHJ7Yg988Y92i5BT401lIU1Ezcb6jnQ7rEms= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774291144; c=relaxed/simple; bh=89osrXGFcyoMNdsGsSYJRS7HmUWWP8RNcJMZ4Irlins=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=lMBDuRMGT4coU8y8nKd7z+zKvMzsyoKpfhDQamohyD0gl3kijJX11uvI29aMysx/UN2zIaFJbXs6yLmhTwW1hALYp6kleg61Kq3MfeWHUdOKTI4GMj3W/5F3HuIhq7OqWyfe0jsmyZx3DHx5k+vr5VfXm8XtaUmzw0cRbG0ms50= 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.20230601.gappssmtp.com header.i=@dama-to.20230601.gappssmtp.com header.b=T89p1VN9; arc=none smtp.client-ip=209.85.210.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.20230601.gappssmtp.com header.i=@dama-to.20230601.gappssmtp.com header.b="T89p1VN9" Received: by mail-pf1-f182.google.com with SMTP id d2e1a72fcca58-82a646c96bdso3629417b3a.2 for ; Mon, 23 Mar 2026 11:39:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dama-to.20230601.gappssmtp.com; s=20230601; t=1774291141; x=1774895941; 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=hzwsL2AaeOyolPivj0sSP8+HZDWRlIMJad3TwBTVVkk=; b=T89p1VN9h6LGCEoOoEJGUO0OWJq/Sj2g4haLGWe1lelkQ4y+s+dAgkOBXDLaak8NoR 759U9DUC6GhTXNgUYvBzCnHtrQMGsWkEO977OTsM2/+f/66Hn06RJR7XCvFNrqAXsQJP lDDUxA38ovEYfvo9HKFh98apoh7AZLraIr/2I6NSdORqpOzLM2FcPH912C88CeZFrcDx gkHTvDM7ANxl9tJeE8JO7jYt73+HnPntI21UZD6mADOCb5CveeBUw71L047Vy/7XVkuJ RiuqqXCR45jyEuAyKwWoJhOrdSyzbbdeSb9XoTZjEvLbkQY8LIL4YPvcnHtqniCBRhq1 eYcw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774291141; x=1774895941; 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=hzwsL2AaeOyolPivj0sSP8+HZDWRlIMJad3TwBTVVkk=; b=DJAr9YadgpKeEicmdXJWEe+HfP1Qdh2ekTQIIdHkaZP18933KGYKEzAtDH7Kf8sxci p+UsqAmJKmlFghnj/AEu0ZbkPVrXUvZgWqR6ic8by167Zd+oVoF+LZ4Bn+JuUlrxPuUT JpGvPjyV/sA5QwJcH92NLE+aEfp6J1snO+7pjVPv2KNUaNGlpG98UKFFylef6VIMygNk Ud6ActukYwlzLiijnaGqgRlUHRPSj0o9MfAYL5VrpaddHG0qvtA/wcSgjGdse07jvgyF C6XS/cZbK0BVtrrRv1zGWARDEZwQubuJsd+qstqcuROXKCYDV+2gtZbVp870LsFepS7r 8lAg== X-Forwarded-Encrypted: i=1; AJvYcCVc/rF8XYNA4hhPbQe/NaFR9X4LFr/6oWgeaUEuGgvPRdA1J0B1yV8cTMf7P4R0x3xVT/5Nqvf/fqZr23k=@vger.kernel.org X-Gm-Message-State: AOJu0YzutoPIjDr0A4jYmJbBkQ2ldpzsaULzDXYKpvNTjIKxY/1fRg3Y zv6255Zgc0/2epk3PNlImOXTYGiWxn7E0nQxu2djAo6rgBDifIjx/ah3Im76q322WL4= X-Gm-Gg: ATEYQzzV+3dKXUVes0tT6nuHYQ26A6Bq126ymww6EKkMDFPsCjf21GC+T1cnjtJmDaW ZhMQ14URSwIqBp2G5TaQVOaVgdFJAIMV7rrjxeH92BpOUyJ3evRvgxW0c0pKjq6SkcoQ9FahByy i/6TaHbRA4o7l4WRagPGqyMpzqQT3ZUvkarb0pvCe8pqs/92elvwexXiL1rRWElLyLwlZzGeacm K6jlPErAHLSooxb92l+9k0VYjf5jGR/YqZCgQqpHyxyXl79IccBnjxYNyVd1rUINuQlxNauFEZf GbyfD31xDxLL4bhiYKrXO/Jtg7RW5gCbJSH/depxL8Ui88kLd/OGB6ZmpCW2ttPjbGbWacErZzt YJMJnig3SeIi0slO+T1Lo8Pqk1ZMuOLC0Vv5QQwHNAbQv4p/ZqU2D7WjRJvY5+5lPsTabUhzhgm Oksf8= X-Received: by 2002:a05:6a00:10c4:b0:829:88e7:c8a0 with SMTP id d2e1a72fcca58-82a8c209e2fmr10800620b3a.12.1774291140962; Mon, 23 Mar 2026 11:39:00 -0700 (PDT) Received: from localhost ([2a03:2880:2ff:2::]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-82b0409c6besm11845843b3a.32.2026.03.23.11.39.00 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 23 Mar 2026 11:39:00 -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 v5 01/12] net: tso: Introduce tso_dma_map Date: Mon, 23 Mar 2026 11:38:26 -0700 Message-ID: <20260323183844.3146982-2-joe@dama.to> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260323183844.3146982-1-joe@dama.to> References: <20260323183844.3146982-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. The struct 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). Helpers to initialize and operate on this struct will be added in the next commit. Suggested-by: Jakub Kicinski Signed-off-by: Joe Damato --- v3: - struct tso_dma_map extended to track IOVA state and a fallback per-region path. include/net/tso.h | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/include/net/tso.h b/include/net/tso.h index e7e157ae0526..8f8d9d74e873 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,43 @@ 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]; +}; + #endif /* _TSO_H */ --=20 2.52.0 From nobody Fri Apr 3 17:37:39 2026 Received: from mail-pl1-f181.google.com (mail-pl1-f181.google.com [209.85.214.181]) (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 45DA32F5A05 for ; Mon, 23 Mar 2026 18:39:04 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.181 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774291147; cv=none; b=DLQV8IW6Qol2t829wGzSm4YIALLYl6Ke+MU1/RmC+uUNSzHJb59v21xOGn7w5Mc4Lazy9q52vDlB6YrZp4XShWoqDPRn+dEK11VXh7xreFhCjozLuWFCTL7namuPeF5w6v0RgHQM2wrrKCYFrz+c2Fgm+UyL2/vj+F5CQNp3YlA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774291147; c=relaxed/simple; bh=ORkpzv7iiCxiXOhQaUQdLjmDGsPudQzXaVUYF9lrn6U=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=sxo1yWZSoZpyCL3BzIsiq6DQdv0zHSorY0kNLLi0hnhnMQX36ACmlQZ/Ae65NpCa4L6t7Vo0rDFT3L0syh4pjPMfIVWvLUonKGXLOF+Imi96esHsqVhCkndSgPeLdhk3ukNnPp59fth5Q4Gjae6EmyeH1pReE71hMgRO77OKQJk= 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.20230601.gappssmtp.com header.i=@dama-to.20230601.gappssmtp.com header.b=zbuAcg81; arc=none smtp.client-ip=209.85.214.181 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.20230601.gappssmtp.com header.i=@dama-to.20230601.gappssmtp.com header.b="zbuAcg81" Received: by mail-pl1-f181.google.com with SMTP id d9443c01a7336-2ab232cc803so13566865ad.3 for ; Mon, 23 Mar 2026 11:39:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dama-to.20230601.gappssmtp.com; s=20230601; t=1774291143; x=1774895943; 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=Blw7GY0uzkKurUX6ypQhQlLBgZS5L/EPKYGZQrzDQcs=; b=zbuAcg81QiTKcIIiFRRFKdXxdSGXzXt9ySA/0+IobNlhxjuuS82BSuGDCf//0jn1gd Ppd79cT15CBCI6958CMRKfIWzSEm3sqjtaBGsCsssoXb8l1pW/uOk65XH3ILlp9YFWrd 0KWufp3mzF4AGBeXkpokKvfh9Rz6Nciv3Ix2U5S96kc5JzS2MhSzsZIF/UV2NA5ueHfB YleUbJPsX0lDgFIPfrRJcI4q4zwQJc8ZspvhHMiHxFvxBLH8qQu9yr6ORm/mJSEkuCPw 8MJoaZxU0bvkYu49ia7RX8n9Gj3cp4Vyp1uQVV08bXL55VJrzHuu3iDsbRjPbWAvL0Wo FFBQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774291143; x=1774895943; 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=Blw7GY0uzkKurUX6ypQhQlLBgZS5L/EPKYGZQrzDQcs=; b=mbzS5soovrZx221ihQaXXTn2EOPgxYrW16Oha0u0uj1S54yh83OmW1NuXJDHN019o2 o1QoGDLj9Bvp2LIUQFlfYamlVzvJ9MdNHS3a1+RTNb8pwHQMq/t9rujtkZ8aABKcpK8t X9dcWPEnivcyvBNE8uB1is5FgDU4cW3BIbrBuD3zlNcEPUGtXlYU+VEyBRs5slJ/Wf+g bocUeiix+Amq4B16qrYBgAOSRZTF6yEiCDUhdadqx0K6Yn2xC14VY5tsUxFSoLNEBWH7 9WO89P3KbGrb6Dp5qOjuW7/qfDAYhU4fF4kLhpcF68Kfh5CK66aM05styBc/1lKtXMfz XtXg== X-Forwarded-Encrypted: i=1; AJvYcCXi7hveIxk4qja6Gxdh/l8gdOWMYd1+lrAUnXWYnZgoSlqxxrTgvuYInzHkeD21NCqSlAHFBoPuzfFkvKU=@vger.kernel.org X-Gm-Message-State: AOJu0Yxf0gKrzTSwfxGh2iu2MTembm+Ql6MOoks8YJMd4FnqYiDZnL0E 9mn+OwX/ahw4IX6DNQjDO6K25X2gZl62WNaVWSIK0rrpoc9tbCR7cYSFW55f74mqp0hE3atyzlA 00JPm7gI= X-Gm-Gg: ATEYQzwF82/3SApU0zjSmi1tvkEnNqE/HzE/LzgfV/9Yc5oneeOVKaOK/0H5hp1sQd1 HzfBaliGJI6l2B8Mig9UtwybzllQXHWisdJixNPRBzqp0wSuN+Y9h0ReHVvVR4SFjqVGdKWnanU HSZrZWK/DFJlFX4o2WE1xfQNIVhCJ2kYahbN30wWdekUrFvBC9QGcYJVMhyiIVa/I3s0yskQb9l iUC1GaHrWaK5QYfSBHvOKm06CZwhgDcX+6GUH75xcR6OhHd7BmxA5PIJuE/nQTK+lhMv6sArqKh 8g6ikKV3LxY9Ra+WiGlmy3psAS2ZPmRqnMKGCdsnsYQ3nqU7+Vswrt8ir5e+CPXOJlHsuBuWHs7 qSEnLSMQsz5zuphM+bsvNkD22Tbq2yLSA80e28LjaERXYYcQ+iH7guX+2CxUu+QXMOsM2Nm0kMv TpwcLX X-Received: by 2002:a17:903:2984:b0:2ae:c981:2a29 with SMTP id d9443c01a7336-2b0826d826emr120431255ad.2.1774291143338; Mon, 23 Mar 2026 11:39:03 -0700 (PDT) Received: from localhost ([2a03:2880:2ff:73::]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2b08354772fsm118263465ad.28.2026.03.23.11.39.02 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 23 Mar 2026 11:39:02 -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 v5 02/12] net: tso: Add tso_dma_map helpers Date: Mon, 23 Mar 2026 11:38:27 -0700 Message-ID: <20260323183844.3146982-3-joe@dama.to> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260323183844.3146982-1-joe@dama.to> References: <20260323183844.3146982-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" 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: 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. Suggested-by: Jakub Kicinski Signed-off-by: Joe Damato --- v4: - Fix the kdoc for the TSO helpers. No functional changes. v3: - 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 | 21 ++++ net/core/tso.c | 273 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 305 insertions(+) diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h index 9cc98f850f1d..d8630eb366c5 100644 --- a/include/linux/skbuff.h +++ b/include/linux/skbuff.h @@ -3758,6 +3758,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 8f8d9d74e873..f78a470a7277 100644 --- a/include/net/tso.h +++ b/include/net/tso.h @@ -68,4 +68,25 @@ struct tso_dma_map { } frags[MAX_SKB_FRAGS]; }; =20 +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_use_iova - check if this map used the DMA IOVA path + * @map: the map to check + * + * Return: true if the IOVA API was used for this mapping. When true, + * the driver must call tso_dma_map_cleanup() at completion time instead + * of doing per-region DMA unmaps. + */ +static inline bool tso_dma_map_use_iova(struct tso_dma_map *map) +{ + return dma_use_iova(&map->iova_state); +} + #endif /* _TSO_H */ diff --git a/net/core/tso.c b/net/core/tso.c index 6df997b9076e..8d3cfbd52e84 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,275 @@ 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; + + if (!total_len) + return 0; + + 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 (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)); + map->linear_len =3D 0; + map->nr_frags =3D 0; + return; + } + + 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; + *mapping_len =3D (map->offset =3D=3D 0) ? region_len : 0; + } 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 Fri Apr 3 17:37:39 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 4CA792FE598 for ; Mon, 23 Mar 2026 18:39:05 +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=1774291149; cv=none; b=tKZDN/PKddHoyrBJR8RWYCSY/Z6Hfy5qHmBpYZnLJa/h1+rQGdUdvQApn41LHSe6p+y5KGmTwScD5Le7RNzSzkI5xERYeFLxiKSY+eAjzR9evnpChgAXtImrMxRekyI1cLqGnZJ2roQR8xXkUd0NDx4JbWBq5NKjWuWYbo+Z394= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774291149; c=relaxed/simple; bh=4WtChQ/QU+gA3V13D+0Xu72gZs69AnOhMz4s0cRfWH0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=hBGZN9YGH6YnswinPliABLjS/HeQXc5r/yGwe92DxqfK5njPHHFzGoZD+3lsY9GoOKLkdW6wWtHrOtcD1gsjr2gW0OHIj5EtaSIoT+5EsugZ1klKv+sDnIY3KDSad7zryh3jsmB/up6LwnvF+BhqF5mbZZ8/+dpqvCBmP7qeeAk= 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.20230601.gappssmtp.com header.i=@dama-to.20230601.gappssmtp.com header.b=HMozXIB2; 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.20230601.gappssmtp.com header.i=@dama-to.20230601.gappssmtp.com header.b="HMozXIB2" Received: by mail-pl1-f173.google.com with SMTP id d9443c01a7336-2ab39b111b9so13912885ad.1 for ; Mon, 23 Mar 2026 11:39:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dama-to.20230601.gappssmtp.com; s=20230601; t=1774291145; x=1774895945; 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=MLwGXFLtuJ9cDWhdalbhm3etGoACm7cTjmdKCjTFcmc=; b=HMozXIB2rChSL3/4svtSTsXf6wj9KKcCkh2E4Q9iGDkgVEvMpWpXjBMAamrWTz4bfL wXvYuEfetx+web0T5SVv2vi0XLirYf0Y/NhGAMqX+Wk97s05mTyoT0WrtqZJ3Xoasikh 3wcLhmdYbQIJtvBc3XcHM8rRn46llCOfnxSynQqr8x9zXreNh8AVRaElLVL96ZsO2vSA tX2nnCs5yDFIoE+zkdfNe+z0QEB0/GeXdzRDnNW3DmIfLwTB1CKT+USvzYNF7SK2itv0 j3Bq/97xOTeB1aIy/mLXDJsS9mPfVZbxXvM8DLDa6Mww7p4WimLhyc14wtdbJV4QFnuW Q2qw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774291145; x=1774895945; 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=MLwGXFLtuJ9cDWhdalbhm3etGoACm7cTjmdKCjTFcmc=; b=bVXecZ/DzroPaz+euIh2cUjjm7Uny8v2mhbnoCLbsqEJpx2yCfXP3epArraRc1BcL3 /uLI+q68xKci2ZeYZ/jvJs31bwQlXFgnSaRrMrpiF2vs2YBPobDS27orCETtE94ITYcK DusRXu1BWEAAwqe4jM5zbcoxwbn8m7xM5zcDVPVcOfd7oCKuh1uHa3/yeiGMgqaGztoM j43FsPg+5OA4pR9lgt7kHOggCZ2eXxuncsHncsES6sU2HEvXgAa2LsEhxbMTiLo++aIA tpl7rVoxErJgNki4vMSP16Insqr5DXt06a+xV8dwoXz02nugMeYZhAS2XpQ8ZeOmxp8W LQtw== X-Forwarded-Encrypted: i=1; AJvYcCUeQMjR5m0NYUEFt6ZX4olCJl6+5pMvTJMrJoZeQECevNktBNjp1uQzefU8sQJSB2OOlfmbkQMgtKfclkQ=@vger.kernel.org X-Gm-Message-State: AOJu0YyxG7Xo79Frack2+YDdpLtloDsZhNPN2/oB7525HAiwsiDSpyhU l0v3pNrkcQ0xs7RzWT+2V/3qckCr+wWTJhE6sbPmTSOyQcZrlzmFkBaYSIK/nx7vM98= X-Gm-Gg: ATEYQzwksttYW+lfNCZtoXODfXvRAtlLgS2+B/Hb7Q/o8xRJCRZ2vNPuE2NZNOMCBqf vUZsvhb7ZFZHf/1AlWntxSPJUPvI1ryrM5fc03MlRYJdpSx6PWUOcw8U2wD9DfvpnTwWmeMW44X HXV5+8qpjZyvd0QS0ap89djO6x6yqh2gEyrGntRTV+8pA+KAcqPnmOlsDxk4zEw7US/HmKOvhZt jn3MIZWYPRIswWbQwR4TcLk4UTTFQ5cAcLlQmyIcIhloxDIilEkZ/kPhWyPL6xVg9SlJ6lttN+9 vnNM93lYOpdkA9DgXporamxe8noxp08QB5YnB6/i3mN3jNGKUcCdnYImbUWJ+FR2ceOcolLOFQ0 89syKE+W4xk1GFNQyAsmMi61sjTBOYKx6TKu7tefcQc04Tw/kKy1dKsrGqOnO4qBp7Dv1dsx2xt fBIdCW X-Received: by 2002:a17:903:1b6b:b0:2ae:bf92:5acc with SMTP id d9443c01a7336-2b0826ff359mr123141045ad.3.1774291145183; Mon, 23 Mar 2026 11:39:05 -0700 (PDT) Received: from localhost ([2a03:2880:2ff:47::]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2b083527f90sm114602505ad.19.2026.03.23.11.39.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 23 Mar 2026 11:39:04 -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 v5 03/12] net: bnxt: Export bnxt_xmit_get_cfa_action Date: Mon, 23 Mar 2026 11:38:28 -0700 Message-ID: <20260323183844.3146982-4-joe@dama.to> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260323183844.3146982-1-joe@dama.to> References: <20260323183844.3146982-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 604966a398f5..7793ba59bcfc 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 dd0f6743acf5..d82b0899b33d 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.h +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.h @@ -2950,6 +2950,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 Fri Apr 3 17:37:39 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 CDBF830596F for ; Mon, 23 Mar 2026 18:39:07 +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=1774291150; cv=none; b=FTnq+/icgnOdion+a2+bXIG8vSG+BW+tMcnTQk1LeS4gDfFbN78LyjNBz59wbf2jRaXjwJFO+G3HuOmdCVrdzZ5glNweqAgQN1bobRNdYfhNQN+0JXUAiTtleRDxsfvDTcIHAhVtQqlfn/wDpR79MzJwmZHt4pOlZZ9kdurSKzs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774291150; c=relaxed/simple; bh=uT8Gdsj4WmnDwk5F7IYjxDPdX4MIIvH80+iQjYGrqHc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=axQRVMmWdDLe3tHR6TsuL7N+ntNhU+bdLLu9VTwXmFMQCEz1MBa1tmpfbApirxm1brgNH0vVlQGJrxYN2RSbsLhYEq/kVL86wf0/djlOjmwNoL0k9mjM2oNYWimj+1PGzk3BOrEzf6HtRSTpd9pl8H++Nk3sGqTqIAJD2jobrAU= 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.20230601.gappssmtp.com header.i=@dama-to.20230601.gappssmtp.com header.b=df6apRLH; 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.20230601.gappssmtp.com header.i=@dama-to.20230601.gappssmtp.com header.b="df6apRLH" Received: by mail-pg1-f174.google.com with SMTP id 41be03b00d2f7-c741db5d610so1282981a12.3 for ; Mon, 23 Mar 2026 11:39:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dama-to.20230601.gappssmtp.com; s=20230601; t=1774291147; x=1774895947; 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=Sy+CDHxlIyZx/+MrAYIXPwoNBrNq+e5Vy6JCRCEF8Rg=; b=df6apRLHEBRXZZaR9NhK7lfCfWPDKkvfPYsH1TdK4iULr7YVYKtK9v4fqKQlSUd38C mRJXXA3I0gLLykgwcn5FJOmK9X22SgHiCgyIPjt9smUQrhpqau167Sw/24ZyMsHUVR+v LOwrIjqNrF6JXxCpagyzRz6X+ToRZyrf45O7AN1JzZfuSRf8jloJr73ZKEDF+MMTBbA2 4E55WG+m6MU0Mh0vr+SbJv1dCSoJ0Ja0VRiP+7zgZuxbHK2jSPirYfR1c+QQJUe10raH cywDk1R0HxaVFVR3Sxmw7vkYVU+ImFBEqqnAaxpvtBgLSUENoT8COK1r5HmfldIv227b eEEg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774291147; x=1774895947; 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=Sy+CDHxlIyZx/+MrAYIXPwoNBrNq+e5Vy6JCRCEF8Rg=; b=hrMONRL105K2O/KFGG5WTq5GvDnnJuFosKdKZqhyA/RCJ7NfxVvjiywj7gjn6nYJnz QccLCS263XSsP5YHIAVISQIQTcge7OsPsVmZ8mLzcFFetKhbSVtYp01tciKoOvcmMwBl RNxuNs3eFd4egOxCvAxjxyMTP2fwKti0Fq76bpQJnYl9xIdcNBRPRmSrU7WhYR/6PHxR JNKcd/9IYUz0x0+RfvGlZyNC50LN/ypPwWgA5JpnB+/QrmAnE+nR9EgqznRb3Ue1mq9k 3T5csuPlxjqWxrdNlvZxzV6yIpG16uLxNOyMUKGDzvAtbaTds+wS+nORGe9/8klUOOTx +qjA== X-Forwarded-Encrypted: i=1; AJvYcCWM2jS2vg8c7ZwBkcOyBILVkGKAr/eJmkU5aehYEdgZDVza9ppXGvtTpPzKCfmjeC4GEE0Q7TfO3g6PYwY=@vger.kernel.org X-Gm-Message-State: AOJu0YyN/rl1ZVNyMdokE1wx7Ax4E5u8bLnnwfc0+KoF//scAsgw6FOu ZtaqucsYwD+1Tye9JWm476BZoohD3FdRJASTVuNhs28LxfCLzUPnmMCPAF4n1V8nA4Y= X-Gm-Gg: ATEYQzy9K5k7Ayqw96jCEnVu2+uYdENuFMDTU+Va3aITF8iYHrZF335Wv6wQml8hdBp aP8YTXf7LUyRLxvlzKq8dEcAL9r6I5Ol0fLCpdNFg1krVN/1lXbFaIXppxBfCZcLPk3GlQtsF3Y zp4qv/eY2U5wlbvP4GRlCvof4S44oWsAIfICvFiklZM1o2BX9nxa/RPsGl6TYnG2XfbfaiyjpEq BDBd6VG1RyLt81f1+HcaZ7ApKd2X+ZHgwm1VD0DuVYK47equMF1b1dIvsNzo6WCPIXMmh40F7I6 EHu/CdG1hOyihF0ijJipsoeNEDFcXPJ5oL3T9z/wQKZB+7fI71LguHkeRxYLpi4yTpwjqVVqDIL IvArVkiRpGNbHJ3eFZDvnpPqU977792TgqKtDBFkVEpqhQznkm+dP4lbf1pfh3iYBw0mxwEmH33 SfFNWplNA/hEA= X-Received: by 2002:a17:903:15c7:b0:2b0:73d2:219e with SMTP id d9443c01a7336-2b08280025bmr116139915ad.47.1774291146948; Mon, 23 Mar 2026 11:39:06 -0700 (PDT) Received: from localhost ([2a03:2880:2ff::]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2b08366c443sm151792235ad.56.2026.03.23.11.39.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 23 Mar 2026 11:39:06 -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 v5 04/12] net: bnxt: Add a helper for tx_bd_ext Date: Mon, 23 Mar 2026 11:38:29 -0700 Message-ID: <20260323183844.3146982-5-joe@dama.to> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260323183844.3146982-1-joe@dama.to> References: <20260323183844.3146982-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 7793ba59bcfc..4d4e7643f7dd 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 d82b0899b33d..a6b04652600e 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.h +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.h @@ -2834,6 +2834,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 Fri Apr 3 17:37:39 2026 Received: from mail-pj1-f46.google.com (mail-pj1-f46.google.com [209.85.216.46]) (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 BCAF730B50D for ; Mon, 23 Mar 2026 18:39:09 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.46 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774291153; cv=none; b=H2syHOQFFeByancMVm13QvqSpHmY1jEhBqAJhrplfcIFrr+7BlrL0DbI3PMAV+g4CW2DEiww+nXxLSGy13B2ccEGCjAnOvBR+seKlN41lwUHBCtnRp2bTqG8I1t6I4PctV50JyVUIfnlRU5BmMM3DOG+Sy9vq5klaUPoXY3mF8E= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774291153; c=relaxed/simple; bh=QZEPYt8xTmiyony78MCUXZEL4YpGdh1C5eyW5Y+WVnk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=RWbIRwsuT5wY0NDIYK8LY5Zxe6jyd0NNC35jWhahNJ9t5Ruw0e6bxBv0lwYmYXCZuTWtOLnpcyr0pLJUlKlhWUsWTXiaX0FcRhVC78AzJZpW54zFwC2qaebKriokVaBX9Q6GCYGLE0BDHpAY9FvsGo4+HpXpXkKpsxPyZVfy95c= 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.20230601.gappssmtp.com header.i=@dama-to.20230601.gappssmtp.com header.b=GRcEtjXf; arc=none smtp.client-ip=209.85.216.46 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.20230601.gappssmtp.com header.i=@dama-to.20230601.gappssmtp.com header.b="GRcEtjXf" Received: by mail-pj1-f46.google.com with SMTP id 98e67ed59e1d1-35ba749f441so406564a91.1 for ; Mon, 23 Mar 2026 11:39:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dama-to.20230601.gappssmtp.com; s=20230601; t=1774291149; x=1774895949; 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=VlYbsuuA0c6fnb8KG9NYIAfHIVUNtAjohKtZhGZnEFE=; b=GRcEtjXf9wFvu+xYEDTlC95J3t5Afl7j8vWfiVFtz72GOOyjdm4wmLfK1Q9lErmpj7 6aEp1oZ1DJ75crjkDcQ469jouSJVZBwDmf835cRb7vzShS81Mcpw3pHVKY4+nLMwB4Rh kVezPNPewbC+zxlPoDKYtJhRa2DQ3jCXLxrt6QKMNI7CHeNtS0pvUJW5Db8KIx/72eDi /Abe/I+M12vbqN90J8br2WAvO+xqJxiIbYsSv5dxN0N7rIbhMGTtWu84wuzGEm4mtA5a oJ1YHKxoicHDNPl/cj8r+xE+o8/NpmE9eH/0niTttWK5BT5h+prIPh1fA1AKNt/X9FHw ND/w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774291149; x=1774895949; 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=VlYbsuuA0c6fnb8KG9NYIAfHIVUNtAjohKtZhGZnEFE=; b=CmGTneuH/pFcmZZWSy5TZmvf29I+GV7Jvs6TvA7y+TVI5vcfTba9T8Q/nTgMWgReMx EewbFA34ueMzu32LgiHFCo57BNwEhrCEcEHFzIVW+y8oVLIdxkogkned5Am8CLdCcvbx sL6a4+5R3EKIGKWkNQFUA0QCcnXcYmly+XhJjGft9edtARERkwQYG6cqzY81X5Coqlp2 afuIHN2zTsGZoF3STQiCl5ubiZtwaI5W/xJYQeSH1r/36DQ4XYC1wDFD8BVXJjpsfcff mRcaBqg1oLvThy42XVWFDp2QmPhEM88rnxehUQZL53Tv9XYlVqfYRbm6JKsX1CEoBIog C/eQ== X-Forwarded-Encrypted: i=1; AJvYcCXzJK8WjM+emBuV+vCx3vAn5l6v/aTJsu9vI0v2wqIW+cYxBQrjePHil8Kn24OjPJ8SllSuInU1RuH7X7A=@vger.kernel.org X-Gm-Message-State: AOJu0YzS2UCfosdqEqAA1ftZrJiTB8i17b8XGpdYqf0BDVy54WQ4Q4PF XQsYppKxvkXvr3dt9QRX1fCOxM8HbWjX1z/dBOzbE3FfdQsIcN3tKt5ARiej3jUK2pk= X-Gm-Gg: ATEYQzyvhDbZfgqYVt/Oz+9jW7xWeD0fKCXZ2wKdGqOK1rhezuNKu9V0C+l/FON4kqP T7qSv89gNeKX4x5Twxukb44I6H82WzZHS8E7Lg4I0g3CItAR93lwTcW4MLEtqsgTnrlYND1gj2C u1IexTDEPRuigOGbtLOe1r2KgKmWGQYWXz36yjPz4db+0SnpN4zxqI5JGRodPWEqjZPDsuHNogE 3uzTVHCxTDFVAkcHmFPcqD14CSqRbmQFnz+7/PIHLnwXDNsZ5DsxGm3/OsuaWLcJbi+/HFd3/E+ eEjSXo98H+s131LqkDzVEw9a1Z8wzNqJkyIe3Og7kxxdhVN9He0x8IkPVQ4Yk/owDoZWlawr7ZD 3VSJGiXwXrzO5hq/In1SDYPWcM22UyDuCV7ivVRTwKUb+8XUCkKUBiz6yKZoeNGbatDSgCvQVOw i/nf0= X-Received: by 2002:a17:90b:1b0e:b0:35b:9dba:be26 with SMTP id 98e67ed59e1d1-35bd2c0885cmr11136098a91.10.1774291148765; Mon, 23 Mar 2026 11:39:08 -0700 (PDT) Received: from localhost ([2a03:2880:2ff:5::]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-35bd3f34b2bsm10304089a91.8.2026.03.23.11.39.08 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 23 Mar 2026 11:39:08 -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 v5 05/12] net: bnxt: Use dma_unmap_len for TX completion unmapping Date: Mon, 23 Mar 2026 11:38:30 -0700 Message-ID: <20260323183844.3146982-6-joe@dama.to> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260323183844.3146982-1-joe@dama.to> References: <20260323183844.3146982-1-joe@dama.to> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Store the DMA mapping length in each TX buffer descriptor via dma_unmap_len_set at submit time, and use dma_unmap_len at completion time. This is a no-op for normal packets but prepares for software USO, where header BDs set dma_unmap_len to 0 because the header buffer is unmapped collectively rather than per-segment. Suggested-by: Jakub Kicinski Reviewed-by: Pavan Chebbi Signed-off-by: Joe Damato --- v4: - Added Pavan's Reviewed-by tag. No functional changes. rfcv2: - Use some local variables to shorten long lines. No functional change f= rom rfcv1. drivers/net/ethernet/broadcom/bnxt/bnxt.c | 63 ++++++++++++++--------- 1 file changed, 40 insertions(+), 23 deletions(-) diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethern= et/broadcom/bnxt/bnxt.c index 4d4e7643f7dd..fe15b32b12e7 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)) { @@ -3402,6 +3413,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 @@ -3412,10 +3425,10 @@ static void bnxt_free_one_tx_ring_skbs(struct bnxt = *bp, =20 if (idx < bp->tx_nr_rings_xdp && tx_buf->action =3D=3D XDP_REDIRECT) { - dma_unmap_single(&pdev->dev, - dma_unmap_addr(tx_buf, mapping), - dma_unmap_len(tx_buf, len), - DMA_TO_DEVICE); + dma_addr =3D dma_unmap_addr(tx_buf, mapping); + dma_len =3D dma_unmap_len(tx_buf, len); + + dma_unmap_single(&pdev->dev, dma_addr, dma_len, DMA_TO_DEVICE); xdp_return_frame(tx_buf->xdpf); tx_buf->action =3D 0; tx_buf->xdpf =3D NULL; @@ -3437,23 +3450,27 @@ static void bnxt_free_one_tx_ring_skbs(struct bnxt = *bp, continue; } =20 - dma_unmap_single(&pdev->dev, - dma_unmap_addr(tx_buf, mapping), - skb_headlen(skb), - DMA_TO_DEVICE); + if (dma_unmap_len(tx_buf, len)) { + dma_addr =3D dma_unmap_addr(tx_buf, mapping); + dma_len =3D dma_unmap_len(tx_buf, len); + + dma_unmap_single(&pdev->dev, dma_addr, dma_len, DMA_TO_DEVICE); + } =20 last =3D tx_buf->nr_frags; i +=3D 2; for (j =3D 0; j < last; j++, i++) { int ring_idx =3D i & bp->tx_ring_mask; - skb_frag_t *frag =3D &skb_shinfo(skb)->frags[j]; =20 tx_buf =3D &txr->tx_buf_ring[ring_idx]; - netmem_dma_unmap_page_attrs(&pdev->dev, - dma_unmap_addr(tx_buf, - mapping), - skb_frag_size(frag), - DMA_TO_DEVICE, 0); + if (dma_unmap_len(tx_buf, len)) { + dma_addr =3D dma_unmap_addr(tx_buf, mapping); + dma_len =3D dma_unmap_len(tx_buf, len); + + netmem_dma_unmap_page_attrs(&pdev->dev, + dma_addr, dma_len, + DMA_TO_DEVICE, 0); + } } dev_kfree_skb(skb); } --=20 2.52.0 From nobody Fri Apr 3 17:37:39 2026 Received: from mail-pj1-f49.google.com (mail-pj1-f49.google.com [209.85.216.49]) (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 9692A30E0EF for ; Mon, 23 Mar 2026 18:39:11 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.49 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774291155; cv=none; b=bxtTwZz/8D7rumdd5l8HKqzYlm13dDpTk/d+EpPcRUc6KSNYQ25bfQ08WidV2Q4LWb+SO5L/z6sznYmMlYAqz00uhDboCN6OToLfD5tZK3PAsseechQ+j5kQZJXa+WtNko1chgPBaDTCOXrQwuNLZRVHzZGIu7IP7zPUMf/K/sc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774291155; c=relaxed/simple; bh=893kAeGclOk4fSk78cvUgba6Sya5sswIG+0f/z9UDDY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=C5eJf/D3YHnRUW5LiCEBxghHvjobDq/56KZ7Uy8OPATV4p/JxKulrkQCci2n9sW5zUoZLa42MtA7rvpKd0mEqq48AsdRVDjKUpv8n90zcTUh8E17D+hYMFoIuD4s1g73KdkVuG8Awi0Y4vARGJS0Gtq6VczFaGFz2zy+cJ8ennE= 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.20230601.gappssmtp.com header.i=@dama-to.20230601.gappssmtp.com header.b=Y0WysUY9; arc=none smtp.client-ip=209.85.216.49 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.20230601.gappssmtp.com header.i=@dama-to.20230601.gappssmtp.com header.b="Y0WysUY9" Received: by mail-pj1-f49.google.com with SMTP id 98e67ed59e1d1-35a288a2c00so241648a91.2 for ; Mon, 23 Mar 2026 11:39:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dama-to.20230601.gappssmtp.com; s=20230601; t=1774291151; x=1774895951; 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=wEdEGPSrIUj5fWAalmJxUK7ZuzZ9BH5SshMhMwYuV3c=; b=Y0WysUY9qtnZJ0PpTDzoQGKK4VN4Mk7Bk/f/94OQfJHkHVNC2z9cLtr+ChJzvUIV22 Y3mSJBWU0ATdXQ4QGbaBibJ8U5Q4UIj99vcY5lMLq5C1/sLYiSN31lLS3foxCRiFgm05 L0JDo5DTfV30Vp5sXe9vwePjMDNoPVNeqO6PBQrK7NzlwhWWfVEuvKbgCipTNtZruyHj 8y9IMtkf8QUf+EVW+zqhjLKbY6J7L9a6cTtfTrKNtbzKL7TXctoGVr/12I33Wy4+Lrem BvKA7pvQ3AwJX8bZjbqEegmuJFusjd+cvRIehhRyRjrmHm1yii09uMK9HDVKfGKVJ7m0 5aAg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774291151; x=1774895951; 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=wEdEGPSrIUj5fWAalmJxUK7ZuzZ9BH5SshMhMwYuV3c=; b=fWrIRv09hA6reYRfQ8tWr5TPqH1wbNIi70nQ+efBG18bSWjWGN/C/5Axg96/qa0H8K cvDgpmIPibf2xIAslbxiEQu5p+z1Z+n3ZfALgLcqpgU9pJis5G/rYQt4lStVqm2Kzxto b0XAwgdaB29YupY4ikeZG7G1guNtiQhpS91MGYLbiQUCWFW0r7lsUyPpneVeEcuNvySE afbgzQFDqRb9Lhq2IHxznmEj41lFqxFwLnfg8lLLy2fMoChBlPG7F/GRQWY/v69urtAZ 1fOujq2X9sVW1RbwESgwYz4nZFVvyLKj0YIXz5yiVqGw42q/GrBKjCaiu15VMTf0mqIP 5ylQ== X-Forwarded-Encrypted: i=1; AJvYcCWZ89q6sWkGjRwEbj6+SKBjv1V5MZUyMdTWi+5m/u6iWyEsUFNZLu6OqeQ3hC9FeYSSre4MSxtTh14WMhw=@vger.kernel.org X-Gm-Message-State: AOJu0Yz22dJjoX7ESj+bkmFQPmVtqI1b8RD9AaNUVq8bOmC0lKtLpXpq 3Xr8rWdkyWZtV5LE3Vmdhkx66XnouK+Gys/tU2HUB+YwaEOV/IbI9JyHyEdTbftV4mI= X-Gm-Gg: ATEYQzxVX209aGWVL4AI5jJh9LbTOn5oxkZivafZn7u9PZ31ZAsBcDWA1Hx/X6meb6J f2zRxDvdvhx2iW7JXoJLJ9tH1i/hiSLhO1i7yWKSKoONn96X0Kblq6n4tndX8TfHOC98Pl4FSFu AXB0fuHLlffFKCaVv+QXNZMrrjvOwYAoTEW4vdPx5bgQDCtgmpWNYw8wnOXu2khPxkSzarMKJ8w 9XkyeloKspqTIlj2HsKPKpZKYN7Ki7ihhxjgnY/cIv4dLKNORgLu4igoxMqnNgFCMOaD9h9d3jt Ew2V82AqIIqBbplSDW+eQ77P6M+xSSXpZDTK2CLAGqLbEh7kUX3zMNANeygZ/qIjYX4YKkF+YW2 lTkw71si5ppi65gSbUa+kxORhXKPpNuI+3oD76zDK9pfasvABNx3OFrZ8BcgISXktAWMuboARek AUS4c= X-Received: by 2002:a17:90a:517:b0:35b:e4f8:55ab with SMTP id 98e67ed59e1d1-35be4f87ae4mr4169478a91.6.1774291150605; Mon, 23 Mar 2026 11:39:10 -0700 (PDT) Received: from localhost ([2a03:2880:2ff:1::]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-35bd410e7b8sm9717171a91.14.2026.03.23.11.39.09 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 23 Mar 2026 11:39:10 -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 v5 06/12] net: bnxt: Add TX inline buffer infrastructure Date: Mon, 23 Mar 2026 11:38:31 -0700 Message-ID: <20260323183844.3146982-7-joe@dama.to> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260323183844.3146982-1-joe@dama.to> References: <20260323183844.3146982-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 fe15b32b12e7..2759a4e2b148 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c @@ -3985,6 +3985,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; @@ -4003,6 +4036,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 a6b04652600e..751dbc055fdd 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.h +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.h @@ -994,6 +994,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 Fri Apr 3 17:37:39 2026 Received: from mail-pf1-f180.google.com (mail-pf1-f180.google.com [209.85.210.180]) (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 3E386311C27 for ; Mon, 23 Mar 2026 18:39:14 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.180 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774291159; cv=none; b=jXqORw3LRYs5hCYXb13gwC/tPHvxFhkZbHZjxBzPCfEaE4tRf0O+sbIZ9UCbTgv+r1Jj5wrfk34MOMxMI8xQqBrmTrQ2nX+nNCKIu6K3JnAgFfwRo6G9De1NOqvDgbBhpBj5MMN0Y5AWG+49lQAOAbmWBaqfKbcb/wHSKFUYUw4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774291159; c=relaxed/simple; bh=HtDcextZUR/YPcgIMnOZtvtxd0jwbtm6Ak5Sth33ogo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=gwBZQcujmjyuxjp1IhQ6f/quLFj5dpaiIn9wh44l4G8WqklTIoQi7GHfxAlg88kQVamYN1vXgqE0F4UYVIRk7kCrn7S6J5nGBWa1a4IwUZN47ikEzoilheOtwIexJ4OELYl5OHO/6rGhjwlel+ZS40vUqdq+8a7DB43QlD9wBEI= 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.20230601.gappssmtp.com header.i=@dama-to.20230601.gappssmtp.com header.b=tiBDfMKm; arc=none smtp.client-ip=209.85.210.180 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.20230601.gappssmtp.com header.i=@dama-to.20230601.gappssmtp.com header.b="tiBDfMKm" Received: by mail-pf1-f180.google.com with SMTP id d2e1a72fcca58-829781b2b01so313083b3a.2 for ; Mon, 23 Mar 2026 11:39:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dama-to.20230601.gappssmtp.com; s=20230601; t=1774291153; x=1774895953; 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=sgC2gqkZaDT8s1RV7I0kqk405vgv8rZzFFbIUkMM2/c=; b=tiBDfMKmyfrYt9k3v5e8JPzhNyUVaDpWtN2BupizXi/FKg5LS+DrU8u0nGMtwqDHdB umnYhgpJOt04JlXfw3uAeoNieMfzUtNf9lWUow6Hi4uljRPOxdMr0vyE+0ujYL6KfNKq D9gjI/bz1otOSEoyT1OD5T8BCkyDoy5B94upPo/NZC7DqJzttVSuhKGujryKUbdpq4kl 0K2PxG4mH4LIgqmZNYZztPqhPZsv2KepeoXwuvXKSdQyKATsmP/8RijeBZuardZZ4klf YrYtedjsyzVpC4HrS8f8c8/Eh6DZfq0Tvjv+mV4wj2K5Wlceu3zu30TGT7bMkyyp7vA+ 8zGA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774291153; x=1774895953; 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=sgC2gqkZaDT8s1RV7I0kqk405vgv8rZzFFbIUkMM2/c=; b=p2p8gtQdPvPN4ozJjF+ruG2SIpdjXJU/SpHqco7nmPIMf3XJcZQy7wYqMzxWOoffb7 6wzCBGvdofOb1DGhnFINxIQl8IjHmfI5SUugAJD29De+q1ZBIYgsJc7pBZIuUPGaULc0 ZvqCp8nxYR5FC0MxNBgGNRaHwMV9u6VesOm98/lx4TZ2MRgUFxXXvcFo3Z7On9KvtDO4 z/azhkdoUYOpQPZQUYNcNe6y9za0RQjHv9gxKCuEd7gBeLASenewlxvAg7ewppWiCWbu ejCYRKKjtDXDDIJC4cpv5duDSLrlP9dRRN9z+vTcXH/NUFwqX7JER15ScU9p3iif+xSW jzpg== X-Forwarded-Encrypted: i=1; AJvYcCUYXRVNyw5HIpR3PF3ateS+2HuryB3dWcr7jAoNwWnDp8f5UYAtDi2ObDtLmZs4QACQcGOMDIPp8OqUoAg=@vger.kernel.org X-Gm-Message-State: AOJu0YwQoxtS73IQITAMssvXAA2XbiLmkasr2tSTKeSOi2ywxzTbfj8U Hhoi1OCnaej1lYlcXpL1JfLMtNFAgX/fer6gSTpA9s1LaMFiilsc1Su1j4nx/GzUZE4= X-Gm-Gg: ATEYQzzx3XlZ5GWjSSIsCAPrWBZqLt/YhAt4rmtYir3ZgcCJiViYEpeVZjKpjc+IMgj tpIyRME9pZl5SMYak6q4xybRr8F/96e5HsWfMMOv3sHs3uBO+1gA8eqLIaMVFnGyfN5RCHkdNLb Gy1UESzFLUDo2Pa4xcCq20P5LCvHWuMXkB7A2n4emf336CI5Z3oIGqSlZgdsJ7Osuu0T3F+2+44 IkjL2OB3/IigAXLzCdEm3vVbkJm9uY1fkCS2ApOoZqG9YOzB0NvcOQD9UpTQm4dFToSwHQC5dC8 zu6GqKnJtqwfubiX7BiSa8YROaXaZLtzfaSRBR+LXanLDKCSkW7ysbYv+Q6/rUxsoIzhq5cbmFy CguYIKPPwBRVOzLnVpvUp830+QgBjzqi5cwqSoeEtCQa/S/xUT2+uJ183+wN5MtMqad8vR5L0zJ 3OW2sDref/J6Fc+w== X-Received: by 2002:a05:6a00:91a6:b0:82a:e3de:27c2 with SMTP id d2e1a72fcca58-82ae3de2ff0mr8957916b3a.41.1774291153012; Mon, 23 Mar 2026 11:39:13 -0700 (PDT) Received: from localhost ([2a03:2880:2ff:4::]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-82b03aaabdesm10375094b3a.5.2026.03.23.11.39.12 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 23 Mar 2026 11:39:12 -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 v5 07/12] net: bnxt: Add boilerplate GSO code Date: Mon, 23 Mar 2026 11:38:32 -0700 Message-ID: <20260323183844.3146982-8-joe@dama.to> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260323183844.3146982-1-joe@dama.to> References: <20260323183844.3146982-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 --- 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 751dbc055fdd..18b08789b3a4 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.h +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.h @@ -891,6 +891,7 @@ struct bnxt_sw_tx_bd { u8 is_ts_pkt; u8 is_push; u8 action; + u8 is_sw_gso; unsigned short nr_frags; union { u16 rx_prod; @@ -898,6 +899,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 Fri Apr 3 17:37:39 2026 Received: from mail-pl1-f171.google.com (mail-pl1-f171.google.com [209.85.214.171]) (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 23F4030E0E5 for ; Mon, 23 Mar 2026 18:39:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.171 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774291159; cv=none; b=iS+wfrDnWtiCX9o6aU0DKiIDw9rdBLiM1ERVjSxQX2Z2GHleFdbrvYVeSQV6EA/iuODQL2+M+GJsy34g+Xb/KbFHTJ4ZgxBKoHbyXTR9ZJfmNw01UDmLXOwEOJwVz1bMzERLY/wXTsTtQ7J/DJ/GqP59osf6mYNZUuO+CMrNrRo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774291159; c=relaxed/simple; bh=6OQYTaplNa+p6S6ZKyj+mOGB6gpqujBNRQyQhKRILLU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=uyOlaJ4Lh7CJ0cE+VnCP1Gil8+EVD8wguqQXnLARX/itT/Ri42fFCpSX6HVKQEnU0bsFya2xeLWL0Wqos504/TT6gHTWqfCZ3m2WzBAGWG0HgstVPyf9lMb7j6XdmvrkFZaiix9sw6EfgjLRT/H9Tz9vUxLjr4N9/ZlExC2kVWo= 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.20230601.gappssmtp.com header.i=@dama-to.20230601.gappssmtp.com header.b=PshxxD8q; arc=none smtp.client-ip=209.85.214.171 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.20230601.gappssmtp.com header.i=@dama-to.20230601.gappssmtp.com header.b="PshxxD8q" Received: by mail-pl1-f171.google.com with SMTP id d9443c01a7336-2b0586d5bb8so32602395ad.3 for ; Mon, 23 Mar 2026 11:39:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dama-to.20230601.gappssmtp.com; s=20230601; t=1774291155; x=1774895955; 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=N0ANdeu4YxwYUS4LGM6HD7gbAYQZSyCIuBlfXxAUbOA=; b=PshxxD8qo0sPtuI7YtA3mAVQBRq4CFF2fehRHZ/UtFNpv2SVrAl50dET6SN8JMTy5Y xAy0QIF9L+ZibcJ6L16t+vDnPUKfqlMOhnyFSOSuT9yPX6F6fWzPEosfxtEeLA+CW7rV 3IifV5OEc73WgI0u7j9dCS/z/pZkIg488VcUJ2fGgUw/mloV1eqk+2MJ9fk9a68IYdmE jk5f9BTtyRJDbnO1H2Yde5c1/VI7NbfvIwzgoeOfp0ZN6Eq0NfaFQDuoj19kRJ4yHUqF ogdYdsMrDPvgZmVA15FXRhTUKqoPRBDG3koh0Kuwb4vssw3y0TYtUulvyEWu1KmIdVOt XeNw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774291155; x=1774895955; 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=N0ANdeu4YxwYUS4LGM6HD7gbAYQZSyCIuBlfXxAUbOA=; b=CbWDok09kvZiNI0MjauLHMoMqsgu7jRBkygW3eMT7jYOSM3cF0F/gcuV3xhyXffjQO CIF+hjfyfw2OGFHgU9jk5b9+Zh9BE7ROM18+4x9Mnht1VOVJfaAf6GvyVmutzkDX9oba elqh1u00PMzwWL4utMmcjDt9VrPZvve3qZEYZPtTPJhkBHm8uCakRZLZvvD8vXrWUPOa lEYszdB+714DIdA7Nv1NBU2uMdxUyhfMLXSPM3McRLaLBNYnfiQGAeaVA6YaDOGvgJbA kXVGxwdvm5otjUGo7xm/FQXKevARz05VywYicT/BW9kD9rJHBXIutnffU64WE3AuitjC kOCQ== X-Forwarded-Encrypted: i=1; AJvYcCUkcT7RW2SPOKEw5HDeJBSjgk3HCom3ClcaEPc3LfvNv2RvfUHOqXMfYVW4NPE8gjo8x035979NQrPYMlE=@vger.kernel.org X-Gm-Message-State: AOJu0Yz4aLfan8Sy0jAQRFggOWG+3YIibfMsa8LL5AZGg3Jt3Bd6nisP ZmF6iD0MIwqIPTlslA1NsSj59twG6NUU00iEosHzNCg3Sw/2ViRxx+tnk56gFwixNr4= X-Gm-Gg: ATEYQzwekeSx4B/pk11zVUWjClf3j1bna6sSlPqT318HUDmlewwGLLALtzBRmkFQgni zqH4sQodmG6Z/XZi/qMDLzXK7bjh8ZXKX0zP/TsQzCLjZvlbAomm46+oSpfKPEZEHg+mk7Pi9eL l+wplB9iHxSBamrKdCgpASecibs6/KmXUhcDQD9dFbp4kWV6ONy9xhPXsjhAkZv6tcEQVbrC0v5 D4cEDlxS2smjE7PglswM4BQnTxTmiDOCFHW6ZixbtIlwQlBAjIBrh4hAxso6KXg1RySyPhYjnWA nZziMmOGzeqh1MUFNewYt8h7J1JjreYmR8JgS2mTtyntrn/SfmSGHzuvpPyFzY6SEWdqDzPqZdU /krnQPyD7/mhYNz5ahi7RXC+4yM8DH3L/rHl6WNPfjzbSg6iejUQ+1slSSjxJVNPmo2xOQNKvhI tKax+Qbmdggj2rSq8= X-Received: by 2002:a17:902:dacb:b0:2b0:9a61:91a with SMTP id d9443c01a7336-2b09a610a7cmr48336195ad.35.1774291155073; Mon, 23 Mar 2026 11:39:15 -0700 (PDT) Received: from localhost ([2a03:2880:2ff:74::]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2b08366c4f1sm116470225ad.59.2026.03.23.11.39.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 23 Mar 2026 11:39:14 -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 v5 08/12] net: bnxt: Implement software USO Date: Mon, 23 Mar 2026 11:38:33 -0700 Message-ID: <20260323183844.3146982-9-joe@dama.to> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260323183844.3146982-1-joe@dama.to> References: <20260323183844.3146982-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. Suggested-by: Jakub Kicinski Reviewed-by: Pavan Chebbi Signed-off-by: Joe Damato --- 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 | 4 + drivers/net/ethernet/broadcom/bnxt/bnxt_gso.c | 206 ++++++++++++++++++ 2 files changed, 210 insertions(+) diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.h b/drivers/net/ethern= et/broadcom/bnxt/bnxt.h index 18b08789b3a4..865546f3bfce 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 @@ -897,6 +899,8 @@ struct bnxt_sw_tx_bd { u16 rx_prod; u16 txts_prod; }; + struct dma_iova_state iova_state; + size_t iova_total_len; }; =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..9c30ee063ef5 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt_gso.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_gso.c @@ -19,11 +19,217 @@ #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; + int i, bds_needed, slots; + struct tso_dma_map map; + u32 vlan_tag_flags =3D 0; + struct tso_t tso; + u16 cfa_action; + 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); + + /* Zero the csum fields so tso_build_hdr will propagate zeroes into + * every segment header. HW csum offload will recompute from scratch. + */ + udp_hdr(skb)->check =3D 0; + if (!tso.ipv6) + ip_hdr(skb)->check =3D 0; + + 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; + } + + slots =3D BNXT_SW_USO_MAX_SEGS - (txr->tx_inline_prod - txr->tx_inline_co= ns); + + if (unlikely(slots < num_segs)) { + netif_txq_try_stop(txq, bnxt_tx_avail(bp, txr), + bp->tx_wake_thresh); + 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; + } + + 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; + void *this_hdr; + int bd_count; + __le32 csum; + 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); + + 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); + + tx_buf->is_sw_gso =3D last ? BNXT_SW_GSO_LAST : BNXT_SW_GSO_MID; + + /* Store IOVA state on the last segment for completion */ + if (last && tso_dma_map_use_iova(&map)) { + tx_buf->iova_state =3D map.iova_state; + tx_buf->iova_total_len =3D map.total_len; + } + + 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); + + csum =3D cpu_to_le32(TX_BD_FLAGS_TCP_UDP_CHKSUM | + TX_BD_FLAGS_IP_CKSUM); + + prod =3D NEXT_TX(prod); + bnxt_init_ext_bd(bp, txr, prod, csum, + vlan_tag_flags, cfa_action); + + /* set dma_unmap_len on the LAST BD touching each + * region. Since completions are in-order, the last segment + * completes after all earlier ones, so the unmap is safe. + */ + while (tso_dma_map_next(&map, &dma_addr, &chunk_len, + &mapping_len, seg_payload)) { + prod =3D NEXT_TX(prod); + txbd =3D &txr->tx_desc_ring[TX_RING(bp, prod)][TX_IDX(prod)]; + tx_buf =3D &txr->tx_buf_ring[RING_TX(bp, prod)]; + + txbd->tx_bd_haddr =3D cpu_to_le64(dma_addr); + dma_unmap_addr_set(tx_buf, mapping, dma_addr); + dma_unmap_len_set(tx_buf, len, 0); + tx_buf->skb =3D NULL; + tx_buf->is_sw_gso =3D 0; + + if (mapping_len) { + if (last_unmap_buf) { + dma_unmap_addr_set(last_unmap_buf, + mapping, + last_unmap_addr); + dma_unmap_len_set(last_unmap_buf, + len, + last_unmap_len); + } + last_unmap_addr =3D dma_addr; + last_unmap_len =3D mapping_len; + } + last_unmap_buf =3D tx_buf; + + flags =3D chunk_len << TX_BD_LEN_SHIFT; + txbd->tx_bd_len_flags_type =3D cpu_to_le32(flags); + txbd->tx_bd_opaque =3D 0; + + seg_payload -=3D chunk_len; + } + + txbd->tx_bd_len_flags_type |=3D + cpu_to_le32(TX_BD_FLAGS_PACKET_END); + + prod =3D NEXT_TX(prod); + } + + if (last_unmap_buf) { + dma_unmap_addr_set(last_unmap_buf, mapping, last_unmap_addr); + dma_unmap_len_set(last_unmap_buf, len, last_unmap_len); + } + + txr->tx_inline_prod +=3D num_segs; + + netdev_tx_sent_queue(txq, skb->len); + + WRITE_ONCE(txr->tx_prod, prod); + /* Sync BDs before doorbell */ + wmb(); + bnxt_db_write(bp, &txr->tx_db, prod); + + if (unlikely(bnxt_tx_avail(bp, txr) <=3D bp->tx_wake_thresh)) + netif_txq_try_stop(txq, bnxt_tx_avail(bp, txr), + bp->tx_wake_thresh); + + return NETDEV_TX_OK; + +drop: dev_kfree_skb_any(skb); dev_core_stats_tx_dropped_inc(bp->dev); return NETDEV_TX_OK; --=20 2.52.0 From nobody Fri Apr 3 17:37:39 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 3F6C9399352 for ; Mon, 23 Mar 2026 18:39:18 +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=1774291162; cv=none; b=jy9WbOgOLDpsjCt8wsOWCCY/iIhUkKRe2elb/am6a9a5hFf0avBtkjcxBrL8kp1CM6KcbylUcwRSSHHXwRZ5D8LanHKGRvztuRwnQDE/HSYgq5f2ykyQgM/0J/Ls6crKCk5pj7uRyb7g6OdnlCvsoD/tNaGXFYpI44q9bY9F21E= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774291162; c=relaxed/simple; bh=wZ9a+8VFvuKCei1yujXWesCt/iH2GQLrp9nnWViTt/Q=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=cisOMCoP2wQNbWB0XNO+xsEgBPFDnJ6AASlxuFZaEALfN2ROEplVVyjmpnMhNyp8yyISntoNDkoKAUeOBZAm5rny4J/BJnX2jVwmJPIdw6aIYVwzu9E3Pg0FmrEQYqR/svGjKbVYTHGVKwgP8r0ZhNYWRkjSvYoDEEX9whWOG58= 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.20230601.gappssmtp.com header.i=@dama-to.20230601.gappssmtp.com header.b=ZscSm5G6; 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.20230601.gappssmtp.com header.i=@dama-to.20230601.gappssmtp.com header.b="ZscSm5G6" Received: by mail-pj1-f41.google.com with SMTP id 98e67ed59e1d1-3590042fa8eso2944030a91.1 for ; Mon, 23 Mar 2026 11:39:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dama-to.20230601.gappssmtp.com; s=20230601; t=1774291157; x=1774895957; 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=Em/5YOnjyQUn+CPxHAJYhh+fDGfpOSNFFMrZDobsG4A=; b=ZscSm5G6tsBmJN9jaXJFLvUI7+Vh/7dpEaTj8vhBcHO9hwoFgRO1/x3kc8qIb2UQuw TUxeFT2tNIRDKwGjbdKoLiROZ+TB9nCYpXlshUYKoD4SJkebsunA65lC2TotEmcBgcsd qT3uv+q2LLgV2NcHdWjSa7vbBYa4lQIBhAg5bx8yr/qnBMMAZ52U8fZSOFW8+YZCSLX5 jQ5QV2B6SB/yyYUsbGTZppRiGoIu8szby6V4PZn0Ydr9M7hMP8o9VelJvRrmYRJpW/d8 LCY9zOJOBDXFcTZ0z0ArNsmB2A8hEmmR1NCoTsoalwmEy4BA1sAkkBa24EcHi52eOAa3 +Asw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774291157; x=1774895957; 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=Em/5YOnjyQUn+CPxHAJYhh+fDGfpOSNFFMrZDobsG4A=; b=m6NAQSse/HDgHJQ3xZH0XTOXMwxQW4cuCEKOnA1FieBS5bJpY0X1Gh6Ibyh980R1gq eoTlFIZLBX8YSIr97GS2uChtpPl7bSaKPfIGax8Fc9eNr4IRd7F7fcuQaevtHjATc8VK CVvq9gaXs3gGJjaVjPhqNqrBDiqkDsZ/gFCiKDVGT6zflGxiIKNAQw2JY+lSdocPjYCa YBUY5WhUc4X2gclD+4ak+D7DEohDZnGZshc9Vt0oVQGzwD5hfjMIEfJbQ8xsNXZEB3Fo 3psCOTVxKjl6h7VtH4CUTxLojXFGxPODQj6Ib0W5XQM4HTEWH5M1rIAdZS46asyDD0XG Z4tQ== X-Forwarded-Encrypted: i=1; AJvYcCX+KLVxJI/5BUc3jmBqQ4X0cpvoiQ1baCsFcfsSX1oJoeUD64FWbqu1JxOAxRLlfPYMp2v3627X2BtoDPA=@vger.kernel.org X-Gm-Message-State: AOJu0Yz9QPDzT+IHIIdJYrzugSOfD9Na/ClBd6i4ZOIbn4ysBnu6cOXa Ser0z4lloRa7PtnFM+bMSp55NRGlIxOsYQK/48fPhu8U7OqKyBBbXu52pN2H8b/E5/c= X-Gm-Gg: ATEYQzx4Sg15jqAzUKeKasCjd1v27cWD0dHUormUu8JMOfd95SzfrievV0tUlyiJVne oLK832RwhtWb2xkLkWrnBzH8rk6Y6cRKuYoJWWVflZwc2kauyT2uDn/1gMF3wSTugJX7xe6YOap R/IcFkjC+YzBOAdHdiWeyGdW74tqhvve69ZQCWb2+76uF/m3L02dC5Tbf54MzBJX5VSGtqFI7P9 iYpTlxa3pnpN5twXvtRizlH2KsOpa7Lxx91Nkgz7QDEpZoqYOVEnz+rc/7DxVZn3gdc2Gzf/EVz wslF+M+NjQr3SjQ+qU5cPKU6vrhxG1KtAbXPoA2UAoNacolX/YDJLX3Hyx3jDZ0wSI/ibLojzMm Ax3QmyzbpVqAU9Tddc1Q4YSIg5rbFsMHDrMr9i74bTUxQP6YQFlXG8TUxUndE/wcq/gWGm5fFoz zvkUU= X-Received: by 2002:a17:90b:3d01:b0:359:fe72:3554 with SMTP id 98e67ed59e1d1-35bd2bb09c6mr10868161a91.5.1774291156965; Mon, 23 Mar 2026 11:39:16 -0700 (PDT) Received: from localhost ([2a03:2880:2ff:3::]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-35bd412b73bsm9711218a91.15.2026.03.23.11.39.16 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 23 Mar 2026 11:39: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 v5 09/12] net: bnxt: Add SW GSO completion and teardown support Date: Mon, 23 Mar 2026 11:38:34 -0700 Message-ID: <20260323183844.3146982-10-joe@dama.to> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260323183844.3146982-1-joe@dama.to> References: <20260323183844.3146982-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: if the DMA IOVA path was used, use dma_iova_destroy to tear down the contiguous mapping. 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. Suggested-by: Jakub Kicinski Reviewed-by: Pavan Chebbi Signed-off-by: Joe Damato --- 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 | 82 +++++++++++++++++-- .../net/ethernet/broadcom/bnxt/bnxt_ethtool.c | 19 ++++- 2 files changed, 91 insertions(+), 10 deletions(-) diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethern= et/broadcom/bnxt/bnxt.c index 2759a4e2b148..40a16f96feba 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,23 @@ static bool __bnxt_tx_int(struct bnxt *bp, struct bnxt= _tx_ring_info *txr, DMA_TO_DEVICE, 0); } } + + if (unlikely(head_buf->is_sw_gso)) { + txr->tx_inline_cons++; + if (head_buf->is_sw_gso =3D=3D BNXT_SW_GSO_LAST) { + if (dma_use_iova(&head_buf->iova_state)) + dma_iova_destroy(&pdev->dev, + &head_buf->iova_state, + head_buf->iova_total_len, + DMA_TO_DEVICE, 0); + } 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 */ @@ -3420,6 +3440,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 @@ -3472,7 +3493,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) { + txr->tx_inline_cons++; + if (head_buf->is_sw_gso =3D=3D BNXT_SW_GSO_LAST) { + if (dma_use_iova(&head_buf->iova_state)) + dma_iova_destroy(&pdev->dev, + &head_buf->iova_state, + head_buf->iova_total_len, + DMA_TO_DEVICE, 0); + } else { + skb =3D NULL; + } + } + if (skb) + dev_kfree_skb(skb); } netdev_tx_reset_queue(netdev_get_tx_queue(bp->dev, idx)); } @@ -3998,9 +4032,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) @@ -4103,6 +4137,14 @@ 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) && + (bp->dev->features & NETIF_F_GSO_UDP_L4)) { + 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); @@ -4645,6 +4687,10 @@ static int bnxt_init_tx_rings(struct bnxt *bp) =20 bp->tx_wake_thresh =3D max_t(int, bp->tx_ring_size / 2, BNXT_MIN_TX_DESC_CNT); + if (!(bp->flags & BNXT_FLAG_UDP_GSO_CAP) && + (bp->dev->features & NETIF_F_GSO_UDP_L4)) + bp->tx_wake_thresh =3D max_t(int, bp->tx_wake_thresh, + BNXT_SW_USO_MAX_DESCS); =20 for (i =3D 0; i < bp->tx_nr_rings; i++) { struct bnxt_tx_ring_info *txr =3D &bp->tx_ring[i]; @@ -13833,6 +13879,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 @@ -13878,6 +13929,15 @@ static int bnxt_set_features(struct net_device *de= v, netdev_features_t features) int rc =3D 0; bool re_init =3D false; =20 + if (!(bp->flags & BNXT_FLAG_UDP_GSO_CAP)) { + if (features & NETIF_F_GSO_UDP_L4) + bp->tx_wake_thresh =3D max_t(int, bp->tx_wake_thresh, + BNXT_SW_USO_MAX_DESCS); + else + bp->tx_wake_thresh =3D max_t(int, bp->tx_ring_size / 2, + BNXT_MIN_TX_DESC_CNT); + } + flags &=3D ~BNXT_FLAG_ALL_CONFIG_FEATS; if (features & NETIF_F_GRO_HW) flags |=3D BNXT_FLAG_GRO; @@ -16881,8 +16941,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; @@ -16915,8 +16974,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 48e8e3be70d3..44b3fd18fcbe 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 --=20 2.52.0 From nobody Fri Apr 3 17:37:39 2026 Received: from mail-pf1-f177.google.com (mail-pf1-f177.google.com [209.85.210.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 ABD502E7631 for ; Mon, 23 Mar 2026 18:39:19 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.177 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774291162; cv=none; b=CdZ1K2z9HqMcbroaVGaLbniMXdppuXIhAPj3xqWkRcXAS4AuUMivKrq8whqElqDanBNkFxCk1qp7LHV3ox4Qyl8hQE+E88EQBG+olemy3r7ZlStqbYX2eNqkmUymFf7DfZVXxx4eRJOvLxzjqB43UM1akLeqwMENnZesCy6xzX8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774291162; c=relaxed/simple; bh=26Gn7eptKPTs+npX9YJ4COxYTU170O6WKZvrvc1AeIo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=a7mhiYWZ2FiuBBIxTwFMeIvmuUoTOYVqPGiplR/qPL67Nnqlt5YCD24Q3SyIFOpp/KMq9+tWuhjslbzSiRhZh1kjKQgy7HTZ8cv+SFzxe5pf3+4LcMv77M03WvIAsJD9RulWRK9OertTBML2aYBHL4FKHsMqO70zV036UTTB3Qg= 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.20230601.gappssmtp.com header.i=@dama-to.20230601.gappssmtp.com header.b=VV3vU474; arc=none smtp.client-ip=209.85.210.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.20230601.gappssmtp.com header.i=@dama-to.20230601.gappssmtp.com header.b="VV3vU474" Received: by mail-pf1-f177.google.com with SMTP id d2e1a72fcca58-82a62714fe6so2170477b3a.0 for ; Mon, 23 Mar 2026 11:39:19 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dama-to.20230601.gappssmtp.com; s=20230601; t=1774291159; x=1774895959; 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=k4lthBZB51mn3B4jVR5pG1aEm/L5AvpnzXFsSccuXTA=; b=VV3vU4743kT0nK03rN9s1zNIFIIhJa8ZnVTV1yo6OqWiEYIj0BiG4LJyQbPdM6ZkYl kZ3z6y2JEdlN3dBaFtgmy2wIlUnuL7eTQASdJ1ni0ZDMpXDs5a8WZEASrI0RYIKU8gQ2 v5yFcDRXtl27ntYYxv86VquxMsHRvM+2Z90RoWFg3zlVYuLucHF73yB0ycDvj9o1hAPO pH3hK0gHHq2x3iaVMSaQxxMlR1cvWr7d87EzNRKTaOlXwVdYfKj6uyHHqcDOZNQKulOE NRS+UZZnrNU2hpdfTpmDusqfER1DTekMX91Kf+AObxoudBomHSLJyfSbVl/PAdIChJX9 4mtQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774291159; x=1774895959; 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=k4lthBZB51mn3B4jVR5pG1aEm/L5AvpnzXFsSccuXTA=; b=Go8dul0dCU23RWTATYyQ/TJyKC11mqVIU6TcKgesqDh+C8Pw6xQN6WGyXG1QfeC7gh ro5cJEkO65wzyrQo4tLasZHSchtxmQu6YWeTZuYco7u3iwJ8bHXhpBbZ2CMBalXyMynW csgaIscxyvNj3dS1AOh7vBwdCiSo5uw92A1BhtfzqummIuC2QeFf3ZSV1XeK/s2aPqj1 G7ZU6WETutFquS8GSP9oA54E6NCrJpJnjrGTyasz1P4Rx+pDK59KzYxKdqXA1GiLyM3g AremcibKRzDI4HJ2hA4UmUl6lexVmBlzWvUayYOlp1eOYplOclEmy3XrsdiOooZGNYtz AFnQ== X-Forwarded-Encrypted: i=1; AJvYcCW/ZPTArWO/R8u9OdB+jA88FB0fHcE+1NYSlLDq0uwqWDQ7pwS+ssSn8p3Po1r5sW88m4WjREGS35qvfzY=@vger.kernel.org X-Gm-Message-State: AOJu0YympCUXfLNo00+0FTxhs/UxinYYWuCdt/D+Nmy0fF1VboNh/u7T bd6efLpf4ztUGmFOhw+arteXkS1CPvT2MgGTc+VTb+zKLBIgMUc/iE+kkw4UZOHzU9k= X-Gm-Gg: ATEYQzxt58UoJ4LA8lcHNxTyA57VQm6MPzSeUS8VnPUOfQ5uG/FeW9ZHuN3g5mC2ZLT tc/b9IyLSVggTEM+JxZuS2JpJ1QgguYenECWA8C+zYxBTfn0Vv/uciAjquvpkzlmxFxlGJuZr55 1h9tQuuZNj12iVNGKtmUXRi4/3B9ThJSAePCPGyigO62c39KyCoBFF8JJ2JYjpPPcM8ZXPlk3xr muR39+AsuUW/M4iO0za8h4Vy50P+k0tb+bVcDfoySpeYu3kg1H/O5NqXioIqL3ESYK4aawdGRHw 4+urU3RHNb/kH+NUQBWobnfidO+9NPmnBYG2Cu8FG9eEyCKo0mnVWkrZxs6B+aJvgFZ+3/bs0A3 EJEhkFv1w+/3mUPcJrin0etEZmeJDKdDSM08K2DjWrQopnDOJuRlRiMKGjzOSkLO/tKAvtnuuU2 V6+FGG4dYMN2Vzj6g= X-Received: by 2002:a05:6a00:4207:b0:829:acf6:9406 with SMTP id d2e1a72fcca58-82c5bf009f3mr392659b3a.29.1774291158678; Mon, 23 Mar 2026 11:39:18 -0700 (PDT) Received: from localhost ([2a03:2880:2ff:42::]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-82b03bc6881sm11664493b3a.22.2026.03.23.11.39.18 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 23 Mar 2026 11:39: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 v5 10/12] net: bnxt: Dispatch to SW USO Date: Mon, 23 Mar 2026 11:38:35 -0700 Message-ID: <20260323183844.3146982-11-joe@dama.to> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260323183844.3146982-1-joe@dama.to> References: <20260323183844.3146982-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 40a16f96feba..737b64f8b80d 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 Fri Apr 3 17:37:39 2026 Received: from mail-pj1-f54.google.com (mail-pj1-f54.google.com [209.85.216.54]) (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 8C16C3D47D4 for ; Mon, 23 Mar 2026 18:39:21 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.54 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774291166; cv=none; b=OL1iOlMkTsgUW+BxLHY4fJZXsBHlYRvO4GJLTAdw9Y+XGaFIGuKQPb+mpnB8p+1KjYN2XLJto1rVNSG9t2Aj4s8cjBk5Bf7ZusT62wOTgAG+GvDy3Cp5HPFXituG22ys3toIZgADfDqZAOfY0YLn5+v5kRlg1q2G4dBQet6gFlI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774291166; c=relaxed/simple; bh=uWnYZfxpXWzMEdoD4OoQj78mYr7rYihNxdLMDApkweE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=YY8vdRUnGpruKrPziupgClcfbJrI/TusnQWv41YJSm1BNuBsKpC6roglyCxRtDqS/Jm2Yf8iIEv1quxUhhhsFhwDdg5XOK+7w1+EljD/9Q35eD26RzpWxldwCAuCu1lIe226JzL7Y5VsibjPFXy368YcEQxfDQ4n6NpCE/ES1d0= 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.20230601.gappssmtp.com header.i=@dama-to.20230601.gappssmtp.com header.b=B9O+J6HS; arc=none smtp.client-ip=209.85.216.54 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.20230601.gappssmtp.com header.i=@dama-to.20230601.gappssmtp.com header.b="B9O+J6HS" Received: by mail-pj1-f54.google.com with SMTP id 98e67ed59e1d1-35691a231a7so314063a91.3 for ; Mon, 23 Mar 2026 11:39:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dama-to.20230601.gappssmtp.com; s=20230601; t=1774291160; x=1774895960; 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=lGwTwQhNH9Rzs+EHOpg8GEhPLriykUGXInx1g7lVTBM=; b=B9O+J6HSsJWNg3SHA+JGq5LDdFSMOBFt6wlHUMEHU9WK/PPYiU2RnOj5LHNDfrEMtK CVyM0Kv+vZ7JnugSubFL7k0HooL/PyksbjvGl/O6Nmu+K02+D2FQJxSTTM3I+0CNrf1M SNob16SGynY35ntATZfC9C7SJ2eKNyBwWe2Nh4+h+RLgQ8E4rEkOzCUoZz4XvzV6CXk3 9joAb+Wip6lnPrSMDDAlCn1TlWae+NJ7YJavkZkvLNJyGx/P/cxdQhk2KYn/uxBPXhUw fQwF1e4wvEUkN2PzTIozYOx4s9d0tG1P3gQjkdsFg/HdqB2io+HFHIgq+AIlJmwoAMCs H8Xg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774291160; x=1774895960; 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=lGwTwQhNH9Rzs+EHOpg8GEhPLriykUGXInx1g7lVTBM=; b=Tae2tZOdbkWNQnGcFqs5gqbjC2gfYUZ1CXqi/eW+SpJ4LSYT88oFSZVJYE8bVgG+P+ 7W8QPQMF9pgSw3t+piQX3coI5uADZPyYXQ7ooABPC1NmqHZMiaXGHbzyxMn+xoqu3LKS 3gHrSYd8NwB5dLOTKxpmeeyE9+DRSdvMZaUsN8j3pZgG7Fu2X2VHsdsmxUVJIu6IWHat b4ftfUXV0kO/UhwSCMATg4P55Gd8UnDTx5SzH/FPKTVGGH742mS4kZlE91marjCfxYVf 4Why4vVY6xCdPm254c6Gy3itgOU4iNMLtWiA6WnlFKyRiTX5HbhYHJR9PRwhbsfafTo0 /RKg== X-Forwarded-Encrypted: i=1; AJvYcCVthOXmlgOSNAn/bhXssSRRpi1U3e1tik0cITekjbnXPeE/Ewg3NGW97cGf6t53LUaZ1RDz6QCSBvq0AXQ=@vger.kernel.org X-Gm-Message-State: AOJu0YxnqTCMbU3Dlnlurrqy38L7MIFdJ+xIDGgxyw0qAcob6OdqpNDl 5Zh9IzaIvQOG93caycRBZOT2uWIXyiKb34kik1fk+ijiZQY3Qfa12g/5V+800daMZbk= X-Gm-Gg: ATEYQzz4StLhjI/2dZWFiESjU9OCW5y4xiEHdKfSU/wQB+m4CEnKFGxgGIN3vBbqW5W u91JXSKt9hLoO/8d/KVpXaysqXSgHtX5/xnI96UghFXNhACShG/dDW9vyZdakFbxEncYqo/SYbT TbQ2yON8RsDSBuR1o+7pAb2qpaCX8sPE2ycw+fIHjc6Lp/qrPtv+Fc5zrOtKd3QN2t+83SRi97P 9eZVFYutg5c3woodxJbDNvDFvL6WhqjkI/0k5zwqpHFa1HAGBucL6j7FcQVzJSuNZbRVx5jUOFs uTtqUE2h0091gAMekUV8ZSQc06Dn3zYv7DpnVEPM0m6WPpFd2XyVgd3N3RAkatCuZUSb+3Nug/p /TYULoImejLKbfdJZ/MesFiZ2FPZTXYaVfk/SoeYbHuYMpYibWfTjUjm+scQiFqVls+dpOusE1C sy82Es0pP7zkc= X-Received: by 2002:a17:90b:3d02:b0:358:db7b:f686 with SMTP id 98e67ed59e1d1-35bd2cece11mr10315385a91.26.1774291160417; Mon, 23 Mar 2026 11:39:20 -0700 (PDT) Received: from localhost ([2a03:2880:2ff::]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-35bd4130765sm10100901a91.16.2026.03.23.11.39.19 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 23 Mar 2026 11:39:19 -0700 (PDT) From: Joe Damato To: netdev@vger.kernel.org, Jakub Kicinski , Andrew Lunn , "David S. Miller" , Eric Dumazet , Paolo Abeni Cc: horms@kernel.org, michael.chan@broadcom.com, pavan.chebbi@broadcom.com, linux-kernel@vger.kernel.org, leon@kernel.org, Joe Damato Subject: [net-next v5 11/12] net: netdevsim: Add support for SW USO Date: Mon, 23 Mar 2026 11:38:36 -0700 Message-ID: <20260323183844.3146982-12-joe@dama.to> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260323183844.3146982-1-joe@dama.to> References: <20260323183844.3146982-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 support for UDP Segmentation Offloading in software (SW USO). This is helpful for testing when real hardware is not available. A test which uses this codepath will be added in a following commit. Suggested-by: Jakub Kicinski Reviewed-by: Pavan Chebbi Signed-off-by: Joe Damato --- v5: - Added Pavan's Reviewed-by. No functional changes. v4: - Added parentheses around the gso_type check for clarity. No functional change. rfcv2: - new in rfcv2 drivers/net/netdevsim/netdev.c | 100 ++++++++++++++++++++++++++++++++- 1 file changed, 99 insertions(+), 1 deletion(-) diff --git a/drivers/net/netdevsim/netdev.c b/drivers/net/netdevsim/netdev.c index c71b8d116f18..f228bcf3d190 100644 --- a/drivers/net/netdevsim/netdev.c +++ b/drivers/net/netdevsim/netdev.c @@ -30,6 +30,7 @@ #include #include #include +#include =20 #include "netdevsim.h" =20 @@ -120,6 +121,98 @@ static int nsim_forward_skb(struct net_device *tx_dev, return nsim_napi_rx(tx_dev, rx_dev, rq, skb); } =20 +static netdev_tx_t nsim_uso_segment_xmit(struct net_device *dev, + struct sk_buff *skb) +{ + unsigned int hdr_len, mss, total_payload, num_segs; + struct netdevsim *ns =3D netdev_priv(dev); + struct net_device *peer_dev; + unsigned int total_len =3D 0; + struct netdevsim *peer_ns; + struct nsim_rq *rq; + struct tso_t tso; + int i, rxq; + + 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); + + udp_hdr(skb)->check =3D 0; + if (!tso.ipv6) + ip_hdr(skb)->check =3D 0; + + rcu_read_lock(); + peer_ns =3D rcu_dereference(ns->peer); + if (!peer_ns) + goto out_drop_free; + + peer_dev =3D peer_ns->netdev; + rxq =3D skb_get_queue_mapping(skb); + if (rxq >=3D peer_dev->num_rx_queues) + rxq =3D rxq % peer_dev->num_rx_queues; + rq =3D peer_ns->rq[rxq]; + + for (i =3D 0; i < num_segs; i++) { + unsigned int seg_payload =3D min_t(unsigned int, mss, + total_payload); + bool last =3D (i =3D=3D num_segs - 1); + unsigned int seg_remaining; + struct sk_buff *seg; + + seg =3D alloc_skb(hdr_len + seg_payload, GFP_ATOMIC); + if (!seg) + break; + + seg->dev =3D dev; + + tso_build_hdr(skb, skb_put(seg, hdr_len), &tso, + seg_payload, last); + + if (!tso.ipv6) { + unsigned int nh_off =3D skb_network_offset(skb); + struct iphdr *iph; + + iph =3D (struct iphdr *)(seg->data + nh_off); + iph->check =3D ip_fast_csum(iph, iph->ihl); + } + + seg_remaining =3D seg_payload; + while (seg_remaining > 0) { + unsigned int chunk =3D min_t(unsigned int, tso.size, + seg_remaining); + + memcpy(skb_put(seg, chunk), tso.data, chunk); + tso_build_data(skb, &tso, chunk); + seg_remaining -=3D chunk; + } + + total_payload -=3D seg_payload; + + seg->ip_summed =3D CHECKSUM_UNNECESSARY; + + if (nsim_forward_skb(dev, peer_dev, seg, rq, NULL) =3D=3D NET_RX_DROP) + continue; + + total_len +=3D hdr_len + seg_payload; + } + + if (!hrtimer_active(&rq->napi_timer)) + hrtimer_start(&rq->napi_timer, us_to_ktime(5), + HRTIMER_MODE_REL); + + rcu_read_unlock(); + dev_kfree_skb(skb); + dev_dstats_tx_add(dev, total_len); + return NETDEV_TX_OK; + +out_drop_free: + dev_kfree_skb(skb); + rcu_read_unlock(); + dev_dstats_tx_dropped(dev); + return NETDEV_TX_OK; +} + static netdev_tx_t nsim_start_xmit(struct sk_buff *skb, struct net_device = *dev) { struct netdevsim *ns =3D netdev_priv(dev); @@ -132,6 +225,10 @@ static netdev_tx_t nsim_start_xmit(struct sk_buff *skb= , struct net_device *dev) int rxq; int dr; =20 + if (skb_is_gso(skb) && + skb_shinfo(skb)->gso_type & SKB_GSO_UDP_L4) + return nsim_uso_segment_xmit(dev, skb); + rcu_read_lock(); if (!nsim_ipsec_tx(ns, skb)) goto out_drop_any; @@ -938,7 +1035,8 @@ static void nsim_setup(struct net_device *dev) NETIF_F_HW_CSUM | NETIF_F_LRO | NETIF_F_TSO | - NETIF_F_LOOPBACK; + NETIF_F_LOOPBACK | + NETIF_F_GSO_UDP_L4; dev->pcpu_stat_type =3D NETDEV_PCPU_STAT_DSTATS; dev->max_mtu =3D ETH_MAX_MTU; dev->xdp_features =3D NETDEV_XDP_ACT_BASIC | NETDEV_XDP_ACT_HW_OFFLOAD; --=20 2.52.0 From nobody Fri Apr 3 17:37:39 2026 Received: from mail-pl1-f171.google.com (mail-pl1-f171.google.com [209.85.214.171]) (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 434123D5647 for ; Mon, 23 Mar 2026 18:39:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.171 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774291167; cv=none; b=kiXf3LQqeFxU2uEssujPJDfMTd0j8McCVjXJD02oMHMAHlJlsveEu7TqZIE1X2xhJ9CyQA0R6v6ipRsBLovlCvfyoosZhzvcbYUaxplpQkly5s93uwThiU87hMWTH3EhNMznuporrNlrigFwT8rQzlQMsbMtJZfp5rvw2XeEmcY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774291167; c=relaxed/simple; bh=S62nqp/L7oaBVz+l0EkYVc7w8PWzqc5mHLXWWDxhwe8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=p5utCUVS8wo+3o34wiPoKNWXAb/SFbJ4YWq6CXlQsR+m3rFOfS8VaP0KxlJ2mjbLxdxE8v3kY8QIvYg8eeZYnLvROLj30F+qZKtt7ySQN0fL9v4NuGuAVPxdKH/+5wAgkW57dqJ5QdmQ9o2ByEfPkv555i7qtknav3f4nz6Apto= 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.20230601.gappssmtp.com header.i=@dama-to.20230601.gappssmtp.com header.b=xppXZ4ua; arc=none smtp.client-ip=209.85.214.171 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.20230601.gappssmtp.com header.i=@dama-to.20230601.gappssmtp.com header.b="xppXZ4ua" Received: by mail-pl1-f171.google.com with SMTP id d9443c01a7336-2aaf43014d0so30350455ad.2 for ; Mon, 23 Mar 2026 11:39:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dama-to.20230601.gappssmtp.com; s=20230601; t=1774291162; x=1774895962; 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=r9OKWh4GFeDrs3iW8vGT1OneAtu45dtpNVuW7lfnaEs=; b=xppXZ4ua4pxk8tMDyUkC3S54I/nOd1N/VghTIbTBuj01dRaqzm+Ihm84NQviGM7Qul MvwIDizEeJnshNWkJ+L2Uo7IQtgrn12dYUdoynJrIiRndZVZZvPppHQY5jCphGpqZxAj Txn9fiJjJw3g4sC4u93RaOPOo5o8qH4bG8hGTrtAEaV6OHqRnweoIEkKBk46bKcgdl1j thAPEvR3Nih/IId/T7NbIwJnRQ5Vx61LsGxsdZa3bfTa2IxSOf35d5l4gHTG/ESbW1Vm Jr6vK3War8+7cXoH8/UbzKGc7FOxHix3lcxCntOwIApG+RCW3UVtGNU8yyA5+n/UFzPW OKWQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774291162; x=1774895962; 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=r9OKWh4GFeDrs3iW8vGT1OneAtu45dtpNVuW7lfnaEs=; b=O4lYSt7kvpuphNTLm3pY3lSS4o49d2En8g9K2jsy0g4uBN2HlVErwaGPIDj0pMR3OO RFsX3Ffxvz6ubMDjNtCJdBRIAq5baJNSoZ8quvNm4NzWQ7RnsHrsQx3HeUHtly6KWENo 13Ciqtez4BuqRuIMr29wB7L551hrkOYsMfr+gN5m16hJKy/7dZx3TCjeA6ZOD+qUY7fJ 2I027UppE9oJtzFZ6WBZEIq4rAlJbJNdlxGJygoCYo3uIpeJASy2IsoFglC4wGVfTNTd 3tRGL/EakeIaBx2t+0uu0tUxoCkSgbXb/uCX20Wmqy2GEdMMS8Azr8auA+wA1/G+vy9C 9TKA== X-Forwarded-Encrypted: i=1; AJvYcCX32GXyIlFAcyPTU5Fs/ZcEZU50hdkpJ+K7IwOixEcxWY0Ly/leSicYy3IHGAU1Zdf4Lgi5zfoxCF5iI10=@vger.kernel.org X-Gm-Message-State: AOJu0YwtmbrDDS6Z8lvwtbS3MuwyuRnaYV00GZ++h7NwR7PL4PbYa0bf GdWLDS3XphP4COqWU4HwPwmHjdEcVHRPo2mJokDqv2VlfjnT25SV4TGJgA6tJHpyDBU= X-Gm-Gg: ATEYQzzaIpzfTOcOtK0sUvpXsIESJDXy2DPlVYbb4Y0y0TI9afI5CQR8i/Yd9kZZtRM lql79jq15JifGjDVdT/+cWKImTFy0BCa7S66SdQyaa/I5JMd7XQS80J0a+sW6k1NF+UbrLvs1Yg FN8ded9tEC7DoK5vpM7E2DWUY1vzK8B14nqta1CJX1FGMGr4kBOIAEj3V303RESnjJ6p/QSfJRs lVIdZaEVett5h033ScCdZMa7VkCMDm2wu3p+BINFyOdCukxWpX8EjRJ0d1PTXuNhiT02+bFx8Za CHeq7q314jDuksUp46ou0YuQEtPIRUjeKJM2RzKIf0HY6UZb2pvvIKQuETycxK36a2negnKHZwH 61rf/Bq6tgV2SGpsHBO/swaJKbP2GkM7COIUPT+IJNLDtP1w7ujdebMu43ZjKT1dx/N3Xh9fmv+ eBm3w= X-Received: by 2002:a17:902:f548:b0:2ae:c529:a13f with SMTP id d9443c01a7336-2b0826f5528mr122156715ad.14.1774291162408; Mon, 23 Mar 2026 11:39:22 -0700 (PDT) Received: from localhost ([2a03:2880:2ff:1::]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2b083516908sm149199255ad.1.2026.03.23.11.39.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 23 Mar 2026 11:39:22 -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 v5 12/12] selftests: drv-net: Add USO test Date: Mon, 23 Mar 2026 11:38:37 -0700 Message-ID: <20260323183844.3146982-13-joe@dama.to> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260323183844.3146982-1-joe@dama.to> References: <20260323183844.3146982-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. Can be used with netdevsim or real hardware. Tests both ipv4 and ipv6 with several full segments and a partial segment. Suggested-by: Jakub Kicinski Reviewed-by: Pavan Chebbi Signed-off-by: Joe Damato --- v5: - Added Pavan's Reviewed-by. No functional changes. v4: - Fix python linter issues (unused imports, docstring, etc). rfcv2: - new in rfcv2 tools/testing/selftests/drivers/net/Makefile | 1 + tools/testing/selftests/drivers/net/uso.py | 96 ++++++++++++++++++++ 2 files changed, 97 insertions(+) create mode 100755 tools/testing/selftests/drivers/net/uso.py diff --git a/tools/testing/selftests/drivers/net/Makefile b/tools/testing/s= elftests/drivers/net/Makefile index 7c7fa75b80c2..335c2ce4b9ab 100644 --- a/tools/testing/selftests/drivers/net/Makefile +++ b/tools/testing/selftests/drivers/net/Makefile @@ -21,6 +21,7 @@ TEST_PROGS :=3D \ ring_reconfig.py \ shaper.py \ stats.py \ + uso.py \ xdp.py \ # end of TEST_PROGS =20 diff --git a/tools/testing/selftests/drivers/net/uso.py b/tools/testing/sel= ftests/drivers/net/uso.py new file mode 100755 index 000000000000..2ddeae99b4d6 --- /dev/null +++ b/tools/testing/selftests/drivers/net/uso.py @@ -0,0 +1,96 @@ +#!/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 correct number of individual segments with correct sizes. +""" +import socket +import time + +from lib.py import ksft_run, ksft_exit, KsftSkipEx +from lib.py import ksft_ge +from lib.py import NetDrvEpEnv +from lib.py import defer, ethtool, ip, rand_port + +# 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 bytes(range(256)) * ((total_payload // 256) + 1) + payload =3D payload[:total_payload] + sock.sendto(payload, dst) + sock.close() + return payload + + +def _get_rx_packets(cfg): + stats =3D ip(f"-s link show dev {cfg.remote_ifname}", + json=3DTrue, host=3Dcfg.remote)[0] + return stats['stats64']['rx']['packets'] + + +def _test_uso(cfg, ipver, mss, total_payload): + cfg.require_ipver(ipver) + + 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 + defer(ethtool, f"-K {cfg.ifname} tx-udp-segmentation off") + + expected_segs =3D (total_payload + mss - 1) // mss + + rx_before =3D _get_rx_packets(cfg) + + port =3D rand_port(stype=3Dsocket.SOCK_DGRAM) + _send_uso(cfg, ipver, mss, total_payload, port) + + time.sleep(0.5) + + rx_after =3D _get_rx_packets(cfg) + rx_delta =3D rx_after - rx_before + + ksft_ge(rx_delta, expected_segs, + comment=3Df"Expected >=3D {expected_segs} rx packets, got {rx_= delta}") + + +def test_uso_v4(cfg): + """USO IPv4: 11 segments (10 full + 1 partial).""" + _test_uso(cfg, "4", 1400, 1400 * 10 + 500) + + +def test_uso_v6(cfg): + """USO IPv6: 11 segments (10 full + 1 partial).""" + _test_uso(cfg, "6", 1400, 1400 * 10 + 500) + + +def test_uso_v4_exact(cfg): + """USO IPv4: exact multiple of MSS (5 full segments).""" + _test_uso(cfg, "4", 1400, 1400 * 5) + + +def main() -> None: + """Run USO tests.""" + with NetDrvEpEnv(__file__) as cfg: + ksft_run([test_uso_v4, + test_uso_v6, + test_uso_v4_exact], + args=3D(cfg, )) + ksft_exit() + + +if __name__ =3D=3D "__main__": + main() --=20 2.52.0