From nobody Thu Apr 2 18:47:52 2026 Received: from mail-pg1-f180.google.com (mail-pg1-f180.google.com [209.85.215.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 661BB2EC0AE for ; Thu, 26 Mar 2026 23:52:52 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.180 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774569173; cv=none; b=sND2AdAvIHVUsQlk1x+HiL+XUMHTi183yJDBZv/as/DEHJ8gV9rEm10tgzO3cV1AFJT7TOdl2xJ/h6LsPEXT7k6Cyi/3wWjhqXSNxKaEbZeyZdHqFMTG/duzdTFO4+xeI/BfNJQDHxjNSeosq/WFN/bvoxLSkeoEdErIWaNwa10= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774569173; c=relaxed/simple; bh=89osrXGFcyoMNdsGsSYJRS7HmUWWP8RNcJMZ4Irlins=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=BcwNN0a1nR87N7wmxllVfYc3KKkCIfbDMvD8WlYEFKHe4t3aA78DwhGtJhC+zBdjs+3iKisqdhknTJbDNRpcSwjSYOTC6j5mk4fWevohWAuxCwwNPvriKB9OKQA82ZHObHm5zAFm+nMiK63sC9WqD+KBDV0foUWgm7FQmkUdxJI= 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=aj+ylgOn; arc=none smtp.client-ip=209.85.215.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="aj+ylgOn" Received: by mail-pg1-f180.google.com with SMTP id 41be03b00d2f7-c73c990a96dso800053a12.0 for ; Thu, 26 Mar 2026 16:52:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dama-to.20230601.gappssmtp.com; s=20230601; t=1774569172; x=1775173972; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=hzwsL2AaeOyolPivj0sSP8+HZDWRlIMJad3TwBTVVkk=; b=aj+ylgOn5510l4Y1yr1L48xVbF+yPSDcoQ04fpFRCjWibUE3Dl6r+5hHV0s3tXUq8P daTXj8gqltaK6AK5N0fWmdswu+r8u1vjc0VwAFNS0ZdFmcaHTb30k3vC/LooVqYTWJCh 30WMIve7I00ypX1HNnuIQaoutbA0ZkDiqkSmshjlpSX0f/3L3z0wRxjMSA0GOSs57JLh /tv5ycH5t3eJ2h0ugybsy5YsG27lTBpYgbP4gwoJ2bVrXb45W6+Q57OMujrOGUbpAjsu KeU/HmwSjtBih6m4VPWwVfJDSKOSf1yOJw0VZnHh0UTs5DLXzath5Q5zRScfdYHvX5+m oeNQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774569172; x=1775173972; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=hzwsL2AaeOyolPivj0sSP8+HZDWRlIMJad3TwBTVVkk=; b=pOW7yZLRN3hWtYRoSBioeTn5L38vac99pawv0x0AX6ojGeJbwGNq2hFYLPl89trbjC GLe8aYtSx6LuBvO4QVFPVdelr53QlSDBZvIepsI8TMxU65ZaVTpoTbpjdXicpk5u9fLv bTwWW0G0pztVO7lCYVwIp4JzITsElPyt6YHppgpjCcgGlU9KsUHOHAqDTuzslSaP376w DAweTcOAsOMggH6oWqTiGZ44diFo6iPBA5tmN3bJQSOef18TMgUYn3QlO35+6vugoTD5 ArEs5igfJroeSVBFP0UkA0I1TtTxZpK2wEV+keodWG/uBhbN2rQ8XatoNfnEa2Zm4Kps s53w== X-Forwarded-Encrypted: i=1; AJvYcCUoUZF8UppOmyMyn6X3l5OYuucTvKClCVQRedLqIKjIS8HOEbRB4k/ojp9DYvaZZhvLT4peAYS4bwDuPkc=@vger.kernel.org X-Gm-Message-State: AOJu0YzK/e5P/X4tvDYpqY/0ou6lrNYGEkidVPoLXrWpItZrHtyFoc4q n9COMxH99HO4JTUXw3uMxYa0E/B3XN1Z5268WP4Dg0OFRjFtmdTceb6P4zXA/I7+u2Q= X-Gm-Gg: ATEYQzw7WAIYFQV4i3aTFGF2nQ10gJoqSgpXxczgpP+BTSg8cLUNh/Ux1IuBUN2ieu9 l2Vcr6bxlK1hejKduFzvHDBTPBfPuRwuO+J6IFIJGpuStJGJlnz7Ao0zmXuFCYH4AD4h0GAjZPC Fuo6ZAc5vF4Sn6MLlHbaXPwYDOhkgtI5juo2VT/j5JfKzd21FX4oiFDFUUJS9/J0ktwqi1b9fco Q3FJ5lyBBykWs3+4iFJa5y8iLUU5LTvmeqoLSn9zQA+o+DA98UuhNByjCqnHOi/Gt+zRajN4+qg GR5FCoP3RuMJzJHkhV7m3EXiwiMiL+c35ol2fMYVbzJbUETg0K3K+BXAunT70kOMEcx/pRfepui UnXvdik+qAyCHt3xLHDjzamyvh6Soak/6IaAWQ5fRNIxMHrW9aEwl8XHZF7ibZoXUnDucdwptNF HKXQs= X-Received: by 2002:a17:903:19ed:b0:2b0:61c2:8e83 with SMTP id d9443c01a7336-2b0cdc43116mr4855505ad.20.1774569171745; Thu, 26 Mar 2026 16:52:51 -0700 (PDT) Received: from localhost ([2a03:2880:2ff:2::]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2b0bc87e643sm43677055ad.41.2026.03.26.16.52.51 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 26 Mar 2026 16:52:51 -0700 (PDT) From: Joe Damato To: netdev@vger.kernel.org, "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni Cc: andrew+netdev@lunn.ch, horms@kernel.org, michael.chan@broadcom.com, pavan.chebbi@broadcom.com, linux-kernel@vger.kernel.org, leon@kernel.org, Joe Damato Subject: [net-next v6 01/12] net: tso: Introduce tso_dma_map Date: Thu, 26 Mar 2026 16:52:20 -0700 Message-ID: <20260326235238.2940471-2-joe@dama.to> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260326235238.2940471-1-joe@dama.to> References: <20260326235238.2940471-1-joe@dama.to> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add struct tso_dma_map to tso.h for tracking DMA addresses of mapped GSO payload data. The struct combines DMA mapping storage with iterator state, allowing drivers to walk pre-mapped DMA regions linearly. Includes fields for the DMA IOVA path (iova_state, iova_offset, total_len) and a fallback per-region path (linear_dma, frags[], frag_idx, offset). Helpers to initialize and operate on this struct will be added in the next commit. Suggested-by: Jakub Kicinski Signed-off-by: Joe Damato --- v3: - struct tso_dma_map extended to track IOVA state and a fallback per-region path. include/net/tso.h | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/include/net/tso.h b/include/net/tso.h index e7e157ae0526..8f8d9d74e873 100644 --- a/include/net/tso.h +++ b/include/net/tso.h @@ -3,6 +3,7 @@ #define _TSO_H =20 #include +#include #include =20 #define TSO_HEADER_SIZE 256 @@ -28,4 +29,43 @@ void tso_build_hdr(const struct sk_buff *skb, char *hdr,= struct tso_t *tso, void tso_build_data(const struct sk_buff *skb, struct tso_t *tso, int size= ); int tso_start(struct sk_buff *skb, struct tso_t *tso); =20 +/** + * struct tso_dma_map - DMA mapping state for GSO payload + * @dev: device used for DMA mapping + * @skb: the GSO skb being mapped + * @hdr_len: per-segment header length + * @iova_state: DMA IOVA state (when IOMMU available) + * @iova_offset: global byte offset into IOVA range (IOVA path only) + * @total_len: total payload length + * @frag_idx: current region (-1 =3D linear, 0..nr_frags-1 =3D frag) + * @offset: byte offset within current region + * @linear_dma: DMA address of the linear payload + * @linear_len: length of the linear payload + * @nr_frags: number of frags successfully DMA-mapped + * @frags: per-frag DMA address and length + * + * DMA-maps the payload regions of a GSO skb (linear data + frags). + * Prefers the DMA IOVA API for a single contiguous mapping with one + * IOTLB sync; falls back to per-region dma_map_phys() otherwise. + */ +struct tso_dma_map { + struct device *dev; + const struct sk_buff *skb; + unsigned int hdr_len; + /* IOVA path */ + struct dma_iova_state iova_state; + size_t iova_offset; + size_t total_len; + /* Fallback path if IOVA path fails */ + int frag_idx; + unsigned int offset; + dma_addr_t linear_dma; + unsigned int linear_len; + unsigned int nr_frags; + struct { + dma_addr_t dma; + unsigned int len; + } frags[MAX_SKB_FRAGS]; +}; + #endif /* _TSO_H */ --=20 2.52.0 From nobody Thu Apr 2 18:47:52 2026 Received: from mail-pl1-f169.google.com (mail-pl1-f169.google.com [209.85.214.169]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8D72838B7C5 for ; Thu, 26 Mar 2026 23:52:54 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.169 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774569176; cv=none; b=se2QHJEuNSwXG9zJXHuoRB23nwHEphOj1jxXu7o5oioPRzj2belGnRZYO7VvHtaFpD09Em8Ei2fy0zfes0VQapHiAEWKHEOValEwtGSk9q5x6eZVp1W9eQDRYp5TTjtddd7YNtZDntKHvfl1ekis9bEY5wHhAFyk2hQwFr8FZAo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774569176; c=relaxed/simple; bh=ORkpzv7iiCxiXOhQaUQdLjmDGsPudQzXaVUYF9lrn6U=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=egcbLVls/J1skVxTv7UY1cSBJvrNn19JYlTgXsynxbN9UMzM1Fh+bubAkOebVU0L4z1lLbuTbTiZmoyfzQu60Qi2GdK3esltyFk5z2QgTCVx0i0SNvQ/yJvoQKucaiOyKghYuzRsjGU81gDOSpdJOT59imWFDyxfAKG2qOowVkE= 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=EaVgK0r4; arc=none smtp.client-ip=209.85.214.169 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=dama.to Authentication-Results: smtp.subspace.kernel.org; spf=none smtp.mailfrom=dama.to Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=dama-to.20230601.gappssmtp.com header.i=@dama-to.20230601.gappssmtp.com header.b="EaVgK0r4" Received: by mail-pl1-f169.google.com with SMTP id d9443c01a7336-2b04e6a989eso9663885ad.3 for ; Thu, 26 Mar 2026 16:52:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dama-to.20230601.gappssmtp.com; s=20230601; t=1774569174; x=1775173974; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=Blw7GY0uzkKurUX6ypQhQlLBgZS5L/EPKYGZQrzDQcs=; b=EaVgK0r4HyvU6sioqne1q3rSS+c2yk8KFt1ibXivQbdpxij4/5e/mxgbixlp7TX0nd zU9Pj5IdHN10tOAlaIvKR9waQAhv3gg94F+xUMRWXo/wdLC2Td9VAsuXOR2uX3Xmn8Eo BLb7sVH9ga0epiHNbzsHvTxpGgPD1HVOSpbsRYC0ERZtzJ6jHqcqq0AyoHqiqNA1dVAx 9OMhqDl+6BWYp3HnrEX6yrW2o14vHqmEHZ+wVJGp6cyNBeyO4tCkRQDX3+N5A7G85B2v R7571il9iY0bX72BoMk0LKFvHWOCCE64nAMcfmRWOGw7wt279okBpfWq+tTtSNP4YeLt qkkA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774569174; x=1775173974; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=Blw7GY0uzkKurUX6ypQhQlLBgZS5L/EPKYGZQrzDQcs=; b=Jsa8YnyvYnWAw0pktrXp3pzfMF3XmxW38OIbTd9pvOof6ZZAGvxI6RindC1YSimdCX FlaRRECwUN4XfhP/kb+8VnEYTli24rHezJ5C22dkvB57TncwV6Ky61qUbVabbQqUeKOV M+bVNEwLfUWtD+NjSlhOnKas8llfWemnALOPiipowEF9hRw1yRdPEO7Ic7O6xoZqURKA f9748BAKXF//Mot5Zh5erN+74w+5/qeCTzbcuwjhaX35hJZMyuckuEa8AJI0U5XZJIQ9 Hh9hlmsz8t0CfiahqBL5Zvapm+6ojKH9dOsWUCw83Vo3nzoPcdjX96fxPiIq83OR1q9u mVBw== X-Forwarded-Encrypted: i=1; AJvYcCWeqOVGd7glCCLrJF2vq2xL9WcRnvDn/tZ7mWyI9tZwl/UrnHO/wihvuLy1KodiHPuyZ4CKHatUokovAwo=@vger.kernel.org X-Gm-Message-State: AOJu0YxVKw5ZGacmFWXdhKVinHp0rpgyJpXTdUL0Y64fSwsszqhsZfiq rVBHFYUGZ/2bKUdL3+t13866Ujl/csH01Ay9GT5Pb4BZAhAw65IBF53hMN4Yv/eKtyA= X-Gm-Gg: ATEYQzzHVhThQgi4KLuFV4fOZxEX9jPKs080o+i7PigIMHZpDnzd5HiL1Jrz6v6dirH LRUeVDU0aMPhVvYmfnZipWnlaqSnqtuRVxnhjzFO6u9qymD91q6zLuVgrrGS7rFqPooTqpXjGM7 L6nEjRjFH4xc+WvS7/BemDg8cMdJfL657pqJIB5SeYNRDsdTF5lx/eKIWtCE7vnB7TCc0D8p1pW WuRNOj9yAU5MaORzLWFyKcge3XjgFfRKs6XD39+5EUxaIqNtPWTNrc9qdjvA1Ja+aI8jyA3mVjg cuzFHO8RwFNtJuU5SQHwCOeR7/k+k5lzMHlz2JCrcJc+INrh5qnBlbZHVbTarJIWIN6Y187OA1Y Bi/GtKQr6CeS9T9p2pnyheqGS5H8hEtMD+XSEMoZsqfSPDilpFlAOpdwCHDH6WlcZl6bWCclV/n BLvyZp X-Received: by 2002:a17:902:ea0f:b0:2ae:57e6:616c with SMTP id d9443c01a7336-2b0cdc1eec0mr4725605ad.3.1774569173788; Thu, 26 Mar 2026 16:52:53 -0700 (PDT) Received: from localhost ([2a03:2880:2ff:59::]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2b0bc76b8acsm43309065ad.4.2026.03.26.16.52.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 26 Mar 2026 16:52:53 -0700 (PDT) From: Joe Damato To: netdev@vger.kernel.org, "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni Cc: andrew+netdev@lunn.ch, horms@kernel.org, michael.chan@broadcom.com, pavan.chebbi@broadcom.com, linux-kernel@vger.kernel.org, leon@kernel.org, Joe Damato Subject: [net-next v6 02/12] net: tso: Add tso_dma_map helpers Date: Thu, 26 Mar 2026 16:52:21 -0700 Message-ID: <20260326235238.2940471-3-joe@dama.to> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260326235238.2940471-1-joe@dama.to> References: <20260326235238.2940471-1-joe@dama.to> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Adds skb_frag_phys() to skbuff.h, returning the physical address of a paged fragment's data, which is used by the tso_dma_map helpers introduced in this commit described below: tso_dma_map_init(): DMA-maps the linear payload region and all frags upfront. Prefers the DMA IOVA API for a single contiguous mapping with one IOTLB sync; falls back to per-region dma_map_phys() otherwise. Returns 0 on success, cleans up partial mappings on failure. tso_dma_map_cleanup(): Handles both IOVA and fallback teardown paths. tso_dma_map_count(): counts how many descriptors the next N bytes of payload will need. Returns 1 if IOVA is used since the mapping is contiguous. tso_dma_map_next(): yields the next (dma_addr, chunk_len) pair. On the IOVA path, each segment is a single contiguous chunk. On the fallback path, indicates when a chunk starts a new DMA mapping so the driver can set dma_unmap_len on that descriptor for completion-time unmapping. Suggested-by: Jakub Kicinski Signed-off-by: Joe Damato --- v4: - Fix the kdoc for the TSO helpers. No functional changes. v3: - Added skb_frag_phys helper include/linux/skbuff.h. - Added tso_dma_map_use_iova() inline helper in tso.h. - Updated the helpers to use the DMA IOVA API and falls back to per-regi= on mapping instead. include/linux/skbuff.h | 11 ++ include/net/tso.h | 21 ++++ net/core/tso.c | 273 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 305 insertions(+) diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h index 9cc98f850f1d..d8630eb366c5 100644 --- a/include/linux/skbuff.h +++ b/include/linux/skbuff.h @@ -3758,6 +3758,17 @@ static inline void *skb_frag_address_safe(const skb_= frag_t *frag) return ptr + skb_frag_off(frag); } =20 +/** + * skb_frag_phys - gets the physical address of the data in a paged fragme= nt + * @frag: the paged fragment buffer + * + * Returns: the physical address of the data within @frag. + */ +static inline phys_addr_t skb_frag_phys(const skb_frag_t *frag) +{ + return page_to_phys(skb_frag_page(frag)) + skb_frag_off(frag); +} + /** * skb_frag_page_copy() - sets the page in a fragment from another fragment * @fragto: skb fragment where page is set diff --git a/include/net/tso.h b/include/net/tso.h index 8f8d9d74e873..f78a470a7277 100644 --- a/include/net/tso.h +++ b/include/net/tso.h @@ -68,4 +68,25 @@ struct tso_dma_map { } frags[MAX_SKB_FRAGS]; }; =20 +int tso_dma_map_init(struct tso_dma_map *map, struct device *dev, + const struct sk_buff *skb, unsigned int hdr_len); +void tso_dma_map_cleanup(struct tso_dma_map *map); +unsigned int tso_dma_map_count(struct tso_dma_map *map, unsigned int len); +bool tso_dma_map_next(struct tso_dma_map *map, dma_addr_t *addr, + unsigned int *chunk_len, unsigned int *mapping_len, + unsigned int seg_remaining); + +/** + * tso_dma_map_use_iova - check if this map used the DMA IOVA path + * @map: the map to check + * + * Return: true if the IOVA API was used for this mapping. When true, + * the driver must call tso_dma_map_cleanup() at completion time instead + * of doing per-region DMA unmaps. + */ +static inline bool tso_dma_map_use_iova(struct tso_dma_map *map) +{ + return dma_use_iova(&map->iova_state); +} + #endif /* _TSO_H */ diff --git a/net/core/tso.c b/net/core/tso.c index 6df997b9076e..8d3cfbd52e84 100644 --- a/net/core/tso.c +++ b/net/core/tso.c @@ -3,6 +3,7 @@ #include #include #include +#include #include =20 void tso_build_hdr(const struct sk_buff *skb, char *hdr, struct tso_t *tso, @@ -87,3 +88,275 @@ int tso_start(struct sk_buff *skb, struct tso_t *tso) return hdr_len; } EXPORT_SYMBOL(tso_start); + +static int tso_dma_iova_try(struct device *dev, struct tso_dma_map *map, + phys_addr_t phys, size_t linear_len, size_t total_len, + size_t *offset) +{ + const struct sk_buff *skb; + unsigned int nr_frags; + int i; + + if (!dma_iova_try_alloc(dev, &map->iova_state, phys, total_len)) + return 1; + + skb =3D map->skb; + nr_frags =3D skb_shinfo(skb)->nr_frags; + + if (linear_len) { + if (dma_iova_link(dev, &map->iova_state, + phys, *offset, linear_len, + DMA_TO_DEVICE, 0)) + goto iova_fail; + map->linear_len =3D linear_len; + *offset +=3D linear_len; + } + + for (i =3D 0; i < nr_frags; i++) { + skb_frag_t *frag =3D &skb_shinfo(skb)->frags[i]; + unsigned int frag_len =3D skb_frag_size(frag); + + if (dma_iova_link(dev, &map->iova_state, + skb_frag_phys(frag), *offset, + frag_len, DMA_TO_DEVICE, 0)) { + map->nr_frags =3D i; + goto iova_fail; + } + map->frags[i].len =3D frag_len; + *offset +=3D frag_len; + map->nr_frags =3D i + 1; + } + + if (dma_iova_sync(dev, &map->iova_state, 0, total_len)) + goto iova_fail; + + return 0; + +iova_fail: + dma_iova_destroy(dev, &map->iova_state, *offset, + DMA_TO_DEVICE, 0); + memset(&map->iova_state, 0, sizeof(map->iova_state)); + + /* reset map state */ + map->frag_idx =3D -1; + map->offset =3D 0; + map->linear_len =3D 0; + map->nr_frags =3D 0; + + return 1; +} + +/** + * tso_dma_map_init - DMA-map GSO payload regions + * @map: map struct to initialize + * @dev: device for DMA mapping + * @skb: the GSO skb + * @hdr_len: per-segment header length in bytes + * + * DMA-maps the linear payload (after headers) and all frags. + * Prefers the DMA IOVA API (one contiguous mapping, one IOTLB sync); + * falls back to per-region dma_map_phys() when IOVA is not available. + * Positions the iterator at byte 0 of the payload. + * + * Return: 0 on success, -ENOMEM on DMA mapping failure (partial mappings + * are cleaned up internally). + */ +int tso_dma_map_init(struct tso_dma_map *map, struct device *dev, + const struct sk_buff *skb, unsigned int hdr_len) +{ + unsigned int linear_len =3D skb_headlen(skb) - hdr_len; + unsigned int nr_frags =3D skb_shinfo(skb)->nr_frags; + size_t total_len =3D skb->len - hdr_len; + size_t offset =3D 0; + phys_addr_t phys; + int i; + + if (!total_len) + return 0; + + map->dev =3D dev; + map->skb =3D skb; + map->hdr_len =3D hdr_len; + map->frag_idx =3D -1; + map->offset =3D 0; + map->iova_offset =3D 0; + map->total_len =3D total_len; + map->linear_len =3D 0; + map->nr_frags =3D 0; + memset(&map->iova_state, 0, sizeof(map->iova_state)); + + if (linear_len) + phys =3D virt_to_phys(skb->data + hdr_len); + else + phys =3D skb_frag_phys(&skb_shinfo(skb)->frags[0]); + + if (tso_dma_iova_try(dev, map, phys, linear_len, total_len, &offset)) { + /* IOVA path failed, map state was reset. Fallback to + * per-region dma_map_phys() + */ + if (linear_len) { + map->linear_dma =3D dma_map_phys(dev, phys, linear_len, + DMA_TO_DEVICE, 0); + if (dma_mapping_error(dev, map->linear_dma)) + return -ENOMEM; + map->linear_len =3D linear_len; + } + + for (i =3D 0; i < nr_frags; i++) { + skb_frag_t *frag =3D &skb_shinfo(skb)->frags[i]; + unsigned int frag_len =3D skb_frag_size(frag); + + map->frags[i].len =3D frag_len; + map->frags[i].dma =3D dma_map_phys(dev, skb_frag_phys(frag), + frag_len, DMA_TO_DEVICE, 0); + if (dma_mapping_error(dev, map->frags[i].dma)) { + tso_dma_map_cleanup(map); + return -ENOMEM; + } + map->nr_frags =3D i + 1; + } + } + + if (linear_len =3D=3D 0 && nr_frags > 0) + map->frag_idx =3D 0; + + return 0; +} +EXPORT_SYMBOL(tso_dma_map_init); + +/** + * tso_dma_map_cleanup - unmap all DMA regions in a tso_dma_map + * @map: the map to clean up + * + * Handles both IOVA and fallback paths. For IOVA, calls + * dma_iova_destroy(). For fallback, unmaps each region individually. + */ +void tso_dma_map_cleanup(struct tso_dma_map *map) +{ + int i; + + if (dma_use_iova(&map->iova_state)) { + dma_iova_destroy(map->dev, &map->iova_state, map->total_len, + DMA_TO_DEVICE, 0); + memset(&map->iova_state, 0, sizeof(map->iova_state)); + map->linear_len =3D 0; + map->nr_frags =3D 0; + return; + } + + if (map->linear_len) + dma_unmap_phys(map->dev, map->linear_dma, map->linear_len, + DMA_TO_DEVICE, 0); + + for (i =3D 0; i < map->nr_frags; i++) + dma_unmap_phys(map->dev, map->frags[i].dma, map->frags[i].len, + DMA_TO_DEVICE, 0); + + map->linear_len =3D 0; + map->nr_frags =3D 0; +} +EXPORT_SYMBOL(tso_dma_map_cleanup); + +/** + * tso_dma_map_count - count descriptors for a payload range + * @map: the payload map + * @len: number of payload bytes in this segment + * + * Counts how many contiguous DMA region chunks the next @len bytes + * will span, without advancing the iterator. On the IOVA path this + * is always 1 (contiguous). On the fallback path, uses region sizes + * from the current position. + * + * Return: the number of descriptors needed for @len bytes of payload. + */ +unsigned int tso_dma_map_count(struct tso_dma_map *map, unsigned int len) +{ + unsigned int offset =3D map->offset; + int idx =3D map->frag_idx; + unsigned int count =3D 0; + + if (!len) + return 0; + + if (dma_use_iova(&map->iova_state)) + return 1; + + while (len > 0) { + unsigned int region_len, chunk; + + if (idx =3D=3D -1) + region_len =3D map->linear_len; + else + region_len =3D map->frags[idx].len; + + chunk =3D min(len, region_len - offset); + len -=3D chunk; + count++; + offset =3D 0; + idx++; + } + + return count; +} +EXPORT_SYMBOL(tso_dma_map_count); + +/** + * tso_dma_map_next - yield the next DMA address range + * @map: the payload map + * @addr: output DMA address + * @chunk_len: output chunk length + * @mapping_len: full DMA mapping length when this chunk starts a new + * mapping region, or 0 when continuing a previous one. + * On the IOVA path this is always 0 (driver must not + * do per-region unmaps; use tso_dma_map_cleanup instead). + * @seg_remaining: bytes left in current segment + * + * Yields the next (dma_addr, chunk_len) pair and advances the iterator. + * On the IOVA path, the entire payload is contiguous so each segment + * is always a single chunk. + * + * Return: true if a chunk was yielded, false when @seg_remaining is 0. + */ +bool tso_dma_map_next(struct tso_dma_map *map, dma_addr_t *addr, + unsigned int *chunk_len, unsigned int *mapping_len, + unsigned int seg_remaining) +{ + unsigned int region_len, chunk; + + if (!seg_remaining) + return false; + + /* IOVA path: contiguous DMA range, no region boundaries */ + if (dma_use_iova(&map->iova_state)) { + *addr =3D map->iova_state.addr + map->iova_offset; + *chunk_len =3D seg_remaining; + *mapping_len =3D 0; + map->iova_offset +=3D seg_remaining; + return true; + } + + /* Fallback path: per-region iteration */ + + if (map->frag_idx =3D=3D -1) { + region_len =3D map->linear_len; + chunk =3D min(seg_remaining, region_len - map->offset); + *addr =3D map->linear_dma + map->offset; + *mapping_len =3D (map->offset =3D=3D 0) ? region_len : 0; + } else { + region_len =3D map->frags[map->frag_idx].len; + chunk =3D min(seg_remaining, region_len - map->offset); + *addr =3D map->frags[map->frag_idx].dma + map->offset; + *mapping_len =3D (map->offset =3D=3D 0) ? region_len : 0; + } + + *chunk_len =3D chunk; + map->offset +=3D chunk; + + if (map->offset >=3D region_len) { + map->frag_idx++; + map->offset =3D 0; + } + + return true; +} +EXPORT_SYMBOL(tso_dma_map_next); --=20 2.52.0 From nobody Thu Apr 2 18:47:52 2026 Received: from mail-pf1-f177.google.com (mail-pf1-f177.google.com [209.85.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 1346F390C95 for ; Thu, 26 Mar 2026 23:52:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.177 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774569177; cv=none; b=J4iO4KYECKJ9kWvN513eDLEGLzt6PefQWzimlRokKr6NfWK5SxS4KNw4UVFzcD0LxwUJtsvG+jhiH2fcniCMNqJF4V0uWoMdOmZ7P+t67lKRYC06e3T9qeAKTXNs7fhMHBHdy7MF3RQ2xjdQ7oM/NLzRkQAF9KKbFxYhKAE7Zc8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774569177; c=relaxed/simple; bh=PObDd+bQYo7v1Saf6REGaI4JZQgWug4Wiiec8tmVByw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=dYkTwqaWnaGdY51Y5PdqX36kk/XtCR6WjUL61vtWUB+qszuKO9vMhZqGueq74GZRYz/Rq4WUdZrJbzqTyMi83057lN47nBtp30ZCs5ZXlQqpt+vJRd873403eujk2RNrxc6y+oPZiUtw6+22o8YfUFuh878GtU47dCyVZp9UnHs= 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=KOJ9Q/pC; arc=none smtp.client-ip=209.85.210.177 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=dama.to Authentication-Results: smtp.subspace.kernel.org; spf=none smtp.mailfrom=dama.to Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=dama-to.20230601.gappssmtp.com header.i=@dama-to.20230601.gappssmtp.com header.b="KOJ9Q/pC" Received: by mail-pf1-f177.google.com with SMTP id d2e1a72fcca58-824c9da9928so1405335b3a.3 for ; Thu, 26 Mar 2026 16:52:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dama-to.20230601.gappssmtp.com; s=20230601; t=1774569175; x=1775173975; 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=2eSWMreP00fEku+GXIEh5WPYlQQ7pdeSpk3DZrhNvfk=; b=KOJ9Q/pC6KG9lk0BV8nI9jmZGVJE352zZtYWJ5iDayo8cxIR/iD1Pddg41ehVDmled KqAW8Va8wUbWGdxNp4Zu190ZIQPVrIRuv9ULf0wMYIHPZSDTV7fJUHjpqFsMytlKTD8b AntwlEQTFM4g6lUnQagwSZtoVb6wo0h/4ffh3lH189cL1sh6tdAjVDlDlhQ7TbrqtVTH DV8i9CE9sIyAcbkWRb5JMxge0mwoC3yjugVNAjRd1YSJ7L3zrosoc5PQ1FGpDZx+a2hi 0Mbgd5zPOdWYb+zXyzvDBevhCMg68OlujCyKnUdC2g6FWKVJe6Y8xkJc+oZN9XlYllc6 WG7g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774569175; x=1775173975; 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=2eSWMreP00fEku+GXIEh5WPYlQQ7pdeSpk3DZrhNvfk=; b=Gr8VKnRLRt5GakQ/T8H6EEiT06GpAqdYFnKC310q7FJjywBE6dStVTE9TDpakN1NSg 8P8NhEAlZrKM+JrKxEl1MG1lYl6KrUwaud4Kg1URLjrBVRg8yy82am41eDy39TAHSHQ/ 7wHli9HKH6AUBcG+tpKrdok65SsvgSaNHtSbXm6HOLnxXR+nSmYW9F3Pa/8Lh0/z+yL0 kP1tbUpNbqcJ2wXOBB65nffmsbrVNRlPz/UIEUYhTbWb7Qx8CLkFCb1ZfaQy/OnV8Pff 6okQK3unJlRFZm3A9gv+IlgqXBtyqguPyx2zmB3/hS7zhDIGQfgeBOtPa2woWftlEM6L 0e2w== X-Forwarded-Encrypted: i=1; AJvYcCWmoIdExPEiOkLNgzNZKKgsE/c4tItpA2CpO8gfLOvJ7Em+cEvoXAp8skx0529nWWEMDNPWD1lpB2+og6U=@vger.kernel.org X-Gm-Message-State: AOJu0YwBU5e6p5OmXFbzIYE2nnDQqqKFmQ8lfl/E5O1FneKwOFA+rSnX tqNwKHj85s8lKH3b7UjaFGQ2oikEcAYnMkRnyDXZj6OTyx0IbCu+eQkdFnnJeOfRhnA= X-Gm-Gg: ATEYQzyywtmQJYs9o+5OqcTl/ACWT+iQF1nWDOrfEu4h+92o81UoAIu/PQsKLzlQmhL JRyGrKXfX5zET67wnv/krVwgJV5uJYJkK9VMaWc6SLAShY360RdiXP5XwJ7FHl996GNgFHJBKdJ 2g1Vuo6clXTGse5Pi3zCcybk8BbV+EG9KhJeEtVds1+MiQz2sAQy+PDbuczczytb3Xazp8qyQ15 gdDw9VV6M7UoYQmUfeI/+BLT+Gn3NXmbBmmSdCirGDdqftxu6F4zQ3jGdvVr5cp6Ei2Xfa+UX4t WUG9MLX3fWvrEkmkOERiKlF4HULB5ZM+tySi0P00rXRUw450u+HJMBD08rkNlTvpuXXnAwqssfl AcKhDFAK4U2gPFLAD3zThRBCVzEARdn99QFEUYckJUC/ltTuVgoup14t21+on5KSAVrFEdJYBm9 sS6bE= X-Received: by 2002:a05:6a00:3cc6:b0:829:9f46:280d with SMTP id d2e1a72fcca58-82c95d42bfemr376957b3a.1.1774569175505; Thu, 26 Mar 2026 16:52:55 -0700 (PDT) Received: from localhost ([2a03:2880:2ff:2::]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-82c7d3894d0sm4758396b3a.30.2026.03.26.16.52.54 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 26 Mar 2026 16:52:55 -0700 (PDT) From: Joe Damato To: netdev@vger.kernel.org, Michael Chan , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni Cc: andrew+netdev@lunn.ch, horms@kernel.org, pavan.chebbi@broadcom.com, linux-kernel@vger.kernel.org, leon@kernel.org, Joe Damato Subject: [net-next v6 03/12] net: bnxt: Export bnxt_xmit_get_cfa_action Date: Thu, 26 Mar 2026 16:52:22 -0700 Message-ID: <20260326235238.2940471-4-joe@dama.to> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260326235238.2940471-1-joe@dama.to> References: <20260326235238.2940471-1-joe@dama.to> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Export bnxt_xmit_get_cfa_action so that it can be used in future commits which add software USO support to bnxt. Suggested-by: Jakub Kicinski Reviewed-by: Pavan Chebbi Signed-off-by: Joe Damato --- v4: - Added Pavan's Reviewed-by tag. No functional changes. drivers/net/ethernet/broadcom/bnxt/bnxt.c | 2 +- drivers/net/ethernet/broadcom/bnxt/bnxt.h | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethern= et/broadcom/bnxt/bnxt.c index 84eb53b4172b..dcc83ccc3bb0 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c @@ -447,7 +447,7 @@ const u16 bnxt_lhint_arr[] =3D { TX_BD_FLAGS_LHINT_2048_AND_LARGER, }; =20 -static u16 bnxt_xmit_get_cfa_action(struct sk_buff *skb) +u16 bnxt_xmit_get_cfa_action(struct sk_buff *skb) { struct metadata_dst *md_dst =3D skb_metadata_dst(skb); =20 diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.h b/drivers/net/ethern= et/broadcom/bnxt/bnxt.h index dd0f6743acf5..d82b0899b33d 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.h +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.h @@ -2950,6 +2950,7 @@ unsigned int bnxt_get_avail_cp_rings_for_en(struct bn= xt *bp); int bnxt_reserve_rings(struct bnxt *bp, bool irq_re_init); void bnxt_tx_disable(struct bnxt *bp); void bnxt_tx_enable(struct bnxt *bp); +u16 bnxt_xmit_get_cfa_action(struct sk_buff *skb); void bnxt_sched_reset_txr(struct bnxt *bp, struct bnxt_tx_ring_info *txr, u16 curr); void bnxt_report_link(struct bnxt *bp); --=20 2.52.0 From nobody Thu Apr 2 18:47:52 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 ED7AC3A6F17 for ; Thu, 26 Mar 2026 23:52:57 +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=1774569179; cv=none; b=reiPNqkDUY0XeQLeCMCr1poW3EypW9yN7VciO29vBY545BoSPNw7GQLsjb5lmjgveqQRsjLzDzvQafvl/g+Gibuz7SffR5F7Ce4sFOAtBGx5sviOrpsJValWTaJ2uupPKx5iZjdX54IP7XY2yaKUTslOwl6J68CF0D9XNYxF3mg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774569179; c=relaxed/simple; bh=Nq5UYxxNFmSt5vepIgZmRBNNU7FqKFEBLG1AqkhZO/4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Q0+JnzOevHfDAqFriYqvMRP69LEBLRy7FFfe/lz+1vxAW7oG4xJflkjttR5bneYGs8WoWI62mw66oxt79BBzltnTRXxwg1CcYgkNWX/60xxuYo2GJD9M2KOOu+2bVhpA5Dg5ySIajtGR7Rqdek+PfuBB8r8DpgLSGAQuFM3jNDM= 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=dTOCrYbf; 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="dTOCrYbf" Received: by mail-pl1-f174.google.com with SMTP id d9443c01a7336-2aaed195901so6721365ad.0 for ; Thu, 26 Mar 2026 16:52:57 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dama-to.20230601.gappssmtp.com; s=20230601; t=1774569177; x=1775173977; 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=5UPYFeaXBCTnwUC9U7Rpioh/CF/owhvrx8QKdsJhO4I=; b=dTOCrYbftR9lgorQnL33KUWCP5FCHDi1W8VZFHCROvrdurdRZNI2iozgFC4LkKKhIb C0rLC+PLKCk6Doq498p/MH5MDOAt2T0uping+cXVj6sB4sFlgqgF9/Zbs25NQ3Q8nVV/ 8m8SARgYXpdlkS3KRj9eAyKKLnR6m1VcxslVm4azp2yHQscsytK9oxihvHeYpGK+MBjT yBdOU/o2NubeLjUVCmFbj0VqRnf9+7uFbNIfxLBgoVFn8SvHgUD947sJpZBV1XpCCSBs I28nA84IFeB++AgDA6nqZ0y1XP9jsjj0l8uLyQcT9izgWyU39Fdyb5IPxAstUVMK4Prd 3Jag== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774569177; x=1775173977; 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=5UPYFeaXBCTnwUC9U7Rpioh/CF/owhvrx8QKdsJhO4I=; b=flVx2uDCDLzFBuvK0j+xLjPh8WQOIdKgJ0bXn62hGJPxKF1gdKrGXEyy8LTuLLYTg9 3v0dlTA+GHg56KFF81pMEstfeBPFe/1Z3kGrMd35M08RotzR3H4yupMn0uG53h5Lf3Yi buwX7kqf4eBUyikqCuqQLICdhmvf3V5MHqQ3rN8fKXyFSTrdVAYswiEvK2MQezgwHgqN vlTlpQHphq9lR6aGDwMxCZiEqqAeZ4S62AoifOW2vvyUYBmUlJpjiwKe6qEyBQAy/y/8 sY7W7fStexUR4+lvIyTEuKwiYh+kpsqRkl4HPx47j/W33XhzGZCVVp+9cKwnujl9QRXN hnFw== X-Forwarded-Encrypted: i=1; AJvYcCVNdjH0OM6OVkaJqfhmJ9+zBxe9PQ4TxQhzgKikl8vnYucAh7/pdRmM01lnp74wRpMDhwTj+ZNyzYPy8jY=@vger.kernel.org X-Gm-Message-State: AOJu0Yx/urZSQty4w3CtHm8SC0jwBrPsaYdDs5stLNL/F6TaiTweymr3 C3h8EDMbIHA3e0W/jZq6CG6ix1PZncoJfBXo2H83yfVQpUtzCG1pZO/EpJRlGiz+EX8= X-Gm-Gg: ATEYQzyzmcAs4HLIJAuuj+V+wcAE7qoQXuDJJMnw1MMfB9g/84E6pYwK9gnEUHQD1mr GUfcIsT+kOPAJ0bpsIU7zN5SJbVcLLFOJVnp0YNdL6yRzXbRDM6JSc0eQeaVNfKuPdldyF4kyEn 1LMskxYqX9p8z5GAfBrn93Xb7bsQEXCSp163H3Q9Z5hjr6jqxFtqitlW6IJf7tMhpNASmxBDagu SHXd4kBeilrJYi+K71UXdzIfLhLYdR0+brQbXRja9MukDFnoLt5qNDnjZxWzO7sAQo7GfoFWwfQ 97lqW47mCDJYMFGc9R5BmJ6rpB5X6jQMkReKAZH155ncwwmjqPj12znNShOQVOUfbVEzd30hey4 IYnXhfLpQYyeG5Cmyu6B6KDqPfvK0jyqwEwD5UJrkzK/r4PI3g/Q8nI9tICvXIWjHiYsObIYu3D usfvf2 X-Received: by 2002:a17:902:eccb:b0:2ae:5752:af82 with SMTP id d9443c01a7336-2b0cdcf5b8emr4290015ad.49.1774569177241; Thu, 26 Mar 2026 16:52:57 -0700 (PDT) Received: from localhost ([2a03:2880:2ff:5f::]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-c76736e54e4sm3263806a12.0.2026.03.26.16.52.56 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 26 Mar 2026 16:52:56 -0700 (PDT) From: Joe Damato To: netdev@vger.kernel.org, Michael Chan , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni Cc: andrew+netdev@lunn.ch, horms@kernel.org, pavan.chebbi@broadcom.com, linux-kernel@vger.kernel.org, leon@kernel.org, Joe Damato Subject: [net-next v6 04/12] net: bnxt: Add a helper for tx_bd_ext Date: Thu, 26 Mar 2026 16:52:23 -0700 Message-ID: <20260326235238.2940471-5-joe@dama.to> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260326235238.2940471-1-joe@dama.to> References: <20260326235238.2940471-1-joe@dama.to> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Factor out some code to setup tx_bd_exts into a helper function. This helper will be used by SW USO implementation in the following commits. Suggested-by: Jakub Kicinski Reviewed-by: Pavan Chebbi Signed-off-by: Joe Damato --- v4: - Added Pavan's Reviewed-by tag. No functional changes. drivers/net/ethernet/broadcom/bnxt/bnxt.c | 9 ++------- drivers/net/ethernet/broadcom/bnxt/bnxt.h | 18 ++++++++++++++++++ 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethern= et/broadcom/bnxt/bnxt.c index dcc83ccc3bb0..8515cd6e82fc 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c @@ -663,10 +663,9 @@ static netdev_tx_t bnxt_start_xmit(struct sk_buff *skb= , struct net_device *dev) txbd->tx_bd_opaque =3D SET_TX_OPAQUE(bp, txr, prod, 2 + last_frag); =20 prod =3D NEXT_TX(prod); - txbd1 =3D (struct tx_bd_ext *) - &txr->tx_desc_ring[TX_RING(bp, prod)][TX_IDX(prod)]; + txbd1 =3D bnxt_init_ext_bd(bp, txr, prod, lflags, vlan_tag_flags, + cfa_action); =20 - txbd1->tx_bd_hsize_lflags =3D lflags; if (skb_is_gso(skb)) { bool udp_gso =3D !!(skb_shinfo(skb)->gso_type & SKB_GSO_UDP_L4); u32 hdr_len; @@ -693,7 +692,6 @@ static netdev_tx_t bnxt_start_xmit(struct sk_buff *skb,= struct net_device *dev) } else if (skb->ip_summed =3D=3D CHECKSUM_PARTIAL) { txbd1->tx_bd_hsize_lflags |=3D cpu_to_le32(TX_BD_FLAGS_TCP_UDP_CHKSUM); - txbd1->tx_bd_mss =3D 0; } =20 length >>=3D 9; @@ -706,9 +704,6 @@ static netdev_tx_t bnxt_start_xmit(struct sk_buff *skb,= struct net_device *dev) flags |=3D bnxt_lhint_arr[length]; txbd->tx_bd_len_flags_type =3D cpu_to_le32(flags); =20 - txbd1->tx_bd_cfa_meta =3D cpu_to_le32(vlan_tag_flags); - txbd1->tx_bd_cfa_action =3D - cpu_to_le32(cfa_action << TX_BD_CFA_ACTION_SHIFT); txbd0 =3D txbd; for (i =3D 0; i < last_frag; i++) { frag =3D &skb_shinfo(skb)->frags[i]; diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.h b/drivers/net/ethern= et/broadcom/bnxt/bnxt.h index d82b0899b33d..a6b04652600e 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.h +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.h @@ -2834,6 +2834,24 @@ static inline u32 bnxt_tx_avail(struct bnxt *bp, return bp->tx_ring_size - (used & bp->tx_ring_mask); } =20 +static inline struct tx_bd_ext * +bnxt_init_ext_bd(struct bnxt *bp, struct bnxt_tx_ring_info *txr, + u16 prod, __le32 lflags, u32 vlan_tag_flags, + u32 cfa_action) +{ + struct tx_bd_ext *txbd1; + + txbd1 =3D (struct tx_bd_ext *) + &txr->tx_desc_ring[TX_RING(bp, prod)][TX_IDX(prod)]; + txbd1->tx_bd_hsize_lflags =3D lflags; + txbd1->tx_bd_mss =3D 0; + txbd1->tx_bd_cfa_meta =3D cpu_to_le32(vlan_tag_flags); + txbd1->tx_bd_cfa_action =3D + cpu_to_le32(cfa_action << TX_BD_CFA_ACTION_SHIFT); + + return txbd1; +} + static inline void bnxt_writeq(struct bnxt *bp, u64 val, volatile void __iomem *addr) { --=20 2.52.0 From nobody Thu Apr 2 18:47:52 2026 Received: from mail-pg1-f178.google.com (mail-pg1-f178.google.com [209.85.215.178]) (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 A40673BF698 for ; Thu, 26 Mar 2026 23:52:59 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.178 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774569180; cv=none; b=pmWwcVr7MT2Lq1p11N/aPzfQN0NmKRTiIy5YLK4NNJqrRL12Escemu8ynjuznw61cYk/D+j+olGhXGDA55GyHtLu4MNciyotLZXDtQWIr0ryeU3TDspg3uQdrJZ8vUuXJvXOkoNcG1BYMb+eSJ64mllErPGOqT4PguqIlVn1fFE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774569180; c=relaxed/simple; bh=SwJnscTqxPzyr8NelnMCAqCLfGawssCKPE4MNXisLfA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=i25mA1tn9gInClTWzKUaP8bMVGkTlN+ufdqLDjY2a6P94kjWMwSX7YbkP7+GQmdqGML5g+WFq4/OsnSl+65SE49YY2GzOgFuqJoVMfBllyMlNu9O7/N5+Vyg30B60wExV48ShLGOXNCEDN4marFoH53UJZWxi/p2d/3/VSInlyI= 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=TzKfwGeh; arc=none smtp.client-ip=209.85.215.178 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="TzKfwGeh" Received: by mail-pg1-f178.google.com with SMTP id 41be03b00d2f7-c70f91776fcso681927a12.0 for ; Thu, 26 Mar 2026 16:52:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dama-to.20230601.gappssmtp.com; s=20230601; t=1774569179; x=1775173979; 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=FRCJMoiMQS5q76rcDSmZShmAqHh8lkp6y+PIztrt728=; b=TzKfwGehSgILdO2KmBSzIn69nEo4UUreOqHMqmsnuSDfgVBHHkUQcjDJF/qa+ruhkj I+QBbmTUQ5cOTDmGGNOwK2zV1FZQeiU/FXqShDvcTBzNFBv/9ysQ1GxwIY+xEDqJHkuH iV+/LVZgEyYS/iaZOl/PznQAJsykbVOSyPxaHaYcDpKeP44h3WxQBCo4f6gJwp3EhaIO kmEvdt5vVhruacHF7K/uEKphUXvfw+XM9OGptyuHRK6oAUa8CjhTSgOMQ51xpPzi9GW4 f30h5iCihp6+k39hFjkKolSv70fvcTNqGPShMc0JLBQYkhBjzFNtSfjUiEskJhODCu4l 75pA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774569179; x=1775173979; 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=FRCJMoiMQS5q76rcDSmZShmAqHh8lkp6y+PIztrt728=; b=dP9nFDIupiwAfz6Cgx1MsuiRerDBdQZMAJaePoyV2kbgjRPgt167N4IrQuYGJjIt1V Ma3pZ4ykpxKfUluxjXMr0+GJz99ucY9q3BP6CkA4y51I6RfkvXmVPjDyFwSIjpaSasru UWrk+FlJTrYYMB5MnakPv+VLSUAkrY6tsl6i7Swi5xyAvY40hFq5n+2n1pVbGGf7LmcW u9QGhCCeiQKcKOCjpEEs1Y2YAb4v3XB/G5IKNlNdyFBEX6nVe6TDOZa/Yx74PgnShkwo shkt02tt0NqNyuYhPXuBua7h/wwR7f79mp2oZrnPK5I417BNnYxLoO9r2JxFfkrfWVpz czUw== X-Forwarded-Encrypted: i=1; AJvYcCX7Ht+amVeTcC2FE8u5ZGpZg5rJEI7MhEXt5OTMDZS4FObX3SBJgYu5ru51SYb7u3IASM+Xw6qdW+ib7to=@vger.kernel.org X-Gm-Message-State: AOJu0YycQQCc1QzPoU4d9o/fahN/mFVCeYwvrpsdH5o9dXy8Ok3qzy3M OO6dZjUDX33gBKR0GjuU4TnNYBM+1atCUdJWtcMORK8MGnBc3xAJX5CLqtAkzerEpjs= X-Gm-Gg: ATEYQzwHR7B2Ree4D+KCfW7Yq8NsWj0pa15ehb5KM2TJqz4vVOtc/AMTlvHEz187GvX mNkMfDBq4OUHfMtFGrAjJEFoYgqXdUZ9NN9EfsPOlE0uA21n1RnhzxYWAvDcboBl1l6TxyLq8Z7 OHgEQN58FhfgdH3xZ0YqWZKcL4tW7bgtZkIV/3aMhOid9hVStlwIA9ChiCQ4cpmcjFqSR87ge6j U1Svvd7/yPBmSug3v04AjAWOPhuENbc7nrJ1VCZvfQs5EIPAwn7bvAWHN2nooNgPm7UOdNOUTvZ 7Tn2ec+SQjxn4379abAch+CTzoZrq3X0K8NTAUGil8pS37bP3MnDNDPCXKeVV9zKX6MwmShPbPz Kh+RN+o+PVYJ3vnmc2U7bOMxFdO2bBTYyku4OVl5Ernhqsz0EjQlQMBojszRieqMKnkM71rs4nn ZLZY13wOebu0f/DW4= X-Received: by 2002:a05:6a20:6a08:b0:38e:9220:ebbe with SMTP id adf61e73a8af0-39c87951cefmr558778637.23.1774569178920; Thu, 26 Mar 2026 16:52:58 -0700 (PDT) Received: from localhost ([2a03:2880:2ff:73::]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-c76739334e6sm3058068a12.18.2026.03.26.16.52.58 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 26 Mar 2026 16:52:58 -0700 (PDT) From: Joe Damato To: netdev@vger.kernel.org, Michael Chan , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni Cc: andrew+netdev@lunn.ch, horms@kernel.org, pavan.chebbi@broadcom.com, linux-kernel@vger.kernel.org, leon@kernel.org, Joe Damato Subject: [net-next v6 05/12] net: bnxt: Use dma_unmap_len for TX completion unmapping Date: Thu, 26 Mar 2026 16:52:24 -0700 Message-ID: <20260326235238.2940471-6-joe@dama.to> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260326235238.2940471-1-joe@dama.to> References: <20260326235238.2940471-1-joe@dama.to> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Store the DMA mapping length in each TX buffer descriptor via dma_unmap_len_set at submit time, and use dma_unmap_len at completion time. This is a no-op for normal packets but prepares for software USO, where header BDs set dma_unmap_len to 0 because the header buffer is unmapped collectively rather than per-segment. Suggested-by: Jakub Kicinski Reviewed-by: Pavan Chebbi Signed-off-by: Joe Damato --- v4: - Added Pavan's Reviewed-by tag. No functional changes. rfcv2: - Use some local variables to shorten long lines. No functional change f= rom rfcv1. drivers/net/ethernet/broadcom/bnxt/bnxt.c | 63 ++++++++++++++--------- 1 file changed, 40 insertions(+), 23 deletions(-) diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethern= et/broadcom/bnxt/bnxt.c index 8515cd6e82fc..2ab588f8de84 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c @@ -656,6 +656,7 @@ static netdev_tx_t bnxt_start_xmit(struct sk_buff *skb,= struct net_device *dev) goto tx_free; =20 dma_unmap_addr_set(tx_buf, mapping, mapping); + dma_unmap_len_set(tx_buf, len, len); flags =3D (len << TX_BD_LEN_SHIFT) | TX_BD_TYPE_LONG_TX_BD | TX_BD_CNT(last_frag + 2); =20 @@ -720,6 +721,7 @@ static netdev_tx_t bnxt_start_xmit(struct sk_buff *skb,= struct net_device *dev) tx_buf =3D &txr->tx_buf_ring[RING_TX(bp, prod)]; netmem_dma_unmap_addr_set(skb_frag_netmem(frag), tx_buf, mapping, mapping); + dma_unmap_len_set(tx_buf, len, len); =20 txbd->tx_bd_haddr =3D cpu_to_le64(mapping); =20 @@ -809,7 +811,8 @@ static bool __bnxt_tx_int(struct bnxt *bp, struct bnxt_= tx_ring_info *txr, u16 hw_cons =3D txr->tx_hw_cons; unsigned int tx_bytes =3D 0; u16 cons =3D txr->tx_cons; - skb_frag_t *frag; + unsigned int dma_len; + dma_addr_t dma_addr; int tx_pkts =3D 0; bool rc =3D false; =20 @@ -844,19 +847,27 @@ static bool __bnxt_tx_int(struct bnxt *bp, struct bnx= t_tx_ring_info *txr, goto next_tx_int; } =20 - dma_unmap_single(&pdev->dev, dma_unmap_addr(tx_buf, mapping), - skb_headlen(skb), DMA_TO_DEVICE); + if (dma_unmap_len(tx_buf, len)) { + dma_addr =3D dma_unmap_addr(tx_buf, mapping); + dma_len =3D dma_unmap_len(tx_buf, len); + + dma_unmap_single(&pdev->dev, dma_addr, dma_len, + DMA_TO_DEVICE); + } + last =3D tx_buf->nr_frags; =20 for (j =3D 0; j < last; j++) { - frag =3D &skb_shinfo(skb)->frags[j]; cons =3D NEXT_TX(cons); tx_buf =3D &txr->tx_buf_ring[RING_TX(bp, cons)]; - netmem_dma_unmap_page_attrs(&pdev->dev, - dma_unmap_addr(tx_buf, - mapping), - skb_frag_size(frag), - DMA_TO_DEVICE, 0); + if (dma_unmap_len(tx_buf, len)) { + dma_addr =3D dma_unmap_addr(tx_buf, mapping); + dma_len =3D dma_unmap_len(tx_buf, len); + + netmem_dma_unmap_page_attrs(&pdev->dev, + dma_addr, dma_len, + DMA_TO_DEVICE, 0); + } } if (unlikely(is_ts_pkt)) { if (BNXT_CHIP_P5(bp)) { @@ -3402,6 +3413,8 @@ static void bnxt_free_one_tx_ring_skbs(struct bnxt *b= p, { int i, max_idx; struct pci_dev *pdev =3D bp->pdev; + unsigned int dma_len; + dma_addr_t dma_addr; =20 max_idx =3D bp->tx_nr_pages * TX_DESC_CNT; =20 @@ -3412,10 +3425,10 @@ static void bnxt_free_one_tx_ring_skbs(struct bnxt = *bp, =20 if (idx < bp->tx_nr_rings_xdp && tx_buf->action =3D=3D XDP_REDIRECT) { - dma_unmap_single(&pdev->dev, - dma_unmap_addr(tx_buf, mapping), - dma_unmap_len(tx_buf, len), - DMA_TO_DEVICE); + dma_addr =3D dma_unmap_addr(tx_buf, mapping); + dma_len =3D dma_unmap_len(tx_buf, len); + + dma_unmap_single(&pdev->dev, dma_addr, dma_len, DMA_TO_DEVICE); xdp_return_frame(tx_buf->xdpf); tx_buf->action =3D 0; tx_buf->xdpf =3D NULL; @@ -3437,23 +3450,27 @@ static void bnxt_free_one_tx_ring_skbs(struct bnxt = *bp, continue; } =20 - dma_unmap_single(&pdev->dev, - dma_unmap_addr(tx_buf, mapping), - skb_headlen(skb), - DMA_TO_DEVICE); + if (dma_unmap_len(tx_buf, len)) { + dma_addr =3D dma_unmap_addr(tx_buf, mapping); + dma_len =3D dma_unmap_len(tx_buf, len); + + dma_unmap_single(&pdev->dev, dma_addr, dma_len, DMA_TO_DEVICE); + } =20 last =3D tx_buf->nr_frags; i +=3D 2; for (j =3D 0; j < last; j++, i++) { int ring_idx =3D i & bp->tx_ring_mask; - skb_frag_t *frag =3D &skb_shinfo(skb)->frags[j]; =20 tx_buf =3D &txr->tx_buf_ring[ring_idx]; - netmem_dma_unmap_page_attrs(&pdev->dev, - dma_unmap_addr(tx_buf, - mapping), - skb_frag_size(frag), - DMA_TO_DEVICE, 0); + if (dma_unmap_len(tx_buf, len)) { + dma_addr =3D dma_unmap_addr(tx_buf, mapping); + dma_len =3D dma_unmap_len(tx_buf, len); + + netmem_dma_unmap_page_attrs(&pdev->dev, + dma_addr, dma_len, + DMA_TO_DEVICE, 0); + } } dev_kfree_skb(skb); } --=20 2.52.0 From nobody Thu Apr 2 18:47:52 2026 Received: from mail-pf1-f171.google.com (mail-pf1-f171.google.com [209.85.210.171]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6EB6F3C13F5 for ; Thu, 26 Mar 2026 23:53:01 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.171 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774569182; cv=none; b=AQgzlxGwYzJQy5aiDl5bNmvwT0iRjlmiRLJDT3TWXQCrLua2b2aYHznzRRf7xSHzIV5wAE1avnRPXdHUTEK67oGxQkiGu2zOj0fPQaBr+Axp912IY0wL3NHSugJDhMEpc6rcgXTSkRbhqgfwIQKazHKHNVL9ydZtFvq3CCebbJI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774569182; c=relaxed/simple; bh=hZH6BRv9phkP1JRWpsTKzeYmMPqR853fS5rg7u/t5mA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=b7ZbKiSMVp20GsPhcqhQcDeoSKdU44GEka8YMP5LH9aOcHRITk+a2rxqn5/36dzkSK0RgVl9xnu13kQWNJhAb08z/KlnJfz1/FHz8fYEMX5ux+Sk6b7BoL9nLg7BWhViBxsO05VLZuLQB9JI17NRvSC/f7kau5Kmb8hiNFGndCE= 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=DPbnA4nG; arc=none smtp.client-ip=209.85.210.171 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=dama.to Authentication-Results: smtp.subspace.kernel.org; spf=none smtp.mailfrom=dama.to Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=dama-to.20230601.gappssmtp.com header.i=@dama-to.20230601.gappssmtp.com header.b="DPbnA4nG" Received: by mail-pf1-f171.google.com with SMTP id d2e1a72fcca58-82bae83318bso706592b3a.2 for ; Thu, 26 Mar 2026 16:53:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dama-to.20230601.gappssmtp.com; s=20230601; t=1774569181; x=1775173981; 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=Q551GxgjDFWgjkscq/5BEfqm5PgzdOZlRNDDRwdsFnE=; b=DPbnA4nGv8JQWPZ5Cz19IWRjWW6XKFVM3Upvg4Yrz4AmGiePPfYiWxcsqQP59X8w1s vB98avSHvvgGKmGWie7xhWoeGVBQywpCPEOutdzukYNudggtRbhnUjqaaLX7kdCSQyG7 tlCxnOaYN8buGKZXTFCkjZy/257v1lLehkDX56vqtf6tru4hXNFwUGCmcsS2Sv41/TcP FqBZGIGD8bCXM40WS/pddlZ7Y/OkRmxxACOywoQJpHi8LveTSADiD7pF+eYQvUZCXE2W oXOf1t12Ia4V/uP14RmLByScxp+gEmyuFmUdxc59Q3zIBQrdhhqKcU6xzoAxZ5Kv+GZM G32A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774569181; x=1775173981; 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=Q551GxgjDFWgjkscq/5BEfqm5PgzdOZlRNDDRwdsFnE=; b=n+tVFUgHsBeb4hNawwsLY4DMdbtim1kK2A7gQ6FlErSkl0//YW8q6wFDdLBZ+JwBtI x3690MEthdWdJLspnPmYATJnm9rtXYlLhYvCde3L/CwZTR/5w/NtcWdDlXfxH3U1s47K mL/uCbiA9jr6L5LbMZIJTffemlABxb+Y9nDCo0zCUZfLJiXOniqr3cefIpdtG+39ne/q hDhPVVhXwZSw3MWped7kqTPZUmvQs1zQueP0aMdANCWSJaHWtfhu4JsI4kv+wVIYnsmb IcBlVDZe/AYeFZbBcbWubnJ4VvwL9YjzC62O7VaL8J9pVyAHP0MOlrJ9be1VLgZ8GC+R kgaQ== X-Forwarded-Encrypted: i=1; AJvYcCW8LZDkLXqqXDbmJlJ+feaQT2VXDDuHoHVZQPlYF7PatxbdlgdwAJeTDVyXHKObfJ6qIo+7VskrK9esimk=@vger.kernel.org X-Gm-Message-State: AOJu0Yw4tT6JV5ET2I//cwPMzMl1figSaJfO/ZtJuqg2FRNfe+KdOaWc YAaRH9CW11YaYYVzOi2OWiaC7hWW+siMIXdQTiuYLKxtm2zz5ng9DCK5Tt5YeWnHODA= X-Gm-Gg: ATEYQzxTOatFvxpdIGieztjhcz9oYQpndm5Nxlwp0pYO78eYNBsQLQPIsOXyjnU3X9U hRzQo6j9gdqEPhl0QhUt+26nTKkQJhYb3nDG9upd2DMW2B0kbqPCPXxoB0iDGnGEJyX8/xSBZol fQkvRayhZIZnPdVKx6i/OBHPUDrVXVelsA8VsABltOxX4i2HKn0cLTLpRPkw3AXE8giX5qMvr9w RL0J4GLjCP0iDbOSioUYDPbMCo+8SQEcNoaj3/WQpF+vhqdi0tv8lJF+byOvZ9NL4tyUbTy4rX7 wTEbKDK3XV9jfGQtCWe7jNf3qNL6V4z6BP+s29bxXMRd40u8Ea5cf7bevxVGg5C7YoTEB0KFYA8 mz3tkJozOmEBWpNyI1Hfp/9tqtbrJ7+xXDc5p4yuTCNEeICvcsxfFjX19UtEEl9XB1LkXO8ZamL HA6BY6te39zwp0CFA= X-Received: by 2002:a05:6a00:3cc9:b0:7e8:4471:ae6d with SMTP id d2e1a72fcca58-82c960ccf21mr300792b3a.57.1774569180790; Thu, 26 Mar 2026 16:53:00 -0700 (PDT) Received: from localhost ([2a03:2880:2ff:50::]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-82c7d3d5e81sm3609131b3a.51.2026.03.26.16.53.00 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 26 Mar 2026 16:53:00 -0700 (PDT) From: Joe Damato To: netdev@vger.kernel.org, Michael Chan , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni Cc: andrew+netdev@lunn.ch, horms@kernel.org, pavan.chebbi@broadcom.com, linux-kernel@vger.kernel.org, leon@kernel.org, Joe Damato Subject: [net-next v6 06/12] net: bnxt: Add TX inline buffer infrastructure Date: Thu, 26 Mar 2026 16:52:25 -0700 Message-ID: <20260326235238.2940471-7-joe@dama.to> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260326235238.2940471-1-joe@dama.to> References: <20260326235238.2940471-1-joe@dama.to> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add per-ring pre-allocated inline buffer fields (tx_inline_buf, tx_inline_dma, tx_inline_size) to bnxt_tx_ring_info and helpers to allocate and free them. A producer and consumer (tx_inline_prod, tx_inline_cons) are added to track which slot(s) of the inline buffer are in-use. The inline buffer will be used by the SW USO path for pre-allocated, pre-DMA-mapped per-segment header copies. In the future, this could be extended to support TX copybreak. Allocation helper is marked __maybe_unused in this commit because it will be wired in later. Suggested-by: Jakub Kicinski Reviewed-by: Pavan Chebbi Signed-off-by: Joe Damato --- v5: - Added Pavan's Reviewed-by. No functional changes. rfcv2: - Added a producer and consumer to correctly track the in use header slo= ts. drivers/net/ethernet/broadcom/bnxt/bnxt.c | 35 +++++++++++++++++++++++ drivers/net/ethernet/broadcom/bnxt/bnxt.h | 6 ++++ 2 files changed, 41 insertions(+) diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethern= et/broadcom/bnxt/bnxt.c index 2ab588f8de84..9e3a74ce5b75 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c @@ -3985,6 +3985,39 @@ static int bnxt_alloc_rx_rings(struct bnxt *bp) return rc; } =20 +static void bnxt_free_tx_inline_buf(struct bnxt_tx_ring_info *txr, + struct pci_dev *pdev) +{ + if (!txr->tx_inline_buf) + return; + + dma_unmap_single(&pdev->dev, txr->tx_inline_dma, + txr->tx_inline_size, DMA_TO_DEVICE); + kfree(txr->tx_inline_buf); + txr->tx_inline_buf =3D NULL; + txr->tx_inline_size =3D 0; +} + +static int __maybe_unused bnxt_alloc_tx_inline_buf(struct bnxt_tx_ring_inf= o *txr, + struct pci_dev *pdev, + unsigned int size) +{ + txr->tx_inline_buf =3D kmalloc(size, GFP_KERNEL); + if (!txr->tx_inline_buf) + return -ENOMEM; + + txr->tx_inline_dma =3D dma_map_single(&pdev->dev, txr->tx_inline_buf, + size, DMA_TO_DEVICE); + if (dma_mapping_error(&pdev->dev, txr->tx_inline_dma)) { + kfree(txr->tx_inline_buf); + txr->tx_inline_buf =3D NULL; + return -ENOMEM; + } + txr->tx_inline_size =3D size; + + return 0; +} + static void bnxt_free_tx_rings(struct bnxt *bp) { int i; @@ -4003,6 +4036,8 @@ static void bnxt_free_tx_rings(struct bnxt *bp) txr->tx_push =3D NULL; } =20 + bnxt_free_tx_inline_buf(txr, pdev); + ring =3D &txr->tx_ring_struct; =20 bnxt_free_ring(bp, &ring->ring_mem); diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.h b/drivers/net/ethern= et/broadcom/bnxt/bnxt.h index a6b04652600e..751dbc055fdd 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.h +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.h @@ -994,6 +994,12 @@ struct bnxt_tx_ring_info { dma_addr_t tx_push_mapping; __le64 data_mapping; =20 + void *tx_inline_buf; + dma_addr_t tx_inline_dma; + unsigned int tx_inline_size; + u16 tx_inline_prod; + u16 tx_inline_cons; + #define BNXT_DEV_STATE_CLOSING 0x1 u32 dev_state; =20 --=20 2.52.0 From nobody Thu Apr 2 18:47:52 2026 Received: from mail-pl1-f178.google.com (mail-pl1-f178.google.com [209.85.214.178]) (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 912523C2768 for ; Thu, 26 Mar 2026 23:53:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.178 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774569185; cv=none; b=gkXX5cGWP8LthVQOb91H9S8kMlzmkBM/zky3okOsH5ORJWDogMj5sK6YFR2KQrbYGucTuehaO5wr+ApHnJ5joZ2NY/5hw+yn97aA0aNeLozS62XaI8dLDlijIWHgiu7hQhLcv5szcaKoNn8F/ttxk9/UsDrldIGF0ujZ8FssZJg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774569185; c=relaxed/simple; bh=HtDcextZUR/YPcgIMnOZtvtxd0jwbtm6Ak5Sth33ogo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Dfl9AK69+kmwDT5eLHK38VkIFjxhlztbzzdRfDjDkjs9uWiJn9Yg5OIXQxjg2cBYyiibPW4gibjDmHw5gMUiu+ATVJkV4ZkiuqjbiF4KH9yhj31/94AWv/jo99CdqaG4ok/T18IuRWNWpecqRpYSIMzVXfZQLCQjiS0ICizgcA8= 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=kXqtFuek; arc=none smtp.client-ip=209.85.214.178 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="kXqtFuek" Received: by mail-pl1-f178.google.com with SMTP id d9443c01a7336-2b0afa0210bso7762275ad.2 for ; Thu, 26 Mar 2026 16:53:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dama-to.20230601.gappssmtp.com; s=20230601; t=1774569183; x=1775173983; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=sgC2gqkZaDT8s1RV7I0kqk405vgv8rZzFFbIUkMM2/c=; b=kXqtFuek94WJt7r2KC+Av/wJ6DSOvmz0JiLkjAi4tJ7nGq0/txUB1udkzWw2q3Zh28 oVNoT0VvaqAsf8xrsfHeDij9BxcutoYtmAJX4TvHQlBQafKztXXhqv0X70kW9y4FK0FB cmrd245AHZYQzBiKJFWtMUTXNWXCQC4LzYaaaK7adUgGVtMLpp//H3HaGBR8iUlJ/b1i +T3n5ZPcmIXv75IbC1igB6tL3kHn/8j2a74prw/QCSg6I9ktXfuMx4flt0BtmVSY7l2/ +zeg3Rko2pJGHrxmmkthKwpDRCWoA8xDCRS/Rl7ujy0T37uuWwR+k7tZZWIkczuJ5K2u tU1A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774569183; x=1775173983; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=sgC2gqkZaDT8s1RV7I0kqk405vgv8rZzFFbIUkMM2/c=; b=h3t96cMInKvCPNWFN/doXlzLItzxWCx5165rS4u2kPl+/T7Hux48olsblajEU+eDng qNxMy/BfHa2vrf4WAkx7z+Gdmq2iS+fmAys8+lrvIgITrwCku/P1lmpmrBLTm4l42bcf 4i8919UtZkZixu7jJY6lRJTFZiIjDWFmJTwPJYhRWbwd78duxDnYZN+4uqR/A0UxPAjX VkvsWwuXx7ZOyxJ6YBLnNaUSpq/u+MJLt+BXyZNax079g1/Zol2tCoYJ/9126iyO5QWT liI/ul+fLRlyNwql68OJGxJkk40Fj+UO2ULhQ8IY+w/btVpELclL1rgcbCkUOZohZYQH Cteg== X-Forwarded-Encrypted: i=1; AJvYcCXhqA6QUjsMkCsHyqho3pVPE8tBzq7RsGNdx/t3knzE9w0FvgxrWOKM9DB5PDLsD9qFNQSrDOZVr4ekiY8=@vger.kernel.org X-Gm-Message-State: AOJu0Yx6n3Hy0AbYhRYXg1DAHNshCfZKeE58vQIdRqjOdreoqQGrIo3G VfkrbwzEV0b/eSmxEkxwycC3B4fYTmSjo8cKsQmCN7dd0pxN18uZLl3KfcQ1CNmfPkM= X-Gm-Gg: ATEYQzzbzrDv4N7TIpYSifyD1vtHWvtNdMDy0Mxym7neMf5AV7rEm4/6QtihHcIGOHN WebqBl5u4cy7YWT0bpzr/+VZAxg6lp6krmAk8A2T2b+tpurq/nneccMbM17lQNrN+qu20cRoMrm Hoha8HXn+q0Lx/R3YJ9VgMv3WmuJPga95yxbNveYEwg4gw8liAH18ou3WiOgAPvV3uTmTDMj/72 LO9jeJ4LidNe6IZhs2KBWzqIFmYhNdylepE6FGh5JDod5DuKvkh0nsNcaX4sf2GLJbhN1HdZlbI iSxRsXHWQUBUQanf6xrHhjG1e7qVo8RIlBjobDfnIvVsLbso7jeaJFfINszbfUeB5Aiw0YosyGW rUqOvYQR02O8WQ51nnGSd79j6ss0SkcMciooTnOnxSBiIJv7/NhYHOAz4hHpJttmBz/RKGfQ8oT QrUrQfc2kuZ/G3rQ== X-Received: by 2002:a17:902:e54f:b0:2b0:65b8:b5b4 with SMTP id d9443c01a7336-2b0cdd830d7mr4268795ad.39.1774569183083; Thu, 26 Mar 2026 16:53:03 -0700 (PDT) Received: from localhost ([2a03:2880:2ff:4::]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-c76737f28fasm3179687a12.7.2026.03.26.16.53.02 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 26 Mar 2026 16:53:02 -0700 (PDT) From: Joe Damato To: netdev@vger.kernel.org, Michael Chan , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Richard Cochran , Alexei Starovoitov , Daniel Borkmann , Jesper Dangaard Brouer , John Fastabend Cc: andrew+netdev@lunn.ch, horms@kernel.org, pavan.chebbi@broadcom.com, linux-kernel@vger.kernel.org, leon@kernel.org, Joe Damato , bpf@vger.kernel.org Subject: [net-next v6 07/12] net: bnxt: Add boilerplate GSO code Date: Thu, 26 Mar 2026 16:52:26 -0700 Message-ID: <20260326235238.2940471-8-joe@dama.to> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260326235238.2940471-1-joe@dama.to> References: <20260326235238.2940471-1-joe@dama.to> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add bnxt_gso.c and bnxt_gso.h with a stub bnxt_sw_udp_gso_xmit() function, SW USO constants (BNXT_SW_USO_MAX_SEGS, BNXT_SW_USO_MAX_DESCS), and the is_sw_gso field in bnxt_sw_tx_bd with BNXT_SW_GSO_MID/LAST markers. The full SW USO implementation will be added in a future commit. Suggested-by: Jakub Kicinski Reviewed-by: Pavan Chebbi Signed-off-by: Joe Damato --- v5: - Added Pavan's Reviewed-by. No functional changes. drivers/net/ethernet/broadcom/bnxt/Makefile | 2 +- drivers/net/ethernet/broadcom/bnxt/bnxt.h | 4 +++ drivers/net/ethernet/broadcom/bnxt/bnxt_gso.c | 30 ++++++++++++++++++ drivers/net/ethernet/broadcom/bnxt/bnxt_gso.h | 31 +++++++++++++++++++ 4 files changed, 66 insertions(+), 1 deletion(-) create mode 100644 drivers/net/ethernet/broadcom/bnxt/bnxt_gso.c create mode 100644 drivers/net/ethernet/broadcom/bnxt/bnxt_gso.h diff --git a/drivers/net/ethernet/broadcom/bnxt/Makefile b/drivers/net/ethe= rnet/broadcom/bnxt/Makefile index ba6c239d52fa..debef78c8b6d 100644 --- a/drivers/net/ethernet/broadcom/bnxt/Makefile +++ b/drivers/net/ethernet/broadcom/bnxt/Makefile @@ -1,7 +1,7 @@ # SPDX-License-Identifier: GPL-2.0-only obj-$(CONFIG_BNXT) +=3D bnxt_en.o =20 -bnxt_en-y :=3D bnxt.o bnxt_hwrm.o bnxt_sriov.o bnxt_ethtool.o bnxt_dcb.o b= nxt_ulp.o bnxt_xdp.o bnxt_ptp.o bnxt_vfr.o bnxt_devlink.o bnxt_dim.o bnxt_c= oredump.o +bnxt_en-y :=3D bnxt.o bnxt_hwrm.o bnxt_sriov.o bnxt_ethtool.o bnxt_dcb.o b= nxt_ulp.o bnxt_xdp.o bnxt_ptp.o bnxt_vfr.o bnxt_devlink.o bnxt_dim.o bnxt_c= oredump.o bnxt_gso.o bnxt_en-$(CONFIG_BNXT_FLOWER_OFFLOAD) +=3D bnxt_tc.o bnxt_en-$(CONFIG_DEBUG_FS) +=3D bnxt_debugfs.o bnxt_en-$(CONFIG_BNXT_HWMON) +=3D bnxt_hwmon.o diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.h b/drivers/net/ethern= et/broadcom/bnxt/bnxt.h index 751dbc055fdd..18b08789b3a4 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.h +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.h @@ -891,6 +891,7 @@ struct bnxt_sw_tx_bd { u8 is_ts_pkt; u8 is_push; u8 action; + u8 is_sw_gso; unsigned short nr_frags; union { u16 rx_prod; @@ -898,6 +899,9 @@ struct bnxt_sw_tx_bd { }; }; =20 +#define BNXT_SW_GSO_MID 1 +#define BNXT_SW_GSO_LAST 2 + struct bnxt_sw_rx_bd { void *data; u8 *data_ptr; diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_gso.c b/drivers/net/et= hernet/broadcom/bnxt/bnxt_gso.c new file mode 100644 index 000000000000..b296769ee4fe --- /dev/null +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_gso.c @@ -0,0 +1,30 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* Broadcom NetXtreme-C/E network driver. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "bnxt.h" +#include "bnxt_gso.h" + +netdev_tx_t bnxt_sw_udp_gso_xmit(struct bnxt *bp, + struct bnxt_tx_ring_info *txr, + struct netdev_queue *txq, + struct sk_buff *skb) +{ + dev_kfree_skb_any(skb); + dev_core_stats_tx_dropped_inc(bp->dev); + return NETDEV_TX_OK; +} diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_gso.h b/drivers/net/et= hernet/broadcom/bnxt/bnxt_gso.h new file mode 100644 index 000000000000..f01e8102dcd7 --- /dev/null +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_gso.h @@ -0,0 +1,31 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * Broadcom NetXtreme-C/E network driver. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation. + */ + +#ifndef BNXT_GSO_H +#define BNXT_GSO_H + +/* Maximum segments the stack may send in a single SW USO skb. + * This caps gso_max_segs for NICs without HW USO support. + */ +#define BNXT_SW_USO_MAX_SEGS 64 + +/* Worst-case TX descriptors consumed by one SW USO packet: + * Each segment: 1 long BD + 1 ext BD + payload BDs. + * Total payload BDs across all segs <=3D num_segs + nr_frags (each frag + * boundary crossing adds at most 1 extra BD). + * So: 3 * max_segs + MAX_SKB_FRAGS + 1 =3D 3 * 64 + 17 + 1 =3D 210. + */ +#define BNXT_SW_USO_MAX_DESCS (3 * BNXT_SW_USO_MAX_SEGS + MAX_SKB_FRAGS + = 1) + +netdev_tx_t bnxt_sw_udp_gso_xmit(struct bnxt *bp, + struct bnxt_tx_ring_info *txr, + struct netdev_queue *txq, + struct sk_buff *skb); + +#endif --=20 2.52.0 From nobody Thu Apr 2 18:47:52 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 C219F3815F4 for ; Thu, 26 Mar 2026 23:53:05 +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=1774569188; cv=none; b=Kt9WhCohnhphtepR9b+A7TnRRzNOW9vPJkLKMhT7SM0PZXJR6KPAo0OoP8iLh6XOg5s4pmdjiq/gb13d7f/Nl0BDgOWLVHDas47XUwvIJF8MZeHjoaJTvMtoOy9fUur1oecgpUOaFJ/AC+W5AWLqDPFGB3UmYVmnBsp/ZDYD1uQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774569188; c=relaxed/simple; bh=g0ZMY/mYiaYad0AEOxJY66TQHgpI8nIFWwm5NwbmfBQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=qmjEuSyK6irwu0nDvEw3JzStyC97RcKp6Y2yW3EmuzbXFDsAQampxdRObAB+AeqmWIVBtl36TMrBRhwr0ECAc3br1zIINnFDsVUDW1yI8+mBnqqrc5s2kaEN1mhmFWVvU2xV3cc/UHhhAIRtSv1x0ePgY0+hTDoxIUqqgQC+g/Q= 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=J9vwX0oF; 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="J9vwX0oF" Received: by mail-pg1-f173.google.com with SMTP id 41be03b00d2f7-c76864f4e58so41575a12.1 for ; Thu, 26 Mar 2026 16:53:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dama-to.20230601.gappssmtp.com; s=20230601; t=1774569185; x=1775173985; 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=9lO3C5A6DOvNenEaFdW0PEXT4Y2qjfVt93hz9LU/SBU=; b=J9vwX0oF2/gu7NI3T+sLoOH5036UU7sr9ww5bnmi/dcWRHG5UjVTJNo6G2eWyggggw Nz3114a8+lY/T6/eRGliz/eB8YGbwRb8lwRf6clFiyIspHdAvJPvEJBDNDKEQmEczCh9 6q1BW1lOD9zdt4UWAurMbrBnC85o1Lf5I/Nqmv67cw8a4y86J3J0CPPZ5Zh33MLIWWeg j74/enyiOb+fCgbvuBdhpNFdLvfA+3nYnC9J6Jni7i/ytEBHUlmb20gdiCb9CGxojybK /8ZjzYScDktz4ZR85MeJ8KyOcj+hQdvdmztYripBoabADK5ACFlTdrZVYhY7Q9EJgX6a ZB2g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774569185; x=1775173985; 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=9lO3C5A6DOvNenEaFdW0PEXT4Y2qjfVt93hz9LU/SBU=; b=omcZKkZdUPKA8b1CDEESjfGdeTn61TZf4xvmeia77GnoqaGNw/PGfJ5oYWwQ21r0Gy MsmMNzTFFjB0C28aurpFLk9d1w61bVKw4CtW5Zpkcd89/8177zFyUtkWaaIF5Uz2TtVM 94BU84lCQlomhWizIx+EzDrySJMVmUgF7tnPaEvlcZOSbj09KFlEvWnijuAYm9T91dec EDg15Cua/lPvt9CJssNfCXBS8JWp+k6/PxdQ84S3WZUNxX3X1ldlLE3VncD66O/ERyjw PdLLINMERah1WK4p6fLH6nFBuhDFIeFzAyhUkdv2/QJPG0o7MbKmViVlclBvhodQkjho s2yw== X-Forwarded-Encrypted: i=1; AJvYcCX8CTyXkzm9Vp/tBVb3PS71xi8z8ORoGF0+JKp+Ub0aE5ldB7VbuAv2eFHgG8suiSJctoLTZ2Xj8BgUe4M=@vger.kernel.org X-Gm-Message-State: AOJu0YwCeByck8KodUD4Xq/NciruVGdGkZjAordZWoM/G9F8R1vBMZE0 OUTd9ewgtoTg1K6FleoQJUCqfDmG2tkHDE87h6p0IILX3EvO/pulC5ZWhz3X6+eCFzUgyUmAIk4 aaiV5nMg= X-Gm-Gg: ATEYQzwwovOht5udRz3YzB41txyjkHiajxJsptPbv49XCjsmRD9wZkAtX7QEyFl+FGF vDXWyFvavZgff51swmlDEiVHt4hCfYYpiV6kyD62Hp8gvf3Un65GjEUjLAqAufMxfVhsXEamR6R LJFB0BOJChJsNDBNbjsm3O1Dl1r/tV4dehomOtWKxuuCjj8NfM4ebLWMIigoy8OBxG36BkDqIGH iYE+ZY4TWq5SIbWl4wjo9Xpzo6CdBIf55Y65/2gnDGsKrgFKy/pC5kQL+WJdy8hcPFWd4qMbXkY wIALfO0GL0EoUtR6wYr7TxraqwN7RzZq0XHuqnTRnV3hkHOh14fRFcBp0Estkzg0wm0bD4hYZWh GNE/kHITzEIKZ6aE5PTybLb0sLCTJSOZU8DL87eSu1UzG9oc+dMzZm2+lIE5plX5+YpwJ1JdmeC 48yj7i X-Received: by 2002:a05:6a20:6a10:b0:39b:835f:1730 with SMTP id adf61e73a8af0-39c877f8f90mr617127637.15.1774569184978; Thu, 26 Mar 2026 16:53:04 -0700 (PDT) Received: from localhost ([2a03:2880:2ff:53::]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-c767382c2a6sm3053581a12.12.2026.03.26.16.53.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 26 Mar 2026 16:53:04 -0700 (PDT) From: Joe Damato To: netdev@vger.kernel.org, Michael Chan , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni Cc: andrew+netdev@lunn.ch, horms@kernel.org, pavan.chebbi@broadcom.com, linux-kernel@vger.kernel.org, leon@kernel.org, Joe Damato Subject: [net-next v6 08/12] net: bnxt: Implement software USO Date: Thu, 26 Mar 2026 16:52:27 -0700 Message-ID: <20260326235238.2940471-9-joe@dama.to> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260326235238.2940471-1-joe@dama.to> References: <20260326235238.2940471-1-joe@dama.to> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Implement bnxt_sw_udp_gso_xmit() using the core tso_dma_map API and the pre-allocated TX inline buffer for per-segment headers. The xmit path: 1. Calls tso_start() to initialize TSO state 2. Stack-allocates a tso_dma_map and calls tso_dma_map_init() to DMA-map the linear payload and all frags upfront. 3. For each segment: - Copies and patches headers via tso_build_hdr() into the pre-allocated tx_inline_buf (DMA-synced per segment) - Counts payload BDs via tso_dma_map_count() - Emits long BD (header) + ext BD + payload BDs - Payload BDs use tso_dma_map_next() which yields (dma_addr, chunk_len, mapping_len) tuples. Header BDs set dma_unmap_len=3D0 since the inline buffer is pre-allocated and unmapped only at ring teardown. Suggested-by: Jakub Kicinski Reviewed-by: Pavan Chebbi Signed-off-by: Joe Damato --- v6: - Addressed Paolo's feedback where the IOVA API could fail transiently, leaving stale state in iova_state. Fix this by always copying the stat= e, noting that dma_iova_try_alloc is called unconditionally in the tso_dma_map_init function (via tso_dma_iova_try), which zeroes the sta= te even if the API can't be used. - Since this was a very minor change, I retained Pavan's Reviewed-by. v5: - Added __maybe_unused to last_unmap_len and last_unmap_addr to silence a build warning when CONFIG_NEED_DMA_MAP_STATE is disabled. No functional changes. - Added Pavan's Reviewed-by. v4: - Fixed the early return issue Pavan pointed out when num_segs <=3D 1; u= se the drop label instead of returning. v3: - Added iova_state and iova_total_len to struct bnxt_sw_tx_bd. - Stores iova_state on the last segment's tx_buf during xmit. rfcv2: - set the unmap len on the last descriptor, so that when completions fire only the last completion unmaps the region. drivers/net/ethernet/broadcom/bnxt/bnxt.h | 4 + drivers/net/ethernet/broadcom/bnxt/bnxt_gso.c | 210 ++++++++++++++++++ 2 files changed, 214 insertions(+) diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.h b/drivers/net/ethern= et/broadcom/bnxt/bnxt.h index 18b08789b3a4..865546f3bfce 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.h +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.h @@ -11,6 +11,8 @@ #ifndef BNXT_H #define BNXT_H =20 +#include + #define DRV_MODULE_NAME "bnxt_en" =20 /* DO NOT CHANGE DRV_VER_* defines @@ -897,6 +899,8 @@ struct bnxt_sw_tx_bd { u16 rx_prod; u16 txts_prod; }; + struct dma_iova_state iova_state; + size_t iova_total_len; }; =20 #define BNXT_SW_GSO_MID 1 diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_gso.c b/drivers/net/et= hernet/broadcom/bnxt/bnxt_gso.c index b296769ee4fe..7c198847a771 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt_gso.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_gso.c @@ -19,11 +19,221 @@ #include "bnxt.h" #include "bnxt_gso.h" =20 +static u32 bnxt_sw_gso_lhint(unsigned int len) +{ + if (len <=3D 512) + return TX_BD_FLAGS_LHINT_512_AND_SMALLER; + else if (len <=3D 1023) + return TX_BD_FLAGS_LHINT_512_TO_1023; + else if (len <=3D 2047) + return TX_BD_FLAGS_LHINT_1024_TO_2047; + else + return TX_BD_FLAGS_LHINT_2048_AND_LARGER; +} + netdev_tx_t bnxt_sw_udp_gso_xmit(struct bnxt *bp, struct bnxt_tx_ring_info *txr, struct netdev_queue *txq, struct sk_buff *skb) { + unsigned int last_unmap_len __maybe_unused =3D 0; + dma_addr_t last_unmap_addr __maybe_unused =3D 0; + struct bnxt_sw_tx_bd *last_unmap_buf =3D NULL; + unsigned int hdr_len, mss, num_segs; + struct pci_dev *pdev =3D bp->pdev; + unsigned int total_payload; + int i, bds_needed, slots; + struct tso_dma_map map; + u32 vlan_tag_flags =3D 0; + struct tso_t tso; + u16 cfa_action; + u16 prod; + + hdr_len =3D tso_start(skb, &tso); + mss =3D skb_shinfo(skb)->gso_size; + total_payload =3D skb->len - hdr_len; + num_segs =3D DIV_ROUND_UP(total_payload, mss); + + /* Zero the csum fields so tso_build_hdr will propagate zeroes into + * every segment header. HW csum offload will recompute from scratch. + */ + udp_hdr(skb)->check =3D 0; + if (!tso.ipv6) + ip_hdr(skb)->check =3D 0; + + if (unlikely(num_segs <=3D 1)) + goto drop; + + /* Upper bound on the number of descriptors needed. + * + * Each segment uses 1 long BD + 1 ext BD + payload BDs, which is + * at most num_segs + nr_frags (each frag boundary crossing adds at + * most 1 extra BD). + */ + bds_needed =3D 3 * num_segs + skb_shinfo(skb)->nr_frags + 1; + + if (unlikely(bnxt_tx_avail(bp, txr) < bds_needed)) { + netif_txq_try_stop(txq, bnxt_tx_avail(bp, txr), + bp->tx_wake_thresh); + return NETDEV_TX_BUSY; + } + + slots =3D BNXT_SW_USO_MAX_SEGS - (txr->tx_inline_prod - txr->tx_inline_co= ns); + + if (unlikely(slots < num_segs)) { + netif_txq_try_stop(txq, bnxt_tx_avail(bp, txr), + bp->tx_wake_thresh); + return NETDEV_TX_BUSY; + } + + if (unlikely(tso_dma_map_init(&map, &pdev->dev, skb, hdr_len))) + goto drop; + + cfa_action =3D bnxt_xmit_get_cfa_action(skb); + if (skb_vlan_tag_present(skb)) { + vlan_tag_flags =3D TX_BD_CFA_META_KEY_VLAN | + skb_vlan_tag_get(skb); + if (skb->vlan_proto =3D=3D htons(ETH_P_8021Q)) + vlan_tag_flags |=3D 1 << TX_BD_CFA_META_TPID_SHIFT; + } + + prod =3D txr->tx_prod; + + for (i =3D 0; i < num_segs; i++) { + unsigned int seg_payload =3D min_t(unsigned int, mss, + total_payload - i * mss); + u16 slot =3D (txr->tx_inline_prod + i) & + (BNXT_SW_USO_MAX_SEGS - 1); + struct bnxt_sw_tx_bd *tx_buf; + unsigned int mapping_len; + dma_addr_t this_hdr_dma; + unsigned int chunk_len; + unsigned int offset; + dma_addr_t dma_addr; + struct tx_bd *txbd; + void *this_hdr; + int bd_count; + __le32 csum; + bool last; + u32 flags; + + last =3D (i =3D=3D num_segs - 1); + offset =3D slot * TSO_HEADER_SIZE; + this_hdr =3D txr->tx_inline_buf + offset; + this_hdr_dma =3D txr->tx_inline_dma + offset; + + tso_build_hdr(skb, this_hdr, &tso, seg_payload, last); + + dma_sync_single_for_device(&pdev->dev, this_hdr_dma, + hdr_len, DMA_TO_DEVICE); + + bd_count =3D tso_dma_map_count(&map, seg_payload); + + tx_buf =3D &txr->tx_buf_ring[RING_TX(bp, prod)]; + txbd =3D &txr->tx_desc_ring[TX_RING(bp, prod)][TX_IDX(prod)]; + + tx_buf->skb =3D skb; + tx_buf->nr_frags =3D bd_count; + tx_buf->is_push =3D 0; + tx_buf->is_ts_pkt =3D 0; + + dma_unmap_addr_set(tx_buf, mapping, this_hdr_dma); + dma_unmap_len_set(tx_buf, len, 0); + + tx_buf->is_sw_gso =3D last ? BNXT_SW_GSO_LAST : BNXT_SW_GSO_MID; + + /* Store IOVA state on the last segment for completion. + * Always copy so that a stale iova_state from a prior + * occupant of this ring slot cannot be misread by + * dma_use_iova() in the completion path. + */ + if (last) { + tx_buf->iova_state =3D map.iova_state; + tx_buf->iova_total_len =3D map.total_len; + } + + flags =3D (hdr_len << TX_BD_LEN_SHIFT) | + TX_BD_TYPE_LONG_TX_BD | + TX_BD_CNT(2 + bd_count); + + flags |=3D bnxt_sw_gso_lhint(hdr_len + seg_payload); + + txbd->tx_bd_len_flags_type =3D cpu_to_le32(flags); + txbd->tx_bd_haddr =3D cpu_to_le64(this_hdr_dma); + txbd->tx_bd_opaque =3D SET_TX_OPAQUE(bp, txr, prod, + 2 + bd_count); + + csum =3D cpu_to_le32(TX_BD_FLAGS_TCP_UDP_CHKSUM | + TX_BD_FLAGS_IP_CKSUM); + + prod =3D NEXT_TX(prod); + bnxt_init_ext_bd(bp, txr, prod, csum, + vlan_tag_flags, cfa_action); + + /* set dma_unmap_len on the LAST BD touching each + * region. Since completions are in-order, the last segment + * completes after all earlier ones, so the unmap is safe. + */ + while (tso_dma_map_next(&map, &dma_addr, &chunk_len, + &mapping_len, seg_payload)) { + prod =3D NEXT_TX(prod); + txbd =3D &txr->tx_desc_ring[TX_RING(bp, prod)][TX_IDX(prod)]; + tx_buf =3D &txr->tx_buf_ring[RING_TX(bp, prod)]; + + txbd->tx_bd_haddr =3D cpu_to_le64(dma_addr); + dma_unmap_addr_set(tx_buf, mapping, dma_addr); + dma_unmap_len_set(tx_buf, len, 0); + tx_buf->skb =3D NULL; + tx_buf->is_sw_gso =3D 0; + + if (mapping_len) { + if (last_unmap_buf) { + dma_unmap_addr_set(last_unmap_buf, + mapping, + last_unmap_addr); + dma_unmap_len_set(last_unmap_buf, + len, + last_unmap_len); + } + last_unmap_addr =3D dma_addr; + last_unmap_len =3D mapping_len; + } + last_unmap_buf =3D tx_buf; + + flags =3D chunk_len << TX_BD_LEN_SHIFT; + txbd->tx_bd_len_flags_type =3D cpu_to_le32(flags); + txbd->tx_bd_opaque =3D 0; + + seg_payload -=3D chunk_len; + } + + txbd->tx_bd_len_flags_type |=3D + cpu_to_le32(TX_BD_FLAGS_PACKET_END); + + prod =3D NEXT_TX(prod); + } + + if (last_unmap_buf) { + dma_unmap_addr_set(last_unmap_buf, mapping, last_unmap_addr); + dma_unmap_len_set(last_unmap_buf, len, last_unmap_len); + } + + txr->tx_inline_prod +=3D num_segs; + + netdev_tx_sent_queue(txq, skb->len); + + WRITE_ONCE(txr->tx_prod, prod); + /* Sync BDs before doorbell */ + wmb(); + bnxt_db_write(bp, &txr->tx_db, prod); + + if (unlikely(bnxt_tx_avail(bp, txr) <=3D bp->tx_wake_thresh)) + netif_txq_try_stop(txq, bnxt_tx_avail(bp, txr), + bp->tx_wake_thresh); + + return NETDEV_TX_OK; + +drop: dev_kfree_skb_any(skb); dev_core_stats_tx_dropped_inc(bp->dev); return NETDEV_TX_OK; --=20 2.52.0 From nobody Thu Apr 2 18:47:52 2026 Received: from mail-pj1-f44.google.com (mail-pj1-f44.google.com [209.85.216.44]) (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 91E593C3BF5 for ; Thu, 26 Mar 2026 23:53:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.44 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774569189; cv=none; b=he/7iFDQ1gnD0mHGMT/MZ9hCuwn181IAWYaIppEvymX0UCPEm10B+DEVp/WrUWxzj1LKBH8iMakmQtYQJcO2ixvhLyK/wYezBabaF2WI47TSeUVhjf9Ho1zOBWL6owUT9HL1K7abviOYBMz99zp3dNMGmuk15Udt8mjgJyyFBbI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774569189; c=relaxed/simple; bh=QIYYU1PdBci5O2yVRYG/xwwmmFuYUM6OvdvwDv/tBRc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=q79Ex56l45FDeg31XreTQz3Tdef509kBJ5ERvFklk9dCutyi7/Wgoa/Q1CM/AnxFqy+XRpcElhUDhJUeqq3g9FM73Bit14w5hPe/VtegC8VMbnljA2kWW/3QbM9v+IxOjxTECdf+fZAWpFHNoGhHRIeuvmSPBX4ZFdjyQJluG80= 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=oJBAebrV; arc=none smtp.client-ip=209.85.216.44 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="oJBAebrV" Received: by mail-pj1-f44.google.com with SMTP id 98e67ed59e1d1-358d80f60ccso1010828a91.3 for ; Thu, 26 Mar 2026 16:53:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dama-to.20230601.gappssmtp.com; s=20230601; t=1774569187; x=1775173987; 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=DQuecpqcamNaQqb75PHjWneMcX+CqxyHDdOas0j0LYg=; b=oJBAebrVcwLG1xvrDeqGh74wDk2DibMHOFGdU8WTP8kojdmgJ8N6HveW322BiaM2ju 5Sfmbf7PctZksKiTIv27kelqN5CmEno+g0V98uFkZWNtK22qpQ2q8PmU/an1yISdnyOh 0de0xMA4H4tN9wjH7iuRF8wDMtFNPfaKpxvbxbhkg7rAS/pzUfpaThZIT5ffqhsW19RM s1z5EpobUPycoOgSPP/72dE8c5ru1bj0du/LXo4DwEwUN7LZtDJ1T8R2pShE1vbxsSwL cBSGf+4unVeYoNA/pGj9Mmyl+EQv0kL2WUJPFuN8OCRzBdIsXgYxXLOWjbxjbqCh/CBl IVvQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774569187; x=1775173987; 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=DQuecpqcamNaQqb75PHjWneMcX+CqxyHDdOas0j0LYg=; b=iCL2pewNciCUXcAXUwcbV3GjWJ6VTTQy4AVpgm+D7a3AzQfm+e7vRR1iSvxWPQX9YD TRQX6j00Z/rMSwgZda3Tcp1Gb4Aj9Ev5FkaWJ+PBCwMMO1Rcm15l8cJ8M1Dlf9BS/+o+ cUkCOWpDJl5bDOSsn9QvsI53tCmJb6r/pE0bruUUYyH/XvPaBMP8yMIFqCroNtCZ9Drv IbyiIndLCt7b7WyL54kDq+9PJ4Eu7LbDDmqkqQ55JdJoa1EOOZTvV48O+PvPdcOPmZg4 8KJkQFT7mw1AZrFIJvZKXsYLHIfqn6jWryeDgZW5IDWWe48TSaPiJ0M5798USs/s5dR+ 2PDg== X-Forwarded-Encrypted: i=1; AJvYcCXFL+wLThg0i+E+d6+WAYAeBHnZoENTbmb9YBpCFuQbmX3FjkDTW9+IHe++T/FfxtEdu8/EcmJ09kbRX9s=@vger.kernel.org X-Gm-Message-State: AOJu0Yw5BDKdez7JzEbLZXbjl2g0WI4HthmXkQSTozvQ4agLlfTfdvbo c9FvUXwZ6VT4XQb27ADm8Hp5Fd5n0wfvv2WRbx0m/8QhYOW95Qx/KVYyqeL5HOI/pfM= X-Gm-Gg: ATEYQzzcl/Icl490e24xr0BTRE/+CTceYDuwfDGTxcXENY2yCbY0HTWkMYCNwaaIGrK ky65MdfPzTJ9KXiWmLrK13EvaeFjXJHS6TVzkYCW46d1jUcChsC/OWFJMmZPY7/6jkAM1iVom12 QAnf0MlGHNxbmWUwP6VwdSLPN5BqiDtD0I+I+nhxDmxM8YZSgCKGqvDPmIc9JreFiueIExQsePs fT52eu7Lk008IRheu3rRZXifts8IcRF4+qqSsTpCxWrG53izeAfm6M1e6pihm+EsL9lzZWn0oSJ 9Ni5aYEnjTxyvhLB/pfMdGQ3P5SoKtBilQtIHwNAQoB8ccmHPszuxsqKfksuRuo3EXEZ6qgvYqT ma5t4CNmClRgWF71E5Zob1KYtLUUXIWgibImiftJ4BILqGiKsQSEkSMlI8zRiOZykoXuoL6xRE1 fYsn8= X-Received: by 2002:a17:90a:158f:b0:35c:30a8:327 with SMTP id 98e67ed59e1d1-35c30a809demr192674a91.0.1774569186980; Thu, 26 Mar 2026 16:53:06 -0700 (PDT) Received: from localhost ([2a03:2880:2ff:4::]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-c76739345b2sm2645967a12.17.2026.03.26.16.53.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 26 Mar 2026 16:53:06 -0700 (PDT) From: Joe Damato To: netdev@vger.kernel.org, Michael Chan , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni Cc: andrew+netdev@lunn.ch, horms@kernel.org, pavan.chebbi@broadcom.com, linux-kernel@vger.kernel.org, leon@kernel.org, Joe Damato Subject: [net-next v6 09/12] net: bnxt: Add SW GSO completion and teardown support Date: Thu, 26 Mar 2026 16:52:28 -0700 Message-ID: <20260326235238.2940471-10-joe@dama.to> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260326235238.2940471-1-joe@dama.to> References: <20260326235238.2940471-1-joe@dama.to> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Update __bnxt_tx_int and bnxt_free_one_tx_ring_skbs to handle SW GSO segments: - MID segments: adjust tx_pkts/tx_bytes accounting and skip skb free (the skb is shared across all segments and freed only once) - LAST segments: if the DMA IOVA path was used, use dma_iova_destroy to tear down the contiguous mapping. On the fallback path, payload DMA unmapping is handled by the existing per-BD dma_unmap_len walk. Both MID and LAST completions advance tx_inline_cons to release the segment's inline header slot back to the ring. is_sw_gso is initialized to zero, so the new code paths are not run. Suggested-by: Jakub Kicinski Reviewed-by: Pavan Chebbi Signed-off-by: Joe Damato --- v5: - Added Pavan's Reviewed-by. No functional changes. v3: - completion paths updated to use DMA IOVA APIs to teardown mappings. rfcv2: - Update the shared header buffer consumer on TX completion. drivers/net/ethernet/broadcom/bnxt/bnxt.c | 82 +++++++++++++++++-- .../net/ethernet/broadcom/bnxt/bnxt_ethtool.c | 19 ++++- 2 files changed, 91 insertions(+), 10 deletions(-) diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethern= et/broadcom/bnxt/bnxt.c index 9e3a74ce5b75..946608db92a0 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c @@ -74,6 +74,8 @@ #include "bnxt_debugfs.h" #include "bnxt_coredump.h" #include "bnxt_hwmon.h" +#include "bnxt_gso.h" +#include =20 #define BNXT_TX_TIMEOUT (5 * HZ) #define BNXT_DEF_MSG_ENABLE (NETIF_MSG_DRV | NETIF_MSG_HW | \ @@ -817,12 +819,13 @@ static bool __bnxt_tx_int(struct bnxt *bp, struct bnx= t_tx_ring_info *txr, bool rc =3D false; =20 while (RING_TX(bp, cons) !=3D hw_cons) { - struct bnxt_sw_tx_bd *tx_buf; + struct bnxt_sw_tx_bd *tx_buf, *head_buf; struct sk_buff *skb; bool is_ts_pkt; int j, last; =20 tx_buf =3D &txr->tx_buf_ring[RING_TX(bp, cons)]; + head_buf =3D tx_buf; skb =3D tx_buf->skb; =20 if (unlikely(!skb)) { @@ -869,6 +872,23 @@ static bool __bnxt_tx_int(struct bnxt *bp, struct bnxt= _tx_ring_info *txr, DMA_TO_DEVICE, 0); } } + + if (unlikely(head_buf->is_sw_gso)) { + txr->tx_inline_cons++; + if (head_buf->is_sw_gso =3D=3D BNXT_SW_GSO_LAST) { + if (dma_use_iova(&head_buf->iova_state)) + dma_iova_destroy(&pdev->dev, + &head_buf->iova_state, + head_buf->iova_total_len, + DMA_TO_DEVICE, 0); + } else { + tx_pkts--; + tx_bytes -=3D skb->len; + skb =3D NULL; + } + head_buf->is_sw_gso =3D 0; + } + if (unlikely(is_ts_pkt)) { if (BNXT_CHIP_P5(bp)) { /* PTP worker takes ownership of the skb */ @@ -3420,6 +3440,7 @@ static void bnxt_free_one_tx_ring_skbs(struct bnxt *b= p, =20 for (i =3D 0; i < max_idx;) { struct bnxt_sw_tx_bd *tx_buf =3D &txr->tx_buf_ring[i]; + struct bnxt_sw_tx_bd *head_buf =3D tx_buf; struct sk_buff *skb; int j, last; =20 @@ -3472,7 +3493,20 @@ static void bnxt_free_one_tx_ring_skbs(struct bnxt *= bp, DMA_TO_DEVICE, 0); } } - dev_kfree_skb(skb); + if (head_buf->is_sw_gso) { + txr->tx_inline_cons++; + if (head_buf->is_sw_gso =3D=3D BNXT_SW_GSO_LAST) { + if (dma_use_iova(&head_buf->iova_state)) + dma_iova_destroy(&pdev->dev, + &head_buf->iova_state, + head_buf->iova_total_len, + DMA_TO_DEVICE, 0); + } else { + skb =3D NULL; + } + } + if (skb) + dev_kfree_skb(skb); } netdev_tx_reset_queue(netdev_get_tx_queue(bp->dev, idx)); } @@ -3998,9 +4032,9 @@ static void bnxt_free_tx_inline_buf(struct bnxt_tx_ri= ng_info *txr, txr->tx_inline_size =3D 0; } =20 -static int __maybe_unused bnxt_alloc_tx_inline_buf(struct bnxt_tx_ring_inf= o *txr, - struct pci_dev *pdev, - unsigned int size) +static int bnxt_alloc_tx_inline_buf(struct bnxt_tx_ring_info *txr, + struct pci_dev *pdev, + unsigned int size) { txr->tx_inline_buf =3D kmalloc(size, GFP_KERNEL); if (!txr->tx_inline_buf) @@ -4103,6 +4137,14 @@ static int bnxt_alloc_tx_rings(struct bnxt *bp) sizeof(struct tx_push_bd); txr->data_mapping =3D cpu_to_le64(mapping); } + if (!(bp->flags & BNXT_FLAG_UDP_GSO_CAP) && + (bp->dev->features & NETIF_F_GSO_UDP_L4)) { + rc =3D bnxt_alloc_tx_inline_buf(txr, pdev, + BNXT_SW_USO_MAX_SEGS * + TSO_HEADER_SIZE); + if (rc) + return rc; + } qidx =3D bp->tc_to_qidx[j]; ring->queue_id =3D bp->q_info[qidx].queue_id; spin_lock_init(&txr->xdp_tx_lock); @@ -4645,6 +4687,10 @@ static int bnxt_init_tx_rings(struct bnxt *bp) =20 bp->tx_wake_thresh =3D max_t(int, bp->tx_ring_size / 2, BNXT_MIN_TX_DESC_CNT); + if (!(bp->flags & BNXT_FLAG_UDP_GSO_CAP) && + (bp->dev->features & NETIF_F_GSO_UDP_L4)) + bp->tx_wake_thresh =3D max_t(int, bp->tx_wake_thresh, + BNXT_SW_USO_MAX_DESCS); =20 for (i =3D 0; i < bp->tx_nr_rings; i++) { struct bnxt_tx_ring_info *txr =3D &bp->tx_ring[i]; @@ -13832,6 +13878,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 @@ -13877,6 +13928,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; @@ -16880,8 +16940,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; @@ -16914,8 +16973,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 b87ac2bb43dd..a3d17f436b22 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 Thu Apr 2 18:47:52 2026 Received: from mail-pl1-f181.google.com (mail-pl1-f181.google.com [209.85.214.181]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 424A338C2BE for ; Thu, 26 Mar 2026 23:53:09 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.181 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774569194; cv=none; b=lCGaSgAPUbd7eehkHHBpfXrkKwia+GRjZESPz0QDD6E7bzT4O08F75F/rZTXgGRMrM4+WlyED5/oO6G6kHZcI8+Mz6BZy3+CjPe+kmqAD+BdktsrHnEuxd0nja8P3x8zoplRgmWa540FVo8g5Hl2tJi7M77Yiu79wJAaiGVB4IA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774569194; c=relaxed/simple; bh=pKyucMpUmEUvEFMBIx42AjbztCbNrx6csAdo92it2Xk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=LzzIC4DdzfYyD4FAHwoX69G9kXELqBbEHG/ionqS3q5Re0xkfP4Z3LLtaWJsx0DQ0IpXWoQ0SKqAKJ36dYYcFv8zIlbc6cbEsnPpxXdaUw2h8571PZW3S5Vwvh+fNcYOAIzXPrOw3cVhhbu0DWqETWvt5jVHB4Zq8rB/r/nWzu8= 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=JwoWFS87; arc=none smtp.client-ip=209.85.214.181 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=dama.to Authentication-Results: smtp.subspace.kernel.org; spf=none smtp.mailfrom=dama.to Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=dama-to.20230601.gappssmtp.com header.i=@dama-to.20230601.gappssmtp.com header.b="JwoWFS87" Received: by mail-pl1-f181.google.com with SMTP id d9443c01a7336-2aecc6b0861so9624315ad.2 for ; Thu, 26 Mar 2026 16:53:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dama-to.20230601.gappssmtp.com; s=20230601; t=1774569188; x=1775173988; 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=JqiCKER8qXjRaUNO4Rk4CZBahew9NIm21W29yweRKzg=; b=JwoWFS87IOpq+uKx9Fqh8duQts3Mx0KQwqFHzfVCKlGLtvto24T2phCv+fOhy0l4C9 tur+Er7cHLRarL7sfep5iR3aviRDR5klUP415UNykel10+ggDTfhBENcjuOvot0Nsw2B NmRNdqLHyBS4mEzTWt5IxXy0ZjIDgmib9e84+mv89YVarUWbFuR1Lvc7cQg77lZPemjN 1jVkrbnc8WVrZH10WLb5lCbPWr07DQFMAAfYVAnTTWgtLvvE3BzBl+xaLn3+gBqXoe18 j2jY9sJfsnaNddaZq6hkHnLrSJ/gd1Ze3o5dALMm5MRAWNwtNUmEtnZLrMUIgKaKfq5y ohXw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774569188; x=1775173988; 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=JqiCKER8qXjRaUNO4Rk4CZBahew9NIm21W29yweRKzg=; b=ErvyvxRFnuwGdjgrdpjSTNg0VPgWGC4/5q9TlZCnm1YH/7bqrJq0URsc+FS3Kc2e/A BxDgCJP25AUISWAg9u+1lak86EHfZCns5ig+o2VIK153For1huOl2aF3QDqQgbBKHTbG WPy4Ix1Vt8ta9aaC/f7Ync5XVamJHonjFJKT7hSeMPyqZfAF1X7x3/+HZ+TsvIIQdB2h lsD6zc7cXkOVdsoc39Y57oK9bfvJrz/9vl3WnhPB49T/OELyO2MclLtY6sB5Yvo0KuNh jEGq9wxBrzB5ApAILxfSou7MKuot0lmg8ZzVhgPGF8VPL2eLnd/+d1iNq+EIEAP0/fQW N1CA== X-Forwarded-Encrypted: i=1; AJvYcCXAq1Z/RF1RTwgn5cJY49ajlTcYGCIBv3BoLu3Bn/AzuipWyYTHn6DoqSRnwm/5JCIEqg2I1yEFMP9ERmo=@vger.kernel.org X-Gm-Message-State: AOJu0YzhYiWy1pi99twBHn8yRGfO9QN5/KrpfWj3lhXOZkptjLYn3a/v rPWWpZW9rQY3IeM59cZnGxm9QwSMJkI5SVSOoIBzbnm1x4ZgnG+nnEQBGzTtAgbbPnA= X-Gm-Gg: ATEYQzxZtnGej/8ymOUyQ+pj4EZveIDXiSfZ5UMmdG1UuB35u+tuxnCy9oGOt19adhm ows4M4qHVPD4tnpohpzxerOGczufFi4wuQbAaUecrCwrYBIAzgshvf9wyEZRB54PGThCZRCgo/F SFvY0b9YFEIu02I4AMIBV3hL4xrghr8znDkgaqE6YrT8lEBe4IeC4QTZ+HBi9suvv6lb7cAPrOZ xM7xQ2pLwyagemQo5To1pl+6Ej/7n8DNHLXThnoVJaG1PVQZK49eqZvqS5UdRkzLJrppY9LjK94 ZVmlOGvWYdA1OaSqPmCFMSEK07h3JYg2ot0aT9lJZ9akn5mUGAPfIKj08GNDq7g9y7cqVb4JhZ/ KIKO51MnFcBhOenOXwceoJoxDgnqx1jmEvRbYCAnpGeKtKb3DqnEw6NhKtyWrL6Em9e3mXOMWxD PLlXgH86trRUgPaoI= X-Received: by 2002:a17:902:da91:b0:2b0:5ec1:97c1 with SMTP id d9443c01a7336-2b0cdc238f3mr5392445ad.7.1774569188532; Thu, 26 Mar 2026 16:53:08 -0700 (PDT) Received: from localhost ([2a03:2880:2ff:73::]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2b0bc7b233fsm43338585ad.32.2026.03.26.16.53.07 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 26 Mar 2026 16:53:08 -0700 (PDT) From: Joe Damato To: netdev@vger.kernel.org, Michael Chan , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni Cc: andrew+netdev@lunn.ch, horms@kernel.org, pavan.chebbi@broadcom.com, linux-kernel@vger.kernel.org, leon@kernel.org, Joe Damato Subject: [net-next v6 10/12] net: bnxt: Dispatch to SW USO Date: Thu, 26 Mar 2026 16:52:29 -0700 Message-ID: <20260326235238.2940471-11-joe@dama.to> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260326235238.2940471-1-joe@dama.to> References: <20260326235238.2940471-1-joe@dama.to> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Wire in the SW USO path added in preceding commits when hardware USO is not possible. When a GSO skb with SKB_GSO_UDP_L4 arrives and the NIC lacks HW USO capability, redirect to bnxt_sw_udp_gso_xmit() which handles software segmentation into individual UDP frames submitted directly to the TX ring. Suggested-by: Jakub Kicinski Reviewed-by: Pavan Chebbi Signed-off-by: Joe Damato --- v5: - Added Pavan's Reviewed-by. No functional changes. drivers/net/ethernet/broadcom/bnxt/bnxt.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethern= et/broadcom/bnxt/bnxt.c index 946608db92a0..bbbef1f1fa70 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c @@ -508,6 +508,11 @@ static netdev_tx_t bnxt_start_xmit(struct sk_buff *skb= , struct net_device *dev) } } #endif + if (skb_is_gso(skb) && + (skb_shinfo(skb)->gso_type & SKB_GSO_UDP_L4) && + !(bp->flags & BNXT_FLAG_UDP_GSO_CAP)) + return bnxt_sw_udp_gso_xmit(bp, txr, txq, skb); + free_size =3D bnxt_tx_avail(bp, txr); if (unlikely(free_size < skb_shinfo(skb)->nr_frags + 2)) { /* We must have raced with NAPI cleanup */ --=20 2.52.0 From nobody Thu Apr 2 18:47:52 2026 Received: from mail-pl1-f176.google.com (mail-pl1-f176.google.com [209.85.214.176]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D0AB43C4556 for ; Thu, 26 Mar 2026 23:53:10 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.176 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774569197; cv=none; b=onJ7KZAevviprl5nhYoK0gw9riCkuxjB0b1leO+oEdSSMJUcjFDY4hwy1/2rZQ/AT+lwzQCfaDf/dKTocPHM1NMCQDX2hbqGkljC/57tSZMR88YE38MZhgtByprUhBrS3lb50QKTZIWc85/x7DX/0HUJmUjw4T1FM5DiotL3L+8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774569197; c=relaxed/simple; bh=uWnYZfxpXWzMEdoD4OoQj78mYr7rYihNxdLMDApkweE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=mpOiaM+oBamacYWNu84bNpui873CAh6Wfz9PmC5vkpMwoP1SEDXFcelZ9GYvFVGorikVXwUIaU5wEVRl5ZoU1kdcD5n93Tctj2swYLBI0SFNI7ylv7j64AO8ZYfAQS8jX/6jiEsvFnBXONp7v4suqbVgv15opLOJFkIPfhXTins= 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=rtYAUz1S; arc=none smtp.client-ip=209.85.214.176 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=dama.to Authentication-Results: smtp.subspace.kernel.org; spf=none smtp.mailfrom=dama.to Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=dama-to.20230601.gappssmtp.com header.i=@dama-to.20230601.gappssmtp.com header.b="rtYAUz1S" Received: by mail-pl1-f176.google.com with SMTP id d9443c01a7336-2b0c8362d93so5833355ad.3 for ; Thu, 26 Mar 2026 16:53:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dama-to.20230601.gappssmtp.com; s=20230601; t=1774569190; x=1775173990; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=lGwTwQhNH9Rzs+EHOpg8GEhPLriykUGXInx1g7lVTBM=; b=rtYAUz1SqOlo8UK0hQgpJEeyQJoG4AReT6crtCujEHQd7PfnfHqepLv3RznAvdysJj oanqLPh4BNyzZWaN73p5d5i64tKgTeQe2V4AlHrrlIcnUhRPmExgW52eXXF6Yz9kwUsn Lc4UBfZ7pIvKHGZTw7djU0K/AHnmhAeIrgcalnTzHZza4kGI7oKF2aJChu9Fp860lIII C4/eE5FsVohrH/snN/xPB8AXhp7YiNnnuuQA358orNp2Unu0ICJPXg8UBuur1XBOZvv3 4qTKg6T1ykz6IaI4K7WKRkZbtwqcitEbNg9avgd0wtmyk4+pXNKT5+nlLpBC/eSHtBtL ov+g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774569190; x=1775173990; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=lGwTwQhNH9Rzs+EHOpg8GEhPLriykUGXInx1g7lVTBM=; b=LamkRdHZNAOl7T2Kc3yldwcYRl/K8suIWK7NQ7/CUDwiJBYGEQNqRrbIF3Q/gFjSIu cQ8Ylfi7AgQ0di+w2RG2yLODY0MkUKHD8qFS6qeDWabbF6OTkxH9SvTSyigS4Wxew3aC ywJmlQSLk84D5qiXdqjH6GlQMlQvtTUs+/N4THwd1hmtrngooor0GuThqj+j2L2026Ug MHXaKeXTI3SGFS35LiGBvimGSzvtycIbeWyHczxMO2VUa0v4XMBK1g/aJhJTS8vyOe5F tXv+y8Xxf/6yGaL6JK36Q8yk2naiNvcUiI+1EoXGTTcE0wzerxjIoE+uSjsRG68WpKq0 /1ow== X-Forwarded-Encrypted: i=1; AJvYcCW9NLkX1PR+GsIiLJF8fn8an0b/tUNOKQLCo977lvDV0VoqkRafGxRcppZWRmW+6f0ZvzvNtnIi/BCZtTs=@vger.kernel.org X-Gm-Message-State: AOJu0Yz7t98miJYjXqdnN2UnOdHiVINFfb7D/YMp5l6Y+T0eW57EL0my FnVCEvQ9FIywB+TuxL336DjChmY7K7D4RxIlrVEpbvuISu4a1/L26SF/tUj5/Tu3qKM= X-Gm-Gg: ATEYQzzwb2dIaGGE5dIO3konQJrjXAsOZoFkqGboe1ZyHGH8RtnKU6ckp7pVzzd02EI bzSWqFXNZKAZxpjOYzd3ZMKHqnjOEZTiJizloc6y7LHaS7tuvRAn6hL4Q89AuP57wN1OTrIWm45 C1FY7FZ1+H0yoLInghZJPsorYG3oPMGu42+C+f2ha46Eqts2qGRqF4N1Z1lHeCwqGWQWRc97lmF 7EkgxeA61ELQgO1lbXH+tTpXzhjIFJioMpBefNZGGE3sIWekOz3EInSsPaegBcbYZs9tQd7IUe5 uD8kZhw9TLt4DtKCnPfLTcaBzFT81rPVS1/5pvM1qqO7QpYdMEjZJi+0HKjRyP/6RHfTr4J7bnJ tKymZQESIH8AFGr91SAj6XOeX7ZdbEPBlp9aSazPZazAAR20pGCOIIDxlpltYvzyP0O1zJOVKom Viq+MPBqJPxqfBLHM= X-Received: by 2002:a17:902:e809:b0:2a9:e8b:5326 with SMTP id d9443c01a7336-2b0cdc3da4emr4232045ad.23.1774569190139; Thu, 26 Mar 2026 16:53:10 -0700 (PDT) Received: from localhost ([2a03:2880:2ff:5d::]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2b0bc881fe7sm44411865ad.48.2026.03.26.16.53.09 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 26 Mar 2026 16:53:09 -0700 (PDT) From: Joe Damato To: netdev@vger.kernel.org, Jakub Kicinski , "David S. Miller" , Eric Dumazet , Paolo Abeni Cc: andrew+netdev@lunn.ch, horms@kernel.org, michael.chan@broadcom.com, pavan.chebbi@broadcom.com, linux-kernel@vger.kernel.org, leon@kernel.org, Joe Damato Subject: [net-next v6 11/12] net: netdevsim: Add support for SW USO Date: Thu, 26 Mar 2026 16:52:30 -0700 Message-ID: <20260326235238.2940471-12-joe@dama.to> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260326235238.2940471-1-joe@dama.to> References: <20260326235238.2940471-1-joe@dama.to> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add support for UDP Segmentation Offloading in software (SW USO). This is helpful for testing when real hardware is not available. A test which uses this codepath will be added in a following commit. Suggested-by: Jakub Kicinski Reviewed-by: Pavan Chebbi Signed-off-by: Joe Damato --- v5: - Added Pavan's Reviewed-by. No functional changes. v4: - Added parentheses around the gso_type check for clarity. No functional change. rfcv2: - new in rfcv2 drivers/net/netdevsim/netdev.c | 100 ++++++++++++++++++++++++++++++++- 1 file changed, 99 insertions(+), 1 deletion(-) diff --git a/drivers/net/netdevsim/netdev.c b/drivers/net/netdevsim/netdev.c index c71b8d116f18..f228bcf3d190 100644 --- a/drivers/net/netdevsim/netdev.c +++ b/drivers/net/netdevsim/netdev.c @@ -30,6 +30,7 @@ #include #include #include +#include =20 #include "netdevsim.h" =20 @@ -120,6 +121,98 @@ static int nsim_forward_skb(struct net_device *tx_dev, return nsim_napi_rx(tx_dev, rx_dev, rq, skb); } =20 +static netdev_tx_t nsim_uso_segment_xmit(struct net_device *dev, + struct sk_buff *skb) +{ + unsigned int hdr_len, mss, total_payload, num_segs; + struct netdevsim *ns =3D netdev_priv(dev); + struct net_device *peer_dev; + unsigned int total_len =3D 0; + struct netdevsim *peer_ns; + struct nsim_rq *rq; + struct tso_t tso; + int i, rxq; + + hdr_len =3D tso_start(skb, &tso); + mss =3D skb_shinfo(skb)->gso_size; + total_payload =3D skb->len - hdr_len; + num_segs =3D DIV_ROUND_UP(total_payload, mss); + + udp_hdr(skb)->check =3D 0; + if (!tso.ipv6) + ip_hdr(skb)->check =3D 0; + + rcu_read_lock(); + peer_ns =3D rcu_dereference(ns->peer); + if (!peer_ns) + goto out_drop_free; + + peer_dev =3D peer_ns->netdev; + rxq =3D skb_get_queue_mapping(skb); + if (rxq >=3D peer_dev->num_rx_queues) + rxq =3D rxq % peer_dev->num_rx_queues; + rq =3D peer_ns->rq[rxq]; + + for (i =3D 0; i < num_segs; i++) { + unsigned int seg_payload =3D min_t(unsigned int, mss, + total_payload); + bool last =3D (i =3D=3D num_segs - 1); + unsigned int seg_remaining; + struct sk_buff *seg; + + seg =3D alloc_skb(hdr_len + seg_payload, GFP_ATOMIC); + if (!seg) + break; + + seg->dev =3D dev; + + tso_build_hdr(skb, skb_put(seg, hdr_len), &tso, + seg_payload, last); + + if (!tso.ipv6) { + unsigned int nh_off =3D skb_network_offset(skb); + struct iphdr *iph; + + iph =3D (struct iphdr *)(seg->data + nh_off); + iph->check =3D ip_fast_csum(iph, iph->ihl); + } + + seg_remaining =3D seg_payload; + while (seg_remaining > 0) { + unsigned int chunk =3D min_t(unsigned int, tso.size, + seg_remaining); + + memcpy(skb_put(seg, chunk), tso.data, chunk); + tso_build_data(skb, &tso, chunk); + seg_remaining -=3D chunk; + } + + total_payload -=3D seg_payload; + + seg->ip_summed =3D CHECKSUM_UNNECESSARY; + + if (nsim_forward_skb(dev, peer_dev, seg, rq, NULL) =3D=3D NET_RX_DROP) + continue; + + total_len +=3D hdr_len + seg_payload; + } + + if (!hrtimer_active(&rq->napi_timer)) + hrtimer_start(&rq->napi_timer, us_to_ktime(5), + HRTIMER_MODE_REL); + + rcu_read_unlock(); + dev_kfree_skb(skb); + dev_dstats_tx_add(dev, total_len); + return NETDEV_TX_OK; + +out_drop_free: + dev_kfree_skb(skb); + rcu_read_unlock(); + dev_dstats_tx_dropped(dev); + return NETDEV_TX_OK; +} + static netdev_tx_t nsim_start_xmit(struct sk_buff *skb, struct net_device = *dev) { struct netdevsim *ns =3D netdev_priv(dev); @@ -132,6 +225,10 @@ static netdev_tx_t nsim_start_xmit(struct sk_buff *skb= , struct net_device *dev) int rxq; int dr; =20 + if (skb_is_gso(skb) && + skb_shinfo(skb)->gso_type & SKB_GSO_UDP_L4) + return nsim_uso_segment_xmit(dev, skb); + rcu_read_lock(); if (!nsim_ipsec_tx(ns, skb)) goto out_drop_any; @@ -938,7 +1035,8 @@ static void nsim_setup(struct net_device *dev) NETIF_F_HW_CSUM | NETIF_F_LRO | NETIF_F_TSO | - NETIF_F_LOOPBACK; + NETIF_F_LOOPBACK | + NETIF_F_GSO_UDP_L4; dev->pcpu_stat_type =3D NETDEV_PCPU_STAT_DSTATS; dev->max_mtu =3D ETH_MAX_MTU; dev->xdp_features =3D NETDEV_XDP_ACT_BASIC | NETDEV_XDP_ACT_HW_OFFLOAD; --=20 2.52.0 From nobody Thu Apr 2 18:47:52 2026 Received: from mail-pl1-f179.google.com (mail-pl1-f179.google.com [209.85.214.179]) (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 B3A5538F634 for ; Thu, 26 Mar 2026 23:53:12 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.179 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774569197; cv=none; b=l9JuZdE6J7a6IkVKmwRln45jqNsfZIH4Gpd/HmY+ZwWj1zO4rrOBvd9rIqV+ZbqKjo/8XoRFXB/MPqax8Ig/WpM/0aWVFVrt+WMWDsliob3yAYSJZAUY4XhDcuitHl/nbbEY7zXsMvQdbwn/+Ghjy2j4roYpY1myBR/nBd6vCac= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774569197; c=relaxed/simple; bh=S62nqp/L7oaBVz+l0EkYVc7w8PWzqc5mHLXWWDxhwe8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=CAcBQC0MffJh3E78VpUFTQjx5OWDorKS9GAUsaimIIfapgL7yk62o4aTy+MLol9ZuvuXw03RXqb0/rp4JbFalgQVOsha7Ou4shAjmJ3LG/HOa4WLs49H5O+uKh5TNfLVDAC9UGV7soiROJDvwJdQJqGUjjhfLYRu0+WW6peaGMo= 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=UsJJEm5P; arc=none smtp.client-ip=209.85.214.179 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="UsJJEm5P" Received: by mail-pl1-f179.google.com with SMTP id d9443c01a7336-2b0ba3bfe16so14034145ad.1 for ; Thu, 26 Mar 2026 16:53:12 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dama-to.20230601.gappssmtp.com; s=20230601; t=1774569192; x=1775173992; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=r9OKWh4GFeDrs3iW8vGT1OneAtu45dtpNVuW7lfnaEs=; b=UsJJEm5Pz1rIeqzf4B5RAagtfXe24nDNyZBZGb/qo7zY7flCo/Hbs+JNlULaCmC6eh N9XIV4Mj7aMcVSK/xaAlQqzMLe3jYWIZu5Ja3nm4W32TIwtadjIiT9omtkwImZJg6r/O B1pR7+5mww8vbRebznyH/OMe/hbpHpxg7jLir+Mu0r/0yLOJis2iiEHIg+iJBwZ+1Jxx XP3QMiMEWChljqFc/aQqNnlgcByeqySzroFS8rVLrerHvdBt4pUkDZLsdItlhBHGCFxy 2nfErfxeFm75SCDubQOu/s8YlEtzixSVt1LqqXL3vWKR1v2sPDrPfAjW1s+YUNZJa4tg A5tg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774569192; x=1775173992; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=r9OKWh4GFeDrs3iW8vGT1OneAtu45dtpNVuW7lfnaEs=; b=k/ZV3Jh1IPbtiXSkU+sxj4TL1w3DO4vdB6eEPeU7e5hunsHlFKacXA84PDmr2oemds 6y7ZI9P8Oew0hYUAds2IBDGgaOAt8PuxTO9b9FPuRNp52QF8x8y8hlSJceI6WDgXwNRN MsV8OWKeayeYIc22+47FVM2G71KFjeMDQddUiFkFny9fafj11aHvo465RVxfniV2UgYu t8b5gKGEbieXiQs7KtQoygu9ZA6mjR4S5VJEWZE93SOy4bM4sCFhLpx4JNuSZzyeLZh8 l4XM6F+UP+bi7ACKi0cZ+VPtgIBlVkgdp/LEM/f/meZSzGB8xfD2EqlsCnIDPkkjlRdx 0szQ== X-Forwarded-Encrypted: i=1; AJvYcCV563euTKyd9AkD9hGbtueG4w32RY4znnuenikIrUepgPACsVvmZuO7gfJ5InG0HgXnXhyAfR99J8Ctfmc=@vger.kernel.org X-Gm-Message-State: AOJu0YzSxWDHoU/yphyyjlg6tsKhWwnI5BcRuq7FBq06Ae8dgDe7wLHx 0AB+nNJJz6QR7hlLBULUOp6NCIZGJ/UyaSvthFBimSiczRXOWwTCSb8cj0jRjzG0F6I= X-Gm-Gg: ATEYQzzv2LyTkY1IIaSYy0tjFWwQJ4ryHh+7tortbZQPPK74i9wpmwgnKIb16FZhjRp i2cldHPTTgZcluiKpIP4tQslDz12DrHbtPVGFPorfVEbIfovmifiu2jtg5ODjUUjBcfsL2eGrw3 J32Jw3cggb8HX5k1W+K/sIZnhwAqOfR0eMBfC5Dk36xhcXTOxjPUXbMGLn2u7/zhBe5haKhSsqF YZnJ1s/niopfopdndFlUUz7YDjM3EiA+LTyLRHP8f36H0QGy/4TJUL6FDEG014GtuISKDyGvw8e w2prTh5r0M8JNbVqhaZDiFXGUKn87U0BZnV6co44225+TbnDyvAZ9VTmPzXmHZ8AJV1XdcqMS+A 5KhwD1bwdEinbdXSJC5yWxRRhre8ISICGJeZDsp6J5737Oua/j1n9rUt/QxH9bskM0XjNKNAVBT Doq/h7KtzWwFoNtA== X-Received: by 2002:a17:902:ef4c:b0:2b0:501e:d751 with SMTP id d9443c01a7336-2b0ce5b10f3mr2054445ad.20.1774569192019; Thu, 26 Mar 2026 16:53:12 -0700 (PDT) Received: from localhost ([2a03:2880:2ff:7::]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2b0bc786b7fsm52644875ad.20.2026.03.26.16.53.11 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 26 Mar 2026 16:53:11 -0700 (PDT) From: Joe Damato To: netdev@vger.kernel.org, Shuah Khan Cc: andrew+netdev@lunn.ch, davem@davemloft.net, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com, horms@kernel.org, michael.chan@broadcom.com, pavan.chebbi@broadcom.com, linux-kernel@vger.kernel.org, leon@kernel.org, Joe Damato , linux-kselftest@vger.kernel.org Subject: [net-next v6 12/12] selftests: drv-net: Add USO test Date: Thu, 26 Mar 2026 16:52:31 -0700 Message-ID: <20260326235238.2940471-13-joe@dama.to> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260326235238.2940471-1-joe@dama.to> References: <20260326235238.2940471-1-joe@dama.to> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add a simple test for USO. Can be used with netdevsim or real hardware. Tests both ipv4 and ipv6 with several full segments and a partial segment. Suggested-by: Jakub Kicinski Reviewed-by: Pavan Chebbi Signed-off-by: Joe Damato --- v5: - Added Pavan's Reviewed-by. No functional changes. v4: - Fix python linter issues (unused imports, docstring, etc). rfcv2: - new in rfcv2 tools/testing/selftests/drivers/net/Makefile | 1 + tools/testing/selftests/drivers/net/uso.py | 96 ++++++++++++++++++++ 2 files changed, 97 insertions(+) create mode 100755 tools/testing/selftests/drivers/net/uso.py diff --git a/tools/testing/selftests/drivers/net/Makefile b/tools/testing/s= elftests/drivers/net/Makefile index 7c7fa75b80c2..335c2ce4b9ab 100644 --- a/tools/testing/selftests/drivers/net/Makefile +++ b/tools/testing/selftests/drivers/net/Makefile @@ -21,6 +21,7 @@ TEST_PROGS :=3D \ ring_reconfig.py \ shaper.py \ stats.py \ + uso.py \ xdp.py \ # end of TEST_PROGS =20 diff --git a/tools/testing/selftests/drivers/net/uso.py b/tools/testing/sel= ftests/drivers/net/uso.py new file mode 100755 index 000000000000..2ddeae99b4d6 --- /dev/null +++ b/tools/testing/selftests/drivers/net/uso.py @@ -0,0 +1,96 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: GPL-2.0 + +"""Test USO + +Sends large UDP datagrams with UDP_SEGMENT and verifies that the peer +receives the correct number of individual segments with correct sizes. +""" +import socket +import time + +from lib.py import ksft_run, ksft_exit, KsftSkipEx +from lib.py import ksft_ge +from lib.py import NetDrvEpEnv +from lib.py import defer, ethtool, ip, rand_port + +# python doesn't expose this constant, so we need to hardcode it to enable= UDP +# segmentation for large payloads +UDP_SEGMENT =3D 103 + + +def _send_uso(cfg, ipver, mss, total_payload, port): + if ipver =3D=3D "4": + sock =3D socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + dst =3D (cfg.remote_addr_v["4"], port) + else: + sock =3D socket.socket(socket.AF_INET6, socket.SOCK_DGRAM) + dst =3D (cfg.remote_addr_v["6"], port) + + sock.setsockopt(socket.IPPROTO_UDP, UDP_SEGMENT, mss) + payload =3D bytes(range(256)) * ((total_payload // 256) + 1) + payload =3D payload[:total_payload] + sock.sendto(payload, dst) + sock.close() + return payload + + +def _get_rx_packets(cfg): + stats =3D ip(f"-s link show dev {cfg.remote_ifname}", + json=3DTrue, host=3Dcfg.remote)[0] + return stats['stats64']['rx']['packets'] + + +def _test_uso(cfg, ipver, mss, total_payload): + cfg.require_ipver(ipver) + + try: + ethtool(f"-K {cfg.ifname} tx-udp-segmentation on") + except Exception as exc: + raise KsftSkipEx( + "Device does not support tx-udp-segmentation") from exc + defer(ethtool, f"-K {cfg.ifname} tx-udp-segmentation off") + + expected_segs =3D (total_payload + mss - 1) // mss + + rx_before =3D _get_rx_packets(cfg) + + port =3D rand_port(stype=3Dsocket.SOCK_DGRAM) + _send_uso(cfg, ipver, mss, total_payload, port) + + time.sleep(0.5) + + rx_after =3D _get_rx_packets(cfg) + rx_delta =3D rx_after - rx_before + + ksft_ge(rx_delta, expected_segs, + comment=3Df"Expected >=3D {expected_segs} rx packets, got {rx_= delta}") + + +def test_uso_v4(cfg): + """USO IPv4: 11 segments (10 full + 1 partial).""" + _test_uso(cfg, "4", 1400, 1400 * 10 + 500) + + +def test_uso_v6(cfg): + """USO IPv6: 11 segments (10 full + 1 partial).""" + _test_uso(cfg, "6", 1400, 1400 * 10 + 500) + + +def test_uso_v4_exact(cfg): + """USO IPv4: exact multiple of MSS (5 full segments).""" + _test_uso(cfg, "4", 1400, 1400 * 5) + + +def main() -> None: + """Run USO tests.""" + with NetDrvEpEnv(__file__) as cfg: + ksft_run([test_uso_v4, + test_uso_v6, + test_uso_v4_exact], + args=3D(cfg, )) + ksft_exit() + + +if __name__ =3D=3D "__main__": + main() --=20 2.52.0