From nobody Sat Apr 4 07:49:32 2026 Received: from mail-pj1-f52.google.com (mail-pj1-f52.google.com [209.85.216.52]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D9EF03C1417 for ; Fri, 20 Mar 2026 14:41:52 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.52 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774017714; cv=none; b=dfdRVSg9e4HgdsC75k1KmciKDc88lU0NEu1QfvkNRKmveCr+zeTt22hLpvTGgZ7qNkUd/pmdtSpsaSjQuYCd4Pi0gdazABn5urku1/yCfj+bJVSjSjzVm4tfChc4vJND3GY9awYeqnVXG7yfFk+C642FnCSGp3kWFFV7lgVpTMQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774017714; c=relaxed/simple; bh=89osrXGFcyoMNdsGsSYJRS7HmUWWP8RNcJMZ4Irlins=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=FIEux8bG3/oOYZgkweKXf/icr1HP4azZgEHTpyLpUZnw2DIS9UwPo/uUj9eWNrbgY1JpZsQmYig6jsnhEqemZvnLGq+TLcJEWIGO95AWurBtRq1MRULrXjulXzI71OYC/muJQwNxLhr7FjH3A9vpcddxXuw1fp/9VHVq5IDXwGc= 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=Lm8sE7OG; arc=none smtp.client-ip=209.85.216.52 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=dama.to Authentication-Results: smtp.subspace.kernel.org; spf=none smtp.mailfrom=dama.to Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=dama-to.20230601.gappssmtp.com header.i=@dama-to.20230601.gappssmtp.com header.b="Lm8sE7OG" Received: by mail-pj1-f52.google.com with SMTP id 98e67ed59e1d1-35b98def50bso1350610a91.0 for ; Fri, 20 Mar 2026 07:41:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dama-to.20230601.gappssmtp.com; s=20230601; t=1774017712; x=1774622512; 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=Lm8sE7OGbocoDFV7Qr9a1YCPAiGWzFngthqaFsYayrlztFFYH8vcExxV5ZRHt/ox5U BpzMcwIZrTieMK1/FSh6332VrK/kg+CDdsUcj1TOd2k7ik9PSu5KJlOWEJ0R9xLB2IwK iBE3wdOLipV4nPnuzxHlKPjBsHMjAs2vxn6PPP+pXxzzdN1KaBcScpvCNrsCQXzjCyTG zv6NS/MKhPPoj6KwS4wlwFQLh8YGqAn6gvPUQFjtFxBECMAqJcllhPelqWTnd0wg+YM5 9J/uiAkkUeNBqnylNd/s+x/aV7ywLxOxBaEicM+qQEUlXXyiie7IRCUNxWrp3P3y7WX1 NCpQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774017712; x=1774622512; 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=sMsEhZodXvXApSx249WRCJE0fVSi9K1wZeWmAVEbnKyKgXmzv245T9PTGLr775GkiK Jd5V7OL8TthULBAZchQqx6gOaq71bHT0I7QAChyAPUe/kZdkZRto6ZUWUYVkJp637p17 1CB1P/BjLcNls8Uff1z01RmTMciEqjwAdtu1Eq1rqKLnkhsZ5+mcgyxjEDViomR4MLoQ HDHV9MBIvvs3o8NlUhEyCXiUk6A46Z1sKsfaZe6mBYsnNpKNOhe6NN7X4QjsjvHnNS1b +YsniO9yo8D6eXsOuKPrgzmVRh3mQkm814YSLoPlIxM6BuJQ2Rz/3o9YsZyXPk626QJ9 58sg== X-Forwarded-Encrypted: i=1; AJvYcCUSlqDk2OPk/6qcVTGs4GWu2Ji7gubPq4i08FIC2xw55SscugWLc42GI03A0e2TiTM52PPOw2ZIizUDTaQ=@vger.kernel.org X-Gm-Message-State: AOJu0Yz6lgIpi1e+Evaqn1qWbveovTeMZZEGO7aoCo/1bpnVshHOsKzi ipEJobK5tLTSksMmcYK951A85NPSuqLeSZbzpAjcMDiGCfsEofWnYtV2J0TI7plOpSOAy18TLXj 438+ykns= X-Gm-Gg: ATEYQzyhA4Ac8xPtXq78pIE9h05w46eX7lv88ms3LYyhXICD8csZCQMEd/7j2OaSght dYT+UK3yLvOGCFPUxrQzQTikaelE2ZJ1xy/1bBrHjeZNkt1eRl+pFI/AHmGC8K90JjpOpTHVpsB PaYg4soNgkS2ggktlx3+khRnT+izBHALtZOm2+kAYJhXaxcmwlHV/ObwDxuQUUq4zv86Lu1g0eC HWVketx/1cinz8LfrH3xXBXUDT6H0pxIQ8pviAHi522dMjMIx79+7SDU/BgdGNeqGk0wUuuZei5 KARUuNkXosApSJOuFbpSCzYPh6ck/dY9mDD6/GDWOsC+J3W50yrE/KbHmgSmFBTnzafZng4GTyl cgckrcM+la3296MdzN1iFgJ9f3KL1Byh8iMO6xOEe6UM3tBJ+IgWycd5wT6qWfL6fKAIqIr7W7r UlrLI= X-Received: by 2002:a17:902:e850:b0:2ae:7fbd:3dcd with SMTP id d9443c01a7336-2b0827e30f8mr31687945ad.52.1774017712230; Fri, 20 Mar 2026 07:41:52 -0700 (PDT) Received: from localhost ([2a03:2880:2ff:7::]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2b083516194sm24208835ad.4.2026.03.20.07.41.51 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 20 Mar 2026 07:41:51 -0700 (PDT) From: Joe Damato To: netdev@vger.kernel.org, "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman Cc: andrew+netdev@lunn.ch, michael.chan@broadcom.com, pavan.chebbi@broadcom.com, linux-kernel@vger.kernel.org, leon@kernel.org, Joe Damato Subject: [net-next v4 01/12] net: tso: Introduce tso_dma_map Date: Fri, 20 Mar 2026 07:41:22 -0700 Message-ID: <20260320144141.260246-2-joe@dama.to> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260320144141.260246-1-joe@dama.to> References: <20260320144141.260246-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 Sat Apr 4 07:49:32 2026 Received: from mail-pj1-f43.google.com (mail-pj1-f43.google.com [209.85.216.43]) (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 0C9F73C279A for ; Fri, 20 Mar 2026 14:41:54 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.43 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774017716; cv=none; b=Xq3WBqtQALTf7qMy1KkJW8+N1NcQEEcza2JdHTQwwK2SDAaX/7CF4Iow8Y+IOUjbKor5AkF6p6RJsTGpxjlISBlXYS15uKPPW+UQ2XQxr0gswB/7PfsjIa2MxokhxRvzA4EBDvhelLqwul4GvDxzfNOsHfSY/mzbynVahCggxMg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774017716; c=relaxed/simple; bh=ORkpzv7iiCxiXOhQaUQdLjmDGsPudQzXaVUYF9lrn6U=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=eZI0CmygKaLjBJAgiik9fECoG1q/RRhvmayYn7Z11THTS+Q3zVZo9BlA2zV2YxyPlCwE3myJZ8jSTYJnc0bOh6vOBHSEEJzASV0yyQqGhbExAs6OebDUdbDdPa5EaztglReVYzwwxC5R5zRp8BcBIGB4fuJprH6+jyXIbiLa0/c= 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=dlSEES2t; arc=none smtp.client-ip=209.85.216.43 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="dlSEES2t" Received: by mail-pj1-f43.google.com with SMTP id 98e67ed59e1d1-35bb7afdc38so1285155a91.1 for ; Fri, 20 Mar 2026 07:41:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dama-to.20230601.gappssmtp.com; s=20230601; t=1774017714; x=1774622514; 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=dlSEES2tzNwJVIPwEQ9qR+FT1ZnrB04wx9XhQO3/p6hPxU92b+lMkEIIh31WClp40p Kz6t6ZRE2WLMimvRIG5raiaacfRpLLc0So40naAXp0IK3pBVBm/FvP3OLJIgaequ+p/o lqKHm3wYAMxjILv/mdUX3SZQMPZmI1tkYFS6aGnH4dZhXP818qgD1bwfIp7fjNi5cCJJ 7pxQLyO/r6vHZQp3PIKukujalRvveT5fCJwh9kGyICgSq6XOGKR8Y6jiev5zXgM6xOge vEDmA1fkpOTfN7dg1mMNTbcdMeGZzVp8EOdWR9jwlxu0fqrdzOd7FyWPlrjZ2oey7/o9 JY/A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774017714; x=1774622514; 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=LSjDuOirjGohdsqIrcfNb8IIRC/Yp7nUPka0GoFRz/Zg89eyKQ8IpcEcm3CSEa7ofO hKhYrCT3SF8paQMOkx6aqV9h2VM/H9VJwCXFPNFa+EDbylH0K4ELhdxN+94ZfvCxzXyl DpeLvf8qu2rjdJ6VouJPQUte7fl2UJ4nsjGSEwADq7BlKGJZ/VJPyHpxnaecg/qspqFu zcIZxRNq/8/cCvGIIWGTN1FXRjriihayzXs6va0ofneCjbavy6078dMacon0KNp7eSJc 01lmApvYcHEg/FQB6x+lKFk1KYqSqz0NA0uQ17rIN7PHMV3KHWhDHHmPEGAFfBJ+yDnP 7ntg== X-Forwarded-Encrypted: i=1; AJvYcCW9mcH8H+0fRTW+AhwHyQoH/I3PmfWH8Cyccm5s39smSPo//7Ups7EbDiXptPec1emT8RD72FYOc+tirtk=@vger.kernel.org X-Gm-Message-State: AOJu0YxdicU5JrgQwnSZots5zBhAqwfzh44KTdPnD8uEUcjuczZ3d02+ ZR5BMZvKcUGxtwkOpH+NzQMwTo+dg1WQp6Bh8qtS2Syw9d5sxkz3cCeVTczEHUqi+bk= X-Gm-Gg: ATEYQzxy+P3YxOHBJx32gqUyGOa87s5OHKEFw5n/rQ+vFgx9ufxMAS1YsxRxjZc/5VT RmdMVEYSsiLy6wtfmZPVVaGUab38K00zz5MW/MBkfIeDuYClxZ9yNWm498dXuWMLNMrexKVAORI vJbAS4roYmz5gtiayFqBreehPYIrbf3SUbbeBVy/FZmmy63lGbbo2kArJh/iniIbVLEkJOBqOxe 4O1hXa8B5Fn+v1hexO3AS0RS1OQSZBzGHFnVkPF1h2+MNAs+1EGLgAKD0nS0ScZTK743fAXWmzq UeF3hoDxs9wzR/G6EqvtZNnmNBZESjQtMDsviQc8AGjp58xFp0g4Yt144d079yhMHcGYlN6OTEf YYutQ1Pm64iPDKOvZF2nClXv0RySoo+JDvMX6UF7x3loSUHZc0637z9GH6SbclBxxvQ8rExtvuW EFgkA= X-Received: by 2002:a17:90b:2c90:b0:35b:a53a:7d0c with SMTP id 98e67ed59e1d1-35bd2cea8a0mr2349103a91.23.1774017714330; Fri, 20 Mar 2026 07:41:54 -0700 (PDT) Received: from localhost ([2a03:2880:2ff:7::]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-35bc5ff6789sm5799911a91.1.2026.03.20.07.41.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 20 Mar 2026 07:41:53 -0700 (PDT) From: Joe Damato To: netdev@vger.kernel.org, "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman Cc: andrew+netdev@lunn.ch, michael.chan@broadcom.com, pavan.chebbi@broadcom.com, linux-kernel@vger.kernel.org, leon@kernel.org, Joe Damato Subject: [net-next v4 02/12] net: tso: Add tso_dma_map helpers Date: Fri, 20 Mar 2026 07:41:23 -0700 Message-ID: <20260320144141.260246-3-joe@dama.to> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260320144141.260246-1-joe@dama.to> References: <20260320144141.260246-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 Sat Apr 4 07:49:32 2026 Received: from mail-pj1-f46.google.com (mail-pj1-f46.google.com [209.85.216.46]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id BCB5E3C65ED for ; Fri, 20 Mar 2026 14:41:56 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.46 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774017718; cv=none; b=B0qhsb49HaQT9NaCIqKDazKRc0RjFC2QAcF0ka62iG94u0jMsdKUkHFO5uYkBgpuFx9zmOPEf4nbwM25nS2IiyClb7y3acxN/9qJqNJwXdA1hvOyoC4FbRBufcxOO1bVq4zE9tvAkZU8wVSBdktPw/ApVxliVAMT++u7oE0asaY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774017718; c=relaxed/simple; bh=gslBSKZShQvzxVkH6sGFPpyp9FY7xq0VAK5AjMnweyE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=HmgVw3phsMfoV4/APOT8fVQOP7yq6/xVBCjmBJxGwJ9uOaaq3Me1IU9itEw0sWrqwQeGZl05lzUZAehHJK1jDTxkIMZX8KjHg1XKDh7sfuO59YVGHcLcxllLAcVvCzVf0LySxmod6LetiLML5omDD0VjTwWdqXs9vN30ZIE65dU= 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=zT5IGejI; arc=none smtp.client-ip=209.85.216.46 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=dama.to Authentication-Results: smtp.subspace.kernel.org; spf=none smtp.mailfrom=dama.to Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=dama-to.20230601.gappssmtp.com header.i=@dama-to.20230601.gappssmtp.com header.b="zT5IGejI" Received: by mail-pj1-f46.google.com with SMTP id 98e67ed59e1d1-35a1f549e7eso425272a91.0 for ; Fri, 20 Mar 2026 07:41:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dama-to.20230601.gappssmtp.com; s=20230601; t=1774017716; x=1774622516; 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=/uAdY+e8gggzhdpu+gz9irB9nQPMWzWHkt4c/tYpJoA=; b=zT5IGejIHbV0yYLpKjp3nRqerevCz0auN/yEDyUCxR0BDGmFd1Epzlr/nJLIssbYeL EZ6d+mhnwoG7pntHONsnVe+5kREDturZeItZyUirGZF476Wk6VA9n0rNPI6heGoErKsq qnf0x2vwmGbtCshBWNqf/aKGIsDYhZLu2BY9U+sPb42TRo+wf6Fx5VayeKy937LGJh+x xiQYs47PrQ6rvSOFM9io1IUah7SvDUxMa3W+cbi69MI34v3QZszwvZh4k8ACHUYGUY0A qh+JkTde3txXJbQC1PU2PpvUyrMi9XXV5TEH9I92rAgf03eWNweffdVsbdMMbQ7zsyb6 iYfg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774017716; x=1774622516; 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=/uAdY+e8gggzhdpu+gz9irB9nQPMWzWHkt4c/tYpJoA=; b=RC21poggteN9WF0auNMlGx/Hmx+xDsJMgwYVd/odxEpMxqgyibI9x4eVG1/xrpAtUj KVHc6PvAwpeWa2cxOOuvB45uKZlIqUzSQjoXFBcLP0oeVmsWGglSqJRDmxt+Lnh9ANkn ugscIlS9PP4mN85DevHiMesnhXpT+GuU0R5BirO4kxBJ3KklztKULyzMeYxfxAGBEEL6 2sGahVMcgv9jGa5JxvnwL5mXWJXTzMzv/cTpV7AbnfXd/LnLgdUPElKsTFO8dcYVVNpf uoxCFyIHxBYQTby9Q8GI5CM905yoqv5ruyV/8ZIYa1zuFbd6w4SLdLhVRiqLUlMB1BoB LpJA== X-Forwarded-Encrypted: i=1; AJvYcCUZD1KjPe7sOBEeQXzFxx7RGdnP4GkbLmoXko54iyJWpeG79PwwQhO5EvFD28C56jmEFY4fv3Tcv+q3gSI=@vger.kernel.org X-Gm-Message-State: AOJu0Yy50nqRA/9a37bH4fSr4lBzUwJrMBJm0++0RSunaBzOvx0OZVCE fIjTMBRqAtEZnRMuy5oDbXH5SycU6iagxxqV3B0Fz+GDbTpNIRi9vWYTVTRfN2yNaqQ= X-Gm-Gg: ATEYQzyod0e0X6MHIe6Qn8OhQniQlP92xPnptF0D53OFn3OGHjjL+EYThGy7b2p4Qg1 2UCN/o7NzGeFePyVLj95jn6Yl11zgbP7+kFndjiPkuGdbORbi+hJdxreQ7O+hVRj4GaZctfNv8P 2XA7NwU0DZlQKIB8xTpmNPEYf4k2z9GHFO1PAslZw9mpiffKQ2E/qtXttJp5XQF4hSg0NEANNCJ m586ujKv12knLAFetGTL4MehxEKf7QjpujvYPmOdg949CVn7B4nYJidWNQQ+vm6909gMbtBtVSv J/bCuWOREr1T2S3RdFZy0CjkdKCdrtJ1X9DN141FOsm8dpi9T2IlThPn+UOo0cIBAJ9ffBC487k cZWty8y8nJ0gpg/RxpBOXZLX5r0kAFVm2SzbDLdyoD2kMU9DXzF92QOcLErXIPn5sWS5A/bXNG+ V/ork= X-Received: by 2002:a17:90b:5107:b0:34e:63c1:4a08 with SMTP id 98e67ed59e1d1-35bd2c98e30mr2359076a91.20.1774017716125; Fri, 20 Mar 2026 07:41:56 -0700 (PDT) Received: from localhost ([2a03:2880:2ff:1::]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-35bc610db9asm5592015a91.15.2026.03.20.07.41.55 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 20 Mar 2026 07:41:55 -0700 (PDT) From: Joe Damato To: netdev@vger.kernel.org, Michael Chan , Pavan Chebbi , Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni Cc: horms@kernel.org, linux-kernel@vger.kernel.org, leon@kernel.org, Joe Damato Subject: [net-next v4 03/12] net: bnxt: Export bnxt_xmit_get_cfa_action Date: Fri, 20 Mar 2026 07:41:24 -0700 Message-ID: <20260320144141.260246-4-joe@dama.to> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260320144141.260246-1-joe@dama.to> References: <20260320144141.260246-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 c982aac714d1..c9206977fd54 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c @@ -447,7 +447,7 @@ const u16 bnxt_lhint_arr[] =3D { TX_BD_FLAGS_LHINT_2048_AND_LARGER, }; =20 -static u16 bnxt_xmit_get_cfa_action(struct sk_buff *skb) +u16 bnxt_xmit_get_cfa_action(struct sk_buff *skb) { struct metadata_dst *md_dst =3D skb_metadata_dst(skb); =20 diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.h b/drivers/net/ethern= et/broadcom/bnxt/bnxt.h index 90fa3e93c8d6..8147f31967b5 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.h +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.h @@ -2950,6 +2950,7 @@ unsigned int bnxt_get_avail_cp_rings_for_en(struct bn= xt *bp); int bnxt_reserve_rings(struct bnxt *bp, bool irq_re_init); void bnxt_tx_disable(struct bnxt *bp); void bnxt_tx_enable(struct bnxt *bp); +u16 bnxt_xmit_get_cfa_action(struct sk_buff *skb); void bnxt_sched_reset_txr(struct bnxt *bp, struct bnxt_tx_ring_info *txr, u16 curr); void bnxt_report_link(struct bnxt *bp); --=20 2.52.0 From nobody Sat Apr 4 07:49:32 2026 Received: from mail-pl1-f177.google.com (mail-pl1-f177.google.com [209.85.214.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 71FDE3C5559 for ; Fri, 20 Mar 2026 14:41:58 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.177 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774017719; cv=none; b=q7UYixf0NZsphuSFFnaD2T7ViqHJmfARDmCk+6pgMPUYivPATCM7oCce5NiZ9oe58IK93KSKKfZXu4b6KkaFbdJWr2chVyd3LYhdl5BiBFZZfzsYp8fxH4gS3eRWt5HTDjM1jTHephbaw/5RvlFxVI/DsugT2/iI9aYKKelALDw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774017719; c=relaxed/simple; bh=godTSr6bdicrLv4RTlBef/WCwR5oxIRNe7AE0gxUCjM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=qWHj3gqfvgdcxoRzAsS0Nqq1JsXwWr2LFPhe0/7dq1YdFZFJhNFY2yCRSdybOa7iB+o4S8+1KHDqsdpCVk+WY/qzq7SEDpGMWkTx2aNNXJXvGaCbhyu9gwPkvYj/uqFMQDHV900XNC874vW6lV2+F8VEfuOUEbbwFp7FB25sL/A= 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=lsTw072U; arc=none smtp.client-ip=209.85.214.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="lsTw072U" Received: by mail-pl1-f177.google.com with SMTP id d9443c01a7336-2b04b4974abso19246995ad.1 for ; Fri, 20 Mar 2026 07:41:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dama-to.20230601.gappssmtp.com; s=20230601; t=1774017718; x=1774622518; 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=cQm62Y6+YSHQLskIUl4TXD+Tc/f2ddlM4l+yzD6p7gA=; b=lsTw072UVGrFIlFgMVdG4e3ip4GrbPp5vFAkqQ2nRwwVvb11lq99p1GpQMiVHbzC1m E2qv+JLtkwuaFiVME+b8pStULkSwKRJMjPDXf51gvz7LNrtXs9/VamnBdonapjWwkSFe ROtzPqkc3qI7u2txkBaFt0P5lNEKxKHS30J6njPkPI7tSYAaknctNa5TUcvK+/an85s4 75OLDMr69yQ/mGYay3To1mgqZgGGFOPYCceoe4FD5MqnBP3UYcxnC3Mhw3x/DIMoFcGA ZCpUgRvZZb8YUeRIBUPZxmKpV3lKNJNsuu+epIFa8xihPWBG+/eM5p+yHcAI24Bk7Zll 6y+Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774017718; x=1774622518; 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=cQm62Y6+YSHQLskIUl4TXD+Tc/f2ddlM4l+yzD6p7gA=; b=kBIQ19/Fqbu9kmIejM8l2CKOEaH52mZsNtp+Ro5M4Vwco6FEPviZnjNMZcogrDIbZE eogsmacCGr45PekRFSbMvNSiLECiBaMVzNBbhVS9bMq9sv4XWiscAvAAqF70YxgxLoaT 6gC/jdZikJ+h6KaeUyQL78/jS6oowu2QPGfgr74VYqBM4UjTTGGkRDbBf+fjaD1w5Kof Y+Tyu3YXcd1PEY9kZ5q2caJKcrpwVaxmN9rGNGJzTUSHVQNn82AHlagVYGRy0LMJUile UCQ/IPfDCf3I6C5r3KbUI7Nsc0nX6SUoDklxWWx2KIEFkJwaWx2EkpnZxkC+FZUplz47 qXog== X-Forwarded-Encrypted: i=1; AJvYcCWm9JXyWMy3UvMPYYdvYId+a1Zpr6NefyJEF1b3LlFKVMxhgoycHDCIGQrD59pH/uJoAC2lzaXqvcodaZY=@vger.kernel.org X-Gm-Message-State: AOJu0YyUtoQetJd4FRNMQGZrhR3jpZ62k0sRmvupXjLv9UlOLPvlnxc+ sEYtWl5l9PQP8sVHbZT5ZNqDtuWUfpaWjXOAmtbeUlHb0yM5mllVJ+4wM5h60W9JVxo= X-Gm-Gg: ATEYQzwFszXoJkel+d7rCDLnrRE4kaXeY44fylZ2+6JkwXjTJU2fngLQCBIWL8LMfDR KtuXYLJIhsIQRq4cNOBhM0taMuoL3kr7sWz08JmJFI0ZAQwBgl2muR925dfB5pfeH+TJeCeJnB6 E4wr4dU6bhQzKFKY4QklOuUllOoPePKaqDcgRv+gVRanVDKvV+bLkSBZT1hiERteL/fqgc5uom3 PsRGXKgBmjxVRY+I4Q8xxx6FCulU+0okLGPe8IP/lpHQu1wQB+dm6m0gCGnpghNjGG1+yakTDHr OUpybuFpUkDPt4bQ3BsLUkC/PLAixggt9CTWUr/Qnknj5mc6OYvJfCV1GuYVbSObU9WISLQ55ku Ga2MX67vSzs+EqXSOg8IpcakLnbv6Bt7PjwRyG8bGtZKd7JmCcDxKR/mg4A35CD6pHfJ6PdKChH u0pghk X-Received: by 2002:a17:903:2f87:b0:2b0:7ca0:3fe4 with SMTP id d9443c01a7336-2b0827dd702mr30026435ad.43.1774017717849; Fri, 20 Mar 2026 07:41:57 -0700 (PDT) Received: from localhost ([2a03:2880:2ff:73::]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2b083656df5sm34525935ad.44.2026.03.20.07.41.57 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 20 Mar 2026 07:41:57 -0700 (PDT) From: Joe Damato To: netdev@vger.kernel.org, Michael Chan , Pavan Chebbi , Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni Cc: horms@kernel.org, linux-kernel@vger.kernel.org, leon@kernel.org, Joe Damato Subject: [net-next v4 04/12] net: bnxt: Add a helper for tx_bd_ext Date: Fri, 20 Mar 2026 07:41:25 -0700 Message-ID: <20260320144141.260246-5-joe@dama.to> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260320144141.260246-1-joe@dama.to> References: <20260320144141.260246-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 c9206977fd54..d12e4fcd5063 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c @@ -663,10 +663,9 @@ static netdev_tx_t bnxt_start_xmit(struct sk_buff *skb= , struct net_device *dev) txbd->tx_bd_opaque =3D SET_TX_OPAQUE(bp, txr, prod, 2 + last_frag); =20 prod =3D NEXT_TX(prod); - txbd1 =3D (struct tx_bd_ext *) - &txr->tx_desc_ring[TX_RING(bp, prod)][TX_IDX(prod)]; + txbd1 =3D bnxt_init_ext_bd(bp, txr, prod, lflags, vlan_tag_flags, + cfa_action); =20 - txbd1->tx_bd_hsize_lflags =3D lflags; if (skb_is_gso(skb)) { bool udp_gso =3D !!(skb_shinfo(skb)->gso_type & SKB_GSO_UDP_L4); u32 hdr_len; @@ -693,7 +692,6 @@ static netdev_tx_t bnxt_start_xmit(struct sk_buff *skb,= struct net_device *dev) } else if (skb->ip_summed =3D=3D CHECKSUM_PARTIAL) { txbd1->tx_bd_hsize_lflags |=3D cpu_to_le32(TX_BD_FLAGS_TCP_UDP_CHKSUM); - txbd1->tx_bd_mss =3D 0; } =20 length >>=3D 9; @@ -706,9 +704,6 @@ static netdev_tx_t bnxt_start_xmit(struct sk_buff *skb,= struct net_device *dev) flags |=3D bnxt_lhint_arr[length]; txbd->tx_bd_len_flags_type =3D cpu_to_le32(flags); =20 - txbd1->tx_bd_cfa_meta =3D cpu_to_le32(vlan_tag_flags); - txbd1->tx_bd_cfa_action =3D - cpu_to_le32(cfa_action << TX_BD_CFA_ACTION_SHIFT); txbd0 =3D txbd; for (i =3D 0; i < last_frag; i++) { frag =3D &skb_shinfo(skb)->frags[i]; diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.h b/drivers/net/ethern= et/broadcom/bnxt/bnxt.h index 8147f31967b5..a822bbb71146 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.h +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.h @@ -2834,6 +2834,24 @@ static inline u32 bnxt_tx_avail(struct bnxt *bp, return bp->tx_ring_size - (used & bp->tx_ring_mask); } =20 +static inline struct tx_bd_ext * +bnxt_init_ext_bd(struct bnxt *bp, struct bnxt_tx_ring_info *txr, + u16 prod, __le32 lflags, u32 vlan_tag_flags, + u32 cfa_action) +{ + struct tx_bd_ext *txbd1; + + txbd1 =3D (struct tx_bd_ext *) + &txr->tx_desc_ring[TX_RING(bp, prod)][TX_IDX(prod)]; + txbd1->tx_bd_hsize_lflags =3D lflags; + txbd1->tx_bd_mss =3D 0; + txbd1->tx_bd_cfa_meta =3D cpu_to_le32(vlan_tag_flags); + txbd1->tx_bd_cfa_action =3D + cpu_to_le32(cfa_action << TX_BD_CFA_ACTION_SHIFT); + + return txbd1; +} + static inline void bnxt_writeq(struct bnxt *bp, u64 val, volatile void __iomem *addr) { --=20 2.52.0 From nobody Sat Apr 4 07:49:32 2026 Received: from mail-pj1-f52.google.com (mail-pj1-f52.google.com [209.85.216.52]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 47CA93C872D for ; Fri, 20 Mar 2026 14:42:00 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.52 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774017721; cv=none; b=cC1meYaG4AHkh/NFxoYPlykSwJ7b8Mhxi3xvg0h4zjrcqbihs8arMVfxsiLH+LrKGjp2+KiSsUEtT7wkJRIx4sXNx0UaoX3eGfpQhUzCdVI6/v/jru2Hjhu625fvPhe0hDhV2NIX+5blYDixXESkvEpoC8lV4iW63ekbZxDf/ao= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774017721; c=relaxed/simple; bh=/xj4RkzD+6XcfT/WAnnGulmdWTK/JPmN4QtjonSYy/A=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=N5wnLBC9eEwY+ZUQxhn4rHGgDfgO+5MrRzQAaYr0YrLDyVAJ2xyZ8pt+ApG/I3NTea1/zHUFbIf90T5/5mdzVhxjc2bqJLvwmxjQw0axINAvshfJNB/AoMQLFM/c1KzIK3RsjaaJkQuD31FJLN8NCW9Al5fu6oBOSlAd2JRHGuc= 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=CFJ3le9G; arc=none smtp.client-ip=209.85.216.52 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=dama.to Authentication-Results: smtp.subspace.kernel.org; spf=none smtp.mailfrom=dama.to Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=dama-to.20230601.gappssmtp.com header.i=@dama-to.20230601.gappssmtp.com header.b="CFJ3le9G" Received: by mail-pj1-f52.google.com with SMTP id 98e67ed59e1d1-3567e2b4159so1404664a91.0 for ; Fri, 20 Mar 2026 07:42:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dama-to.20230601.gappssmtp.com; s=20230601; t=1774017720; x=1774622520; 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=S9WgVeDTvAClfK2RzPtOGPk95x1pLaQKgMuXVPEY3A4=; b=CFJ3le9GV3s3+UygehuWsXhCF5BBZRBQ8KIATg62Sii55UptYuHI7AYCQu/rOqx3ew ibB+SZkp13zrTpbgWLTgJ0q4QxA7s+gtB9J/jJh2dy7f1DC9qaAKDFZ4+DtwV0CMTzbJ RWfoAWfucxdZ4O+kVeZEvgty/3v8ksZpWL+p/wiBzxhecKlklOeTSSlxWgzq3oANQMNy irFVRaoIqJQ9bljHK6PH7jeY2xqGfP5/AkWny6nkJyrQAlRQ+z0U/yk5YuMFSKQsaIGd iWFw00ZksWIKszb6vE1W8HfUDRO3/XS9biZZLxOpJ5IV1U+8hgre1NB3OLyXQQSHXMkt 3H3g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774017720; x=1774622520; 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=S9WgVeDTvAClfK2RzPtOGPk95x1pLaQKgMuXVPEY3A4=; b=h3WPZoiw8b6pREwLL1puSGcQolyGpjB/j9NvEFw4H8PJtWj7VoASSTmrOUGRhnT8Zl JHLiJ/SbuYpLoDV+dhqITTc4Mapl7y6XcKR4dQIufz1OkaIWcR+o+q+WQXh1HOkHntCi nQAoni/QB0pN90+Qp4gpi66aC17DkHQ5w7Xxcy5ECqgej4NtqW5Krz/KmtgXmJsGpslV ERmPmc+UBwL3gkbrbC0VtsRavmJXmSyFsBl/BkCqRSZtU1SVNuINMG7Y+Xqw/lJo8Fby Zv1zFSbWYeulUUlFed845wNYwt9BHux1y7Ns01jqpa7zUBLn7B7PlXYli9YcrHRHTifX WlCQ== X-Forwarded-Encrypted: i=1; AJvYcCWCTcJz6VKTqnp6m3AVDPsJkQcKF9IuiRLOB1MhJ5viOLIpbqeZ/3e6xCOAg2xDWKqNEcwbi5Kc+qgBoP4=@vger.kernel.org X-Gm-Message-State: AOJu0YwgUAbzhNoYXKpq3qR4PGMwr3NLn0qrPl7KUEVsC8r0ybM5eTEa v1WpsNwoArESXy4M3vGo1uQmftXq9pNexFZ0iC0VVIWkPcxFZQj+hshb410W+4VNEKI= X-Gm-Gg: ATEYQzxOjXrM6jCRALKXI2PueSxEN9GnYp4zjB+hUwmU5Lgk6ExEvmcCyPOaBfEnsKf 9+ou+lC/h/Zjxf9esVM2m8YDLSOfF2ih1fLTnlYTej44pHfOu81WZ3z06ugLLf4PJzbcgyNR0zA luQhvGL7mW+vePdAwxB7ulOfyhXgRWieOa0etCRxZ31b5lZxnPH5S9H0ZpEHH+81irB7pfGZbVi x90J+2xq3UMjKScPwexD/YDdcKB/0vZLcgumA8BRo4txI36om9nZSMPdFzgN2L5RiRKv7sWKBqk L2pHJQzGbJM4DK2hS/R6F7ablOoV+jeIyWc2zKIvdusWV0tjjPagE5ceEphz8eodXjhhh29wA2D i3whH8PHbIoy0xBv7ECfGIqXYcfG8ldavdB2EO1dTNyWdlYIlYKcj3Tf9U5F0cqLZlobIvO9rF7 znkrI= X-Received: by 2002:a17:90b:3d83:b0:35b:a7be:ae6e with SMTP id 98e67ed59e1d1-35bd2d53a91mr2925330a91.33.1774017719588; Fri, 20 Mar 2026 07:41:59 -0700 (PDT) Received: from localhost ([2a03:2880:2ff:1::]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-c743a939af0sm1769216a12.16.2026.03.20.07.41.58 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 20 Mar 2026 07:41:59 -0700 (PDT) From: Joe Damato To: netdev@vger.kernel.org, Michael Chan , Pavan Chebbi , Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni Cc: horms@kernel.org, linux-kernel@vger.kernel.org, leon@kernel.org, Joe Damato Subject: [net-next v4 05/12] net: bnxt: Use dma_unmap_len for TX completion unmapping Date: Fri, 20 Mar 2026 07:41:26 -0700 Message-ID: <20260320144141.260246-6-joe@dama.to> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260320144141.260246-1-joe@dama.to> References: <20260320144141.260246-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 d12e4fcd5063..ea8081aeb5ae 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c @@ -656,6 +656,7 @@ static netdev_tx_t bnxt_start_xmit(struct sk_buff *skb,= struct net_device *dev) goto tx_free; =20 dma_unmap_addr_set(tx_buf, mapping, mapping); + dma_unmap_len_set(tx_buf, len, len); flags =3D (len << TX_BD_LEN_SHIFT) | TX_BD_TYPE_LONG_TX_BD | TX_BD_CNT(last_frag + 2); =20 @@ -720,6 +721,7 @@ static netdev_tx_t bnxt_start_xmit(struct sk_buff *skb,= struct net_device *dev) tx_buf =3D &txr->tx_buf_ring[RING_TX(bp, prod)]; netmem_dma_unmap_addr_set(skb_frag_netmem(frag), tx_buf, mapping, mapping); + dma_unmap_len_set(tx_buf, len, len); =20 txbd->tx_bd_haddr =3D cpu_to_le64(mapping); =20 @@ -809,7 +811,8 @@ static bool __bnxt_tx_int(struct bnxt *bp, struct bnxt_= tx_ring_info *txr, u16 hw_cons =3D txr->tx_hw_cons; unsigned int tx_bytes =3D 0; u16 cons =3D txr->tx_cons; - skb_frag_t *frag; + unsigned int dma_len; + dma_addr_t dma_addr; int tx_pkts =3D 0; bool rc =3D false; =20 @@ -844,19 +847,27 @@ static bool __bnxt_tx_int(struct bnxt *bp, struct bnx= t_tx_ring_info *txr, goto next_tx_int; } =20 - dma_unmap_single(&pdev->dev, dma_unmap_addr(tx_buf, mapping), - skb_headlen(skb), DMA_TO_DEVICE); + if (dma_unmap_len(tx_buf, len)) { + dma_addr =3D dma_unmap_addr(tx_buf, mapping); + dma_len =3D dma_unmap_len(tx_buf, len); + + dma_unmap_single(&pdev->dev, dma_addr, dma_len, + DMA_TO_DEVICE); + } + last =3D tx_buf->nr_frags; =20 for (j =3D 0; j < last; j++) { - frag =3D &skb_shinfo(skb)->frags[j]; cons =3D NEXT_TX(cons); tx_buf =3D &txr->tx_buf_ring[RING_TX(bp, cons)]; - netmem_dma_unmap_page_attrs(&pdev->dev, - dma_unmap_addr(tx_buf, - mapping), - skb_frag_size(frag), - DMA_TO_DEVICE, 0); + if (dma_unmap_len(tx_buf, len)) { + dma_addr =3D dma_unmap_addr(tx_buf, mapping); + dma_len =3D dma_unmap_len(tx_buf, len); + + netmem_dma_unmap_page_attrs(&pdev->dev, + dma_addr, dma_len, + DMA_TO_DEVICE, 0); + } } if (unlikely(is_ts_pkt)) { if (BNXT_CHIP_P5(bp)) { @@ -3400,6 +3411,8 @@ static void bnxt_free_one_tx_ring_skbs(struct bnxt *b= p, { int i, max_idx; struct pci_dev *pdev =3D bp->pdev; + unsigned int dma_len; + dma_addr_t dma_addr; =20 max_idx =3D bp->tx_nr_pages * TX_DESC_CNT; =20 @@ -3410,10 +3423,10 @@ static void bnxt_free_one_tx_ring_skbs(struct bnxt = *bp, =20 if (idx < bp->tx_nr_rings_xdp && tx_buf->action =3D=3D XDP_REDIRECT) { - dma_unmap_single(&pdev->dev, - dma_unmap_addr(tx_buf, mapping), - dma_unmap_len(tx_buf, len), - DMA_TO_DEVICE); + dma_addr =3D dma_unmap_addr(tx_buf, mapping); + dma_len =3D dma_unmap_len(tx_buf, len); + + dma_unmap_single(&pdev->dev, dma_addr, dma_len, DMA_TO_DEVICE); xdp_return_frame(tx_buf->xdpf); tx_buf->action =3D 0; tx_buf->xdpf =3D NULL; @@ -3435,23 +3448,27 @@ static void bnxt_free_one_tx_ring_skbs(struct bnxt = *bp, continue; } =20 - dma_unmap_single(&pdev->dev, - dma_unmap_addr(tx_buf, mapping), - skb_headlen(skb), - DMA_TO_DEVICE); + if (dma_unmap_len(tx_buf, len)) { + dma_addr =3D dma_unmap_addr(tx_buf, mapping); + dma_len =3D dma_unmap_len(tx_buf, len); + + dma_unmap_single(&pdev->dev, dma_addr, dma_len, DMA_TO_DEVICE); + } =20 last =3D tx_buf->nr_frags; i +=3D 2; for (j =3D 0; j < last; j++, i++) { int ring_idx =3D i & bp->tx_ring_mask; - skb_frag_t *frag =3D &skb_shinfo(skb)->frags[j]; =20 tx_buf =3D &txr->tx_buf_ring[ring_idx]; - netmem_dma_unmap_page_attrs(&pdev->dev, - dma_unmap_addr(tx_buf, - mapping), - skb_frag_size(frag), - DMA_TO_DEVICE, 0); + if (dma_unmap_len(tx_buf, len)) { + dma_addr =3D dma_unmap_addr(tx_buf, mapping); + dma_len =3D dma_unmap_len(tx_buf, len); + + netmem_dma_unmap_page_attrs(&pdev->dev, + dma_addr, dma_len, + DMA_TO_DEVICE, 0); + } } dev_kfree_skb(skb); } --=20 2.52.0 From nobody Sat Apr 4 07:49:32 2026 Received: from mail-pf1-f179.google.com (mail-pf1-f179.google.com [209.85.210.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 01FBF3C945D for ; Fri, 20 Mar 2026 14:42:01 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.179 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774017723; cv=none; b=PN2QQAUn6m3/QkjtIE1YWYoW+KB48VQABm04o/EaBgvZ2HgUejCuS+RC28g5KmlWMl4uMw+onzb4323qUSKgJWylInRM+SiBwgVe4kknXB2JLYg+IQ1eJXSVWZA3h5T0LDgl+nY+qASj4eL4LcXKa0qLVC4ysx4ShD7nP/NyhLo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774017723; c=relaxed/simple; bh=7Zu0Dz91B8pcyek/pNRIrZNMIcp1uoJ9XU9YtqJIP40=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Z8YG3I83omGYKSgv1Rqhe2laMVWUnolmR6iF7I0h+qEZ6XSgJ0kKKdV3XHa/ckxFHvpU+CHECgu7JEqocviu8hWm35pVTMSgWprfzc2ISTKbEub0eH/ztbjHyc+01FqldBn2Wn8GQ/sAcERHbfgbq7Y73jaU9r5znDeK60mklO4= 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=WFZC5c9I; arc=none smtp.client-ip=209.85.210.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="WFZC5c9I" Received: by mail-pf1-f179.google.com with SMTP id d2e1a72fcca58-824c9da9928so1969659b3a.3 for ; Fri, 20 Mar 2026 07:42:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dama-to.20230601.gappssmtp.com; s=20230601; t=1774017721; x=1774622521; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=SXOL9iubHrTOR9uFk5hJvutezBCpUTAEEHozBYZRA8g=; b=WFZC5c9IH0Y8WxULW0z10sbs8RMkQSKfw5A5HSeiE7ebA1EtYHFlkM88NjC80rKo5M 1Rbt8uZk7AhXMOCBEjVKrnsMN5113XHtKOIfQpvFfwIBRtyjISoPNlV2XClbzFWWOK3/ uLU7XaqN2RnQNOS/CK+2KycfR6VfoZU5RKWz7PHekdjLzY/rVVWPMBhL48wzQ5MTgrw4 EhFgLN/j+Knl9bjJIgo/z05jqOo6ESQ36YSNmNIVg/j4cOiEnv3S0vaTRpqJMgEd0/jS NNJSeY+x+Rzp4eaj6E4YrMadhNZuk8NBcgcPCs94YQPZERGkQ8A8X7pyIB5aGA9/IgQs JVOg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774017721; x=1774622521; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=SXOL9iubHrTOR9uFk5hJvutezBCpUTAEEHozBYZRA8g=; b=jUuAxg86LOKuVpGNAP0x7TrvLLLA5nxWgLyZr0CWtnJmUP5NAA5g4KxCG+ZAqGTvpd YqyAcr6fOwbCrxOLhuuDFXYqU4Y16CEJTkZqnjfuU8dqBOPn18nCpN5iH4yrJRXMxmDw UjVM0OVjZfhqZ92J/Ziz+MNf2ZSW836V6s7IuMMr4hL1qyY3ey8GUAeFrsAnppaw3BF+ RHFoMRTkMAfBdTE7rQa5O5iufq+LFAk0Sr/vSGPmpiOQVenSj7NledmCwZuSPpQUYOw+ lCQvvN7bqg/45Z55u9T3Npf7rNA9eJm35XvYCQGaOEdn2oBSyd506DysTYum5+FVZWai a8ig== X-Forwarded-Encrypted: i=1; AJvYcCWskNW9hzA0lAX0IzCv19y7DKWrkx7Gn6W0Wzyu0MF4PIsMS5IPfeAqgT71fng4h01A5b0mqLbmidJvw8E=@vger.kernel.org X-Gm-Message-State: AOJu0YyWGSwIs5T799mqXBsVcC4BXTMyZha0Knbl5i6Zg27jRpr7pR2q PPurKAcfyZFNuqG5Mi7EO85lPtKpwFJ200AOapcwUjVX8uMw6jh0DhQoaqOF3KRnaN8= X-Gm-Gg: ATEYQzwFxYX+wIJbiKVbLBsX7fVGTn+XekyNX9owXDrlEmUdeSgwBcoocAhqA2/H9gn UuspKsapbSRlTztzTA19YJbuNn4NA0LbvMklqROrWjR6uv+f9tcBNhAR8baVvYjfJynSZ2Kefkq aGNjFuxtizP6DiAj2RTop6XAYVa8RHZ6WPIERZO8a31AHlqcUsy81LO93wj4V9dGgS2RxbF0itg ccIBz76reKKZjMoa2t0KKuefLBsKdpNLmJzuVV78LlPgTPpZeFpPGZMxbKQmWjHW3w0LTgoB5yN ekAQn/mBRTWoOksEmlk3+7e20zLxsECwaZwboBGvF6kNRnySCS7gPhbtn4zw8FVtEOp5TlGkM/p 6qZmydvPNJwb91LWrWFohX4NWproJ2iSmxc+SDwYSbAY5kE6E2xWsbWrEwIgb6WeRfHPaAHyR9x wUtZI= X-Received: by 2002:a05:6a00:299b:b0:82a:f02:7355 with SMTP id d2e1a72fcca58-82a8c35c866mr2564897b3a.32.1774017721399; Fri, 20 Mar 2026 07:42:01 -0700 (PDT) Received: from localhost ([2a03:2880:2ff:4::]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-82b03aa9619sm2261657b3a.6.2026.03.20.07.42.00 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 20 Mar 2026 07:42:01 -0700 (PDT) From: Joe Damato To: netdev@vger.kernel.org, Michael Chan , Pavan Chebbi , Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni Cc: horms@kernel.org, linux-kernel@vger.kernel.org, leon@kernel.org, Joe Damato Subject: [net-next v4 06/12] net: bnxt: Add TX inline buffer infrastructure Date: Fri, 20 Mar 2026 07:41:27 -0700 Message-ID: <20260320144141.260246-7-joe@dama.to> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260320144141.260246-1-joe@dama.to> References: <20260320144141.260246-1-joe@dama.to> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add per-ring pre-allocated inline buffer fields (tx_inline_buf, tx_inline_dma, tx_inline_size) to bnxt_tx_ring_info and helpers to allocate and free them. A producer and consumer (tx_inline_prod, tx_inline_cons) are added to track which slot(s) of the inline buffer are in-use. The inline buffer will be used by the SW USO path for pre-allocated, pre-DMA-mapped per-segment header copies. In the future, this could be extended to support TX copybreak. Allocation helper is marked __maybe_unused in this commit because it will be wired in later. Suggested-by: Jakub Kicinski Signed-off-by: Joe Damato Reviewed-by: Pavan Chebbi --- rfcv2: - Added a producer and consumer to correctly track the in use header slo= ts. drivers/net/ethernet/broadcom/bnxt/bnxt.c | 35 +++++++++++++++++++++++ drivers/net/ethernet/broadcom/bnxt/bnxt.h | 6 ++++ 2 files changed, 41 insertions(+) diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethern= et/broadcom/bnxt/bnxt.c index ea8081aeb5ae..8929264a54b1 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c @@ -3983,6 +3983,39 @@ static int bnxt_alloc_rx_rings(struct bnxt *bp) return rc; } =20 +static void bnxt_free_tx_inline_buf(struct bnxt_tx_ring_info *txr, + struct pci_dev *pdev) +{ + if (!txr->tx_inline_buf) + return; + + dma_unmap_single(&pdev->dev, txr->tx_inline_dma, + txr->tx_inline_size, DMA_TO_DEVICE); + kfree(txr->tx_inline_buf); + txr->tx_inline_buf =3D NULL; + txr->tx_inline_size =3D 0; +} + +static int __maybe_unused bnxt_alloc_tx_inline_buf(struct bnxt_tx_ring_inf= o *txr, + struct pci_dev *pdev, + unsigned int size) +{ + txr->tx_inline_buf =3D kmalloc(size, GFP_KERNEL); + if (!txr->tx_inline_buf) + return -ENOMEM; + + txr->tx_inline_dma =3D dma_map_single(&pdev->dev, txr->tx_inline_buf, + size, DMA_TO_DEVICE); + if (dma_mapping_error(&pdev->dev, txr->tx_inline_dma)) { + kfree(txr->tx_inline_buf); + txr->tx_inline_buf =3D NULL; + return -ENOMEM; + } + txr->tx_inline_size =3D size; + + return 0; +} + static void bnxt_free_tx_rings(struct bnxt *bp) { int i; @@ -4001,6 +4034,8 @@ static void bnxt_free_tx_rings(struct bnxt *bp) txr->tx_push =3D NULL; } =20 + bnxt_free_tx_inline_buf(txr, pdev); + ring =3D &txr->tx_ring_struct; =20 bnxt_free_ring(bp, &ring->ring_mem); diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.h b/drivers/net/ethern= et/broadcom/bnxt/bnxt.h index a822bbb71146..d9543d6048d8 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.h +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.h @@ -994,6 +994,12 @@ struct bnxt_tx_ring_info { dma_addr_t tx_push_mapping; __le64 data_mapping; =20 + void *tx_inline_buf; + dma_addr_t tx_inline_dma; + unsigned int tx_inline_size; + u16 tx_inline_prod; + u16 tx_inline_cons; + #define BNXT_DEV_STATE_CLOSING 0x1 u32 dev_state; =20 --=20 2.52.0 From nobody Sat Apr 4 07:49:32 2026 Received: from mail-pg1-f175.google.com (mail-pg1-f175.google.com [209.85.215.175]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A92163CAE83 for ; Fri, 20 Mar 2026 14:42:04 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.175 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774017726; cv=none; b=kJibozJS9foZA5YwkjQUIZM/pSqcdvbuBibcn+f4ctaxOfmyP+qGTEiRPKtK1A7w6MxxlGhn90aFytJbovHW1JoFIsyHp7SSPWGgMoqcitpKFaRYfwLS5i0wUJigSi9JM4rUi0zcPXKHsy5nhOXAMoNaf3m+qpcbzd8oLWEYLXk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774017726; c=relaxed/simple; bh=e96EXxfLihKuO05dFmuztcwCzRpZVtLutKKCC6HBE8c=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Orkg6bH7zVHZNDOTNIMsFtPNmfIfPmsBgqHFEgsbMsqFXhLDbSRyEZCNXl7gnVoTA3XB6Vga7u94eB8V5pNbK5UVJ0F1O1jGBbS2rHNvjV/RiLNvoxBfQXdWyupb1hKOW9O1EeB8gST0VOOu6RzU9skKCcFHFUR//StHRYD14Fw= 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=KEuw/nq0; arc=none smtp.client-ip=209.85.215.175 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=dama.to Authentication-Results: smtp.subspace.kernel.org; spf=none smtp.mailfrom=dama.to Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=dama-to.20230601.gappssmtp.com header.i=@dama-to.20230601.gappssmtp.com header.b="KEuw/nq0" Received: by mail-pg1-f175.google.com with SMTP id 41be03b00d2f7-c742824e1d3so739496a12.1 for ; Fri, 20 Mar 2026 07:42:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dama-to.20230601.gappssmtp.com; s=20230601; t=1774017724; x=1774622524; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=LU0lxc3eKqf92oDepH/UmC/x9vwxuAnsiBKDevCcH+I=; b=KEuw/nq0UxFJEN94nRSwwQWNasWOGQAm8/mjC4bDR1u6SRbMirnO1JZXZZHGoIv5hT Lw2+fXOnNjgUEo9LCUYC0KY5XVYP5ZrqcmLZ6n7tsX/UcFO9t2eDzVpCxVcCHWAZCywv U5AMgk0thL5wvEKRF94+W2s8DPvywhTPPMXh5oH0cIl7llC6pJvcmDCc7aVMvuaLfU2U HsRaqls+Zf8aR8T/bmzxhQcozo61CvAFG1E8l/I76GofLD0m6OPFpKPEOfxe/nq55Lg+ 7eJhJIsp9nQepQNkIaNDIEsyjQ3wXfSZbFDoG2/Qn6vYJ2IMaJUx0VagcsKEDR1T/BjX 5jQg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774017724; x=1774622524; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=LU0lxc3eKqf92oDepH/UmC/x9vwxuAnsiBKDevCcH+I=; b=GeBL7nW/iqdVmwLa3YhCbGq09XDF+uIUnfc2U3LGB0JK9PVAErl9vq7u59svKlEccm mDrPlOf6o/RBsCTMiYIOUm6SMvJsraojXWbAe0qfY4i5sAhjE6yyuJ2zvH63Dgb5Xain /Ed2Lu8mZIUMG78Og0+DNUBunoN7XAUHxN7iem3s5DCVIA2g5HdAazOeF7nFMvlxpjhG i2o75/jtJ1VuJuUHelhlUZ3nm1m7pFdOTe2T04AbGEXgwzJXjdrlEyDZmQCgADpzUUpJ sgjgxUN6hVM23WetsiGEWAm8bZHnH7t5ubi0YpzZPoPodyu9xXcp0Yl4IlDMY9CkZmVr U4DA== X-Forwarded-Encrypted: i=1; AJvYcCU953WuB4XcCO3x9wEDhu+0ug+MnFleJyUQHeCzGTKbhdpPPqUVnFpBSEQfWMrVe7GGiHHFICHReK9GvKQ=@vger.kernel.org X-Gm-Message-State: AOJu0YzpWRRTbdDXEqHb5fgBvFkvXKsOkGp4nv4i0hNxNX6wxifPXdcs 65G8mY1GyAfHDUshZaLwY6gGAm6Ns6sP+Swy9B6S+4uOmjHgnNE4Ah9l0JrN5fJL9OM= X-Gm-Gg: ATEYQzz/s5s9a5wkQrL2Vfw/PKpcGWMbOzTld3mVvsvwiMVc4HUQ0ErplxNxFIfG92P JhVgvSJjbbp/LBxbYNKp3yZnZkkm234TqrVS0o6IlTxT0A7YGN9nsXt4NVIU1r49K1q12I3Wagu +1L8ssYOp+YR8KrnyhnGDA2CsrPCUHf3meq711axWn/HWaaAt6shG5Jm3AZyy9ShE1NPeIxM4Gm 37GtS2hPfCFLdsCg8DL7r9bfq07ujYXtt1/vCIaxtC8w0FXR5FIaBvjEMkkFk3VuAzyuj1c6N0d VbCym3CMdI0ENTFFOvR/Cjy3TB+Xx1wvW16yCjoz3ossX4GtrYUJ/Gkm/TDadpm3fbU72NB1OVB nd627RjxtI/+7zZ3TtMH4+FZckuI7IVuXq/TqZp/ykyagTAICZfRZNcEKjPqeUsy6riK76jRju+ CkPzA= X-Received: by 2002:a17:903:3c2d:b0:2ae:3afc:eb42 with SMTP id d9443c01a7336-2b0827de54amr34730085ad.38.1774017723548; Fri, 20 Mar 2026 07:42:03 -0700 (PDT) Received: from localhost ([2a03:2880:2ff:1::]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2b0835604cdsm23482005ad.37.2026.03.20.07.42.02 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 20 Mar 2026 07:42:03 -0700 (PDT) From: Joe Damato To: netdev@vger.kernel.org, Michael Chan , Pavan Chebbi , Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Richard Cochran , Alexei Starovoitov , Daniel Borkmann , Jesper Dangaard Brouer , John Fastabend , Stanislav Fomichev Cc: horms@kernel.org, linux-kernel@vger.kernel.org, leon@kernel.org, Joe Damato , bpf@vger.kernel.org Subject: [net-next v4 07/12] net: bnxt: Add boilerplate GSO code Date: Fri, 20 Mar 2026 07:41:28 -0700 Message-ID: <20260320144141.260246-8-joe@dama.to> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260320144141.260246-1-joe@dama.to> References: <20260320144141.260246-1-joe@dama.to> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add bnxt_gso.c and bnxt_gso.h with a stub bnxt_sw_udp_gso_xmit() function, SW USO constants (BNXT_SW_USO_MAX_SEGS, BNXT_SW_USO_MAX_DESCS), and the is_sw_gso field in bnxt_sw_tx_bd with BNXT_SW_GSO_MID/LAST markers. The full SW USO implementation will be added in a future commit. Suggested-by: Jakub Kicinski Signed-off-by: Joe Damato Reviewed-by: Pavan Chebbi --- drivers/net/ethernet/broadcom/bnxt/Makefile | 2 +- drivers/net/ethernet/broadcom/bnxt/bnxt.h | 4 +++ drivers/net/ethernet/broadcom/bnxt/bnxt_gso.c | 30 ++++++++++++++++++ drivers/net/ethernet/broadcom/bnxt/bnxt_gso.h | 31 +++++++++++++++++++ 4 files changed, 66 insertions(+), 1 deletion(-) create mode 100644 drivers/net/ethernet/broadcom/bnxt/bnxt_gso.c create mode 100644 drivers/net/ethernet/broadcom/bnxt/bnxt_gso.h diff --git a/drivers/net/ethernet/broadcom/bnxt/Makefile b/drivers/net/ethe= rnet/broadcom/bnxt/Makefile index ba6c239d52fa..debef78c8b6d 100644 --- a/drivers/net/ethernet/broadcom/bnxt/Makefile +++ b/drivers/net/ethernet/broadcom/bnxt/Makefile @@ -1,7 +1,7 @@ # SPDX-License-Identifier: GPL-2.0-only obj-$(CONFIG_BNXT) +=3D bnxt_en.o =20 -bnxt_en-y :=3D bnxt.o bnxt_hwrm.o bnxt_sriov.o bnxt_ethtool.o bnxt_dcb.o b= nxt_ulp.o bnxt_xdp.o bnxt_ptp.o bnxt_vfr.o bnxt_devlink.o bnxt_dim.o bnxt_c= oredump.o +bnxt_en-y :=3D bnxt.o bnxt_hwrm.o bnxt_sriov.o bnxt_ethtool.o bnxt_dcb.o b= nxt_ulp.o bnxt_xdp.o bnxt_ptp.o bnxt_vfr.o bnxt_devlink.o bnxt_dim.o bnxt_c= oredump.o bnxt_gso.o bnxt_en-$(CONFIG_BNXT_FLOWER_OFFLOAD) +=3D bnxt_tc.o bnxt_en-$(CONFIG_DEBUG_FS) +=3D bnxt_debugfs.o bnxt_en-$(CONFIG_BNXT_HWMON) +=3D bnxt_hwmon.o diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.h b/drivers/net/ethern= et/broadcom/bnxt/bnxt.h index d9543d6048d8..593b78672be8 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.h +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.h @@ -891,6 +891,7 @@ struct bnxt_sw_tx_bd { u8 is_ts_pkt; u8 is_push; u8 action; + u8 is_sw_gso; unsigned short nr_frags; union { u16 rx_prod; @@ -898,6 +899,9 @@ struct bnxt_sw_tx_bd { }; }; =20 +#define BNXT_SW_GSO_MID 1 +#define BNXT_SW_GSO_LAST 2 + struct bnxt_sw_rx_bd { void *data; u8 *data_ptr; diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_gso.c b/drivers/net/et= hernet/broadcom/bnxt/bnxt_gso.c new file mode 100644 index 000000000000..b296769ee4fe --- /dev/null +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_gso.c @@ -0,0 +1,30 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* Broadcom NetXtreme-C/E network driver. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "bnxt.h" +#include "bnxt_gso.h" + +netdev_tx_t bnxt_sw_udp_gso_xmit(struct bnxt *bp, + struct bnxt_tx_ring_info *txr, + struct netdev_queue *txq, + struct sk_buff *skb) +{ + dev_kfree_skb_any(skb); + dev_core_stats_tx_dropped_inc(bp->dev); + return NETDEV_TX_OK; +} diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_gso.h b/drivers/net/et= hernet/broadcom/bnxt/bnxt_gso.h new file mode 100644 index 000000000000..f01e8102dcd7 --- /dev/null +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_gso.h @@ -0,0 +1,31 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * Broadcom NetXtreme-C/E network driver. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation. + */ + +#ifndef BNXT_GSO_H +#define BNXT_GSO_H + +/* Maximum segments the stack may send in a single SW USO skb. + * This caps gso_max_segs for NICs without HW USO support. + */ +#define BNXT_SW_USO_MAX_SEGS 64 + +/* Worst-case TX descriptors consumed by one SW USO packet: + * Each segment: 1 long BD + 1 ext BD + payload BDs. + * Total payload BDs across all segs <=3D num_segs + nr_frags (each frag + * boundary crossing adds at most 1 extra BD). + * So: 3 * max_segs + MAX_SKB_FRAGS + 1 =3D 3 * 64 + 17 + 1 =3D 210. + */ +#define BNXT_SW_USO_MAX_DESCS (3 * BNXT_SW_USO_MAX_SEGS + MAX_SKB_FRAGS + = 1) + +netdev_tx_t bnxt_sw_udp_gso_xmit(struct bnxt *bp, + struct bnxt_tx_ring_info *txr, + struct netdev_queue *txq, + struct sk_buff *skb); + +#endif --=20 2.52.0 From nobody Sat Apr 4 07:49:32 2026 Received: from mail-pg1-f174.google.com (mail-pg1-f174.google.com [209.85.215.174]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 94ADB3C4579 for ; Fri, 20 Mar 2026 14:42:06 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.174 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774017728; cv=none; b=c2vPCKPQqCyi2tK/XrzgzkAkZu/WF7KyaFKHqGDfWOCN2xaXBE4QEgN/defsGP4InoWVKxPDu53XHUTemlSoEhxhZ1KWJnwtu87LBvkdbu03WJDkpPkOlTa9km6z9NcL5x8KBuCpBNUDEf4sY1nWYYkBacFJfMp0mvSSYFjlxJk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774017728; c=relaxed/simple; bh=J79iNL/SAQ9qgtYX0VM4PuGUhLVLRwjcZiUAvSV9Klw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=l3elCTFhd/YLc59h+j/V04VFvOPamkv+DU3sSthHeFFZ94E9FV/f38T7AJOReb2Oe6lyDFHVTG/k7fLbbhyPNBeC3pTyEvLS+TEPvzX64YaKqrD7l6qoqeEbCxZr52h6eelymHPSCyhwBiC6MxnhBmN76e9//8T/wPHN7VwL4KI= 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=U6eZ0L3c; arc=none smtp.client-ip=209.85.215.174 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=dama.to Authentication-Results: smtp.subspace.kernel.org; spf=none smtp.mailfrom=dama.to Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=dama-to.20230601.gappssmtp.com header.i=@dama-to.20230601.gappssmtp.com header.b="U6eZ0L3c" Received: by mail-pg1-f174.google.com with SMTP id 41be03b00d2f7-c763c294cccso164917a12.1 for ; Fri, 20 Mar 2026 07:42:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dama-to.20230601.gappssmtp.com; s=20230601; t=1774017726; x=1774622526; 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=1CazIVEaRv3LnqWR08+/3SmBxoY0fNfgKVHWCxFfOpM=; b=U6eZ0L3cGWvJhXDH35ceGKv/AysyXNwYVNq7GVa6X1XbHcVyKMQ6OobSqRtJNsn3DZ NxQxvnrx4lHvqSqpO5yNkGobV6NI7RzM1OJ+Ys88cfEgbwCVja6B2jgAab+qmGWUC4UY F1NV0XcLrjAgc6dftywxF/DGPf/V6RIh5obEL2a31xRec9GITb57LLxDO+0FUPadJbDd xRgtNuyWUh0CWKzivkLUFEXD2oL3Eg1iDU/uVa1sbLOqEnTvb7ZJMiYpTg0fmKJzY+d4 QF4poL02h5aSd+oyeyEdSx0h/AO/EI8gAhAnumw/5kbktMlhoO0JSbyByGoEW4nq3TmO KCbw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774017726; x=1774622526; 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=1CazIVEaRv3LnqWR08+/3SmBxoY0fNfgKVHWCxFfOpM=; b=H6xjRYAlEzOIBNraiXsgE8oq7MDNB3QlSfOrHwF4xLdGVGWZNWUL0MlJayCcQ4LZYL ByU2NJUiiRYqZ8uhHBlqqdneKpyxm5cNc+yB/EsX3mPtwrVji6P9q/jk6HEA7mJJ5Qjq fVKIzwt0y5NKx7woJA0+558+tG5IvirJXhb7unnSRIxdGGLVOC/sfTmjSfPN/ddyA+51 HqZ/6seQIRs5jlgCSos7WiZU6pkGvDRwRoYL14EpGuavL4fxa/CiVljw87gTy0XCP+iM 6Jet86s7LOcs8BOW+s0SSI6k7jzQh7zVTIt+gack87CJca4pl4j5YbfZvFuSV0BVxrlU pVgA== X-Forwarded-Encrypted: i=1; AJvYcCXWveJuNDeCXiyV3PHJhrrKKg+izZX3KHwTAQqF7NfvbrR5tNNtnq6AHTxIXs5OvUxoZURwZt/B28PEm5k=@vger.kernel.org X-Gm-Message-State: AOJu0Yzk4LVDcmcItkUxr+F3cRzdl2T8LJqZytOBYTu1yT+QhaW4C061 lYaiCWvAn8bd+QbHUsMfA4iSBH4B4nOS0uawNdGHLow0iZD2ojUgCDOMOtrhoYWD89Q= X-Gm-Gg: ATEYQzzxi+uXN/yL8soFXQpZ2l4EY3nob0/LmqlA5/eONmz3uFUmlGR+bpxX69cruf2 BtQ5S6MWsGhmv+RLr/hflQpEQN1+MpvFjGh1UTrDJGwd1uEii996JWjwhnc+w6EFFfuTOSfhGTS PbJ6tm2jzjs7IblNl5r4Fe9d5mKj77oPVuaQ8iRISKBXxEefOxd2rbyEqkw8iglRgrmo+JhsBwm s01kRK8QAy5BnlLpXqX0UjeDjdvh53I5D5D/ymv1xiD8RS0bmRl4KPhlcJaSEe0Z3Uw/Rl+zWzA Z7+h7WHKvitRqqQiRZzsh/AGd3a6O+v9t4dP9C3dqrQWxKRCLcUu8wqORk5KYVSk90cbL5iqQSb /3Ic6EqLZqbHmEV5lTMSEWiUTrClRlBT/+Qx9P1NizPOih1JnC1WbP7BJ/Of6zsDZ6Jia2sNtNT ejPFF4 X-Received: by 2002:a05:6a20:9191:b0:39b:8dcb:f377 with SMTP id adf61e73a8af0-39bcebf74a7mr2883374637.53.1774017725932; Fri, 20 Mar 2026 07:42:05 -0700 (PDT) Received: from localhost ([2a03:2880:2ff:73::]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-c74665ca206sm2435823a12.18.2026.03.20.07.42.05 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 20 Mar 2026 07:42:05 -0700 (PDT) From: Joe Damato To: netdev@vger.kernel.org, Michael Chan , Pavan Chebbi , Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni Cc: horms@kernel.org, linux-kernel@vger.kernel.org, leon@kernel.org, Joe Damato Subject: [net-next v4 08/12] net: bnxt: Implement software USO Date: Fri, 20 Mar 2026 07:41:29 -0700 Message-ID: <20260320144141.260246-9-joe@dama.to> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260320144141.260246-1-joe@dama.to> References: <20260320144141.260246-1-joe@dama.to> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Implement bnxt_sw_udp_gso_xmit() using the core tso_dma_map API and the pre-allocated TX inline buffer for per-segment headers. The xmit path: 1. Calls tso_start() to initialize TSO state 2. Stack-allocates a tso_dma_map and calls tso_dma_map_init() to DMA-map the linear payload and all frags upfront. 3. For each segment: - Copies and patches headers via tso_build_hdr() into the pre-allocated tx_inline_buf (DMA-synced per segment) - Counts payload BDs via tso_dma_map_count() - Emits long BD (header) + ext BD + payload BDs - Payload BDs use tso_dma_map_next() which yields (dma_addr, chunk_len, mapping_len) tuples. Header BDs set dma_unmap_len=3D0 since the inline buffer is pre-allocated and unmapped only at ring teardown. Suggested-by: Jakub Kicinski Signed-off-by: Joe Damato Reviewed-by: Pavan Chebbi --- v4: - Fixed the early return issue Pavan pointed out when num_segs <=3D 1; u= se the drop label instead of returning. v3: - Added iova_state and iova_total_len to struct bnxt_sw_tx_bd. - Stores iova_state on the last segment's tx_buf during xmit. rfcv2: - set the unmap len on the last descriptor, so that when completions fire only the last completion unmaps the region. drivers/net/ethernet/broadcom/bnxt/bnxt.h | 4 + drivers/net/ethernet/broadcom/bnxt/bnxt_gso.c | 206 ++++++++++++++++++ 2 files changed, 210 insertions(+) diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.h b/drivers/net/ethern= et/broadcom/bnxt/bnxt.h index 593b78672be8..0afa0b731063 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..4287afe0fd72 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt_gso.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_gso.c @@ -19,11 +19,217 @@ #include "bnxt.h" #include "bnxt_gso.h" =20 +static u32 bnxt_sw_gso_lhint(unsigned int len) +{ + if (len <=3D 512) + return TX_BD_FLAGS_LHINT_512_AND_SMALLER; + else if (len <=3D 1023) + return TX_BD_FLAGS_LHINT_512_TO_1023; + else if (len <=3D 2047) + return TX_BD_FLAGS_LHINT_1024_TO_2047; + else + return TX_BD_FLAGS_LHINT_2048_AND_LARGER; +} + netdev_tx_t bnxt_sw_udp_gso_xmit(struct bnxt *bp, struct bnxt_tx_ring_info *txr, struct netdev_queue *txq, struct sk_buff *skb) { + struct bnxt_sw_tx_bd *last_unmap_buf =3D NULL; + unsigned int hdr_len, mss, num_segs; + unsigned int last_unmap_len =3D 0; + struct pci_dev *pdev =3D bp->pdev; + dma_addr_t last_unmap_addr =3D 0; + unsigned int total_payload; + int i, bds_needed, slots; + struct tso_dma_map map; + u32 vlan_tag_flags =3D 0; + struct tso_t tso; + u16 cfa_action; + u16 prod; + + hdr_len =3D tso_start(skb, &tso); + mss =3D skb_shinfo(skb)->gso_size; + total_payload =3D skb->len - hdr_len; + num_segs =3D DIV_ROUND_UP(total_payload, mss); + + /* Zero the csum fields so tso_build_hdr will propagate zeroes into + * every segment header. HW csum offload will recompute from scratch. + */ + udp_hdr(skb)->check =3D 0; + if (!tso.ipv6) + ip_hdr(skb)->check =3D 0; + + if (unlikely(num_segs <=3D 1)) + goto drop; + + /* Upper bound on the number of descriptors needed. + * + * Each segment uses 1 long BD + 1 ext BD + payload BDs, which is + * at most num_segs + nr_frags (each frag boundary crossing adds at + * most 1 extra BD). + */ + bds_needed =3D 3 * num_segs + skb_shinfo(skb)->nr_frags + 1; + + if (unlikely(bnxt_tx_avail(bp, txr) < bds_needed)) { + netif_txq_try_stop(txq, bnxt_tx_avail(bp, txr), + bp->tx_wake_thresh); + return NETDEV_TX_BUSY; + } + + slots =3D BNXT_SW_USO_MAX_SEGS - (txr->tx_inline_prod - txr->tx_inline_co= ns); + + if (unlikely(slots < num_segs)) { + netif_txq_try_stop(txq, bnxt_tx_avail(bp, txr), + bp->tx_wake_thresh); + return NETDEV_TX_BUSY; + } + + if (unlikely(tso_dma_map_init(&map, &pdev->dev, skb, hdr_len))) + goto drop; + + cfa_action =3D bnxt_xmit_get_cfa_action(skb); + if (skb_vlan_tag_present(skb)) { + vlan_tag_flags =3D TX_BD_CFA_META_KEY_VLAN | + skb_vlan_tag_get(skb); + if (skb->vlan_proto =3D=3D htons(ETH_P_8021Q)) + vlan_tag_flags |=3D 1 << TX_BD_CFA_META_TPID_SHIFT; + } + + prod =3D txr->tx_prod; + + for (i =3D 0; i < num_segs; i++) { + unsigned int seg_payload =3D min_t(unsigned int, mss, + total_payload - i * mss); + u16 slot =3D (txr->tx_inline_prod + i) & + (BNXT_SW_USO_MAX_SEGS - 1); + struct bnxt_sw_tx_bd *tx_buf; + unsigned int mapping_len; + dma_addr_t this_hdr_dma; + unsigned int chunk_len; + unsigned int offset; + dma_addr_t dma_addr; + struct tx_bd *txbd; + void *this_hdr; + int bd_count; + __le32 csum; + bool last; + u32 flags; + + last =3D (i =3D=3D num_segs - 1); + offset =3D slot * TSO_HEADER_SIZE; + this_hdr =3D txr->tx_inline_buf + offset; + this_hdr_dma =3D txr->tx_inline_dma + offset; + + tso_build_hdr(skb, this_hdr, &tso, seg_payload, last); + + dma_sync_single_for_device(&pdev->dev, this_hdr_dma, + hdr_len, DMA_TO_DEVICE); + + bd_count =3D tso_dma_map_count(&map, seg_payload); + + tx_buf =3D &txr->tx_buf_ring[RING_TX(bp, prod)]; + txbd =3D &txr->tx_desc_ring[TX_RING(bp, prod)][TX_IDX(prod)]; + + tx_buf->skb =3D skb; + tx_buf->nr_frags =3D bd_count; + tx_buf->is_push =3D 0; + tx_buf->is_ts_pkt =3D 0; + + dma_unmap_addr_set(tx_buf, mapping, this_hdr_dma); + dma_unmap_len_set(tx_buf, len, 0); + + tx_buf->is_sw_gso =3D last ? BNXT_SW_GSO_LAST : BNXT_SW_GSO_MID; + + /* Store IOVA state on the last segment for completion */ + if (last && tso_dma_map_use_iova(&map)) { + tx_buf->iova_state =3D map.iova_state; + tx_buf->iova_total_len =3D map.total_len; + } + + flags =3D (hdr_len << TX_BD_LEN_SHIFT) | + TX_BD_TYPE_LONG_TX_BD | + TX_BD_CNT(2 + bd_count); + + flags |=3D bnxt_sw_gso_lhint(hdr_len + seg_payload); + + txbd->tx_bd_len_flags_type =3D cpu_to_le32(flags); + txbd->tx_bd_haddr =3D cpu_to_le64(this_hdr_dma); + txbd->tx_bd_opaque =3D SET_TX_OPAQUE(bp, txr, prod, + 2 + bd_count); + + csum =3D cpu_to_le32(TX_BD_FLAGS_TCP_UDP_CHKSUM | + TX_BD_FLAGS_IP_CKSUM); + + prod =3D NEXT_TX(prod); + bnxt_init_ext_bd(bp, txr, prod, csum, + vlan_tag_flags, cfa_action); + + /* set dma_unmap_len on the LAST BD touching each + * region. Since completions are in-order, the last segment + * completes after all earlier ones, so the unmap is safe. + */ + while (tso_dma_map_next(&map, &dma_addr, &chunk_len, + &mapping_len, seg_payload)) { + prod =3D NEXT_TX(prod); + txbd =3D &txr->tx_desc_ring[TX_RING(bp, prod)][TX_IDX(prod)]; + tx_buf =3D &txr->tx_buf_ring[RING_TX(bp, prod)]; + + txbd->tx_bd_haddr =3D cpu_to_le64(dma_addr); + dma_unmap_addr_set(tx_buf, mapping, dma_addr); + dma_unmap_len_set(tx_buf, len, 0); + tx_buf->skb =3D NULL; + tx_buf->is_sw_gso =3D 0; + + if (mapping_len) { + if (last_unmap_buf) { + dma_unmap_addr_set(last_unmap_buf, + mapping, + last_unmap_addr); + dma_unmap_len_set(last_unmap_buf, + len, + last_unmap_len); + } + last_unmap_addr =3D dma_addr; + last_unmap_len =3D mapping_len; + } + last_unmap_buf =3D tx_buf; + + flags =3D chunk_len << TX_BD_LEN_SHIFT; + txbd->tx_bd_len_flags_type =3D cpu_to_le32(flags); + txbd->tx_bd_opaque =3D 0; + + seg_payload -=3D chunk_len; + } + + txbd->tx_bd_len_flags_type |=3D + cpu_to_le32(TX_BD_FLAGS_PACKET_END); + + prod =3D NEXT_TX(prod); + } + + if (last_unmap_buf) { + dma_unmap_addr_set(last_unmap_buf, mapping, last_unmap_addr); + dma_unmap_len_set(last_unmap_buf, len, last_unmap_len); + } + + txr->tx_inline_prod +=3D num_segs; + + netdev_tx_sent_queue(txq, skb->len); + + WRITE_ONCE(txr->tx_prod, prod); + /* Sync BDs before doorbell */ + wmb(); + bnxt_db_write(bp, &txr->tx_db, prod); + + if (unlikely(bnxt_tx_avail(bp, txr) <=3D bp->tx_wake_thresh)) + netif_txq_try_stop(txq, bnxt_tx_avail(bp, txr), + bp->tx_wake_thresh); + + return NETDEV_TX_OK; + +drop: dev_kfree_skb_any(skb); dev_core_stats_tx_dropped_inc(bp->dev); return NETDEV_TX_OK; --=20 2.52.0 From nobody Sat Apr 4 07:49:32 2026 Received: from mail-pj1-f53.google.com (mail-pj1-f53.google.com [209.85.216.53]) (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 968423CBE74 for ; Fri, 20 Mar 2026 14:42:08 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.53 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774017730; cv=none; b=ezL58rkUg8fAQuDRPm2CQt0I3sNzAjN2gGQUw8kNEwV3BlB0rK/3CiVWaa/aNauTJYDDtyIZXjKkH3XIyuF7ysb3OgWeB5+ivB04q0X3D79PPpAxsGhFsZ+3HInZPg73pUxjBAPDGekokht64oBIc0Dcb3vbWT1OZtVTb/Hi1dQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774017730; c=relaxed/simple; bh=YzKXajmKc0ASt3KsvZpVHQxjsM4waE4u3jEZJ2oRbpA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Sh1fIIDqgsACS6OlACYD8FnXOqQntEaKVAcWsLwEYtgvDb80czMc3YVZZZDi/tz6Nekk4N2nJxEvnjXhdMGcicLkqRsTAZrI4yQHhtCKht7o9v9mc61Oixm/uFcMaZKeRtGjhmuFdMldgVhK0Z/hWoMa8povqg8VEqC1/wiNWEE= 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=dz5cnYh2; arc=none smtp.client-ip=209.85.216.53 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="dz5cnYh2" Received: by mail-pj1-f53.google.com with SMTP id 98e67ed59e1d1-35bb9070644so465912a91.2 for ; Fri, 20 Mar 2026 07:42:08 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dama-to.20230601.gappssmtp.com; s=20230601; t=1774017728; x=1774622528; 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=AE0NX7RG+iFP3hDspYtJNUt8M+6AmihieJBZLfIyPVc=; b=dz5cnYh2+swfbnJ0H9RNXXOZFcy99gbARIrnYwAGguTXlFgm5428Ghwe73X3xaJU/h GrM5gJZStVwseTtfI18v3rXrUJPRliAYZdWM55wR4DZOugBmp/etH71E+qCplf9KoOiu 1gY2afg9Yn8cqPsen/7/1mF/d1a11dmM1HgPUynyge8cuwydaEcRXALW2GI8zlEKqPi/ 1R8sUdf4odOG3hdhCKdaWA0iChAWH99JIzrzC6odo6C5TGBSUuvcFSCJnE0/Zx4+AW15 Fyvo2NWjJLy02MCSyywtGDIBoYENTllINm9BkphtPOrkcV3elNxoRa2CNq2ysALqXZJP jMKA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774017728; x=1774622528; 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=AE0NX7RG+iFP3hDspYtJNUt8M+6AmihieJBZLfIyPVc=; b=ioi2E9J937wmEGOqTBSiQ6usFxjQcEj6JSSsOx2x5/nWofXAIC/uo6KLjxUveOztj0 k6LGrodq5MvBSpze0/Fm50JeZ0u0H47+4RA/S6x+LbUvgpOslpzeNqrCK9A3qb1ElTwS 5ba6/NOqo5aR1AOEqVeBT+uM4ncYjXRk1TQ0zuo81Ih4FDH5ia+clZHASXWf7dlWQM1F C9n4RxjbCUuKzkIUXw46vjhPC40D/rHXUDRSM4ElnY/k/x2Gk2YJxWWkUHWG8UUTVL2r 39jkq6+tSErZOb7YxWDIrcR3rzqsQnGF3XPuzFKWUFZfRlrl6bEp73fseyu2OdXxioaK 9ylw== X-Forwarded-Encrypted: i=1; AJvYcCV5QaLsdGCYM+jGOSs0g7GPTgH3cDP5K9lWC3mnVrP2QnHOQX24ywd/6ln1adg/qfwfoXRgfNhpoPJndRY=@vger.kernel.org X-Gm-Message-State: AOJu0YxVNHpRRO3mgc0FoVd+6XNZgaZi9SbtE3LM+6fOxPLxPmYSFeAS E4wLif76T3xEhPAOtLfJ304Yt6P4nJypNuH21Us8QSn08xrOs1uK2JoaD3mKhfqWsj8= X-Gm-Gg: ATEYQzy7KzZV54AhBVYjUhouIfKxAGWDflBH9gZ4mUnQUxJ99rwFDFSxmwAOXKrjZCz aQ1yzQYcg7FV8JVJBngYLZHUY4ojpJiaIYNlZ9sHlG4j8REoJYGDLG0gT6L6YV+c0MkjbcW8kW+ RhzIp11RbdK6NbeBfMGkEAeeQbR575TPwfNGk1IlRRwJGc/9fnrpgCKNFC6IyAx1OsGrCx+wNJR +QKOZb9v71jwBb2ySho1rxhTY816QTBxF8LMQFO18EqYz+WmAtSODd/itR71P3g2QalsdKJ6UVg +YY9K6ljq4kvvXSbe5lK1/1azNMqiwT93OflEd5gdlBzBRJzfRaGh41RkwJ6RuabSmIVhmVf1a6 0flaGOnGUSPDX/bBtV4MemMHxvgz5puTATnulO1ZxPv9svrpD7fynVxRwQBQIKMv4NbtUoa3Cw2 0+Zis= X-Received: by 2002:a17:90b:5107:b0:34e:63c1:4a08 with SMTP id 98e67ed59e1d1-35bd2c98e30mr2359558a91.20.1774017727884; Fri, 20 Mar 2026 07:42:07 -0700 (PDT) Received: from localhost ([2a03:2880:2ff:2::]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-35bc60ecb30sm5418293a91.12.2026.03.20.07.42.07 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 20 Mar 2026 07:42:07 -0700 (PDT) From: Joe Damato To: netdev@vger.kernel.org, Michael Chan , Pavan Chebbi , Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni Cc: horms@kernel.org, linux-kernel@vger.kernel.org, leon@kernel.org, Joe Damato Subject: [net-next v4 09/12] net: bnxt: Add SW GSO completion and teardown support Date: Fri, 20 Mar 2026 07:41:30 -0700 Message-ID: <20260320144141.260246-10-joe@dama.to> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260320144141.260246-1-joe@dama.to> References: <20260320144141.260246-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 Signed-off-by: Joe Damato Reviewed-by: Pavan Chebbi --- 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 8929264a54b1..d9ca4933ee62 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 */ @@ -3418,6 +3438,7 @@ static void bnxt_free_one_tx_ring_skbs(struct bnxt *b= p, =20 for (i =3D 0; i < max_idx;) { struct bnxt_sw_tx_bd *tx_buf =3D &txr->tx_buf_ring[i]; + struct bnxt_sw_tx_bd *head_buf =3D tx_buf; struct sk_buff *skb; int j, last; =20 @@ -3470,7 +3491,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)); } @@ -3996,9 +4030,9 @@ static void bnxt_free_tx_inline_buf(struct bnxt_tx_ri= ng_info *txr, txr->tx_inline_size =3D 0; } =20 -static int __maybe_unused bnxt_alloc_tx_inline_buf(struct bnxt_tx_ring_inf= o *txr, - struct pci_dev *pdev, - unsigned int size) +static int bnxt_alloc_tx_inline_buf(struct bnxt_tx_ring_info *txr, + struct pci_dev *pdev, + unsigned int size) { txr->tx_inline_buf =3D kmalloc(size, GFP_KERNEL); if (!txr->tx_inline_buf) @@ -4101,6 +4135,14 @@ static int bnxt_alloc_tx_rings(struct bnxt *bp) sizeof(struct tx_push_bd); txr->data_mapping =3D cpu_to_le64(mapping); } + if (!(bp->flags & BNXT_FLAG_UDP_GSO_CAP) && + (bp->dev->features & NETIF_F_GSO_UDP_L4)) { + rc =3D bnxt_alloc_tx_inline_buf(txr, pdev, + BNXT_SW_USO_MAX_SEGS * + TSO_HEADER_SIZE); + if (rc) + return rc; + } qidx =3D bp->tc_to_qidx[j]; ring->queue_id =3D bp->q_info[qidx].queue_id; spin_lock_init(&txr->xdp_tx_lock); @@ -4643,6 +4685,10 @@ static int bnxt_init_tx_rings(struct bnxt *bp) =20 bp->tx_wake_thresh =3D max_t(int, bp->tx_ring_size / 2, BNXT_MIN_TX_DESC_CNT); + if (!(bp->flags & BNXT_FLAG_UDP_GSO_CAP) && + (bp->dev->features & NETIF_F_GSO_UDP_L4)) + bp->tx_wake_thresh =3D max_t(int, bp->tx_wake_thresh, + BNXT_SW_USO_MAX_DESCS); =20 for (i =3D 0; i < bp->tx_nr_rings; i++) { struct bnxt_tx_ring_info *txr =3D &bp->tx_ring[i]; @@ -13831,6 +13877,11 @@ static netdev_features_t bnxt_fix_features(struct = net_device *dev, if ((features & NETIF_F_NTUPLE) && !bnxt_rfs_capable(bp, false)) features &=3D ~NETIF_F_NTUPLE; =20 + if ((features & NETIF_F_GSO_UDP_L4) && + !(bp->flags & BNXT_FLAG_UDP_GSO_CAP) && + bp->tx_ring_size < 2 * BNXT_SW_USO_MAX_DESCS) + features &=3D ~NETIF_F_GSO_UDP_L4; + if ((bp->flags & BNXT_FLAG_NO_AGG_RINGS) || bp->xdp_prog) features &=3D ~(NETIF_F_LRO | NETIF_F_GRO_HW); =20 @@ -13876,6 +13927,15 @@ static int bnxt_set_features(struct net_device *de= v, netdev_features_t features) int rc =3D 0; bool re_init =3D false; =20 + if (!(bp->flags & BNXT_FLAG_UDP_GSO_CAP)) { + if (features & NETIF_F_GSO_UDP_L4) + bp->tx_wake_thresh =3D max_t(int, bp->tx_wake_thresh, + BNXT_SW_USO_MAX_DESCS); + else + bp->tx_wake_thresh =3D max_t(int, bp->tx_ring_size / 2, + BNXT_MIN_TX_DESC_CNT); + } + flags &=3D ~BNXT_FLAG_ALL_CONFIG_FEATS; if (features & NETIF_F_GRO_HW) flags |=3D BNXT_FLAG_GRO; @@ -16879,8 +16939,7 @@ static int bnxt_init_one(struct pci_dev *pdev, cons= t struct pci_device_id *ent) NETIF_F_GSO_UDP_TUNNEL_CSUM | NETIF_F_GSO_GRE_CSUM | NETIF_F_GSO_PARTIAL | NETIF_F_RXHASH | NETIF_F_RXCSUM | NETIF_F_GRO; - if (bp->flags & BNXT_FLAG_UDP_GSO_CAP) - dev->hw_features |=3D NETIF_F_GSO_UDP_L4; + dev->hw_features |=3D NETIF_F_GSO_UDP_L4; =20 if (BNXT_SUPPORTS_TPA(bp)) dev->hw_features |=3D NETIF_F_LRO; @@ -16913,8 +16972,15 @@ static int bnxt_init_one(struct pci_dev *pdev, con= st struct pci_device_id *ent) dev->priv_flags |=3D IFF_UNICAST_FLT; =20 netif_set_tso_max_size(dev, GSO_MAX_SIZE); - if (bp->tso_max_segs) + if (!(bp->flags & BNXT_FLAG_UDP_GSO_CAP)) { + u16 max_segs =3D BNXT_SW_USO_MAX_SEGS; + + if (bp->tso_max_segs) + max_segs =3D min_t(u16, max_segs, bp->tso_max_segs); + netif_set_tso_max_segs(dev, max_segs); + } else if (bp->tso_max_segs) { netif_set_tso_max_segs(dev, bp->tso_max_segs); + } =20 dev->xdp_features =3D NETDEV_XDP_ACT_BASIC | NETDEV_XDP_ACT_REDIRECT | NETDEV_XDP_ACT_RX_SG; diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c b/drivers/ne= t/ethernet/broadcom/bnxt/bnxt_ethtool.c index 48e8e3be70d3..44b3fd18fcbe 100644 --- a/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c @@ -33,6 +33,7 @@ #include "bnxt_xdp.h" #include "bnxt_ptp.h" #include "bnxt_ethtool.h" +#include "bnxt_gso.h" #include "bnxt_nvm_defs.h" /* NVRAM content constant and structure defs */ #include "bnxt_fw_hdr.h" /* Firmware hdr constant and structure defs */ #include "bnxt_coredump.h" @@ -852,12 +853,18 @@ static int bnxt_set_ringparam(struct net_device *dev, u8 tcp_data_split =3D kernel_ering->tcp_data_split; struct bnxt *bp =3D netdev_priv(dev); u8 hds_config_mod; + int rc; =20 if ((ering->rx_pending > BNXT_MAX_RX_DESC_CNT) || (ering->tx_pending > BNXT_MAX_TX_DESC_CNT) || (ering->tx_pending < BNXT_MIN_TX_DESC_CNT)) return -EINVAL; =20 + if ((dev->features & NETIF_F_GSO_UDP_L4) && + !(bp->flags & BNXT_FLAG_UDP_GSO_CAP) && + ering->tx_pending < 2 * BNXT_SW_USO_MAX_DESCS) + return -EINVAL; + hds_config_mod =3D tcp_data_split !=3D dev->cfg->hds_config; if (tcp_data_split =3D=3D ETHTOOL_TCP_DATA_SPLIT_DISABLED && hds_config_m= od) return -EINVAL; @@ -882,9 +889,17 @@ static int bnxt_set_ringparam(struct net_device *dev, bp->tx_ring_size =3D ering->tx_pending; bnxt_set_ring_params(bp); =20 - if (netif_running(dev)) - return bnxt_open_nic(bp, false, false); + if (netif_running(dev)) { + rc =3D bnxt_open_nic(bp, false, false); + if (rc) + return rc; + } =20 + /* ring size changes may affect features (SW USO requires a minimum + * ring size), so recalculate features to ensure the correct features + * are blocked/available. + */ + netdev_update_features(dev); return 0; } =20 --=20 2.52.0 From nobody Sat Apr 4 07:49:32 2026 Received: from mail-pg1-f170.google.com (mail-pg1-f170.google.com [209.85.215.170]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3255C3CBE60 for ; Fri, 20 Mar 2026 14:42:10 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.170 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774017731; cv=none; b=hQNrD7R+PMntUBXQIc81TBLcct9WcbnA7r3m3ieFRmojjna4zuOA0RxqtxMJ8Vnel95oiNta0OOl8dBvUfE9pazZuQZCdZLl/jt3qi1URILQzlSXF3mYy2/lsNkI598DTfVFBY+BP8TwtMvIfIPPSZHnufAB5Q360Us+AuI+XzE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774017731; c=relaxed/simple; bh=92aqkYJ0b5GlsxkwOgN+ntPd5LTvqgJxwBWqWknd7Dk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=rQTRroK0Sigfn491PLBS1kBnPX0xN4bM1MTTe80nf4/P6yCylQqjBxCglrP9mbJ++q6qYXaPfsf4105wo4Qh6k1yqyMT1nileSRSNB9BxTzRCwBe2PJtX4UZDulfJHPZH+FpsX6Tjm/1BAfRwUo05iUIEEwC+A7licg/Si4lZEI= 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=Qh1Y9TvF; arc=none smtp.client-ip=209.85.215.170 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=dama.to Authentication-Results: smtp.subspace.kernel.org; spf=none smtp.mailfrom=dama.to Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=dama-to.20230601.gappssmtp.com header.i=@dama-to.20230601.gappssmtp.com header.b="Qh1Y9TvF" Received: by mail-pg1-f170.google.com with SMTP id 41be03b00d2f7-c70e27e2b74so697202a12.0 for ; Fri, 20 Mar 2026 07:42:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dama-to.20230601.gappssmtp.com; s=20230601; t=1774017729; x=1774622529; 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=1W18gZ6DTQpQ6YetxkK8bSGbSnx/tyFrgmhuV+UxdE8=; b=Qh1Y9TvFlo5ggIIrupO61GS9Iohp/YwZHU25TPDPI1TL7tpLOEpMuFvC+LdlMC/fqr VC3ycXq8fZSejd/MuUuzv2i0tVKUtEmJ3+oQvuWCZ+0PCThqkRzIkPj54/q7pRXfsEeS KPawp09SyfsfjfVaH4Kr9iWhc26eEC2t7SiWmZOz+g0GIV3k1t216N5f6D5WI8Z8pGnM sw+I+Poq9IIic+Xm7eRoLnKPOWQyxr3f4B2oOMI+XwbpjV412URqYpGZ7+AiDah4n/ar /XC/EoW/iSan3jXVKScpko82jegFy/qeEaVkUeLCMUya050AEzLj+0pQ83XjBbfgZhpE TL+Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774017729; x=1774622529; 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=1W18gZ6DTQpQ6YetxkK8bSGbSnx/tyFrgmhuV+UxdE8=; b=LTiJfUIEdQK/H+tkEIM+oeNq/B06kMWcORnZGIAmzGw4KtX8sL/+tSy9UDD7XsAi/4 Zl878GEYFebdnKLPfY6epMcS1mw01rNNnvPSqo/PSJqdmKLByduSRkk1waGRQjIM1LMo xnFPTT5lED0puTsdgMBGNFY57Cegjevgrr1SokfyySBygXOxuyiIRmbRRc5RcT2zqeaE RKHFNbv0O+4jjQYTEx/IKqo1TYD82kREl0c9zAbr23dzrOt9WNRDJqNoSO0lmGIAShW/ SOG7VHlxI0SfyQViKWMliUkCHChOVwfd/msCinbHGd5kxAO1kE4ZsVBhO421mCpwzCT9 39zA== X-Forwarded-Encrypted: i=1; AJvYcCVgKvKdzJ6bd4nKWbphpEXQVsSGRqkv4fyDPQTB/bIqTmLbPn/ssutgmxQXed6qlnvU6LGLzNwuNqr37Mk=@vger.kernel.org X-Gm-Message-State: AOJu0Yzv/vbJNXHeTg8SHNpKXGBCFMQb5XgXlsmL21qga/8IefjdzbLG 5p35zJ/AgKoyqv0ELPff2BuzinhiLEkgn9DcWXysOWwyc0xqSN7xVY2PhaGUGZHpHD4= X-Gm-Gg: ATEYQzwSHrJFn/fAPqbJZsEe7dsJ+Nai6F9XA1xVRmD3gjithFFqo8K+/WxByBKS653 CZr/vezR9kvMDqJQrhxQYGtHpS/LJ9W4jV66drZlggWxga12jsZa/e2x8OB32MR3EU5+EP+U0ns NJmrBln+ekuhhO9fhX1CuA7vpPotUgnvIcAV0DXgUMTPkV7Jss7AjE4AiuLy6rNxCvC5gLqJ4Ag mDKDyP9jhUG966wNHnMLpxGCQmqQUtGyA1RvXnkde4nOifgk7+dNHI1i7IS2tDTyurByVF9+LM5 W2TPg+gRsfET+65QxgaIuG3QlE4yFedsEeHrR8+h007EW78zUMudxlrikkQX2hyyfd7E9XkMMzh Bs9nMYFivmAxh2HggL6rXIA4RW/bVp2PNm95IYG61ZcYjLu66x9lkMrduK6WkYTu7AgNtJTHrYu sm X-Received: by 2002:a17:902:f605:b0:2b0:49e6:9622 with SMTP id d9443c01a7336-2b0827db766mr29534045ad.37.1774017729468; Fri, 20 Mar 2026 07:42:09 -0700 (PDT) Received: from localhost ([2a03:2880:2ff::]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2b083527f90sm24692975ad.19.2026.03.20.07.42.08 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 20 Mar 2026 07:42:09 -0700 (PDT) From: Joe Damato To: netdev@vger.kernel.org, Michael Chan , Pavan Chebbi , Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni Cc: horms@kernel.org, linux-kernel@vger.kernel.org, leon@kernel.org, Joe Damato Subject: [net-next v4 10/12] net: bnxt: Dispatch to SW USO Date: Fri, 20 Mar 2026 07:41:31 -0700 Message-ID: <20260320144141.260246-11-joe@dama.to> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260320144141.260246-1-joe@dama.to> References: <20260320144141.260246-1-joe@dama.to> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Wire in the SW USO path added in preceding commits when hardware USO is not possible. When a GSO skb with SKB_GSO_UDP_L4 arrives and the NIC lacks HW USO capability, redirect to bnxt_sw_udp_gso_xmit() which handles software segmentation into individual UDP frames submitted directly to the TX ring. Suggested-by: Jakub Kicinski Signed-off-by: Joe Damato Reviewed-by: Pavan Chebbi --- 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 d9ca4933ee62..5c3b3adaf701 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 Sat Apr 4 07:49:32 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 B6F123CCFD9 for ; Fri, 20 Mar 2026 14:42:11 +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=1774017733; cv=none; b=h4l5phB633W3j0e5gsJ3TDhVA8c/Lt3Qu0Z/jDvwqCgsYd7ZlYWwIbxVK1c/M3YGsRZouyMoyWrPN+zkwUfrXeF8/yjhVBY9OhL79PJroJ+pr22H0AZn1EEv0wrz3Jm4hmUWBJgLM/rAdzRWcSmH+iuTxAH7+nu3KGGzVXauQbQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774017733; c=relaxed/simple; bh=tk6yIcgDNmYbIICltKD6OaLCHNSA9DvyfvCudVZWJRs=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=cijE13u1/1WW8s1OFmzT6NUb1SjSC0H9ZIbtFA3wAK6hJE9BRvnn0we/RIzoqMs8mwTVO9gok8oi0TeqMoNKmbtbUc/3bc4i8nvgJMsJ5qpsckmxDPsiGBAyMo+J1huvVX2NywWRn72uWNLnKlKRw7J6ChTkmX5jskGHj2PTM68= 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=bh2smwQ/; 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="bh2smwQ/" Received: by mail-pg1-f180.google.com with SMTP id 41be03b00d2f7-c6dd5b01e14so769179a12.0 for ; Fri, 20 Mar 2026 07:42:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dama-to.20230601.gappssmtp.com; s=20230601; t=1774017731; x=1774622531; 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=rGXsa+qFOM0/tzQzSS33c8kc0mVqkh8Ml/C2OypIk08=; b=bh2smwQ/tGrl5yHrGGZbNYyHFi67UFFscGfjrDg2+A2uFyECYF+WZii3j1O0DTOhdW 0Pi4cD/FB7UmMHC+HkaFwRn93e9dp8T0eJSrN+NvVyiuthkqbVGLtCpCajeqdmLXMxDc J6jIeVQGMyQWNYBuUBiOLYljGkp3h1RRKYHl4HZuEM/EaIPhdg9RoJDLKHaNzByGWhIf 8Ks/5s9J2SGTrnje8ptb+1TuQBCXRMpBzgbhNgkjNA2X/CiOomZqopvMnuQ5OcBerLQx 9khbclzZ1czhwulgPnMuHmF5XrcN6Am6+E463OlqTZUnjUeATi/jSnYY2L7Wj5JGHRz+ ZyDQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774017731; x=1774622531; 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=rGXsa+qFOM0/tzQzSS33c8kc0mVqkh8Ml/C2OypIk08=; b=EbpviJe7tkUEV/YcBJFVlbzFuVm78AQ5cUTRZOVXd747JsfYp74wikqjgfZ0h1DKo5 AHJt72iIZiO4uuVXdr363WSHelUez0H1Fex1mSmbZAR8EmXWYGltjlZfyHCRSYDPStXE yXu/kLSIn2hHFCP/5tmL5jGfewlknXoSoqBFBmdOwGKxWo16ITYs3IfAHLPCAeyIR1EW VTGS0XDwt9zal2eWFJnhbNxune9Uw442q9rPKwqe4jUz6I2WJ5clzlpa5jzE7uPRyZjT ftTuVHVQXtXBpxU1pDTFH3cIi+kylUoiWHI0OsAOqUDMIRUb1yaaop1bGDdhKnx0pFBC nDbw== X-Forwarded-Encrypted: i=1; AJvYcCWvqgIOZAX8JAfm+NWcp+m2j/MFP4wX6oLscCeyCHvvjR7u7cKML3kiQHGEdl9JhLqCzgXIAEcDXpcD6DU=@vger.kernel.org X-Gm-Message-State: AOJu0YxedCXGcLTtxXKx96DaWL5//6F6QwgxyryAtX1WC84SD7msbALx kf0v+I1seiMYHIl1mYZQNerZjBSriicCPadc/rGUTV0id7ZNjS4m/GrkmN52LfzWujc= X-Gm-Gg: ATEYQzxEz/lkb5Z7Sy47o+ONWH6XoVCQ2C/JUWenPkZ8myz2pUbrZWhCB2qEQ1zRuud X8+pDGWm1zIvZ7Loipio9oquWhEzLoL3kj08t2ahbQZkZNynH9rPmnY+ETafdoYNgLFf7dlhSlZ H4UZFj2siaLCQbtFDae3HJHOYHu+NIYzE3rC0e2mj3L65jRPZqyS7EfnEKp8eRbg6yuSuizndXb u9YuIC8A4p4bxDb6dKDHC0cPnHLAJav+YlEWT2FIz3g+YRWXNmwNj0yPe9KU3MyeA4QiCM+4tdm fEOeQI0O8DDqcnowx86pU7pB2nc7neGkrhQ7Rg5LvH6vA7DCTdnggglAllgmRoE5utR5s9pCWiz +Kv+tzBNkDfuTC2rgxb8LG2BYfGgyCDe2cY74INnA877dmmW8mBdZk8Gm45C7msvXWppBQKhKGh 2gL/nIQag+HzeQ0p8= X-Received: by 2002:a05:6a20:3948:b0:398:9fc9:e07c with SMTP id adf61e73a8af0-39bcea31be3mr2935202637.24.1774017731199; Fri, 20 Mar 2026 07:42:11 -0700 (PDT) Received: from localhost ([2a03:2880:2ff:72::]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-82b041059a5sm2844280b3a.53.2026.03.20.07.42.10 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 20 Mar 2026 07:42:10 -0700 (PDT) From: Joe Damato To: netdev@vger.kernel.org, Jakub Kicinski , Andrew Lunn , "David S. Miller" , Eric Dumazet , Paolo Abeni Cc: horms@kernel.org, michael.chan@broadcom.com, pavan.chebbi@broadcom.com, linux-kernel@vger.kernel.org, leon@kernel.org, Joe Damato Subject: [net-next v4 11/12] net: netdevsim: Add support for SW USO Date: Fri, 20 Mar 2026 07:41:32 -0700 Message-ID: <20260320144141.260246-12-joe@dama.to> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260320144141.260246-1-joe@dama.to> References: <20260320144141.260246-1-joe@dama.to> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add support for UDP Segmentation Offloading in software (SW USO). This is helpful for testing when real hardware is not available. A test which uses this codepath will be added in a following commit. Suggested-by: Jakub Kicinski Signed-off-by: Joe Damato Reviewed-by: Pavan Chebbi --- 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 5ec028a00c62..f7dd7692a5d9 100644 --- a/drivers/net/netdevsim/netdev.c +++ b/drivers/net/netdevsim/netdev.c @@ -30,6 +30,7 @@ #include #include #include +#include =20 #include "netdevsim.h" =20 @@ -117,6 +118,98 @@ static int nsim_forward_skb(struct net_device *tx_dev, return nsim_napi_rx(tx_dev, rx_dev, rq, skb); } =20 +static netdev_tx_t nsim_uso_segment_xmit(struct net_device *dev, + struct sk_buff *skb) +{ + unsigned int hdr_len, mss, total_payload, num_segs; + struct netdevsim *ns =3D netdev_priv(dev); + struct net_device *peer_dev; + unsigned int total_len =3D 0; + struct netdevsim *peer_ns; + struct nsim_rq *rq; + struct tso_t tso; + int i, rxq; + + hdr_len =3D tso_start(skb, &tso); + mss =3D skb_shinfo(skb)->gso_size; + total_payload =3D skb->len - hdr_len; + num_segs =3D DIV_ROUND_UP(total_payload, mss); + + udp_hdr(skb)->check =3D 0; + if (!tso.ipv6) + ip_hdr(skb)->check =3D 0; + + rcu_read_lock(); + peer_ns =3D rcu_dereference(ns->peer); + if (!peer_ns) + goto out_drop_free; + + peer_dev =3D peer_ns->netdev; + rxq =3D skb_get_queue_mapping(skb); + if (rxq >=3D peer_dev->num_rx_queues) + rxq =3D rxq % peer_dev->num_rx_queues; + rq =3D peer_ns->rq[rxq]; + + for (i =3D 0; i < num_segs; i++) { + unsigned int seg_payload =3D min_t(unsigned int, mss, + total_payload); + bool last =3D (i =3D=3D num_segs - 1); + unsigned int seg_remaining; + struct sk_buff *seg; + + seg =3D alloc_skb(hdr_len + seg_payload, GFP_ATOMIC); + if (!seg) + break; + + seg->dev =3D dev; + + tso_build_hdr(skb, skb_put(seg, hdr_len), &tso, + seg_payload, last); + + if (!tso.ipv6) { + unsigned int nh_off =3D skb_network_offset(skb); + struct iphdr *iph; + + iph =3D (struct iphdr *)(seg->data + nh_off); + iph->check =3D ip_fast_csum(iph, iph->ihl); + } + + seg_remaining =3D seg_payload; + while (seg_remaining > 0) { + unsigned int chunk =3D min_t(unsigned int, tso.size, + seg_remaining); + + memcpy(skb_put(seg, chunk), tso.data, chunk); + tso_build_data(skb, &tso, chunk); + seg_remaining -=3D chunk; + } + + total_payload -=3D seg_payload; + + seg->ip_summed =3D CHECKSUM_UNNECESSARY; + + if (nsim_forward_skb(dev, peer_dev, seg, rq, NULL) =3D=3D NET_RX_DROP) + continue; + + total_len +=3D hdr_len + seg_payload; + } + + if (!hrtimer_active(&rq->napi_timer)) + hrtimer_start(&rq->napi_timer, us_to_ktime(5), + HRTIMER_MODE_REL); + + rcu_read_unlock(); + dev_kfree_skb(skb); + dev_dstats_tx_add(dev, total_len); + return NETDEV_TX_OK; + +out_drop_free: + dev_kfree_skb(skb); + rcu_read_unlock(); + dev_dstats_tx_dropped(dev); + return NETDEV_TX_OK; +} + static netdev_tx_t nsim_start_xmit(struct sk_buff *skb, struct net_device = *dev) { struct netdevsim *ns =3D netdev_priv(dev); @@ -129,6 +222,10 @@ static netdev_tx_t nsim_start_xmit(struct sk_buff *skb= , struct net_device *dev) int rxq; int dr; =20 + if (skb_is_gso(skb) && + (skb_shinfo(skb)->gso_type & SKB_GSO_UDP_L4)) + return nsim_uso_segment_xmit(dev, skb); + rcu_read_lock(); if (!nsim_ipsec_tx(ns, skb)) goto out_drop_any; @@ -986,7 +1083,8 @@ static void nsim_setup(struct net_device *dev) NETIF_F_HW_CSUM | NETIF_F_LRO | NETIF_F_TSO | - NETIF_F_LOOPBACK; + NETIF_F_LOOPBACK | + NETIF_F_GSO_UDP_L4; dev->pcpu_stat_type =3D NETDEV_PCPU_STAT_DSTATS; dev->max_mtu =3D ETH_MAX_MTU; dev->xdp_features =3D NETDEV_XDP_ACT_BASIC | NETDEV_XDP_ACT_HW_OFFLOAD; --=20 2.52.0 From nobody Sat Apr 4 07:49:32 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 BA44E3CD8DF for ; Fri, 20 Mar 2026 14:42:13 +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=1774017735; cv=none; b=st+gApyCUP9JwrW3p/KiRSv0UoOKjg9IgsMUFReEXc4XLikANSnJPnfkfpsIzU17YPRGNTZPw3zU8BuYShqa6jIo4idENNvOIfB9NU2/pRajXzs0ftJO/hjx6tkUZjMZuHDYx3xXdJRThvU74WyE1nNlBX49OADd7xZba9zEAs4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774017735; c=relaxed/simple; bh=gZOdfjY1VvR5IwPQ4DlYdoa0l2KwYEyHRE+QSQfPXrg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=rQhzvzPsioZuPNIaN5WHSjxGWcTMNtRoIK605k3Rw7wMSQNijHCf6LVHNuXDWFgAdddgYhfmL+z/OsF9ay+Dnx95rxhm4lNSq2qzIJ/E6qm4qQf48yMLFcfixlNsWGPte9UgbEhcFnFSu9hhzUUP4e+K+vOkN3wcaomyPiNiLuM= 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=S6h+IxUc; 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="S6h+IxUc" Received: by mail-pj1-f44.google.com with SMTP id 98e67ed59e1d1-354a18c48b5so1529607a91.1 for ; Fri, 20 Mar 2026 07:42:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dama-to.20230601.gappssmtp.com; s=20230601; t=1774017733; x=1774622533; 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=mnLqUf8eREw2cxnnLAXHgQIdPczp+LnKWCZ2auovkBA=; b=S6h+IxUcDve7CSroRjQdoXgfJSHNJPrX0b2pIxo84kxe3092NVaQB59jjcU4Xkjp0a vX5ULqbDlLDCUe1i1GsP5JG2O4/CeJ01QJqvTmq9xFKtgVc3aKOrt38w4jnq34rUjT65 GVuk9LF0eW1s5sZBtzd6l6AugFUAeS0xlvR7d98JMSOZJ/86cM65JwZC5HLW9AhsoM5y AfWMmg2H8GoE4efGQEig2JWoSkeokRtKnmWaKhJlhooEuquadPQ3AH/H+1hOKNqqZCJw GpiP/AB68pfW+AZ32xrOfyeoIOnHPoWvfEuc2toCRBgpOeGLJBTBMM5y1HigL6uuw/f9 UJeg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774017733; x=1774622533; 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=mnLqUf8eREw2cxnnLAXHgQIdPczp+LnKWCZ2auovkBA=; b=iYiTqEz+MWjLV/Dzr/BcAaZpUfD7MO5iXM0/sGyDzV/E18IGoaksi2QFfkKWonSLqv umsze8d908931DMKUB7pwx/Q/w+dj87sm95PRiORTzIs5Uf2vmydajUM+bJ18vmLxpmT pyxdFyYZbxC9dTMqCbfYBK1c6QHNX1i8MNgeHGvs9WQ7sj8ABzM8z8PxOMwOfeiOw7fw gBnIoQ9mVoO1CYaDS/2Lu4X/CkoC0QiVBsQx4HWUBvLUA28RswgTPhuTpUJ0Z1Bz6/Dc en6Gk6/e/xcMdA3JU4T4lxZho0MDy/UW9/ln62+QKNhHZ7rqaxJy7DQwRv8TDUJMpauJ FCVg== X-Forwarded-Encrypted: i=1; AJvYcCXDeNrZFuJXR4EeTYTcxyZWgUgltrLKi+9+D0omUBV3UhdATk5SrGFci8brtQ+0jmbHrQkyCVrRTw+61P4=@vger.kernel.org X-Gm-Message-State: AOJu0YwG8wbfY42h25qn6o+cb12/+YKeojlAH0irC/Piy5/4w/Skqz4d xcaszEjAW4FAe9ADuOEbys8+3J0zZhDtahLIJyLLfQuMtA/HBZLpe3tMMicc4JQgRqo= X-Gm-Gg: ATEYQzyzer5Rj3SCI7Cu/uFTMOOFh18xDsdmrc5/KszT7KizGlgrQlUlr+qG8Pn/TwS lVeP8CYwPJsa3PuPNaL1AM4UnugiND/W+OcaGRBn19/gCL2K6S1/DhMnKl6lmsrQ59Kfzt9Gd2k zkD1xCFYpL4xfNgXFO7aWTKsbw3si5zO0qUEN7AjKnC5BnMrK13tULHnxyM7ZvPPdsXWwGHYupO m4OZB5K2f/YbC6nLWzgDUtu7H3VEwetmisHRUIIe8jRVKwbpjeTCnDuE0Q+bQzWNgltPpJ5jjs7 tlI3QL1GbvUPpIyR7PxJuqZ1mvWZRIkDRmW7NF+ea9F8tuIVxS7smHMbp1+v71MBzr07bbIMC3X Nji427TjJPJp1t4W5koFCfXxMTCmon5owubAd5m5OA2osTe6J5K5OJUWHJGFAuC8eXgEbmkqeYN G5ShbC X-Received: by 2002:a17:90b:5584:b0:359:8e1c:53e with SMTP id 98e67ed59e1d1-35bd2d3b94emr2258575a91.31.1774017733134; Fri, 20 Mar 2026 07:42:13 -0700 (PDT) Received: from localhost ([2a03:2880:2ff:72::]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-35bc610c1efsm5621687a91.14.2026.03.20.07.42.12 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 20 Mar 2026 07:42:12 -0700 (PDT) From: Joe Damato To: netdev@vger.kernel.org, Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Shuah Khan Cc: horms@kernel.org, michael.chan@broadcom.com, pavan.chebbi@broadcom.com, linux-kernel@vger.kernel.org, leon@kernel.org, Joe Damato , linux-kselftest@vger.kernel.org Subject: [net-next v4 12/12] selftests: drv-net: Add USO test Date: Fri, 20 Mar 2026 07:41:33 -0700 Message-ID: <20260320144141.260246-13-joe@dama.to> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260320144141.260246-1-joe@dama.to> References: <20260320144141.260246-1-joe@dama.to> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add a simple test for USO. Can be used with netdevsim or real hardware. Tests both ipv4 and ipv6 with several full segments and a partial segment. Suggested-by: Jakub Kicinski Signed-off-by: Joe Damato Reviewed-by: Pavan Chebbi --- 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 8154d6d429d3..800065fe443f 100644 --- a/tools/testing/selftests/drivers/net/Makefile +++ b/tools/testing/selftests/drivers/net/Makefile @@ -22,6 +22,7 @@ TEST_PROGS :=3D \ ring_reconfig.py \ shaper.py \ stats.py \ + uso.py \ xdp.py \ # end of TEST_PROGS =20 diff --git a/tools/testing/selftests/drivers/net/uso.py b/tools/testing/sel= ftests/drivers/net/uso.py new file mode 100755 index 000000000000..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