From nobody Tue Apr 7 14:39:28 2026 Received: from mail-pg1-f182.google.com (mail-pg1-f182.google.com [209.85.215.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 D7FB3397E80 for ; Thu, 12 Mar 2026 22:35:08 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.182 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773354910; cv=none; b=TnLd4JZkVVgEEbBvSP57OdFNtIE4wIWHKZ8Z7PwS5SlHD8lnF1b3/fF4hjWD7+/ah6t39iB7ay8O3LF6embnck/j8x2bvBz2tSIox3jWm90bIeFoO4lsroKxcRgfh/jlSDQabMVQ4Ijcb4GFXGfR+Tmvd/h5ulLxsZAfq1Od6fw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773354910; c=relaxed/simple; bh=Z/ESX+LLNY5t82nBsQH8Qqv4GqQzNnZ9UJQed+Rqsn4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=hOYdBE+eVvNG9daeOAyqDYuJMwDY96OmJC3OmquBDQT5n9nnTHTdRZ/x7ZYtDa3SAd28Z0LwRLOXg6B+bfWeXeRv8pJhDOCYENLkHzqbw7OYQichguFhfuHGIqvG5EmTw34aRcw5v4UFzgPjc+erL6WZEPMGX25toE/fgC5CgAU= 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=ALM2w1B6; arc=none smtp.client-ip=209.85.215.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="ALM2w1B6" Received: by mail-pg1-f182.google.com with SMTP id 41be03b00d2f7-c738fecf349so995862a12.0 for ; Thu, 12 Mar 2026 15:35:08 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dama-to.20230601.gappssmtp.com; s=20230601; t=1773354908; x=1773959708; 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=fhbXK6hap671NF5qoYb68AsIxNo8RyyFm3WoVwNRKKg=; b=ALM2w1B6qU98oRWzwOpue/SZqP+/jeMEJwh3g7KH5J6svrCZ4OPmDGVZN4sa1XTmBA M2d4NjqB2WKZOtgIjf402UWRGL3f1NK22atGEQrYRcjjx3EUmZ3piMYAF/HV0nh3Z8xy c1i6XQ9nlUPHnMWdzNg9kTVV8G5phty6xm1eLiyUq/NKX0UDmQSx7YCX8zk7G11OpCly Nmm4ejQlz8N18fCjxl+6p8TUb/0OjLslvlKoMww6k68B1EGOQ430zuZDTXwzP/58wf/B ES3MF71eb03gRA0QgKIUNwjCahbS6AEkJlsF0BFzczuUi2dBrK2J/IzeaERnjTJlz6NA pg+w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773354908; x=1773959708; 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=fhbXK6hap671NF5qoYb68AsIxNo8RyyFm3WoVwNRKKg=; b=lnsEwvFEyoAjAwmmwuobSsiZfa9T/YhX+NK7o18wpCGbqhR1Z7iqZKPiYmE+c5rkY7 No7pz1zK+43lQInrTtzMrw0Fll/mDu3R5UBs+aqvOooKA5kN3gJ5aYu8JsE+F8LKekS3 nqRKjaTgzzm28BDILVJYZtKqsw1/TJZDXyNrjEoTU36tcaEJTGh186FeucgJQr5B3TkC Z8ScFQlkDBS10MeKmT09LzoXxp8UgzFFnIFHZBxTOtYvhmT00UPblxsE3X5XRBV//HzQ 4Gb0dV7HBjH4vf9dmvXkz2MdzOOiOb0kgHuYzrIiOKHoV/gX7uxafDtexFfbcfhTiMZL uEVw== X-Forwarded-Encrypted: i=1; AJvYcCXwyF05k1NmreyPLhtsVq0oJDYYJWfHYFpJzzRgUF/3js8uX5ZcMwqaF+0FEchcNtk53WchB19ezWuK8uU=@vger.kernel.org X-Gm-Message-State: AOJu0YxjFTfHpw1UQmOFzMFEXYkFK0TpQMejcTwQvCzHYPaq8bICFqZD AvePsQHOgHBJ/vN6COvVC4juFpsjUydSNDNlFOBAqnSmUPHngFnsDDO/DCE7WiUXofk= X-Gm-Gg: ATEYQzy+pepiRkfYfL/mCdaOPju8uk48HnRfby0G24mjE1+1V8WvciRjcMtDHHQkjNf P5At2uuYCW7jHmEtX6BRS/Dsh93jphK2cwpnaGj4u9Bs47mdc6P0NVVGHTVn+ZBIYs/n7mBdIya hJ2ccd9TYg3uofzJnyaJgaztVklxUtjMyNgoxcio00Yyx1kvzNeY8KqxlC6OT1b1r4Vo+ARcaXf 4iuKe523K5Fh/oEMrmvIrYpgm/MJiCoecLFBg0aNcFE7N9S8o2sN+hD/LJJa6H3G2hWdT+KWboQ K57wz1wtmFPev71aZBsHo9BC3+rfrIEg3Wd5f65R48UMS/1eO3Tq8dqxH3ebuFzey1M/fuE+K3y 6js8xQmlczGY5xuiKpvBD1o9ZoQ4tS7o8ZYsJCKCiiHV8g8gy6rOQyC1DYX3haKYS9rO+3njJZx sxJoRB X-Received: by 2002:a17:90b:2b4d:b0:359:f5f4:7740 with SMTP id 98e67ed59e1d1-35a2208696fmr831058a91.17.1773354908222; Thu, 12 Mar 2026 15:35:08 -0700 (PDT) Received: from localhost ([2a03:2880:2ff:73::]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-35a1ac3baf8sm2718951a91.12.2026.03.12.15.35.07 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 12 Mar 2026 15:35:07 -0700 (PDT) From: Joe Damato To: netdev@vger.kernel.org, "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman Cc: michael.chan@broadcom.com, pavan.chebbi@broadcom.com, linux-kernel@vger.kernel.org, Joe Damato Subject: [RFC net-next v2 01/12] net: tso: Introduce tso_dma_map Date: Thu, 12 Mar 2026 15:34:38 -0700 Message-ID: <20260312223457.1999489-2-joe@dama.to> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260312223457.1999489-1-joe@dama.to> References: <20260312223457.1999489-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 (linear_dma, frags[]) with iterator state (frag_idx, offset), allowing drivers to walk pre-mapped DMA regions linearly. Helpers to initialize and operate on this struct will be added in the next commit. Suggested-by: Jakub Kicinski Signed-off-by: Joe Damato --- include/net/tso.h | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/include/net/tso.h b/include/net/tso.h index e7e157ae0526..cd4b98dbea71 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,37 @@ 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 + * @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 (after headers) + * @linear_len: length of the linear payload + * @nr_frags: number of frags successfully DMA-mapped + * @frags: per-frag DMA address and length + * + * Struct that DMA-maps the payload regions of a GSO skb + * (linear data + frags) upfront, then provides iteration to yield + * (dma_addr, chunk_len) pairs bounded by region boundaries. + */ +struct tso_dma_map { + struct device *dev; + const struct sk_buff *skb; + unsigned int hdr_len; + /* Iterator state */ + int frag_idx; + unsigned int offset; + /* Pre-mapped regions */ + 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 Tue Apr 7 14:39:28 2026 Received: from mail-pl1-f174.google.com (mail-pl1-f174.google.com [209.85.214.174]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E4DAA3BBA12 for ; Thu, 12 Mar 2026 22:35:10 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.174 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773354912; cv=none; b=FJxMsizxqKp/uDhUHDBRKUDUFSIaCQhiKN6eJDir/DyhpJkXgiys4dcq7alF+Ify+a8YFUxsaZqgiWx+1fzL16FHTzaFSOZ5aG2f5uqr2yGOO7hIMcaImqlE/IaIwO+OI/7gyNGAyhEMpehHzBeMXVj0hKtvk2RBc4ZQ5D6mXPo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773354912; c=relaxed/simple; bh=X9VHKvATHxHvX/KMPAT55nhb5PDXdcI5BfyrlNhdZIA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=hPTMkEA4mrORXH/Cy5Sp2tGMdI+zwRQmmuMzUkljDZ+moU5/MAx8x+7ES3GjHxl0+3pw0Vr2QzjQIsKZBQQzDh0CZV0lsRXtF0JqOQrVViSsGFpc5GD516KycsmnoSrSnIoOaUwgSl4VbPOEdRcL2ynBLxGnGVKWVV87KsR134s= 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=2DFV/DZU; arc=none smtp.client-ip=209.85.214.174 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=dama.to Authentication-Results: smtp.subspace.kernel.org; spf=none smtp.mailfrom=dama.to Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=dama-to.20230601.gappssmtp.com header.i=@dama-to.20230601.gappssmtp.com header.b="2DFV/DZU" Received: by mail-pl1-f174.google.com with SMTP id d9443c01a7336-2ab39b111b9so7173455ad.1 for ; Thu, 12 Mar 2026 15:35:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dama-to.20230601.gappssmtp.com; s=20230601; t=1773354910; x=1773959710; 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=ECNOcyzIL3pvAcmxfJ0jNS0/PNd0BF4YXgB3fthJC9U=; b=2DFV/DZULxNeQ68eKEROxwx56JK3Ru5eooNh5P8HcN52AvNy4zpbR/jMtQQ7wnuoMa aYzpIednwHfB9bpBxMseeU8pU5QVO1lJQutEL0/e2UmrdyX8P64Dxs8o9Nwz8O6CymOh Q5vR2+RxfsCMQURx4do740XtdqvD0pjYZEzIPmbbNOViPuR5/DqeDFISnwkP8tqWS7aL gOyr2T2zb4zOVOg3mk/046qYqYTnOa16ifEiJE2qqC+WyzYjSXjbYZI7ZymrZ38PV7LB 8CcI7fVDOnvcLryE8PXmhHCC69mrsStEDFyM9nTnnKSgdZYgZPsjEGPH8SCt3b89eJEo dgIg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773354910; x=1773959710; 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=ECNOcyzIL3pvAcmxfJ0jNS0/PNd0BF4YXgB3fthJC9U=; b=RbbRXq+fLZPy067/NPyjUW4fzc3JSePqUu7CITUw+WCqMOODWoJm6oKhXpSFQ9JqQ7 18LHrtl7oE6Q4p+pqEQ8Yl3T4XHMrNpWEVZeuWq1yCMvVGn3dduSl7F70yas7iYwVxKe JFO3WyYDGGhsFASi0ZZbHi8rgYLge5V9+vEP3GPHhi951DfICcyo/PFGARr1pw+TUmdp 0bsmhaURxt3PxTJMJc3kz2/Ob8JXxg97/OUeYwzL8qF8wc6WPjMDgX1xO6qtALMzSqbJ 1I3Kh/psGsZB5DWg1DI/H4ncHNI1riodgo/TaUo3/CwA1MV3OYxTMPVG6Q9CaLg2Lhxa Udow== X-Forwarded-Encrypted: i=1; AJvYcCWxDeo329AhH/rSGSn3+suEb7Kj/N5KN8O+cwTJgXA4GrgG9S0nEBqm+ewf+dNArkLBiy23Wc73V/JQS2A=@vger.kernel.org X-Gm-Message-State: AOJu0YzNocjIRc1YzxDtjBVPQQ2IotSP8ClKGGJNkKnSaJUzAFaYIHez 0PfaRIhyiHruxOqmkDw4VxPup3GpcuDtzPDXyoINEML/lQNtXuLgXPLBen1E5ZWFGBk= X-Gm-Gg: ATEYQzygBfpdPx/ljspAR3MFnow4UzgmuFmmdwLNGtsOSR8xtGZtO3GJpI9JOrYZjy9 SPVXwd46wzlDVG+uXTmUi/uIR1vYXaRnxMoH7sKSNtqG4ziV6Lcbe5iJ+GcUoyNLRyO8y2W/8Du FHPk1P2MQIIP0IfU7xbCppVf5Vg8lhMnd0KpG+RqRZOjf4Y3mSaGiUQfU1MNADPCA34Dh9XeHdI Q5LIgUeBH2Ts94WCMoeb1/9rlp2EmIFmEP3Chsyo/SCqkMb1JHOG90UBq8Lx3S2Yca3pSRsCldN 9Ic3W7hTTSczIRaumD3Sl0xWxlosaOgU1pz0fTxV3qysItdx+5IDUTqfYcpdy0WWpIzF37G5SQB MXq4/rlFonUTpU2Q+xGnvoPmpIWAruLaBmleGWZP5FskXTD0H2SGju4esDfI28xji9K82nprSi1 khu4M= X-Received: by 2002:a17:903:3c43:b0:2ae:5baa:cef6 with SMTP id d9443c01a7336-2aecaa26653mr9883235ad.19.1773354910240; Thu, 12 Mar 2026 15:35:10 -0700 (PDT) Received: from localhost ([2a03:2880:2ff:2::]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2aece63133fsm317385ad.41.2026.03.12.15.35.09 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 12 Mar 2026 15:35:09 -0700 (PDT) From: Joe Damato To: netdev@vger.kernel.org, "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman Cc: michael.chan@broadcom.com, pavan.chebbi@broadcom.com, linux-kernel@vger.kernel.org, Joe Damato Subject: [RFC net-next v2 02/12] net: tso: Add tso_dma_map helpers Date: Thu, 12 Mar 2026 15:34:39 -0700 Message-ID: <20260312223457.1999489-3-joe@dama.to> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260312223457.1999489-1-joe@dama.to> References: <20260312223457.1999489-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 helpers to initialize, iterate, and clean up a tso_dma_map: tso_dma_map_init(): DMA-maps the linear payload region and all frags upfront into the tso_dma_map struct. Returns 0 on success, cleans up partial mappings on failure. tso_dma_map_cleanup(): unmaps all DMA regions. Used on error paths. tso_dma_map_count(): counts how many descriptors the next N bytes of payload will need, without advancing the iterator. tso_dma_map_next(): yields the next (dma_addr, chunk_len) pair. Indicates when a chunk starts a new DMA mapping so the driver can set dma_unmap_len on that BD for completion-time unmapping. Suggested-by: Jakub Kicinski Signed-off-by: Joe Damato --- include/net/tso.h | 8 +++ net/core/tso.c | 165 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 173 insertions(+) diff --git a/include/net/tso.h b/include/net/tso.h index cd4b98dbea71..a1fa605f26b4 100644 --- a/include/net/tso.h +++ b/include/net/tso.h @@ -62,4 +62,12 @@ 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(const 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); + #endif /* _TSO_H */ diff --git a/net/core/tso.c b/net/core/tso.c index 6df997b9076e..fdbef4ca840d 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,167 @@ int tso_start(struct sk_buff *skb, struct tso_t *tso) return hdr_len; } EXPORT_SYMBOL(tso_start); + +/** + * 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. + * Positions the iterator at byte 0 of the payload. + * + * Returns 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; + int i; + + map->dev =3D dev; + map->skb =3D skb; + map->hdr_len =3D hdr_len; + map->frag_idx =3D -1; + map->offset =3D 0; + map->linear_len =3D 0; + map->nr_frags =3D 0; + + if (linear_len > 0) { + map->linear_dma =3D dma_map_single(dev, skb->data + hdr_len, + linear_len, DMA_TO_DEVICE); + 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]; + + map->frags[i].len =3D skb_frag_size(frag); + map->frags[i].dma =3D skb_frag_dma_map(dev, frag, 0, + map->frags[i].len, + DMA_TO_DEVICE); + 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 + * + * Unmaps linear payload and all mapped frags. Used on error paths. + * Success paths use the driver's completion path to handle unmapping. + */ +void tso_dma_map_cleanup(struct tso_dma_map *map) +{ + int i; + + if (map->linear_len) + dma_unmap_single(map->dev, map->linear_dma, map->linear_len, + DMA_TO_DEVICE); + + for (i =3D 0; i < map->nr_frags; i++) + dma_unmap_page(map->dev, map->frags[i].dma, map->frags[i].len, + DMA_TO_DEVICE); + + 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. Uses region sizes from + * the current position. + * + * Returns the number of descriptors needed for @len bytes of payload. + */ +unsigned int tso_dma_map_count(const 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; + + 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. + * Driver can assign this to the last descriptor. + * @seg_remaining: bytes left in current segment + * + * Yields the next (dma_addr, chunk_len) pair and advances the iterator. + * + * Returns 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; + + 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 Tue Apr 7 14:39:28 2026 Received: from mail-pl1-f180.google.com (mail-pl1-f180.google.com [209.85.214.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 B48153BADAA for ; Thu, 12 Mar 2026 22:35:12 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.180 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773354914; cv=none; b=cQtif20lvlavYiZ16FggAxTVaKjE7zFzAeokRG/l3dVzFySbWBjBWn2r5BlDg7szDwmuXpca5RCnOiFUNusInL7mN9JnqTNHls8Hc5alN9bNa7ZXvvoKEWLNqipaOcTJBwX4YBmGDqEYsMX8CAL/CONonRfSBWuXIfvQEetpHKo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773354914; c=relaxed/simple; bh=22BZ7U1/BMBwqwa8TSe0Uautb58lPHHPr3F6DM186+I=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=WZGsMAw2MZqZ80TEbdjWC7N9rHyhVDzhex0o76KSDivu4UeONk1B88oY3srlFbaIelhCNgTiBB3bTJpyc3xrQccXRqtcjZlVR2xlq9WtP0+ncnuXDWEzZL3WtKynfkt9dW0x3whkXo/k6HzAozxi9HTdiwQH9ajMbG1Vaao/QCU= 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=UQVv55Hd; arc=none smtp.client-ip=209.85.214.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="UQVv55Hd" Received: by mail-pl1-f180.google.com with SMTP id d9443c01a7336-2ad9516a653so7067705ad.0 for ; Thu, 12 Mar 2026 15:35:12 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dama-to.20230601.gappssmtp.com; s=20230601; t=1773354912; x=1773959712; 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=QIDc8NJNVATknvweSjylLv8e3icsVcoxO5WK/CBbVqs=; b=UQVv55HdYDm8FH5yMTRqkWNhgu1+R/hKa6f2BuuiKnMgrZhhw8IrY8VW12d7PybPkz xv6Pl+Zb+daIoE9XtveMDLrptEi97zaW/U8BnNxkfLI2R3ko+x1YJuaCMBbExfsSkqMA hCPbdIOwtPrwMcd4hCJTQwfqT0MBG/gylPsnTBX1unlgZPZnaWJL7xJJVW5YrfSJoxB1 uyb/4DSq/3+7hGrmpLR78Bcwf8DLyHt3Doi8tVOmU0c2sbnWQEpxwe3Qm3XHWtfqaEIz jAOPaA7BmdaT+zQnt1A0lq+CwvepHv8f/qbMe1hZf7uthhuLLHcMST+/er3cmWQQ2FUI 8DxQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773354912; x=1773959712; 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=QIDc8NJNVATknvweSjylLv8e3icsVcoxO5WK/CBbVqs=; b=nHZyDfXADwKrMb70/01Vt7wiXDsBC6D67w/BQXpb59mZIlxLlGkPvCDvdUMsI28hbu AtJ1KOgehXkdQRtb1SuH56nA2TyaqD48EGhVnmV9JA1h6maEoapY6xTm4MDEoyYP914R Wm3bOBQdiBMnM9zreuiA7nqXgcl3noS6x06l7U13xdJWBu+juJ04d3SHYaQNRl9y0AQ6 qgrThomGUsUpb3kDYID1IyWz7ALtiNZ1RB3I+9OgOZ03uWW/sEjMFizLC7VCrfKe1G8a YgsIJMfjaBT0N5fmTGdJ2aRhpwNWcuMQxb2MD5ncilGKeabCQwOBU40zJaBafLhG0g2b mWng== X-Gm-Message-State: AOJu0YyZNtD/pSAp9+RAFT8cB+FwwrqdbeAhGtNwKmxi5xppXeW+gu4+ vpJBm+inb3S6/e6n8y7qxM35oAi6z5AqZdsZi8R7+tIc5I2xMx1QOxQ1eO2QaoSSVTE= X-Gm-Gg: ATEYQzxHJE/uVcFOvzVm2FgLKgqWmVe+sNV0Y91sL58p8q0eWFG933aXGeLj5DJRpGR adjCZxCX3gKkhkmf5o2glzUwWwWwkNdS4brGEkiBwbzxWmya9c/j5Z7LW2T/GzJuHX/X/LwYKSG XjFghGq/TO8lzuQJ6k3egdW7pES9XEh0FGOjooEbsi1pqOxCvJtICDs+T+jWSG6LNVHelnceG58 QXKVzZxU3K9rpyKOAgZaKIJnkkeDHHvfL0R89I8bvmUahswYMxsHr0lUeWyb3uucUARtQfN+TwD 5jQcqp0ilyhr3yiuibrro0Ew7ZKeKI/Ea5yV8lOp177b6oahQyZbfaZH7VYL13rKPl22JtrIV4T /6bQAinuuiIarkMp4xLoHMNkgHKOAdc6yZkGdrzaTMskqlcEqA6KniuuEJWkBR4N5CwetxzJW2e THW4VW X-Received: by 2002:a17:902:ef08:b0:2ad:cede:3a1a with SMTP id d9443c01a7336-2aecab22c14mr9107505ad.39.1773354911980; Thu, 12 Mar 2026 15:35:11 -0700 (PDT) Received: from localhost ([2a03:2880:2ff:42::]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2aece80a3a0sm43715ad.65.2026.03.12.15.35.11 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 12 Mar 2026 15:35:11 -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: linux-kernel@vger.kernel.org, Joe Damato Subject: [RFC net-next v2 03/12] net: bnxt: Export bnxt_xmit_get_cfa_action Date: Thu, 12 Mar 2026 15:34:40 -0700 Message-ID: <20260312223457.1999489-4-joe@dama.to> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260312223457.1999489-1-joe@dama.to> References: <20260312223457.1999489-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 Signed-off-by: Joe Damato --- 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 c982aac714d1..c9206977fd54 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 90fa3e93c8d6..8147f31967b5 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 Tue Apr 7 14:39:28 2026 Received: from mail-pl1-f172.google.com (mail-pl1-f172.google.com [209.85.214.172]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7327C3BBA12 for ; Thu, 12 Mar 2026 22:35:14 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.172 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773354917; cv=none; b=dDypygc4JaKEpW29w5pU544XX/9cwm+Aop8qZHY9Evp4q3OUjLygfXzDGe0AZ89DaVGlvFFK+bE0LyRyULdNWYg3mCkNfw6jaoDCglqw9xZ9xi59SB0Bqbo7uzBmMqf8AirVbZPG3AFo+aMevKXSVt7yw7qKbPsj62XuFUGJ2g4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773354917; c=relaxed/simple; bh=PuJu+cuvxYyzLYu/heimivKoS0LlknYg8MItINKiTSc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Qcz04eDKm6HdIuMuklZj0sxPOS6NTMpXAPiiHL02y+opBe994jGzo5Lt2+UX5XEMISCS4XxdOCBqaN3H54K+sw6jPtI/+X9BxmXXqQdGEiAEOJtlDpxm7xhLTudvYES+5FI5ZpyDFYtZNHZ5ilgoJXUi1OwyeEXg4lpvhKAUDl0= 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=JEH9/HFi; arc=none smtp.client-ip=209.85.214.172 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=dama.to Authentication-Results: smtp.subspace.kernel.org; spf=none smtp.mailfrom=dama.to Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=dama-to.20230601.gappssmtp.com header.i=@dama-to.20230601.gappssmtp.com header.b="JEH9/HFi" Received: by mail-pl1-f172.google.com with SMTP id d9443c01a7336-2ab46931cf1so20135445ad.0 for ; Thu, 12 Mar 2026 15:35:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dama-to.20230601.gappssmtp.com; s=20230601; t=1773354914; x=1773959714; 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=yhpU0qTAGa7ThLCGsekUFVuiiOUf0jdr/bUs5nRSlS8=; b=JEH9/HFipRoY975DSUM3yxuNnuOUBeYc98szNskPCBO9PRL2pwVJNwFAJqA3CudUJR UBNnVuolzAClTDrOtrdHtXIpDChUfVNLuiGOSzpMzIEVfoBlhkd+4zdbqZMuq1kXdz6D 842u68IV+FtyHYMETgWewlvr9UQwR4hcvUONl6wQyY4bF7gps4lpUOFDZjg4W+QAmnUv UQGy5Kd5eakJeAgBIOYsJ5SpmlkkrYKZz1TbKbaTM1QuRVGI/qqMjhHWpcWE9hLDYv2Y plo7IReDJAX5n+xQ+hS01b1BfqJELAizcBRdaOJwAH6Qw7DYxNOG8yUhTugmwD9rhgqX q3NQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773354914; x=1773959714; 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=yhpU0qTAGa7ThLCGsekUFVuiiOUf0jdr/bUs5nRSlS8=; b=I7kk8UAhm+bLtHgjYlTpjOc9lPcjl6KwskFnfNM339sR+vsa13yYHj9DQC7pDsnjUI IqrMskJpvABm8UpL7L+kEN0mg1zKLxYEttAB41gdsBdF5IudqzT/7VJCpngUAytYvfDa UzGQLEqXXI9AHfS7oS8IbcRWrpeNTSkON5iOHg4scKsulLgTAY7v3OnvjZSPgVSGcODI qh5r12yFUcEgD+2Y5LDzbhZYfYBfjbRRS0IxQozHcPDKmfWjqaVjgSi+c5RDU+RDcdUq mbMbMW6g7A6jr12DfcnHK6rWqLyfFAyjz7jGSd/c7QJCnBdGkNUnHTwMxh3c2oEU6KkX Oahg== X-Gm-Message-State: AOJu0YxZR8gQiHU9WKw7J1je3nefMzwMCuvHvIm4ZioN9Dx/jZ7g7f9r pPsBynlr5c61KDK5/wzdyzTZUdYK4otYzFc0XuuE24wc7KulowmTMCcWTX/CmtLYebw= X-Gm-Gg: ATEYQzzerPtXQaJuDH9VSn39+dO6z6bb5/DKBDY/7yvFgKBUGq9KMOf0jNqi0KkbtIh DuzstFPCFs+g4TBD4OW1yBXTs30eGfpVRnk+AOCz0hZRI6Y1JOdOGkHFGJL22tg4yYUfPX0LpyM xYwGuAqEwsZjZtokf4TFk5r0T7v5qUznYp+Gte5AQjuU4IxBsHeGWY45JvQ24Z2dCK8JodJz/eq +NNQ442PFeCH+b3f1n/S8lZueUAzNGYuHK31B3chE9pfWqPu+9w1Te7sfz9S91htXOtkHOa5C7y Or1y0dPDBy08NTP9iM9ZxxF+6IUSWHH05uftD2Wj/CVhYcyDY9hoknMd6xsBzl1Qr+uXKw+ZKL3 /KOjZ4wDspTh+3kC9VN0WGaYSQ13MeHLhhDPg4N4ZvE0CEN76uBCkiJt7/tcY+YShlE0l+YZ31s eA1TLl X-Received: by 2002:a17:902:ec91:b0:2ae:4d6b:b2c7 with SMTP id d9443c01a7336-2aeca50068bmr10458835ad.9.1773354913863; Thu, 12 Mar 2026 15:35:13 -0700 (PDT) Received: from localhost ([2a03:2880:2ff:71::]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2aece8233e1sm31025ad.71.2026.03.12.15.35.13 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 12 Mar 2026 15:35:13 -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: linux-kernel@vger.kernel.org, Joe Damato Subject: [RFC net-next v2 04/12] net: bnxt: Add a helper for tx_bd_ext Date: Thu, 12 Mar 2026 15:34:41 -0700 Message-ID: <20260312223457.1999489-5-joe@dama.to> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260312223457.1999489-1-joe@dama.to> References: <20260312223457.1999489-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 Signed-off-by: Joe Damato --- 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 c9206977fd54..d12e4fcd5063 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 8147f31967b5..a822bbb71146 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 Tue Apr 7 14:39:28 2026 Received: from mail-pl1-f170.google.com (mail-pl1-f170.google.com [209.85.214.170]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 40A233BB9F5 for ; Thu, 12 Mar 2026 22:35:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.170 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773354919; cv=none; b=lhT0mZFudOU75deoiCFRbjjsYl5WUn25u6R7zB4X4xnQEcJmxVGtYeMNcHvDNYVNFHUvEyTSMH5K9270opxqb+DREyJnaDWdJj4SxaYYihCzMiATr913bDqQW+3WtrNhcJS68/VzArvEsKBIa724LMv/EoEeHlXlBjpmI5YkJSU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773354919; c=relaxed/simple; bh=LFxmYubxtvxESGJkaDDD8TLr9mfsBvvJI9Y6f+WIXHY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=BVm1GeoZQmEwXNHnRZTGfp4omIgAvn4cmuc2uAOKuK2oXOuION2+lB9cT6J+lv59hplEbvYgzQSOOAf0UWSwN3w2/6nooLw1HnhWJfNOenEduIYzZwACf6RjTOVyWjSoH9J5Lu8oH6ABo4aeKfJgF4XuebibCeNoD8hYcm19j5o= 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=uueeTmGF; arc=none smtp.client-ip=209.85.214.170 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=dama.to Authentication-Results: smtp.subspace.kernel.org; spf=none smtp.mailfrom=dama.to Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=dama-to.20230601.gappssmtp.com header.i=@dama-to.20230601.gappssmtp.com header.b="uueeTmGF" Received: by mail-pl1-f170.google.com with SMTP id d9443c01a7336-2ab077e3f32so7246095ad.3 for ; Thu, 12 Mar 2026 15:35:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dama-to.20230601.gappssmtp.com; s=20230601; t=1773354915; x=1773959715; 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=WJyTxUd6u+yzwsu9Uzqyo58WkKimIItw6uQu3GFh36E=; b=uueeTmGFNiBHKvYXC5I4xLGzHOfiRKSlgHB16afLePG2WYlAgCK//WO8ohO7JrsP9H hQDugfk/RC8MzL12JvXkvrlcgDbIUxmh3tKCEQ3xDlmJzw0z/oWACPqZyhZKeIAMw7AD OIdvmqATrEkWgadjBtg4zJUqjqKBR9ceH60I083OS9Pz3hEZqeyQFjYSHyek7V0LN/rC CikXdad3y/WxfI5lF/xPdyoVO2W12tuPZqIfwmsYQ853yzqViqoKGUH6tyop2+DsOVV8 zrEk/MyQAiZwgdAXhIcNfbmndPFQaDvgnYW90biEThFr0Xk6mWWyBMCwLWDIDsRZ49un vryg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773354915; x=1773959715; 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=WJyTxUd6u+yzwsu9Uzqyo58WkKimIItw6uQu3GFh36E=; b=h0/1dxzhyzVtG6aL/K3pY3/6skDQEMMoCPMMzA0RjxNWM9MFkyKq2ftabiSxPY+gdk NRR0Z9JHmEE5/OwKt60Zma7H3RauSgql3m18Paqoh21DN5eYFKHXVi2fKPswq1yKwTGe z52i+l2TTskkQJYu6+uk9VpplPO6NjuJZQ/5cDcaWBx9WN1p1IraVyzMp3KlLq5NUUPi 3AIwpKmHGqBYCmY2gj9yG+jf1n0k5vflhn7pJAf6fWFrNoi5J4BCFiieripqELLw3zTk NucR6hoReWs9u6jnEA+BCVtYzUZ+uDbZd6BuS3xL/ugFfdNYHo50+gXUSDrwBmo1Kq7U +vYQ== X-Gm-Message-State: AOJu0YwvL6Z+txbgUs3Epfo7zcF9MFLSYaPFOCqRHWF+naGFEONRceCX /fHXaQT/ulfzNaFnfx9ibRulyYHwQ2fsDNVWldtHJ1b0v+fHeukv61z2LdcGpeCCzkk= X-Gm-Gg: ATEYQzyZqK19v2gv3o4+XmpAVL846r43ONJBgCbTGA3aTKGgeHMIkwh22AkA5LZHddV vOFcC81uy194YwumFZ0Q9coOk9gXiP/kCMZ7sRK+8c9KzB5i4rxC2/mcuG0hHBfH4ZKYpDIIrDI aQ+UtzTXOfHvlGPvo+P/hhBuxW3hJOPz/QR5YB/LdFiyLtAkVHL1wV8iRW+VSjxcFE+NVzKTADg sn1NQQeZojH3dl5PVvvACpVUOSolNRZQC4maexbyd4fTkEmFMxhzxgVflEJEtr2uZgW4g73ZF3t x+zTeSMDrdZEoX3tpCLeNf/tzCvVfoIwrxcVAeLfEkAsX1/q5Z4hbjuNlPoo0B99/kfViPR+UOz OKWOWjf7p4NaN8xUJgOjNoE4U9PJtmlUYPZgmwsu08WCvnFxx4gZHvdpHyaVbTBEICPCQ58z9iQ YvAurz X-Received: by 2002:a17:902:d490:b0:2ad:6e26:abbb with SMTP id d9443c01a7336-2aecacc3272mr9078945ad.54.1773354915571; Thu, 12 Mar 2026 15:35:15 -0700 (PDT) Received: from localhost ([2a03:2880:2ff:70::]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-c73eba9e183sm25897a12.14.2026.03.12.15.35.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 12 Mar 2026 15:35:15 -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: linux-kernel@vger.kernel.org, Joe Damato Subject: [RFC net-next v2 05/12] net: bnxt: Use dma_unmap_len for TX completion unmapping Date: Thu, 12 Mar 2026 15:34:42 -0700 Message-ID: <20260312223457.1999489-6-joe@dama.to> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260312223457.1999489-1-joe@dama.to> References: <20260312223457.1999489-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 Signed-off-by: Joe Damato --- rfcv2: - Use some local variables to shortern long lines. No functional change fr= om 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 d12e4fcd5063..ea8081aeb5ae 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)) { @@ -3400,6 +3411,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 @@ -3410,10 +3423,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; @@ -3435,23 +3448,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 Tue Apr 7 14:39:28 2026 Received: from mail-pf1-f170.google.com (mail-pf1-f170.google.com [209.85.210.170]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 18FC33B6343 for ; Thu, 12 Mar 2026 22:35:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.170 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773354921; cv=none; b=QP852v5n720cHQbye51GBfzJr0Dcp92gBq5KiNPwCJsp5fok65w+R6G8jHfr9IEIKy07FYtAu9pa1V6pheKNPYvseg0tgHoAw5+D5JAKANMnh6dyJSzEW0wW2ZyQ+753FEE6Qi9GHD2RjQZN6PwxSC0s9jZPYyowP2XQHELewDw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773354921; c=relaxed/simple; bh=7Zu0Dz91B8pcyek/pNRIrZNMIcp1uoJ9XU9YtqJIP40=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=nuPtvV1BiQdKNu0mhoss4m+aC7eT5xymkhXP8yCtSwjZQ3gWfcuhiDtDHukC+2LEyzaqTSrIMAzPDO1/t9AGqJ9/PkDD+qLBf8umDdK3d/5yvKc2w9wvTR0mVz1vYyhlHzLd+3Sg8WWZbbsk1ldU/ZI6g8UxsgFfqrGdgXSPnjk= 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=WUVjAjC5; arc=none smtp.client-ip=209.85.210.170 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=dama.to Authentication-Results: smtp.subspace.kernel.org; spf=none smtp.mailfrom=dama.to Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=dama-to.20230601.gappssmtp.com header.i=@dama-to.20230601.gappssmtp.com header.b="WUVjAjC5" Received: by mail-pf1-f170.google.com with SMTP id d2e1a72fcca58-82990763921so1378168b3a.1 for ; Thu, 12 Mar 2026 15:35:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dama-to.20230601.gappssmtp.com; s=20230601; t=1773354917; x=1773959717; 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=SXOL9iubHrTOR9uFk5hJvutezBCpUTAEEHozBYZRA8g=; b=WUVjAjC51YCuQPwHHr+wVDiRD0+jdwmT5qoTeRMaPAtZXenJzsZm+xn/PEqPiw7N9a X/RS9EquPNeYo+RA4yQE4qFWP9wsY+bN9aAl4C9wqvXrhsVePQBXD0kvg6X1uva6HnOu BYGu30rWA23z8MYVoRzarXDFzSBe8OdFiI8Sg/5geeC8N9XXWe8JsxPhzAIVuNczHSFA dLpJFFWDS8Lw3CYoU9mqKt2oZI4x8lCe+6nUVeX779ncDyOul39bH3qqpad5BHB5uN4e 4iNOCU8m1NrvPzWEFlx63515wa/Wxr82rUm3ZOxrQpxIsC8NmdLVWfele3v0KtRONakS o3qw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773354917; x=1773959717; 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=SXOL9iubHrTOR9uFk5hJvutezBCpUTAEEHozBYZRA8g=; b=U/UMUINjtVi2vivYbZxb8vCbgb9x1gdzYvmc5okMlU9qC6wISUYFUY3T31KkYywFxi mcYJBoRqKcbaXjsSh8HRzwAL0EWhGZW4hhSwhAJ6ZCkT3gb6qhYdJjouyw84VMkHHpai c+BvuE3tYhuccJiCoFy5cLjfg9ey3WhbJ/QPplriWaWddEahXPqrM2KIQXw7naSnPSqJ mueG74mUcIFMmGrRsiJZ10XWB+T6hMB5RnUTZJx6HGVLVdHxvKPZ/YxUnrou+TkU2XEi hIGHQ1xJPSFzhteKcEP+gSs805Z7a4xhq6KHw9TD9I6hGNZEIJbKILRAChY8LZ6akYcd NhdQ== X-Gm-Message-State: AOJu0Yzvz0i21BsbBdMv4/C79ZDyls/zQ1OggoN9u1ia7oqx+dqpbjgg Q2nkG6rNR/FUeGjsA0WPgm5CEt54kkCLsMBsXKA4qiZ9kxWshOlx5kiI8nb3DJ/lJfg= X-Gm-Gg: ATEYQzwHRK1ZkxDmfEtu7kiqqlj6UPtZwYQemSEAIswHLWVN6OFH9LxOlJQ2cxRPr2p aQWacS0lMzwMvgfIA2ofQtH/slYh6pvfaXJO3YE5GoDj7Z9Pi1fsdIDPMrQW6Y6zjwaOgPRPxta GDeBb0/TigN+Bn7Lrd9J7uI9wKDnI2Wf89GkZ0iEGy+cPm/39j1Lz0sjR2/sv93UR4KS5g9ss+F lSUwMx7JDwdPJoWcpkzlt+eOz86/JCaRJHJSd0bPbLtaZFltTUKq7KCIUMOLo/J7CDFwY/EWEzu 4r6fHeS7w5LDIH/ooYUpPtTq8wQ3Fjt5/QEnMexw8yUkI06E9OKmA69sgLs5v6r1BBtVKa8w+k1 4JYtVwZ4HMxaNHi8t6cBlF/s2hT36hFEfvCjnRVsUhtLlR61HHyjF+6u5hIXLOxiSVvpwLlu8p8 dOZAl7 X-Received: by 2002:a05:6a00:9293:b0:824:a01f:6335 with SMTP id d2e1a72fcca58-82a198505f1mr886315b3a.22.1773354917495; Thu, 12 Mar 2026 15:35:17 -0700 (PDT) Received: from localhost ([2a03:2880:2ff:47::]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-82a073b265bsm4176803b3a.65.2026.03.12.15.35.16 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 12 Mar 2026 15:35:17 -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: linux-kernel@vger.kernel.org, Joe Damato Subject: [RFC net-next v2 06/12] net: bnxt: Add TX inline buffer infrastructure Date: Thu, 12 Mar 2026 15:34:43 -0700 Message-ID: <20260312223457.1999489-7-joe@dama.to> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260312223457.1999489-1-joe@dama.to> References: <20260312223457.1999489-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 Signed-off-by: Joe Damato --- 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 ea8081aeb5ae..8929264a54b1 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c @@ -3983,6 +3983,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; @@ -4001,6 +4034,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 a822bbb71146..d9543d6048d8 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 Tue Apr 7 14:39:28 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 4AAE43BD247 for ; Thu, 12 Mar 2026 22:35:20 +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=1773354923; cv=none; b=YKXoZ6heL3JdimGVEBbUmWkP6MxrD3NMvDF9quP76/uCVMsSCYxEg+amxhHx63Kf34zWiIbcgDNfHLZaYGhZNFUMQVM6faY+Y0tfKutfJgua2ZvPnLWMWGFJIX8+4qVCdEYUc2yzbpdwC3I5xj5hm34+5zfGmd0/QXg9aL32OA8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773354923; c=relaxed/simple; bh=e96EXxfLihKuO05dFmuztcwCzRpZVtLutKKCC6HBE8c=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=BLxFDe9ndgkhLSGBoCI4GOIYV0e0NqhwNwUZnp+GYIxdLh+mr4UTz4OXPv9TrBZVkd6JAGAKKXSaWxMI7XTs4ZeNJCVllbBksO+2LYZJSMZ/3SPvoDfWI0R+vVZWsJVbXgWPqLnMQgmoh/vsrGdWlBaOvbQYr5/ZEhHKEkquh70= 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=kH38lWFI; 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="kH38lWFI" Received: by mail-pf1-f180.google.com with SMTP id d2e1a72fcca58-829a568f3ccso781612b3a.0 for ; Thu, 12 Mar 2026 15:35:20 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dama-to.20230601.gappssmtp.com; s=20230601; t=1773354920; x=1773959720; 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=LU0lxc3eKqf92oDepH/UmC/x9vwxuAnsiBKDevCcH+I=; b=kH38lWFIb8tjyfHn/7AIXv70zfvgmacoR/SLbJrkct0eLtjuuZVexooEsX6tEJsE3F wyVBo2dYr/+uEvNOt2A7I+BAtjNwKGoxxPCuHOhmPWfQ3nUdU4BfzLfLzaJdVsLLTHh9 eZCt9Q/BxQxb0K5DDt8V3ZqODyI5ILzcD2Bu8g01RBwtobA+pcH9Ifd5dQQnbcpbQv6s KUalqM2ou+/CmNJfA1cjSdj6ODbaEpky01MdsmsjhG7YDw3R4p+0GAkBxVJRth6yIaFX +v003H7H2aTl2mr1mXJ42ugvo1dVAIcEUg3psdRq6yjsJDxlMBiai47JYsOlX/69wnPr UoKg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773354920; x=1773959720; 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=LU0lxc3eKqf92oDepH/UmC/x9vwxuAnsiBKDevCcH+I=; b=niOxGdhUNiQWYW3DjBuPrqER/r3MEoa2kL5Qpj2acoFWNXRZ32Lw7Fxj9Bx0Iu+DSu 4P1I7WR+Cc1pVj55dyThvemPQ0A7hEIzDfcyqrXS0B8jmF1Wa3g3LCJ8EZ3YivkEyC9B pZu6/tmhsXETifMnTzciPgld2FyzpkyYI75JnGn94/l7Rtz6708ufjSEUpHX7D/69kTc h0+SoriL1okhQR7Q/FPrhWaTYQFVmmYXKBG0N64rR1ovY7rCwgWBXgheMa8gfP3Vssvf yvxBXrP3qJ9C98LfJJi7WFaio5syfCXLZvXJWlGjpNGtK9u376oqLKS/2T6nThoRWbuR lpig== X-Gm-Message-State: AOJu0YxcBY9Haq391qTQD8NSHkUJfm+faLz/VcCCvmW9B5pJHqa65+mL 4m06TAxaqftqlBr3HFkbH/yPq3qE4ljsFpkSSwHRDBRbchBgvA8dr4VGBVGb9bFQco0= X-Gm-Gg: ATEYQzz520m/oaSQV78wjdUonHdaOj6BNShR2RfEdunTF+VnXHbMJv1NzTE+FAt9gnf EW6RM4Fup2joKPev3CMJCc+RjX8N/nRH4+HKrvbEaPmoYGKw+Ru5Xc/e/4atJrXM9on7eiQ3B7W +HeTxeaxf1Y2xIVAGmLT8SxuBVk7lC3AA4eh0nDxXImiRcIQxFdQoH3eiYr9ZiNck20jI4fXC8L ckvVD2LfTHe3nA1SvA5wwtdo+YRSnWs3nFlILY04rmJnn1S0pbaxRagRAJQhJ4MQHYDKknWhNuf jPYal6hThTlcWtwAVvplVYIvXeyaO/utUP0yzwScyB/zmXu1Xv+H7hhpgpQvjYQX4Ht0LVAhvdR H1hS9Jprla8x5V7BRXRDDHW3PzQKLD8ePbCHHM4s44/AMZG/1eOkbCZOzzKlX4vibp/lForwujg 0Ok+cw X-Received: by 2002:a05:6a00:1a02:b0:827:32dd:59d8 with SMTP id d2e1a72fcca58-82a1972e8dfmr667827b3a.16.1773354919660; Thu, 12 Mar 2026 15:35:19 -0700 (PDT) Received: from localhost ([2a03:2880:2ff:71::]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-82a0724407csm3861688b3a.8.2026.03.12.15.35.19 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 12 Mar 2026 15:35:19 -0700 (PDT) From: Joe Damato To: netdev@vger.kernel.org, Michael Chan , Pavan Chebbi , Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Richard Cochran , Alexei Starovoitov , Daniel Borkmann , Jesper Dangaard Brouer , John Fastabend , Stanislav Fomichev Cc: linux-kernel@vger.kernel.org, Joe Damato , bpf@vger.kernel.org Subject: [RFC net-next v2 07/12] net: bnxt: Add boilerplate GSO code Date: Thu, 12 Mar 2026 15:34:44 -0700 Message-ID: <20260312223457.1999489-8-joe@dama.to> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260312223457.1999489-1-joe@dama.to> References: <20260312223457.1999489-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 Signed-off-by: Joe Damato --- 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 d9543d6048d8..593b78672be8 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 Tue Apr 7 14:39:28 2026 Received: from mail-pl1-f170.google.com (mail-pl1-f170.google.com [209.85.214.170]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 1A9083BC668 for ; Thu, 12 Mar 2026 22:35:21 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.170 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773354924; cv=none; b=a7pJPGbMwETssDK7tI3bkbbzfG5h+W9d655I9OZ+ow6KJFZI9BXz+a1sG0R8v5CNBTgyrbns9jdH+qcDiYRLU2UDTL9MoufYky0Ojp14QJoxuK3xbvIe8Wu/gqdOYftaae5MIoCNPY0/Ms1EF0iJnElMby4ZZARKua2MPxAskkE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773354924; c=relaxed/simple; bh=u5+oNe0978EChMIR3JwT6yRD4AgHvONvCIidjJFO510=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=s/JqwuZDVIxzAdi4YDsg5lCyLBseD4BPHXH7WVRlvCUGuYK+UfJAfxK9MBvQq0XXAQ1addNMoYuWatUb/veKl7YuUUnjSSEGUUnAViiu3wUnhpB1UaM99x+AsXZYtMNcHEfLJk2jP4nxN969yIQ4mMQMOSjutsIZs+fZzN3uL5U= 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=dKeeBfCp; arc=none smtp.client-ip=209.85.214.170 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=dama.to Authentication-Results: smtp.subspace.kernel.org; spf=none smtp.mailfrom=dama.to Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=dama-to.20230601.gappssmtp.com header.i=@dama-to.20230601.gappssmtp.com header.b="dKeeBfCp" Received: by mail-pl1-f170.google.com with SMTP id d9443c01a7336-2ae82df847bso12199975ad.2 for ; Thu, 12 Mar 2026 15:35:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dama-to.20230601.gappssmtp.com; s=20230601; t=1773354921; x=1773959721; 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=3zCgPu0ORD9SdVm8ZaahrImfIReOfvGCBgxdZWuhJl0=; b=dKeeBfCp3LlawKoLjYO3fcNBxlPjL3ekw4igZA1XJHURn1z7iV2tCVJ9kOjJnN0N6X Zswt86yh1rP2rr0MRZRpAgi8rwiihviltDxP/N4h5Fab2ZF+qagp3enNyfuhCYQockka oVlTizd5mt411yhd3xe/PxwerJlkelb/bQl8D2aqiZRuvbwkkUG361JaLrZ5fqLHExxL 1g6wZ4m7Xhxx7yw8YFh/VmITH57pNH4vEmxLpeg2vVrZc4RIJMYLLJlDjUC1ckrh1Ho3 +KyqsFP7tMwHbpxZfPZUptBsO6PYogRBr6YAAq/hizVDefKS0qFegl3CvyR3ren9Zln3 NyPg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773354921; x=1773959721; 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=3zCgPu0ORD9SdVm8ZaahrImfIReOfvGCBgxdZWuhJl0=; b=RrhtGrpArd3yje4H/PXmsxhLg23PmeToRM5e2HgGFfOZWDX6XSLQPYtKCda+ymQHWn NDNsH8rru+8GIR2x275rFHgzVjN0D4yX2/DsO7ruAzHWgOjnXrU4QfMhYNeS+286Ib7S nOvPVXR4liWQEnH94hsgGGQAMuGQi1IWKEIP6Ayj07tD2ADYuLQhY/ZDgx/w61TBR8iv b1QqraVr7q/3EaJrmp08gxvOeif9AyEgQYKCBkT1ihyDUYLQm27ei12dOrGthk3a2Jia P+HnQE1bvdICkh30+nmISnSYvCxW8vBLiHWSPJCfP8T6qA8H12zPskUG6mGkie7ochPi /X1g== X-Gm-Message-State: AOJu0YxKrjAZXVikbyckpWFs9j9F4NbBR7iLJmm2KXsGC4JbDebQUJYC 40CPIn40MftwieLN8ahRgeTTUIMtQFY/FZEA9XE+LH4Eq+bjefzyYNlYSHtmcm2ZF+E= X-Gm-Gg: ATEYQzyrbJtuKFmb6dTUcItkwRjJYOogbMG3QFD7RliTKt+IG7btN57pXbqdL9BAgsH HpzCOE26+Ac1VT8Om+slUuyc94YFNL5YPiCjDISkZHxAHW5u8+ONcktGUw83b56a5W4+skHJZkZ k46jNJijZ4ZiT+E3xXAVindc697YdJjxKVCAGQupOBEFhUQ7S5WYLbRWxe124uY169Z4VYOJ41T fZbrwlBiGd3ajVHTrgVl9HRiDlWjn5IKw9Gm3VWUDBPIPF76HQqsZsCSsn7WWwWvAN77uR/HjKi 9D1sn7vZgUofinQqcUFAoPqRUl46watXW92lYArnrasBuGQaRzYpXVL2nW4fGTUMfODP1Q10vqd yMZAhuEYobSp6oqdBRp8RNC1uDO+jyNMsMtxo1WCwexBn1GvAEsWqfRNjvn+BpQMx56Kf6brGe4 2jvGQ= X-Received: by 2002:a17:903:19e6:b0:2ae:4cb8:484a with SMTP id d9443c01a7336-2aeca9f5549mr9600935ad.17.1773354921438; Thu, 12 Mar 2026 15:35:21 -0700 (PDT) Received: from localhost ([2a03:2880:2ff:6::]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2aece7edcd1sm33845ad.49.2026.03.12.15.35.20 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 12 Mar 2026 15:35:21 -0700 (PDT) From: Joe Damato To: netdev@vger.kernel.org, Michael Chan , Pavan Chebbi , Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni Cc: linux-kernel@vger.kernel.org, Joe Damato Subject: [RFC net-next v2 08/12] net: bnxt: Implement software USO Date: Thu, 12 Mar 2026 15:34:45 -0700 Message-ID: <20260312223457.1999489-9-joe@dama.to> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260312223457.1999489-1-joe@dama.to> References: <20260312223457.1999489-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 Signed-off-by: Joe Damato --- 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_gso.c | 200 ++++++++++++++++++ 1 file changed, 200 insertions(+) diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_gso.c b/drivers/net/et= hernet/broadcom/bnxt/bnxt_gso.c index b296769ee4fe..6e186d514a2b 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt_gso.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_gso.c @@ -19,11 +19,211 @@ #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) { + struct bnxt_sw_tx_bd *last_unmap_buf =3D NULL; + unsigned int hdr_len, mss, num_segs; + unsigned int last_unmap_len =3D 0; + struct pci_dev *pdev =3D bp->pdev; + dma_addr_t last_unmap_addr =3D 0; + 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)) + return NETDEV_TX_OK; + + /* 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; + + 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 Tue Apr 7 14:39:28 2026 Received: from mail-pl1-f182.google.com (mail-pl1-f182.google.com [209.85.214.182]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 68A823BD256 for ; Thu, 12 Mar 2026 22:35:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.182 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773354930; cv=none; b=WW5Gb6x3tndMDXiFitA7MdC39fLI9cVKD+Qz0GGnQ06/neTJkBaGg/VTP34M/MuPRH7tyMOXo4/gXg2lGLoBT3ngVUw5mCuOJx7aIUrM39kXASfdqMzTflqtLajIv9QXTHiPVAEt2KPOF9qmxYjEwEa9bdt/4/b2d8P1rMJT4mc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773354930; c=relaxed/simple; bh=VSWPHQrChpY+se9dqS1grbZmUudcEqXcy5BBDDHxP6I=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=tmppELryHChw0l8tFP8EpRrStJCktY7y06ctC2cRJY3RBACgbCnPtSW3vz7GGWEMsiL4zrSWpS97QviukWvalRLEGnRvIMC1oUoaMuwXvsB1mLPYoBy5fktmv5Lq7zLgwmB9gznQ/0gW3gQvSdkkg/4xbRlOeXLTJ0zH50vOrcM= 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=p7bzvPmU; arc=none smtp.client-ip=209.85.214.182 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=dama.to Authentication-Results: smtp.subspace.kernel.org; spf=none smtp.mailfrom=dama.to Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=dama-to.20230601.gappssmtp.com header.i=@dama-to.20230601.gappssmtp.com header.b="p7bzvPmU" Received: by mail-pl1-f182.google.com with SMTP id d9443c01a7336-2aec4a71ef9so6317615ad.3 for ; Thu, 12 Mar 2026 15:35:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dama-to.20230601.gappssmtp.com; s=20230601; t=1773354923; x=1773959723; 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=YlvgGOZa+lsv924b+1yH84F0jxgzjrLCRlog+wcl+jo=; b=p7bzvPmUvz6RZb4O+ZFJqLZwSOi6fCr4hdBi0h0LwFAr/58YoOLjyXIpyyScsSVAkH BqfWRsmTHgBU9qmDq8EHD+KpNv5pkj+u2a3HsEZp1qTwWWMoHDfgUD/n4DXgKtG3v/z0 KHLXtTIlXdsr/q94Jgkyaatin35QowDDqO80rWT1ynIaa9zPdxAP6bRvOkjkAgOPymCO uFaVefLI2bU7Uv2R5DKPX1/m2McKb8BHLutibh0lO1caVrc2rssNUhZ1n4wQk8su6IKU fwHNZ7AikKiPSsVlcY7cmT29Y+t0lDwnNSc2xpxBNucWmr/8O1d2yfQmAs2upiE7iy0a wCKA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773354923; x=1773959723; 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=YlvgGOZa+lsv924b+1yH84F0jxgzjrLCRlog+wcl+jo=; b=nKVs2cvbK3ngeuHfnwsk7QIjn2EOJjuLjVtUPeJ99ueKtzLt3Bls1NOBxco/yKkW7n LPy5vfi2e7RdUoihHwdhVQrpnB/MfrtdvPXg5Q65pmr53bPsrc1dgzp5BJzqH6bS1U5B sLvRVOmqbS7FBS2AOJEteuMq3MmcbIZbsX8Wg8UVaoopmaa5vc1BX8U/XcexATYmzAui d6pDJGt4mYwHAbMDbpXmIDTvKS7Bh/yvcAdSkwA5LJVt6rp2nUrOT/akI6GH0U0UFSJf Tlq/35sRxpvB2Rxz0D4F2tJnvwnmds+UE5iZVdUSeDuK/U+lUryWc4syMAGemO/x6J0q 1bYQ== X-Gm-Message-State: AOJu0YyiA07aXt/4Ke9XAo3F9Zl8TTnIvr+oJEgILdkAaVPxczdytdjB mqNGbasyvm/uWCH3+O+JfcfR13vNnezBSu42Zi3SH7ifAtmjg8m++qjMW0cFM1RDYlc= X-Gm-Gg: ATEYQzxZQ7H6JbrVonvKY0FhwdN7QehQomRZHplgZzEwdMwvvtBuiwROANBKjMr4NGX lbgvxnLcCqpi7Cu8xPR+pU/HZKaI65R8rEgpn7RDHxEdIQawBw5/PWC1PEcgRdvZkhoRrwQlhny a7Sqt4+LWjyiTUXQin5Wxg4UNwdBS4lZJgJEL1uJVntSQ/Jjgly5t3c0Ne8dl8jeTc25u67rz3S 9raTqSG4zMlsTAlvaMIz+T1GLjfEm/dsUGlTZ41jq9P1WMJbsso0WDshd8g4gekJbr0P2FMJc5O eYzC+VTZukaF34HPqYnMrG1+SnsXlQs2WbOU3IHBTTOfEu0D5lDBKwvkmJ43Lq/Fn+sAMIZcVgo vGe57VgugQSoNTUDKXi3+3VQU+NTTA1bKaR0oKRL6BlxwARXorRYLCCCIQIE/KuHcySGSqO+HBX NkAOrWoMXbrGSrDg== X-Received: by 2002:a17:903:94d:b0:2ae:7ed6:7d15 with SMTP id d9443c01a7336-2aecaacf9famr8633075ad.28.1773354923409; Thu, 12 Mar 2026 15:35:23 -0700 (PDT) Received: from localhost ([2a03:2880:2ff:2::]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2aece5c87bfsm366845ad.24.2026.03.12.15.35.22 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 12 Mar 2026 15:35:22 -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: linux-kernel@vger.kernel.org, Joe Damato Subject: [RFC net-next v2 09/12] net: bnxt: Add SW GSO completion and teardown support Date: Thu, 12 Mar 2026 15:34:46 -0700 Message-ID: <20260312223457.1999489-10-joe@dama.to> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260312223457.1999489-1-joe@dama.to> References: <20260312223457.1999489-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: no special cleanup needed -- payload DMA unmapping is handled by the existing per-BD dma_unmap_len walk, and the header inline buffer is pre-allocated per-ring (freed at ring teardown) 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 Signed-off-by: Joe Damato --- rfcv2: - Update the shared header buffer consumer on TX completion. drivers/net/ethernet/broadcom/bnxt/bnxt.c | 69 ++++++++++++++++--- .../net/ethernet/broadcom/bnxt/bnxt_ethtool.c | 19 ++++- 2 files changed, 78 insertions(+), 10 deletions(-) diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethern= et/broadcom/bnxt/bnxt.c index 8929264a54b1..60daf813154e 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,17 @@ 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_MID) { + 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 */ @@ -3418,6 +3432,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 @@ -3470,7 +3485,13 @@ 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_MID) + skb =3D NULL; + } + if (skb) + dev_kfree_skb(skb); } netdev_tx_reset_queue(netdev_get_tx_queue(bp->dev, idx)); } @@ -3996,9 +4017,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) @@ -4101,6 +4122,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); @@ -4643,6 +4672,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]; @@ -13831,6 +13864,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 @@ -13876,6 +13914,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; @@ -16879,8 +16926,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; @@ -16913,8 +16959,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 26fcd52c8a61..1a2c6920e9e1 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 Tue Apr 7 14:39:28 2026 Received: from mail-pg1-f173.google.com (mail-pg1-f173.google.com [209.85.215.173]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 752983BD24B for ; Thu, 12 Mar 2026 22:35:25 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.173 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773354926; cv=none; b=OwcwbQ5Kcue+8EPqRqAxEFFKaCvQOoa6hAyM5JDxE9VT9Kmon64T+3Nr21glF+wlOAiUzx+9AvmFShIkGHCoMD2J2DMney6E0GFwRHhJyKsIX2IDIYHOItEFAxxgWrxLItjCiEvBIAgdLEmLFr9FSm9YaacB05Z1LhoYNJH8ErY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773354926; c=relaxed/simple; bh=NVUYBlGIFPOzvTgwiM1AqtMx+naqD3Qm2M223Xx4Pnw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=X9oUksgA0hF0Rv7csSvVx1kmyFCsS7qdIw6/Fbhwh8r9OrrFv5HHWDtETTfLfUyYhVhaTkFbVprpj8Dr59oODP/3uHEi0vy19vDfLpCozyUsO0BpKQrlb49+Vrbjo2vt2X7ep4wGu0Qd05158uZyJlMcfI1Tnj2wq744pmsyGbg= 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=T2KjEnT5; arc=none smtp.client-ip=209.85.215.173 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=dama.to Authentication-Results: smtp.subspace.kernel.org; spf=none smtp.mailfrom=dama.to Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=dama-to.20230601.gappssmtp.com header.i=@dama-to.20230601.gappssmtp.com header.b="T2KjEnT5" Received: by mail-pg1-f173.google.com with SMTP id 41be03b00d2f7-c737d3a51bdso655543a12.3 for ; Thu, 12 Mar 2026 15:35:25 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dama-to.20230601.gappssmtp.com; s=20230601; t=1773354925; x=1773959725; 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=2NktXVc512r2uSg71OOoFRo+j5rlYWgIN6qvWki50uU=; b=T2KjEnT5rgqMaWEF7O45OaLrj26om6HRdQkB82EyLSk6W+CQyxPqvEPRTKDq1EHqV+ nwMAr1/+xc2TP67naQPIK7gEmObsuESzBYJI44yNnYOn8mrhReXsgeBHWKJiMb3hRSC2 WNT4TVVrn0mzFkxpE9OllKbVFyZ6cZrhirPYvwwLklXu/wECJAhHjyq6Appgq91EmrHz GueexyjnRtjplBHKjpU0ytBxi/M4jZ3ArSi09rNVMKiFeK2VYX5/ke2AgdFhTO8XGDY6 Lb0SXMoCPrn3MaQLpAmfv9C4ZY+Zpm56Hyvz9VjoP7jwSAmwDILr7M7v8rAF5q8kpsUO vAIw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773354925; x=1773959725; 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=2NktXVc512r2uSg71OOoFRo+j5rlYWgIN6qvWki50uU=; b=srpOz+6oKBcH+XjUZ61EmsJfnTJhpkoLz8j89pHccgbJcWTj89gkBjXU/YeBh++E3x EbxfANhi9qGxLD4SSBEXjFtMgWn29ZHc+SiRwNZw7029xwQbXg18jhYPanEuMZYrbmmo AGQTKYLPxBO8HqCTHQvbyH6IeWsE76trosYXhspYaORkuzX0d89RaIIb3Whlo1ghybkP G4Z+Bc2g5N5AhtwJQjAWpS+a08czbUZ0wGZXCS8kfnBw4edPlzCOVYPPP6wsB0I5joj+ ZmUnJp/MA40HMUyvxZ56l2SUgRkMg2/I1VY9BvjK8iqSHRSlBWXlhNt+kKTHJ8NpXQh/ +W6Q== X-Gm-Message-State: AOJu0YzzWx+JQP6P+CCRtiNpKimn49sHQPkt59sVUKW2uFLFFoK8UyKj CR5U/1VPJr58M8oJUzi14EjX3BWF/xzlHG+R/9o6EGiHOLa89InT9yC2CebPxsimW9U= X-Gm-Gg: ATEYQzx4YlM++lirZC+WtGpFF1I4mwisAciTUdWbRVvVmOu8DaIIHlqqBOlpbBUMEWC oA78gv5gXdc8G8OJnDXIYwby1QwCkAjjLCzBp1xn8zZ45rR8z6agKUwERY6/Z8LqXYi/JPkFzE+ LXswf1nuKce6cJbp9NYXSjfgV94RSlB5Sz3xXH1fnnmTkl4f8gwXop8MKMMQmxLLPliN6gnMfSN nJZnyIxImWRC5/iyvlwpYpQIYhNDtHqVS40Gm/zdUqxNs4WDUU1sPEqMAlCGpO7t1t76dKR2nMn URW4Q8yiI9D2OQkw7ANWJyhdSd+9RPeDfM5LUG0m5hN7YfKQAvvcMO1KFVhFursFGl/J2rmvaC/ u3B/E+HnEc1857ZgtdbdrprUTIHC8ZJqvgNsu2snFni3QpKpdyuZ+KI1Gvz3/oWmF6ro+EushMJ ZCs+ek7gl5l5O+1Ts= X-Received: by 2002:a05:6a21:2c11:b0:398:80dd:5705 with SMTP id adf61e73a8af0-398eccf385amr678068637.46.1773354924927; Thu, 12 Mar 2026 15:35:24 -0700 (PDT) Received: from localhost ([2a03:2880:2ff:42::]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-82a0738bca8sm3905934b3a.60.2026.03.12.15.35.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 12 Mar 2026 15:35:24 -0700 (PDT) From: Joe Damato To: netdev@vger.kernel.org, Michael Chan , Pavan Chebbi , Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni Cc: linux-kernel@vger.kernel.org, Joe Damato Subject: [RFC net-next v2 10/12] net: bnxt: Dispatch to SW USO Date: Thu, 12 Mar 2026 15:34:47 -0700 Message-ID: <20260312223457.1999489-11-joe@dama.to> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260312223457.1999489-1-joe@dama.to> References: <20260312223457.1999489-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 Signed-off-by: Joe Damato --- 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 60daf813154e..c09772aa2b32 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 Tue Apr 7 14:39:28 2026 Received: from mail-pj1-f45.google.com (mail-pj1-f45.google.com [209.85.216.45]) (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 3F46F3D88E5 for ; Thu, 12 Mar 2026 22:35:27 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.45 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773354930; cv=none; b=jaP+evTkZxThuONVzH2LOup6hmI6BIqRASn0jX51a62fDLf/nI/79z5c8FFyPQbVXiMAs7Kr3mCnG9/62+CEwY2WXvNFSipm+nslfd4EV+xiaabS/jRV50ZQSP4wIDjAzmcmSecHcAKn/5HxwgLG7wCMoNkfWdCv/5li+uJXPfc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773354930; c=relaxed/simple; bh=G3lAJEGIzOMjHC/w2zD2WcOKWET3ZX4PkXRW3E0aC98=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=JCc/DvD7fP30GeQgbra/hljFjmLSeRqG8cf2Nqt+C7IReBw0Sdc4OG0D+v0EIHKAse+78zp8OilT2vJ4xQUCmNMQL94yLK1gLT8noZr5fdxFVXkgS8dJuPC85K+kVx5mYffh0pdWzLF+QMV2vVQiw31ebqsoZwAh8Jv2LelRAB4= 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=JZ+6YizI; arc=none smtp.client-ip=209.85.216.45 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="JZ+6YizI" Received: by mail-pj1-f45.google.com with SMTP id 98e67ed59e1d1-35a1f549e7eso549205a91.0 for ; Thu, 12 Mar 2026 15:35:27 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dama-to.20230601.gappssmtp.com; s=20230601; t=1773354926; x=1773959726; 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=vzxTmIvDilrbiI026msD2EOVwu+JY7leoshXAkQYWUA=; b=JZ+6YizIMNvaRhiHZCvrCc4Q2kVdqZaBDT6B+s5uOhoOOW0zPLc3uXYV9v3OHI0igx H04f53AkIO8hWx5gTWqrvCQlZ2C8uPVlD6r2WGq4E9U7o6obQrP903lvkqGjhW/wk+0t 9m6lH7thIGdvp9ewRA63wKtRhLXyy5gOU8xuW9ENyVKVReByF3/CSdFnI2DEGJOVKTPW W9X92e/H7NAMUpZY5T4m1Axd1GtwGRNKYHiZOnr6tivZAa4fETCVLIGAA1Hk2DkWdY5O Ka4ZdavDyjs5P3q2M6A6cQBBmDsPiCorBMJmEjM3mYbk6SpXwZh6sPYa40IYhfSpl4Rv OXMQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773354926; x=1773959726; 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=vzxTmIvDilrbiI026msD2EOVwu+JY7leoshXAkQYWUA=; b=puikZLjAz13BeiMHIkWnMHqdbZCYN7tVFS+rm1ZSiJswlMiFAlBmPTi3Ik/maSU2QE sIgg1M0KfQypKLEIu2Ef/hAylQgx5H8d4RauniCVhKi/dMsIf2kYGuYf0zoRciGPp7uo RqaoEaNH2rrKvfSEzJW189u8RmeA8TARjQLp++s5StXAcoSCmJvdtRezcKlQEmj2S9ji qQ61Zl4eYVPLMDrtLqrvc1dxfWkeIvNcpRr7vonTaXpWHn12ZyVhLZ9GnPclj4zFW3Le aqdTKc7Q6NZI8D0kLy0AmeWBTHVa0vcuinQGQQQnhh1MvX9RcnKcsIJLOOhbk+/iCUe4 z1lg== X-Forwarded-Encrypted: i=1; AJvYcCWPiTm2XoyT0xueOwYrKAjVkQizn6aTMDiY7yMAKdjSCgEp+d0j/iNNlyB/j6/xZmEbbAxqkwnBKzh+6ZY=@vger.kernel.org X-Gm-Message-State: AOJu0YySnj/WS4pOVgHg8RrZ/CJR1Xy8QuESYoS6ThyEkcNWbZ+tlUXi LhWqCBqvke4PiVTsqLsFWDkfFyxzB2AeAqOnz2Ht9qOhpSfdkwJppeEBAC61Ln6VZcc= X-Gm-Gg: ATEYQzxx5YaISm2O8NvSW+knDQxfxd2Kvm4e6jQMSnaEEGLxjXq/FnHIdma62iHurrv NfImspjQrLyImdwwlUFJBB7TdoWD8OKZuVFydNU+HBs68LWNWpmE47uqHv54jv8USQmoGTJeGsQ FQxQ8fQ3qDBtXWS3tajLM7WLro9Tir119hGyizYk6QCINfPy9ybAHMN807NrC5rmo3iAcKaQQDJ WKTqH/qAcPIwXvNH22TBnQ25owv7azgUmeDM3uo3V+T9vfw3pUVEUrQGoiSnvRRlA+yPZRdSTr2 akXwZkIU4Skv8Fvd0Si2TgxahMR4hGP9CUVsUQsnUvTfgMrcXFwLxL9Bed56+JC8SnYTRFXdvWn ErIRB9zSFE0wROh2ESY5cnc7sm8RzfMpGqBqzwBVESvpJGHdKFAtItkORl7G5RsDQpuhL9GeB83 JRj2Cr X-Received: by 2002:a17:90a:e7d1:b0:340:b912:536 with SMTP id 98e67ed59e1d1-35a220555eamr943023a91.31.1773354926610; Thu, 12 Mar 2026 15:35:26 -0700 (PDT) Received: from localhost ([2a03:2880:2ff:74::]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-359fc97356dsm7682310a91.8.2026.03.12.15.35.25 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 12 Mar 2026 15:35:26 -0700 (PDT) From: Joe Damato To: netdev@vger.kernel.org, Jakub Kicinski , Andrew Lunn , "David S. Miller" , Eric Dumazet , Paolo Abeni Cc: michael.chan@broadcom.com, pavan.chebbi@broadcom.com, linux-kernel@vger.kernel.org, Joe Damato Subject: [RFC net-next v2 11/12] net: netdevsim: Add support for SW USO Date: Thu, 12 Mar 2026 15:34:48 -0700 Message-ID: <20260312223457.1999489-12-joe@dama.to> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260312223457.1999489-1-joe@dama.to> References: <20260312223457.1999489-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 Signed-off-by: Joe Damato --- 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 5ec028a00c62..f7dd7692a5d9 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 @@ -117,6 +118,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); @@ -129,6 +222,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; @@ -986,7 +1083,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 Tue Apr 7 14:39:28 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 F31C23D47A1 for ; Thu, 12 Mar 2026 22:35:28 +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=1773354931; cv=none; b=fWiJkQWFyFXwaQeDHi1LDOsdLjZ3bpDGJEmXPqugDS9DtQo6dP0tLmBHogzOquk7zCbIoja7QqRCe23qPvQyuSbFszp3pGFfU3BaOypiySLJWc3bIIAEzGkFbV0N+FVUxizoGVZlg9x7R7sOR9hvPJRfh/U8D/iiZeMjdyx5s8w= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773354931; c=relaxed/simple; bh=bOIv1idMYclJig7dHHf8ZB5kdbI0WSQDOttniO+KCbs=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=hauKzK/XhStoGbyz9ApJYdc3oX0gePj8XRCP5TWSOxe9t9uz61HDm+lxCjkbZUerQk3qbPpgjkkqRxehexY6f80KFt4iLPJT9/WMoNAGuGVlv3bZV1LjX8AFibo4y7CDRCwrvz6vSZi53rIUVOivN1N9M0KTR/SMuSkhxeynZxw= 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=p3D9+s+/; 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="p3D9+s+/" Received: by mail-pj1-f49.google.com with SMTP id 98e67ed59e1d1-35a17791284so764231a91.2 for ; Thu, 12 Mar 2026 15:35:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dama-to.20230601.gappssmtp.com; s=20230601; t=1773354928; x=1773959728; 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=zDgUXurlnboqnR9kUYXcG83BLVmHtjY+C3jwCrk3SN8=; b=p3D9+s+/2+ucOmzmglVyBs1yEFXGrh6FarkmvyuB6BZtQxW9J0Zn7up12rbiGXGl8/ mpG/QBiuvBstyFF1MQ9H1ZI3kklsuO5tRVtFyXnTH+hFUHa1oDd+x9KlMmiYhcKy3MHB qrHtVhnp+asDFcwFxmDubToeSMQg82U7g6paTERDTWZAKf2U8+6oVupWvp1Xf/XjkLNk Vb1u4dAigjd3mhV/L3Dfw0c8tcyR3XixYj9CZMNujrep5pYZFtprfJUQki4CckbVb/P1 9jVpKSRFUQet3WUKBbiE8UscUSBvvcUquDHoxHVrf6v9+MUK2sK53zptQN6TkhdPNVOY 8wyg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773354928; x=1773959728; 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=zDgUXurlnboqnR9kUYXcG83BLVmHtjY+C3jwCrk3SN8=; b=bkyF9x5cFBM/6Nl5vPwNWsLblAEPU57kcyF5K8JqCv6HhwI15wib3XhFkKNCuitsl3 pyQS571UlcGzmMhIY3/C1Uszx/yLiWWo/4lgSt6xwPtao1VAe0CgVJpkAo+p5rCKQ12Y ff/02aAQZ+4x4KCu4Z2TC3c2Brds0kN5It7MjiO71G7E09tSDJboRj80L81BO9okTmT/ jF174tNamXebRhxzifMo0mSiXGHwlvaYIsg1SLQ5PJQJlDRO2z94QG2ipI1Bf0BZMJ/0 tgR9jAIX5LgoYBl9aNC1glo13XySil9j/kuJ+EFmijX6GujTQ4t81Ig9ckSaBtPfi2er YH0g== X-Forwarded-Encrypted: i=1; AJvYcCXU2jvwYc7WvqHWV7U0rDaWEprxrSFZ01KDdMpFa6fV6LAjVXNL1oMuCFSAVH4wHO5QML7m6F7da3+xeOU=@vger.kernel.org X-Gm-Message-State: AOJu0YwCT0EK1+1T4l9jxOtMkOE/VdgNJ6mLhevdBVYAMuAFS5bGTDF0 SdudV6qHqmnvt+yDQvjI+w7ukQtKF3LWDRBJnH+0gE8ZfevuzndUY9uxvnSvqc4DKRw= X-Gm-Gg: ATEYQzxzVGA60IR4uGkNlRZ1sAl3Cu+q4KRKu3yKMa0fR2S5A2BSKkFyAnlEkIX5o0X 6ZvicaCuUJ08Y5LWRaI5AkkbnuB+Cp5AX3oOy9mIE85yiq1hSZTDcLszvuiXm+VqYMGh9iaWDTp ZJX5HTivPPzIu8nIf07uVgA7JUSGa6/4h2Z2Zjk0/DZ3bI3uiH484b0kJWSC474VFSgXOoM3kk7 x1McKi6e1GCeNV6DxszLBjRlyDMF3l4KMwZH6dFPcNpVCvaC3VoT3vZVl7KEbeNF3EwVQ25231J 8fIPZyr9yr9SesbWakroxyUl6/t2+50qNIfpdCGLw2cYmCHsDXniUSE0zvF5mA7muwu+dfvx62/ y0eycnmXCgCnHP5xCWummqlvmgQyx3Vw70IzwY65ZCtl2Dtl5n4PMlfeFRRDqEnSwDatleeFimi sfK8o= X-Received: by 2002:a17:90b:2783:b0:35a:329:73c1 with SMTP id 98e67ed59e1d1-35a21e1b7b2mr1078051a91.7.1773354928480; Thu, 12 Mar 2026 15:35:28 -0700 (PDT) Received: from localhost ([2a03:2880:2ff:7::]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-35a24acecadsm142489a91.2.2026.03.12.15.35.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 12 Mar 2026 15:35:28 -0700 (PDT) From: Joe Damato To: netdev@vger.kernel.org, Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Shuah Khan Cc: michael.chan@broadcom.com, pavan.chebbi@broadcom.com, linux-kernel@vger.kernel.org, Joe Damato , linux-kselftest@vger.kernel.org Subject: [RFC net-next v2 12/12] selftests: drv-net: Add USO test Date: Thu, 12 Mar 2026 15:34:49 -0700 Message-ID: <20260312223457.1999489-13-joe@dama.to> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260312223457.1999489-1-joe@dama.to> References: <20260312223457.1999489-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 Signed-off-by: Joe Damato --- rfcv2: - new in rfcv2 tools/testing/selftests/drivers/net/Makefile | 1 + tools/testing/selftests/drivers/net/uso.py | 87 ++++++++++++++++++++ 2 files changed, 88 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 8154d6d429d3..800065fe443f 100644 --- a/tools/testing/selftests/drivers/net/Makefile +++ b/tools/testing/selftests/drivers/net/Makefile @@ -22,6 +22,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..da7a68b15734 --- /dev/null +++ b/tools/testing/selftests/drivers/net/uso.py @@ -0,0 +1,87 @@ +#!/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 struct +import time + +from lib.py import ksft_pr, ksft_run, ksft_exit, KsftSkipEx +from lib.py import ksft_eq, ksft_ge +from lib.py import NetDrvEpEnv +from lib.py import bkg, cmd, defer, ethtool, ip, rand_port, wait_port_list= en + +# 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: + raise KsftSkipEx("Device does not support tx-udp-segmentation") + 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: + 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