From nobody Tue Dec 2 02:44:08 2025 Received: from CO1PR03CU002.outbound.protection.outlook.com (mail-westus2azon11010051.outbound.protection.outlook.com [52.101.46.51]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 131DF3590B1; Tue, 18 Nov 2025 13:55:58 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.46.51 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763474162; cv=fail; b=lIom57H+pxBbITnZbkW61at18Ez5wy7NcxYeteFwj8Ho88ZTIgzvWCV+KUiYs3XiMiGdQ1uSCcxph0bCVFje7WVCHikwNfLmoETRVvvFbxLp2TbGsEvZ1sy0pJOSvdtxjU/gsfGzSQqC1dq0yrDTyFKyVU1JwREjbrJS0trQH+U= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763474162; c=relaxed/simple; bh=yvI/GVdApA2zfFZEdw/1ONakagj2mqLTklAkTFe2Vt0=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=Gh41PfFD7P44bTaSH3X3Ho2QH5/zW1ybK8LV8VkyZArvStJBEVaS3YWz0et/iEhE8aytAxQNlNMfyLvk7aRNm9Ie3O1noR/GTgqACDFUp6DqzTC83Z0VWBfClWytH2hDQIM2tWGBd2NTWyxLjNTPe17K4jrQ0s6URtOMvk+iuz0= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=ti.com; spf=pass smtp.mailfrom=ti.com; dkim=pass (1024-bit key) header.d=ti.com header.i=@ti.com header.b=v76OkzuX; arc=fail smtp.client-ip=52.101.46.51 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=ti.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=ti.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=ti.com header.i=@ti.com header.b="v76OkzuX" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=nC73vdQDy8azaXUrPCPnMWyEkzWUkn5VEphVAiG4OrxrCqGydV1mRldgpoGKdqiDEhBMkZm3P/nOtuZ1t0AuV88jdcdVPWvIVb/673umNSzUSpEvw2SO3VWN8vEScGE1fAnZB9mB8Lb31SzkRWiyqdjss0UzJAlaH6LxKv6+8EQ8l3QN5dA50z9th1JPwJO8CjxoitTutlKsIBPIQEUU/7RFGPyGh5FbftkM3f9vUNRb4hdnz1St1NVhuoPHr3zQ65D/vilBGH/q56WiZlzA1hDMnKEqQ3YE21biwfyCQHTyZPmoGsm3Vxy1lyjqpQZSp9fAoBTz89u6iOaqboAYVg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=oUL6mUBmyFLtF8BBUUM3B/wi8ahS+qpSyhNahi34T9Y=; b=rQlHySzfzNcMPzJnfBamPHMW5d+KIPIwp4saovpARyI8bUy07TMFv7v1NNZ5dCU9nCtHrx7jbE9U+6oAgQGhQ9Kx7b0W1X2Rxepl4vGJSHkBNS8BQio/5AjPk2ITIKgHwu8HePv9PoqUL9k94rmm/vzllBauH2duypVJNeA75Rd2x3fXfjFjmXV/hg9GSPQHdKlYTSTPpLquSdbZ3bO6XDUYb6IgSRl4p3YJV6cF3nmjn/AZmWJM6OSvpnP0iO8lttTGoamDH8P3FO944LrWHrFiTcir31jK9Mtf5631JdRCMqmx6Ka1AlAkGBKKpE3XWPWcbgDp+W5OvDPBVQDvDg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 198.47.23.194) smtp.rcpttodomain=kernel.org smtp.mailfrom=ti.com; dmarc=pass (p=quarantine sp=none pct=100) action=none header.from=ti.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ti.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=oUL6mUBmyFLtF8BBUUM3B/wi8ahS+qpSyhNahi34T9Y=; b=v76OkzuXDTYdwTNnHgl/gDkj8k4v2qolZ+ISQQjpfJRxxleGzAuldRRBgW6hdVL3myKKNxCSfrI83Up/DM2r2ZxM4w2Dg5DHePMM7CcHig4wOw8OomylxN1Fdgx0b/YETN25X7gWePdJ8zBHRG6feIZeJLQhLKeJKnlpYWbyVpo= Received: from DS7PR03CA0343.namprd03.prod.outlook.com (2603:10b6:8:55::17) by IA1PR10MB5969.namprd10.prod.outlook.com (2603:10b6:208:3ef::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9320.19; Tue, 18 Nov 2025 13:55:55 +0000 Received: from DS1PEPF00017098.namprd05.prod.outlook.com (2603:10b6:8:55:cafe::e8) by DS7PR03CA0343.outlook.office365.com (2603:10b6:8:55::17) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.9320.22 via Frontend Transport; Tue, 18 Nov 2025 13:55:55 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 198.47.23.194) smtp.mailfrom=ti.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=ti.com; Received-SPF: Pass (protection.outlook.com: domain of ti.com designates 198.47.23.194 as permitted sender) receiver=protection.outlook.com; client-ip=198.47.23.194; helo=lewvzet200.ext.ti.com; pr=C Received: from lewvzet200.ext.ti.com (198.47.23.194) by DS1PEPF00017098.mail.protection.outlook.com (10.167.18.102) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9343.9 via Frontend Transport; Tue, 18 Nov 2025 13:55:54 +0000 Received: from DLEE208.ent.ti.com (157.170.170.97) by lewvzet200.ext.ti.com (10.4.14.103) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.20; Tue, 18 Nov 2025 07:55:51 -0600 Received: from DLEE208.ent.ti.com (157.170.170.97) by DLEE208.ent.ti.com (157.170.170.97) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.20; Tue, 18 Nov 2025 07:55:50 -0600 Received: from lelvem-mr05.itg.ti.com (10.180.75.9) by DLEE208.ent.ti.com (157.170.170.97) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.20 via Frontend Transport; Tue, 18 Nov 2025 07:55:50 -0600 Received: from lelv0854.itg.ti.com (lelv0854.itg.ti.com [10.181.64.140]) by lelvem-mr05.itg.ti.com (8.18.1/8.18.1) with ESMTP id 5AIDtoeo152506; Tue, 18 Nov 2025 07:55:50 -0600 Received: from localhost (meghana-pc.dhcp.ti.com [10.24.69.13] (may be forged)) by lelv0854.itg.ti.com (8.14.7/8.14.7) with ESMTP id 5AIDtnxt004172; Tue, 18 Nov 2025 07:55:50 -0600 From: Meghana Malladi To: , , , , , , , , , , , , , , , , CC: , , , , , , , , Vignesh Raghavendra , Roger Quadros , Subject: [PATCH net-next v6 1/6] net: ti: icssg-prueth: Add functions to create and destroy Rx/Tx queues Date: Tue, 18 Nov 2025 19:25:37 +0530 Message-ID: <20251118135542.380574-2-m-malladi@ti.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20251118135542.380574-1-m-malladi@ti.com> References: <20251118135542.380574-1-m-malladi@ti.com> 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 X-C2ProcessedOrg: 333ef613-75bf-4e12-a4b1-8e3623f5dcea X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DS1PEPF00017098:EE_|IA1PR10MB5969:EE_ X-MS-Office365-Filtering-Correlation-Id: 8be08d59-908d-46f9-01da-08de26aa3184 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|36860700013|82310400026|376014|1800799024|7416014|921020; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?zodVXDU6qRDrXYRnerFxInlnPFwDA/ytn34shZ0wG3SLb/6L9uYOhSQZSQKs?= =?us-ascii?Q?sREho4NKVeSoBCsdVIUFXWuu2n6/4YIBGDek94BXix03IVd9JL4Km/jJ0Yx1?= =?us-ascii?Q?aMTFk53BidyMTLNJb+gvfR1HG4J8DwoBNDor+/kgwOyZecJ//5wPpCLW7GWO?= =?us-ascii?Q?CwKBv/qgUajHd0FtsA/qYUSUkhYaX0vk3tOCDiGUltXAfyCFpJHNsMyb1SLL?= =?us-ascii?Q?Y+HmKFLOrqujqOPDrF1X/1gx0g74f7PxmX3ofxve9Z1AvbqtdGUfklfw5wGQ?= =?us-ascii?Q?4xo5uzab0QWV0fe+vLfAUdgZ5q0OxPCZ/xUy+DUs/E70AkJtEvc0dwNq4RQ7?= =?us-ascii?Q?Xhf7Wq5OjGskdR+DSorFVxuEvw4wd289f92CVUTVpc+m0PaLj3nDcSNC28IF?= =?us-ascii?Q?8+VNOcFJbPc9GeMTq7SifiQDhg+nlSlzJdRyrf2yajgjINKUuB/KioTRpVeX?= =?us-ascii?Q?sf9h+BRZkxRwwHjmXh/ucaKSHlc/v3V6Hn1GlkJIx4Ip/dMKYdO9N4lhrXJm?= =?us-ascii?Q?RecoDzXhjVd2Q87ynxSXuNjj7a0mQSkeAe47VAIoIBLLk1Paw89+p2Chs3q4?= =?us-ascii?Q?n2qV9yMoW37nW12I8BFcDI7waDIP1uMRtkmZi3nbVM5xps2W7XLgsMu1V9Ka?= =?us-ascii?Q?Oqa178y0MEvLBDrw9D1Dq7llsVvUAFCZdXH+/cfsC+nuYD4Po7lxjfcMzqXw?= =?us-ascii?Q?61+EbgKCKe2bnNYiIpjb42Sb8G5M3/kVKGzbj7ymbR/jEghY+1FDTLwdHCov?= =?us-ascii?Q?zcnCdNv0E0JViXgZ2Lzk0IUdU6IJ1IJQp7w2vMoo7EOS/rCRmpl/pul39Lhz?= =?us-ascii?Q?bpGHrNIY9qA6ClxMT+GVNt9NIv0hYic/Oo3wGQswohGjGumzHC2n1hotDs0P?= =?us-ascii?Q?+gagqQmC7VeMl4S7W34nil4l1WD/Zp/olW7bviNStW8ek9ZWG5lXiTdWK1Jr?= =?us-ascii?Q?xOwzYxfuHqmUrszdtGw6GQ/d6q+91WjsgvTTzVs2zOGhAqp4tT9er2hYqcnM?= =?us-ascii?Q?VbrDVsmnHCHVmV8jw9r3slOH79Yxp+oEM04hdd21nIQ3wgp6M3YxMSn+VszO?= =?us-ascii?Q?HhBhMy8kbOURVjJ1CrUWBm4SdVpi9Uokh8CnCyqURq+jn/g6cIzwt5Yx/9Lt?= =?us-ascii?Q?McxxH3QnBFVhYEC1wjvb5KFyZutJ0ulTYCEznKsITwyW0XVtcxiBjDGXF1Tr?= =?us-ascii?Q?URVKuAvrPCxdLkKBtjf/Kk18xmsDgTEmXx8RINT/NKTtRDOJI+6jTEXSN0qG?= =?us-ascii?Q?LNeZYQfVUxXvAAZ9+7qVexv1s9sdCiT058+h9BdlbCSy0EKhwz+G68UjZORP?= =?us-ascii?Q?wCH+jNjauVr1MyNUlfdowYhDf+R8s3MIVvsPJg0HUB2lhIXAZRZfortg2coK?= =?us-ascii?Q?8q86nckCpCAPd3F7QKyW/kPt/4c0tDCQjxInfMFOg1t+VRSeg1uCfiIG6wb9?= =?us-ascii?Q?4kme1qebLjr2s09s4I0R8rSWDxxO8kwGAiBYpNQxAxRinyOcr5lk47HktQ/t?= =?us-ascii?Q?pGs2Jb/KT8ZB/XIEEABQVkp4uh3EGBrXhbULDkSw8MZX+fgCEdAw85SRDPPs?= =?us-ascii?Q?wP+vC5wpnhVuoREAytr65mUhgjZn9Ya57/Xz7VfZ?= X-Forefront-Antispam-Report: CIP:198.47.23.194;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:lewvzet200.ext.ti.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230040)(36860700013)(82310400026)(376014)(1800799024)(7416014)(921020);DIR:OUT;SFP:1101; X-OriginatorOrg: ti.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Nov 2025 13:55:54.9450 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 8be08d59-908d-46f9-01da-08de26aa3184 X-MS-Exchange-CrossTenant-Id: e5b49634-450b-4709-8abb-1e2b19b982b7 X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=e5b49634-450b-4709-8abb-1e2b19b982b7;Ip=[198.47.23.194];Helo=[lewvzet200.ext.ti.com] X-MS-Exchange-CrossTenant-AuthSource: DS1PEPF00017098.namprd05.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: IA1PR10MB5969 Content-Type: text/plain; charset="utf-8" Each port for a given ICSSG instance has their own set of Tx and Rx queues. Add functions to create and destroy these queues, which will be further used while performing ndo_bpf operations to set up XSK Tx/Rx queues for a given port. In the destroy Rx queue sequence add teardown wait to ensure that all the descriptors including the TDCM (teardown completion marker) have been serviced and freed to avoid any sort of descriptor leaks. Reviewed-by: Jacob Keller Signed-off-by: Meghana Malladi --- drivers/net/ethernet/ti/icssg/icssg_common.c | 10 +- drivers/net/ethernet/ti/icssg/icssg_prueth.c | 177 ++++++++++++------- drivers/net/ethernet/ti/icssg/icssg_prueth.h | 2 + 3 files changed, 127 insertions(+), 62 deletions(-) diff --git a/drivers/net/ethernet/ti/icssg/icssg_common.c b/drivers/net/eth= ernet/ti/icssg/icssg_common.c index 0eed29d6187a..94021751b6b7 100644 --- a/drivers/net/ethernet/ti/icssg/icssg_common.c +++ b/drivers/net/ethernet/ti/icssg/icssg_common.c @@ -719,8 +719,10 @@ static int emac_rx_packet(struct prueth_emac *emac, u3= 2 flow_id, u32 *xdp_state) return ret; } =20 - if (cppi5_desc_is_tdcm(desc_dma)) /* Teardown ? */ + if (cppi5_desc_is_tdcm(desc_dma)) { + complete(&emac->tdown_complete); return 0; + } =20 desc_rx =3D k3_cppi_desc_pool_dma2virt(rx_chn->desc_pool, desc_dma); swdata =3D cppi5_hdesc_get_swdata(desc_rx); @@ -804,7 +806,7 @@ static int emac_rx_packet(struct prueth_emac *emac, u32= flow_id, u32 *xdp_state) return ret; } =20 -static void prueth_rx_cleanup(void *data, dma_addr_t desc_dma) +void prueth_rx_cleanup(void *data, dma_addr_t desc_dma) { struct prueth_rx_chn *rx_chn =3D data; struct cppi5_host_desc_t *desc_rx; @@ -822,6 +824,7 @@ static void prueth_rx_cleanup(void *data, dma_addr_t de= sc_dma) =20 k3_cppi_desc_pool_free(rx_chn->desc_pool, desc_rx); } +EXPORT_SYMBOL_GPL(prueth_rx_cleanup); =20 static int prueth_tx_ts_cookie_get(struct prueth_emac *emac) { @@ -1025,7 +1028,7 @@ enum netdev_tx icssg_ndo_start_xmit(struct sk_buff *s= kb, struct net_device *ndev } EXPORT_SYMBOL_GPL(icssg_ndo_start_xmit); =20 -static void prueth_tx_cleanup(void *data, dma_addr_t desc_dma) +void prueth_tx_cleanup(void *data, dma_addr_t desc_dma) { struct prueth_tx_chn *tx_chn =3D data; struct cppi5_host_desc_t *desc_tx; @@ -1051,6 +1054,7 @@ static void prueth_tx_cleanup(void *data, dma_addr_t = desc_dma) =20 prueth_xmit_free(tx_chn, desc_tx); } +EXPORT_SYMBOL_GPL(prueth_tx_cleanup); =20 irqreturn_t prueth_rx_irq(int irq, void *dev_id) { diff --git a/drivers/net/ethernet/ti/icssg/icssg_prueth.c b/drivers/net/eth= ernet/ti/icssg/icssg_prueth.c index 57a7d1ceab08..b66ffbfb499c 100644 --- a/drivers/net/ethernet/ti/icssg/icssg_prueth.c +++ b/drivers/net/ethernet/ti/icssg/icssg_prueth.c @@ -735,6 +735,114 @@ static int icssg_update_vlan_mcast(struct net_device = *vdev, int vid, return 0; } =20 +static void prueth_destroy_txq(struct prueth_emac *emac) +{ + int ret, i; + + atomic_set(&emac->tdown_cnt, emac->tx_ch_num); + /* ensure new tdown_cnt value is visible */ + smp_mb__after_atomic(); + /* tear down and disable UDMA channels */ + reinit_completion(&emac->tdown_complete); + for (i =3D 0; i < emac->tx_ch_num; i++) + k3_udma_glue_tdown_tx_chn(emac->tx_chns[i].tx_chn, false); + + ret =3D wait_for_completion_timeout(&emac->tdown_complete, + msecs_to_jiffies(1000)); + if (!ret) + netdev_err(emac->ndev, "tx teardown timeout\n"); + + for (i =3D 0; i < emac->tx_ch_num; i++) { + napi_disable(&emac->tx_chns[i].napi_tx); + hrtimer_cancel(&emac->tx_chns[i].tx_hrtimer); + k3_udma_glue_reset_tx_chn(emac->tx_chns[i].tx_chn, + &emac->tx_chns[i], + prueth_tx_cleanup); + k3_udma_glue_disable_tx_chn(emac->tx_chns[i].tx_chn); + } +} + +static void prueth_destroy_rxq(struct prueth_emac *emac) +{ + int i, ret; + + /* tear down and disable UDMA channels */ + reinit_completion(&emac->tdown_complete); + k3_udma_glue_tdown_rx_chn(emac->rx_chns.rx_chn, true); + + /* When RX DMA Channel Teardown is initiated, it will result in an + * interrupt and a Teardown Completion Marker (TDCM) is queued into + * the RX Completion queue. Acknowledging the interrupt involves + * popping the TDCM descriptor from the RX Completion queue via the + * RX NAPI Handler. To avoid timing out when waiting for the TDCM to + * be popped, schedule the RX NAPI handler to run immediately. + */ + if (!napi_if_scheduled_mark_missed(&emac->napi_rx)) { + if (napi_schedule_prep(&emac->napi_rx)) + __napi_schedule(&emac->napi_rx); + } + + ret =3D wait_for_completion_timeout(&emac->tdown_complete, + msecs_to_jiffies(1000)); + if (!ret) + netdev_err(emac->ndev, "rx teardown timeout\n"); + + for (i =3D 0; i < PRUETH_MAX_RX_FLOWS; i++) { + napi_disable(&emac->napi_rx); + hrtimer_cancel(&emac->rx_hrtimer); + k3_udma_glue_reset_rx_chn(emac->rx_chns.rx_chn, i, + &emac->rx_chns, + prueth_rx_cleanup); + } + + prueth_destroy_xdp_rxqs(emac); + k3_udma_glue_disable_rx_chn(emac->rx_chns.rx_chn); +} + +static int prueth_create_txq(struct prueth_emac *emac) +{ + int ret, i; + + for (i =3D 0; i < emac->tx_ch_num; i++) { + ret =3D k3_udma_glue_enable_tx_chn(emac->tx_chns[i].tx_chn); + if (ret) + goto reset_tx_chan; + napi_enable(&emac->tx_chns[i].napi_tx); + } + return 0; + +reset_tx_chan: + /* Since interface is not yet up, there is wouldn't be + * any SKB for completion. So set false to free_skb + */ + prueth_reset_tx_chan(emac, i, false); + return ret; +} + +static int prueth_create_rxq(struct prueth_emac *emac) +{ + int ret; + + ret =3D prueth_prepare_rx_chan(emac, &emac->rx_chns, PRUETH_MAX_PKT_SIZE); + if (ret) + return ret; + + ret =3D k3_udma_glue_enable_rx_chn(emac->rx_chns.rx_chn); + if (ret) + goto reset_rx_chn; + + ret =3D prueth_create_xdp_rxqs(emac); + if (ret) + goto reset_rx_chn; + + napi_enable(&emac->napi_rx); + return 0; + +reset_rx_chn: + prueth_reset_rx_chan(&emac->rx_chns, PRUETH_MAX_RX_FLOWS, false); + return ret; +} + /** * emac_ndo_open - EMAC device open * @ndev: network adapter device @@ -746,7 +854,7 @@ static int icssg_update_vlan_mcast(struct net_device *v= dev, int vid, static int emac_ndo_open(struct net_device *ndev) { struct prueth_emac *emac =3D netdev_priv(ndev); - int ret, i, num_data_chn =3D emac->tx_ch_num; + int ret, num_data_chn =3D emac->tx_ch_num; struct icssg_flow_cfg __iomem *flow_cfg; struct prueth *prueth =3D emac->prueth; int slice =3D prueth_emac_slice(emac); @@ -819,28 +927,13 @@ static int emac_ndo_open(struct net_device *ndev) goto stop; =20 /* Prepare RX */ - ret =3D prueth_prepare_rx_chan(emac, &emac->rx_chns, PRUETH_MAX_PKT_SIZE); + ret =3D prueth_create_rxq(emac); if (ret) goto free_tx_ts_irq; =20 - ret =3D prueth_create_xdp_rxqs(emac); - if (ret) - goto reset_rx_chn; - - ret =3D k3_udma_glue_enable_rx_chn(emac->rx_chns.rx_chn); + ret =3D prueth_create_txq(emac); if (ret) - goto destroy_xdp_rxqs; - - for (i =3D 0; i < emac->tx_ch_num; i++) { - ret =3D k3_udma_glue_enable_tx_chn(emac->tx_chns[i].tx_chn); - if (ret) - goto reset_tx_chan; - } - - /* Enable NAPI in Tx and Rx direction */ - for (i =3D 0; i < emac->tx_ch_num; i++) - napi_enable(&emac->tx_chns[i].napi_tx); - napi_enable(&emac->napi_rx); + goto destroy_rxq; =20 /* start PHY */ phy_start(ndev->phydev); @@ -851,15 +944,8 @@ static int emac_ndo_open(struct net_device *ndev) =20 return 0; =20 -reset_tx_chan: - /* Since interface is not yet up, there is wouldn't be - * any SKB for completion. So set false to free_skb - */ - prueth_reset_tx_chan(emac, i, false); -destroy_xdp_rxqs: - prueth_destroy_xdp_rxqs(emac); -reset_rx_chn: - prueth_reset_rx_chan(&emac->rx_chns, max_rx_flows, false); +destroy_rxq: + prueth_destroy_rxq(emac); free_tx_ts_irq: free_irq(emac->tx_ts_irq, emac); stop: @@ -889,9 +975,6 @@ static int emac_ndo_stop(struct net_device *ndev) { struct prueth_emac *emac =3D netdev_priv(ndev); struct prueth *prueth =3D emac->prueth; - int rx_flow =3D PRUETH_RX_FLOW_DATA; - int max_rx_flows; - int ret, i; =20 /* inform the upper layers. */ netif_tx_stop_all_queues(ndev); @@ -905,32 +988,8 @@ static int emac_ndo_stop(struct net_device *ndev) else __dev_mc_unsync(ndev, icssg_prueth_del_mcast); =20 - atomic_set(&emac->tdown_cnt, emac->tx_ch_num); - /* ensure new tdown_cnt value is visible */ - smp_mb__after_atomic(); - /* tear down and disable UDMA channels */ - reinit_completion(&emac->tdown_complete); - for (i =3D 0; i < emac->tx_ch_num; i++) - k3_udma_glue_tdown_tx_chn(emac->tx_chns[i].tx_chn, false); - - ret =3D wait_for_completion_timeout(&emac->tdown_complete, - msecs_to_jiffies(1000)); - if (!ret) - netdev_err(ndev, "tx teardown timeout\n"); - - prueth_reset_tx_chan(emac, emac->tx_ch_num, true); - for (i =3D 0; i < emac->tx_ch_num; i++) { - napi_disable(&emac->tx_chns[i].napi_tx); - hrtimer_cancel(&emac->tx_chns[i].tx_hrtimer); - } - - max_rx_flows =3D PRUETH_MAX_RX_FLOWS; - k3_udma_glue_tdown_rx_chn(emac->rx_chns.rx_chn, true); - - prueth_reset_rx_chan(&emac->rx_chns, max_rx_flows, true); - prueth_destroy_xdp_rxqs(emac); - napi_disable(&emac->napi_rx); - hrtimer_cancel(&emac->rx_hrtimer); + prueth_destroy_txq(emac); + prueth_destroy_rxq(emac); =20 cancel_work_sync(&emac->rx_mode_work); =20 @@ -943,10 +1002,10 @@ static int emac_ndo_stop(struct net_device *ndev) =20 free_irq(emac->tx_ts_irq, emac); =20 - free_irq(emac->rx_chns.irq[rx_flow], emac); + free_irq(emac->rx_chns.irq[PRUETH_RX_FLOW_DATA], emac); prueth_ndev_del_tx_napi(emac, emac->tx_ch_num); =20 - prueth_cleanup_rx_chns(emac, &emac->rx_chns, max_rx_flows); + prueth_cleanup_rx_chns(emac, &emac->rx_chns, PRUETH_MAX_RX_FLOWS); prueth_cleanup_tx_chns(emac); =20 prueth->emacs_initialized--; diff --git a/drivers/net/ethernet/ti/icssg/icssg_prueth.h b/drivers/net/eth= ernet/ti/icssg/icssg_prueth.h index f0fa9688d9a0..5cc90b66035a 100644 --- a/drivers/net/ethernet/ti/icssg/icssg_prueth.h +++ b/drivers/net/ethernet/ti/icssg/icssg_prueth.h @@ -501,5 +501,7 @@ u32 emac_xmit_xdp_frame(struct prueth_emac *emac, struct xdp_frame *xdpf, struct page *page, unsigned int q_idx); +void prueth_rx_cleanup(void *data, dma_addr_t desc_dma); +void prueth_tx_cleanup(void *data, dma_addr_t desc_dma); =20 #endif /* __NET_TI_ICSSG_PRUETH_H */ --=20 2.43.0 From nobody Tue Dec 2 02:44:08 2025 Received: from SN4PR0501CU005.outbound.protection.outlook.com (mail-southcentralusazon11011067.outbound.protection.outlook.com [40.93.194.67]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2E2CD3590B9; Tue, 18 Nov 2025 13:56:00 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.93.194.67 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763474163; cv=fail; b=hQPZOdw21m3zgFiAcdvnb+qBp0D6PoIICS9EWd6ZxHLTRpK34v/D2TGecRv1WbUxCcQowgNySJ8V9Pp9fapI+qJcFeEFRLBOiBUTMX0jN1Py29260/pMX/83CsaoaSZp/YiGkm6BXo3B+qdxlEw6bV8HnghZVMtPW4a7bFS1TnY= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763474163; c=relaxed/simple; bh=mxfk3l7rfYrPE2SKFeSigWYk5cbie6tj4lSLRGbHHuo=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=PMeE7bl0MOcTSz7dfaUvudc7qbnOUeuw7ZzT/Nl/oFoyeBBXY++Fe+GwzjK+aa/nW6ncelOSk0ekOlCDpnORN0f74h4avIF2sRnQmkTabxZypOpSdqiFRRAsYjAoBSqW8DpSKdq1d79/1BkuGavU3mn7yP15g+Ej2+9cscOoN98= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=ti.com; spf=pass smtp.mailfrom=ti.com; dkim=pass (1024-bit key) header.d=ti.com header.i=@ti.com header.b=uEfkUcM7; arc=fail smtp.client-ip=40.93.194.67 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=ti.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=ti.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=ti.com header.i=@ti.com header.b="uEfkUcM7" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=ZySycKL/XPMld+7lSIC8viBfCndhke7kn49G18iXBWzVuqy1ASV9lqt0UiC9WFLsM/8l/tMG2UyjRatqQViu4h6pAJbrJjE2VygKV2QD08J0YrxI3orkePZo209XU3St/fRD44bWrr7yhPd58T+Bx88/WFpdCHETDGjzC9eCNZKpBFBaXVOeqZAM8M4Xjvv5fS/VAovucNTvWquttYLZIh9rHIFnc4v3kWFVB6eVZ54iHI7bN/3r6jBAymy/ddJVGUf8z2/sT8SZsmot2S8agoZYKi3+qfnIX7luQULqrOyskCOsaVJ8/LZwylUqvSfnGytifQsE4qdSByO57e56nQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=LG5T1SYsEKJP1K2KSvTJd8/+7I09mhmV9RjweHVK5BI=; b=AcHkc1sibYe0ud0cmbrI9HuR3Q1bef80/sq1FBP0LXPSDaHRpYO0chGzMeb/TMraRzqTcgrm38vKVYC09P9vsAFGv5MghIMFTEQZXlPXgyTVNP5hoQtgk4o2JMd3jgsV4JBXRqswaVvZe5OvmiZZd4r0YA3zM3FZwD74sdzfafkj4XbX7JcBniCNBuyNj7zyqD2t+TEPpesCS7Ykh/+09df7ktl8rJDNNOXRfM/93yv7P4OtLrPImcM0a7k9O8xVL/v5o1AAPhL952iETzzhV6aLK1iU42N+/8WLtGW6uJlw8xh3EboIt/E2lHuH9NbBL5/EQc3jQoSPC28lujso5A== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 198.47.23.194) smtp.rcpttodomain=kernel.org smtp.mailfrom=ti.com; dmarc=pass (p=quarantine sp=none pct=100) action=none header.from=ti.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ti.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=LG5T1SYsEKJP1K2KSvTJd8/+7I09mhmV9RjweHVK5BI=; b=uEfkUcM703NyuPyYhUlD9OApc3jXb6x8elUITQo3zOP1FjOZJT+H5phsVdliquNKeoCHat0F/Yi7JOMho+43QhMrLKzSsx5SkTDbf+0xJrTKZRcnVHMsqD5NUMDJyd+munOplL1q1YK1xi2czRWFgJFjWWGCA54VcQsGQCbNfjQ= Received: from DS7PR05CA0097.namprd05.prod.outlook.com (2603:10b6:8:56::26) by IA1PR10MB7445.namprd10.prod.outlook.com (2603:10b6:208:449::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9320.21; Tue, 18 Nov 2025 13:55:57 +0000 Received: from DS1PEPF0001709A.namprd05.prod.outlook.com (2603:10b6:8:56:cafe::f1) by DS7PR05CA0097.outlook.office365.com (2603:10b6:8:56::26) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.9343.10 via Frontend Transport; Tue, 18 Nov 2025 13:55:53 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 198.47.23.194) smtp.mailfrom=ti.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=ti.com; Received-SPF: Pass (protection.outlook.com: domain of ti.com designates 198.47.23.194 as permitted sender) receiver=protection.outlook.com; client-ip=198.47.23.194; helo=lewvzet200.ext.ti.com; pr=C Received: from lewvzet200.ext.ti.com (198.47.23.194) by DS1PEPF0001709A.mail.protection.outlook.com (10.167.18.104) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9343.9 via Frontend Transport; Tue, 18 Nov 2025 13:55:56 +0000 Received: from DLEE209.ent.ti.com (157.170.170.98) by lewvzet200.ext.ti.com (10.4.14.103) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.20; Tue, 18 Nov 2025 07:55:54 -0600 Received: from DLEE214.ent.ti.com (157.170.170.117) by DLEE209.ent.ti.com (157.170.170.98) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.20; Tue, 18 Nov 2025 07:55:54 -0600 Received: from fllvem-mr07.itg.ti.com (10.64.41.89) by DLEE214.ent.ti.com (157.170.170.117) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.20 via Frontend Transport; Tue, 18 Nov 2025 07:55:54 -0600 Received: from lelv0854.itg.ti.com (lelv0854.itg.ti.com [10.181.64.140]) by fllvem-mr07.itg.ti.com (8.18.1/8.18.1) with ESMTP id 5AIDts41605896; Tue, 18 Nov 2025 07:55:54 -0600 Received: from localhost (meghana-pc.dhcp.ti.com [10.24.69.13] (may be forged)) by lelv0854.itg.ti.com (8.14.7/8.14.7) with ESMTP id 5AIDtqVx004180; Tue, 18 Nov 2025 07:55:53 -0600 From: Meghana Malladi To: , , , , , , , , , , , , , , , , CC: , , , , , , , , Vignesh Raghavendra , Roger Quadros , Subject: [PATCH net-next v6 2/6] net: ti: icssg-prueth: Add XSK pool helpers Date: Tue, 18 Nov 2025 19:25:38 +0530 Message-ID: <20251118135542.380574-3-m-malladi@ti.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20251118135542.380574-1-m-malladi@ti.com> References: <20251118135542.380574-1-m-malladi@ti.com> 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 X-C2ProcessedOrg: 333ef613-75bf-4e12-a4b1-8e3623f5dcea X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DS1PEPF0001709A:EE_|IA1PR10MB7445:EE_ X-MS-Office365-Filtering-Correlation-Id: d6be0b6f-52c0-4ae3-d910-08de26aa32b5 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|82310400026|376014|7416014|1800799024|36860700013|921020; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?ckGgPOCPi+8yyOTn2dY1CIT7p4CH6igzk+WqU7UfpCW3U/OiS0Pe8klsVK3/?= =?us-ascii?Q?lsW4fBoNtonTRBdVQCOedDzwKPXazDWk9CrfX7K5WRbCzo0GeZwtkcVXNp7r?= =?us-ascii?Q?Je/xM56XaaIGGXlxYHBW1aCH5LHT7YRzyMhuUu6vGMcWhQT/ds7J8lgqGLvS?= =?us-ascii?Q?nVLrDkhaVg3FxZppE24Rz/nRk5lkE26K7eixuVujhkwwI0095wmhHickAFoC?= =?us-ascii?Q?t9EzWFJf3r0VcLGW2sF+ZYHnLboa134j5rBn80gPkd0z6cgQgEmpVE41+RwO?= =?us-ascii?Q?DkC/mx/tRz3hGmNSXROqpAPUkWhhz6RmZxh7hovpQdOZnh2qENL+UelzXXgS?= =?us-ascii?Q?oMhHcnubYS4BTG+L9bFTEIjf0cdawDO+f4j0KdKOLK8R0jlkKGGkQOvw9xM5?= =?us-ascii?Q?BkpRIZ/2j0cm7GVo1+wFd38+HsGwZu1MOLNy4IdCyP0uysIdcgQVNrSdF/l5?= =?us-ascii?Q?4vvusGOo/GrsN0G62nY1uvkPBiGK2vt3fPne4mXdOpIbYm38ti2jnsITLtt+?= =?us-ascii?Q?2OQOav8o0EJl4Z3Hhb9/pvJON3DwFg0yExVAGLBVgw2iajGi5/LteocDJvx0?= =?us-ascii?Q?9O7M4660zuQ1JIpIgVCa7Q7r4+nvsM80P7RMxXzJ9b28x/eREHqyXOwnBw0M?= =?us-ascii?Q?r8yHhxCEiEO667K85aJlkJw/S5S6JVfc6jKhcwnPrJNiPXmxK4PfCrPSMSqc?= =?us-ascii?Q?F3dG2cybSWVhuBByyMJolR97K2YAniKl0uOlVq6w3CgF17F9h4YWvir/NSko?= =?us-ascii?Q?YreONP88asRdCwi/xRWeXhjl1deCB/Oi4F/bH7ZVWSlCMe1LFz7PgAW4gPSw?= =?us-ascii?Q?imLKyDEX+EDipBwZhjyO+wlmTHg24V9NmTbib71u23YnB91jJyPD0YjZX+bW?= =?us-ascii?Q?AQaBCcTXy295axOGWILJ9xT4cnsY1kCTFb3jZlHz+3KSGH6zSBCe33HZGBU5?= =?us-ascii?Q?5E0VSSAaZdGjAt/uLhCceoOItcpxgwfPNzDFIZHegohIEPSAGSf0CSKG3nFf?= =?us-ascii?Q?cNeKx0PDIFLK0iUj+frs1mdQNpzRXoOmwYrHVYUla3m06D+8dyjg/jwCM9dH?= =?us-ascii?Q?zHuFTofVSbcWpc8/atW9p5Bx64nn0iThF+i/oUtLQmSTAuMVX0GIZlaimuCK?= =?us-ascii?Q?HjORLnTR0JR9sY4+P8LXz9eMMoWWU/lOlzg1ABxaop+EMAExnAZtVgdEkJyR?= =?us-ascii?Q?DCBcWEzs0LqNifVs/xKKM/OzmBTa8eZVkQf+9b/30unpQ9SVRQDgp+QZ2xZV?= =?us-ascii?Q?tJCYdha0gpsa0a48/IORuyNWH8kbCCUb4++93t1P4aoOpR4V0YYwJncrNTAH?= =?us-ascii?Q?UJtTCGO3wOi5DCiu4QQCXZekucpwviB6GHS2OXABXKJk9AY8LA6ejKoKoLxU?= =?us-ascii?Q?XSh9yyPFh167qZyiMIAGiwwXduknsWt48jEK7TPqIB0VbsoU81vSPH6DpxlV?= =?us-ascii?Q?QGh0JpKXAfl1ya/zG1lWIggKpKiA7CwUNybeWFzOmvX7wZxbK0/fdBwfLbOX?= =?us-ascii?Q?imdxTfNmcC3C1BiO5vTFHwhaisabMk62F6r2jQT8WJ2dmh6Yj/kxvrw1/U7W?= =?us-ascii?Q?jdqfMb283CMUMA8m1Yu/6AMpNyPoDFIzBrizZoMe?= X-Forefront-Antispam-Report: CIP:198.47.23.194;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:lewvzet200.ext.ti.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230040)(82310400026)(376014)(7416014)(1800799024)(36860700013)(921020);DIR:OUT;SFP:1101; X-OriginatorOrg: ti.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Nov 2025 13:55:56.9472 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: d6be0b6f-52c0-4ae3-d910-08de26aa32b5 X-MS-Exchange-CrossTenant-Id: e5b49634-450b-4709-8abb-1e2b19b982b7 X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=e5b49634-450b-4709-8abb-1e2b19b982b7;Ip=[198.47.23.194];Helo=[lewvzet200.ext.ti.com] X-MS-Exchange-CrossTenant-AuthSource: DS1PEPF0001709A.namprd05.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: IA1PR10MB7445 Content-Type: text/plain; charset="utf-8" Implement XSK NDOs (setup, wakeup) and create XSK Rx and Tx queues. xsk_qid stores the queue id for a given port which has been registered for zero copy AF_XDP and used to acquire UMEM pointer if registered. Based on the xsk_qid and the xsk_pool (umem) the driver is either in copy or zero copy mode. In case of copy mode the xsk_qid value will be invalid and will be set to valid queue id when enabling zero copy. To enable zero copy, the Rx queues are destroyed, i.e., descriptors pushed to fq and cq are freed to remap them to xdp buffers from the umem. Reviewed-by: Jacob Keller Signed-off-by: Meghana Malladi --- drivers/net/ethernet/ti/icssg/icssg_common.c | 2 +- drivers/net/ethernet/ti/icssg/icssg_prueth.c | 138 +++++++++++++++++++ drivers/net/ethernet/ti/icssg/icssg_prueth.h | 10 ++ 3 files changed, 149 insertions(+), 1 deletion(-) diff --git a/drivers/net/ethernet/ti/icssg/icssg_common.c b/drivers/net/eth= ernet/ti/icssg/icssg_common.c index 94021751b6b7..cc52cff70d7e 100644 --- a/drivers/net/ethernet/ti/icssg/icssg_common.c +++ b/drivers/net/ethernet/ti/icssg/icssg_common.c @@ -754,7 +754,7 @@ static int emac_rx_packet(struct prueth_emac *emac, u32= flow_id, u32 *xdp_state) } =20 pa =3D page_address(page); - if (emac->xdp_prog) { + if (prueth_xdp_is_enabled(emac)) { xdp_init_buff(&xdp, PAGE_SIZE, &rx_chn->xdp_rxq); xdp_prepare_buff(&xdp, pa, PRUETH_HEADROOM, pkt_len, false); =20 diff --git a/drivers/net/ethernet/ti/icssg/icssg_prueth.c b/drivers/net/eth= ernet/ti/icssg/icssg_prueth.c index b66ffbfb499c..e4c3b6b152ea 100644 --- a/drivers/net/ethernet/ti/icssg/icssg_prueth.c +++ b/drivers/net/ethernet/ti/icssg/icssg_prueth.c @@ -47,6 +47,9 @@ NETIF_F_HW_HSR_TAG_INS | \ NETIF_F_HW_HSR_TAG_RM) =20 +#define PRUETH_RX_DMA_ATTR (DMA_ATTR_SKIP_CPU_SYNC |\ + DMA_ATTR_WEAK_ORDERING) + /* CTRLMMR_ICSSG_RGMII_CTRL register bits */ #define ICSSG_CTRL_RGMII_ID_MODE BIT(24) =20 @@ -735,6 +738,20 @@ static int icssg_update_vlan_mcast(struct net_device *= vdev, int vid, return 0; } =20 +static void prueth_set_xsk_pool(struct prueth_emac *emac, u16 queue_id) +{ + struct prueth_tx_chn *tx_chn =3D &emac->tx_chns[queue_id]; + struct prueth_rx_chn *rx_chn =3D &emac->rx_chns; + + if (emac->xsk_qid !=3D queue_id) { + rx_chn->xsk_pool =3D NULL; + tx_chn->xsk_pool =3D NULL; + } else { + rx_chn->xsk_pool =3D xsk_get_pool_from_qid(emac->ndev, queue_id); + tx_chn->xsk_pool =3D xsk_get_pool_from_qid(emac->ndev, queue_id); + } +} + static void prueth_destroy_txq(struct prueth_emac *emac) { int ret, i; @@ -875,6 +892,7 @@ static int emac_ndo_open(struct net_device *ndev) return ret; } =20 + emac->xsk_qid =3D -EINVAL; init_completion(&emac->cmd_complete); ret =3D prueth_init_tx_chns(emac); if (ret) { @@ -1200,6 +1218,109 @@ static int emac_xdp_setup(struct prueth_emac *emac,= struct netdev_bpf *bpf) return 0; } =20 +static int prueth_xsk_pool_enable(struct prueth_emac *emac, + struct xsk_buff_pool *pool, u16 queue_id) +{ + struct prueth_rx_chn *rx_chn =3D &emac->rx_chns; + u32 frame_size; + int ret; + + if (queue_id >=3D PRUETH_MAX_RX_FLOWS || + queue_id >=3D emac->tx_ch_num) { + netdev_err(emac->ndev, "Invalid XSK queue ID %d\n", queue_id); + return -EINVAL; + } + + frame_size =3D xsk_pool_get_rx_frame_size(pool); + if (frame_size < PRUETH_MAX_PKT_SIZE) + return -EOPNOTSUPP; + + ret =3D xsk_pool_dma_map(pool, rx_chn->dma_dev, PRUETH_RX_DMA_ATTR); + if (ret) { + netdev_err(emac->ndev, "Failed to map XSK pool: %d\n", ret); + return ret; + } + + if (netif_running(emac->ndev)) { + /* stop packets from wire for graceful teardown */ + ret =3D icssg_set_port_state(emac, ICSSG_EMAC_PORT_DISABLE); + if (ret) + return ret; + prueth_destroy_rxq(emac); + } + + emac->xsk_qid =3D queue_id; + prueth_set_xsk_pool(emac, queue_id); + + if (netif_running(emac->ndev)) { + ret =3D prueth_create_rxq(emac); + if (ret) { + netdev_err(emac->ndev, "Failed to create RX queue: %d\n", ret); + return ret; + } + ret =3D icssg_set_port_state(emac, ICSSG_EMAC_PORT_FORWARD); + if (ret) { + prueth_destroy_rxq(emac); + return ret; + } + ret =3D prueth_xsk_wakeup(emac->ndev, queue_id, XDP_WAKEUP_RX); + if (ret) + return ret; + } + + return 0; +} + +static int prueth_xsk_pool_disable(struct prueth_emac *emac, u16 queue_id) +{ + struct xsk_buff_pool *pool; + int ret; + + if (queue_id >=3D PRUETH_MAX_RX_FLOWS || + queue_id >=3D emac->tx_ch_num) { + netdev_err(emac->ndev, "Invalid XSK queue ID %d\n", queue_id); + return -EINVAL; + } + + if (emac->xsk_qid !=3D queue_id) { + netdev_err(emac->ndev, "XSK queue ID %d not registered\n", queue_id); + return -EINVAL; + } + + pool =3D xsk_get_pool_from_qid(emac->ndev, queue_id); + if (!pool) { + netdev_err(emac->ndev, "No XSK pool registered for queue %d\n", queue_id= ); + return -EINVAL; + } + + if (netif_running(emac->ndev)) { + /* stop packets from wire for graceful teardown */ + ret =3D icssg_set_port_state(emac, ICSSG_EMAC_PORT_DISABLE); + if (ret) + return ret; + prueth_destroy_rxq(emac); + } + + xsk_pool_dma_unmap(pool, PRUETH_RX_DMA_ATTR); + emac->xsk_qid =3D -EINVAL; + prueth_set_xsk_pool(emac, queue_id); + + if (netif_running(emac->ndev)) { + ret =3D prueth_create_rxq(emac); + if (ret) { + netdev_err(emac->ndev, "Failed to create RX queue: %d\n", ret); + return ret; + } + ret =3D icssg_set_port_state(emac, ICSSG_EMAC_PORT_FORWARD); + if (ret) { + prueth_destroy_rxq(emac); + return ret; + } + } + + return 0; +} + /** * emac_ndo_bpf - implements ndo_bpf for icssg_prueth * @ndev: network adapter device @@ -1214,11 +1335,27 @@ static int emac_ndo_bpf(struct net_device *ndev, st= ruct netdev_bpf *bpf) switch (bpf->command) { case XDP_SETUP_PROG: return emac_xdp_setup(emac, bpf); + case XDP_SETUP_XSK_POOL: + return bpf->xsk.pool ? + prueth_xsk_pool_enable(emac, bpf->xsk.pool, bpf->xsk.queue_id) : + prueth_xsk_pool_disable(emac, bpf->xsk.queue_id); default: return -EINVAL; } } =20 +int prueth_xsk_wakeup(struct net_device *ndev, u32 qid, u32 flags) +{ + struct prueth_emac *emac =3D netdev_priv(ndev); + + if (qid >=3D PRUETH_MAX_RX_FLOWS || qid >=3D emac->tx_ch_num) { + netdev_err(ndev, "Invalid XSK queue ID %d\n", qid); + return -EINVAL; + } + + return 0; +} + static const struct net_device_ops emac_netdev_ops =3D { .ndo_open =3D emac_ndo_open, .ndo_stop =3D emac_ndo_stop, @@ -1237,6 +1374,7 @@ static const struct net_device_ops emac_netdev_ops = =3D { .ndo_xdp_xmit =3D emac_xdp_xmit, .ndo_hwtstamp_get =3D icssg_ndo_get_ts_config, .ndo_hwtstamp_set =3D icssg_ndo_set_ts_config, + .ndo_xsk_wakeup =3D prueth_xsk_wakeup, }; =20 static int prueth_netdev_init(struct prueth *prueth, diff --git a/drivers/net/ethernet/ti/icssg/icssg_prueth.h b/drivers/net/eth= ernet/ti/icssg/icssg_prueth.h index 5cc90b66035a..a5e3774b0388 100644 --- a/drivers/net/ethernet/ti/icssg/icssg_prueth.h +++ b/drivers/net/ethernet/ti/icssg/icssg_prueth.h @@ -38,6 +38,8 @@ #include #include #include +#include +#include =20 #include "icssg_config.h" #include "icss_iep.h" @@ -126,6 +128,7 @@ struct prueth_tx_chn { char name[32]; struct hrtimer tx_hrtimer; unsigned long tx_pace_timeout_ns; + struct xsk_buff_pool *xsk_pool; }; =20 struct prueth_rx_chn { @@ -138,6 +141,7 @@ struct prueth_rx_chn { char name[32]; struct page_pool *pg_pool; struct xdp_rxq_info xdp_rxq; + struct xsk_buff_pool *xsk_pool; }; =20 enum prueth_swdata_type { @@ -241,6 +245,7 @@ struct prueth_emac { struct netdev_hw_addr_list vlan_mcast_list[MAX_VLAN_ID]; struct bpf_prog *xdp_prog; struct xdp_attachment_info xdpi; + int xsk_qid; }; =20 /* The buf includes headroom compatible with both skb and xdpf */ @@ -503,5 +508,10 @@ u32 emac_xmit_xdp_frame(struct prueth_emac *emac, unsigned int q_idx); void prueth_rx_cleanup(void *data, dma_addr_t desc_dma); void prueth_tx_cleanup(void *data, dma_addr_t desc_dma); +int prueth_xsk_wakeup(struct net_device *ndev, u32 qid, u32 flags); +static inline bool prueth_xdp_is_enabled(struct prueth_emac *emac) +{ + return !!READ_ONCE(emac->xdp_prog); +} =20 #endif /* __NET_TI_ICSSG_PRUETH_H */ --=20 2.43.0 From nobody Tue Dec 2 02:44:08 2025 Received: from PH7PR06CU001.outbound.protection.outlook.com (mail-westus3azon11010029.outbound.protection.outlook.com [52.101.201.29]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A2A8935C1A4; Tue, 18 Nov 2025 13:56:04 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.201.29 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763474171; cv=fail; b=d9F3o8DyGxC9j8af4mFMJq2HvUVXZkr8iTBnfyY+mwT/A6Y1NfDAGQukFQ1POY2xImgkxhbx+1PJue3hPFMp5Ho+Mvrw9A5AENhwgkSLppDOdbFetV36r4wUuwTEOr3gIDOYpVrvHWsv0CPelCKoYz4FJS+jmlqv+eyj8dbzW8M= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763474171; c=relaxed/simple; bh=4gJJRSmFMZdvwfIvjeIrB26njPAyIyj5DQ4p8nTYdEw=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=VeYPnlFeypF13Q0+2HR1EnwrK3YZauVqDuIGf4tv1XeklZhaRRavQyYkdkK5WMbn4ymj8wP2uQSRV3Q6K76do0PFcOljOrDUm4hr1Z0t8Wz6sPkNQuRTgdVtUXW1qdLWEATZofef4z5uTdAKpMtpKMeILkkoX0Vx+2L276Lquno= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=ti.com; spf=pass smtp.mailfrom=ti.com; dkim=pass (1024-bit key) header.d=ti.com header.i=@ti.com header.b=gycNNDjS; arc=fail smtp.client-ip=52.101.201.29 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=ti.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=ti.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=ti.com header.i=@ti.com header.b="gycNNDjS" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=QWjCa8Jzv1wlDxCdXzGfvUu3OamATwZqJ/XtWL7alvMYb6HfQNAMFWYbCpjKoYs71aZ7vyv8zzfSWvlgbNFFSJldxomSayewmElGZ1mfkBGcA4g4OdH8F8JqxNxfqZ/x+xztvI22UnET4wOS9NWtQZyCrHx568y6cqW7J+qT0YtFsDHKKIgP2cU3F/fd4VfaHMJNUJdKQDJ8CodFcmC8YsxomDPsgwApoBnYrVFkTwCcTjepWMzs35TjpBElMsaxudq181qs/Le6O+6jDQNTyIB1fgZC/aRyI1QQREBRPdi/iAskAVKhKn6cQ9o2nnP++ta4qkP+LjhvXsJ1DpO+qw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=BB+teHW0iB5Yxuynnn2f7aIdonhm0p57w4dhjxKR50I=; b=nLm3fRIfB6Uu/4C7hG2nUKpsMEdt71bTcFwenJ8VzyxQWya/tXbq/ds9TOh+7hBxw7EzlSjoZHINY4Kbn3YxtAX/ZcO7uyY7r85YG1MSz3Iq6jdeUNH3GGzJAFphyTaoDj0MMm6zlsOsN+f55BOlom8MSd5CdVuBbkmJTniFJf+9t0WPRZiTgxatvxaCwL2n71IutwXCrxHsDWI/LO7qOe/627fRDo9OCp+WDZzAP9SNsUqa8O4vsu4GVH6RcKz8XMghJVrYzoXrcOAbu7m9MDG69cdJa/Z8LuN4Yt4W3mWaXTQi9yZfBDFfMlYbU5eIu9H/HPXZxHgK5yMsym71ew== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 198.47.23.195) smtp.rcpttodomain=kernel.org smtp.mailfrom=ti.com; dmarc=pass (p=quarantine sp=none pct=100) action=none header.from=ti.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ti.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=BB+teHW0iB5Yxuynnn2f7aIdonhm0p57w4dhjxKR50I=; b=gycNNDjSSl0Zpf4JNCslhiNNULbsXowe3S26/SdzeOcp98bKtiSayB2gpW9rpAfKdCrnh73AzxFrS7eNAEk7TIO+TLU5CRw37Lj4rwKv+wdDPwmJFuuTU0q0NZAOGfPIL+AnezdZTvkmvDXIUVTCKlRno/5JozHJIr8m+W3EunY= Received: from BL1PR13CA0204.namprd13.prod.outlook.com (2603:10b6:208:2be::29) by IA3PR10MB8419.namprd10.prod.outlook.com (2603:10b6:208:57f::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9343.10; Tue, 18 Nov 2025 13:56:01 +0000 Received: from MN1PEPF0000F0E0.namprd04.prod.outlook.com (2603:10b6:208:2be:cafe::24) by BL1PR13CA0204.outlook.office365.com (2603:10b6:208:2be::29) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.9343.10 via Frontend Transport; Tue, 18 Nov 2025 13:55:55 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 198.47.23.195) smtp.mailfrom=ti.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=ti.com; Received-SPF: Pass (protection.outlook.com: domain of ti.com designates 198.47.23.195 as permitted sender) receiver=protection.outlook.com; client-ip=198.47.23.195; helo=lewvzet201.ext.ti.com; pr=C Received: from lewvzet201.ext.ti.com (198.47.23.195) by MN1PEPF0000F0E0.mail.protection.outlook.com (10.167.242.38) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9343.9 via Frontend Transport; Tue, 18 Nov 2025 13:56:00 +0000 Received: from DLEE209.ent.ti.com (157.170.170.98) by lewvzet201.ext.ti.com (10.4.14.104) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.20; Tue, 18 Nov 2025 07:55:57 -0600 Received: from DLEE204.ent.ti.com (157.170.170.84) by DLEE209.ent.ti.com (157.170.170.98) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.20; Tue, 18 Nov 2025 07:55:57 -0600 Received: from lelvem-mr05.itg.ti.com (10.180.75.9) by DLEE204.ent.ti.com (157.170.170.84) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.20 via Frontend Transport; Tue, 18 Nov 2025 07:55:57 -0600 Received: from lelv0854.itg.ti.com (lelv0854.itg.ti.com [10.181.64.140]) by lelvem-mr05.itg.ti.com (8.18.1/8.18.1) with ESMTP id 5AIDtvxs152620; Tue, 18 Nov 2025 07:55:57 -0600 Received: from localhost (meghana-pc.dhcp.ti.com [10.24.69.13] (may be forged)) by lelv0854.itg.ti.com (8.14.7/8.14.7) with ESMTP id 5AIDttHJ004187; Tue, 18 Nov 2025 07:55:56 -0600 From: Meghana Malladi To: , , , , , , , , , , , , , , , , CC: , , , , , , , , Vignesh Raghavendra , Roger Quadros , Subject: [PATCH net-next v6 3/6] net: ti: icssg-prueth: Add AF_XDP zero copy for TX Date: Tue, 18 Nov 2025 19:25:39 +0530 Message-ID: <20251118135542.380574-4-m-malladi@ti.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20251118135542.380574-1-m-malladi@ti.com> References: <20251118135542.380574-1-m-malladi@ti.com> 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 X-C2ProcessedOrg: 333ef613-75bf-4e12-a4b1-8e3623f5dcea X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: MN1PEPF0000F0E0:EE_|IA3PR10MB8419:EE_ X-MS-Office365-Filtering-Correlation-Id: 16d7f92a-901f-44c3-2981-08de26aa34a8 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|36860700013|1800799024|82310400026|7416014|376014|921020; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?O7Zg2fOmJyfcnlobY9L1Y9NznFBpsyKpHBgJi6SrM/YAWojF2ig0oRXB+Qyi?= =?us-ascii?Q?k10WDl7uBcEk2d3/EffheVRZ7jJwYq5RwuBh+1U50K7tKL6Ax0egbKecb5BO?= =?us-ascii?Q?VBOpwmUU/1Bx1HYuTyp87JDnqL7uGcjRA8j0UDXOOoIV2Urn0hPBALWsnnpX?= =?us-ascii?Q?ShstjvY9yV+8jC9a6KU6Un1wAJGSjKdDKhFowF5P7D6e8LObl6eXbbbgBW+x?= =?us-ascii?Q?koLiP0NK54UsX3V24OWkTc519M2oBm0bvfzrLhIo6gksQvL4lX85/aytTCDx?= =?us-ascii?Q?u9N2U5/kInlJ5nebzLGRk+wkZY0Gw0MbS1xLJ3cZXp4sLK5kDbu2hQ/QbuB6?= =?us-ascii?Q?wW+l4dAJi2hh/Oh/hqB8rvXxDm4DoQj3/EJIVTm7nxvKOHjjNx6TCeWPFW5q?= =?us-ascii?Q?PQRArCrz3teCda2aZLKlfphnrtKPPkjm49AQKlMNsMHNzEzk1asT1duBu1TD?= =?us-ascii?Q?IAXpZv8EQWMvSxd3+LB1kqg8cepDj2SxK2J41PnUH8LUegpraSIQ/Mjefjrc?= =?us-ascii?Q?OlUwiEkGVehTcyrwDAODCSjsHcWKPt1plYwoaDTPSFzgFdd8lVfUL6mscH0n?= =?us-ascii?Q?imxH0PPMYzDBd9apISE8lqHRF7l1mscCme55KlnKhG3zkBoZNKVWOslJk8Zn?= =?us-ascii?Q?Fb2/IY/qPo1GCFLinsxcMQAGmXA+b1H5b3xzKP/BeuSbDRcHOiKL8Iy0uNV8?= =?us-ascii?Q?gim3EfPpjULujOciDNR+BNaRgCv9Ls0EUgWNbH1pRkcR/naLEvSCG6EeBsKr?= =?us-ascii?Q?00vIKtwEDQgWFTHpZ6zwOngfPIdo8NeOGV8MEezx8oa3Ny24a37b2tnInIzj?= =?us-ascii?Q?KkPeQeKb6LixuIl1GjMNHeIywWEbuBfsnOgIu4DuufOhQ5UKXIXfKe1wjGJJ?= =?us-ascii?Q?A98yvhdDb3QCDPx1aWNlVw2z0QLWXSlt6u7wKrMLmORAprhSuksk1uYxocH1?= =?us-ascii?Q?oBNQG2pGf+d1aIG2sYmoXgRniXZUix5IWcsk7E359CFQhqeYBln3TJwHOfhj?= =?us-ascii?Q?3+619aztUHbSHWsWqsK5tlk8uomEp0fqzqt6jDFHAPr6u0yK9v98l3JwPLk7?= =?us-ascii?Q?+REEEgJCUP45D60hFV1h98SVtDc0KIis/jaq/6RZsWaAL8yOcAXtMsWv70XI?= =?us-ascii?Q?In1iJCpx1aKHgtfAfxZR2Oc0S/rgZ4qh0lQ3VjUv7PWIexxoLUHgkMuviv8h?= =?us-ascii?Q?MOQ63/bw5gqViNHyif7RrNp8dhP5ZpcC0lg3a859wT7ed3kT0BeTi3+oQ11k?= =?us-ascii?Q?NWLkJgj3/6jWld4U9PTb6TquO1KYOWyP2VZqngAQ86U1nXkqGYLKecn8hLoA?= =?us-ascii?Q?OhK3JrKIU3IsSD9+LAkmRDGIsEacgDCqFL40iJJr4mDaV5S5vKHG7HMyi8YM?= =?us-ascii?Q?FgXsEd83xjQqvF0/guLV+zRhBVEM2P3aNQ91werI733u0yAs9WXKGv4iK6BQ?= =?us-ascii?Q?EOGoNgi6vaM0KodrHYZ12B9EJZfUqlX6NtOrrEmj8RcWA/kK4LLIiQ8NZ+1z?= =?us-ascii?Q?Prkl87RgSosXdwXPD1U2yq/dd60a+jTCI1smlVuhEukhNJLy57otGNOwrGFu?= =?us-ascii?Q?GBrECAvS671gdhBgU784PlcI7uJJhDuEw5kPuOdA?= X-Forefront-Antispam-Report: CIP:198.47.23.195;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:lewvzet201.ext.ti.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230040)(36860700013)(1800799024)(82310400026)(7416014)(376014)(921020);DIR:OUT;SFP:1101; X-OriginatorOrg: ti.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Nov 2025 13:56:00.1503 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 16d7f92a-901f-44c3-2981-08de26aa34a8 X-MS-Exchange-CrossTenant-Id: e5b49634-450b-4709-8abb-1e2b19b982b7 X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=e5b49634-450b-4709-8abb-1e2b19b982b7;Ip=[198.47.23.195];Helo=[lewvzet201.ext.ti.com] X-MS-Exchange-CrossTenant-AuthSource: MN1PEPF0000F0E0.namprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: IA3PR10MB8419 Content-Type: text/plain; charset="utf-8" Use xsk_pool inside tx_chn to check if a given Tx queue id is registered for xsk zero copy, which gets populated during xsk enable If xsk_pool is set, get frames from the pool in NAPI context and submit them to the Tx channel. Tx completion is also handled in the NAPI context. Use PRUETH_SWDATA_XSK to recycle xsk buffers back to the umem pool. Add XDP_WAKEUP_TX support to enable xsk_wakeup for Tx. Reviewed-by: Jacob Keller Signed-off-by: Meghana Malladi --- drivers/net/ethernet/ti/icssg/icssg_common.c | 112 ++++++++++++++++++- drivers/net/ethernet/ti/icssg/icssg_prueth.c | 13 +++ drivers/net/ethernet/ti/icssg/icssg_prueth.h | 2 + 3 files changed, 125 insertions(+), 2 deletions(-) diff --git a/drivers/net/ethernet/ti/icssg/icssg_common.c b/drivers/net/eth= ernet/ti/icssg/icssg_common.c index cc52cff70d7e..d7469ad457fd 100644 --- a/drivers/net/ethernet/ti/icssg/icssg_common.c +++ b/drivers/net/ethernet/ti/icssg/icssg_common.c @@ -93,15 +93,91 @@ void prueth_ndev_del_tx_napi(struct prueth_emac *emac, = int num) } EXPORT_SYMBOL_GPL(prueth_ndev_del_tx_napi); =20 +static int emac_xsk_xmit_zc(struct prueth_emac *emac, + unsigned int q_idx) +{ + struct prueth_tx_chn *tx_chn =3D &emac->tx_chns[q_idx]; + struct xsk_buff_pool *pool =3D tx_chn->xsk_pool; + struct net_device *ndev =3D emac->ndev; + struct cppi5_host_desc_t *host_desc; + dma_addr_t dma_desc, dma_buf; + struct prueth_swdata *swdata; + struct xdp_desc xdp_desc; + int num_tx =3D 0, pkt_len; + int descs_avail, ret; + u32 *epib; + int i; + + descs_avail =3D k3_cppi_desc_pool_avail(tx_chn->desc_pool); + /* ensure that TX ring is not filled up by XDP, always MAX_SKB_FRAGS + * will be available for normal TX path and queue is stopped there if + * necessary + */ + if (descs_avail <=3D MAX_SKB_FRAGS) + return 0; + + descs_avail -=3D MAX_SKB_FRAGS; + + for (i =3D 0; i < descs_avail; i++) { + if (!xsk_tx_peek_desc(pool, &xdp_desc)) + break; + + dma_buf =3D xsk_buff_raw_get_dma(pool, xdp_desc.addr); + pkt_len =3D xdp_desc.len; + xsk_buff_raw_dma_sync_for_device(pool, dma_buf, pkt_len); + + host_desc =3D k3_cppi_desc_pool_alloc(tx_chn->desc_pool); + if (unlikely(!host_desc)) + break; + + cppi5_hdesc_init(host_desc, CPPI5_INFO0_HDESC_EPIB_PRESENT, + PRUETH_NAV_PS_DATA_SIZE); + cppi5_hdesc_set_pkttype(host_desc, 0); + epib =3D host_desc->epib; + epib[0] =3D 0; + epib[1] =3D 0; + cppi5_hdesc_set_pktlen(host_desc, pkt_len); + cppi5_desc_set_tags_ids(&host_desc->hdr, 0, + (emac->port_id | (q_idx << 8))); + + k3_udma_glue_tx_dma_to_cppi5_addr(tx_chn->tx_chn, &dma_buf); + cppi5_hdesc_attach_buf(host_desc, dma_buf, pkt_len, dma_buf, + pkt_len); + + swdata =3D cppi5_hdesc_get_swdata(host_desc); + swdata->type =3D PRUETH_SWDATA_XSK; + + dma_desc =3D k3_cppi_desc_pool_virt2dma(tx_chn->desc_pool, + host_desc); + ret =3D k3_udma_glue_push_tx_chn(tx_chn->tx_chn, + host_desc, dma_desc); + + if (ret) { + ndev->stats.tx_errors++; + k3_cppi_desc_pool_free(tx_chn->desc_pool, host_desc); + break; + } + + num_tx++; + } + + xsk_tx_release(tx_chn->xsk_pool); + return num_tx; +} + void prueth_xmit_free(struct prueth_tx_chn *tx_chn, struct cppi5_host_desc_t *desc) { struct cppi5_host_desc_t *first_desc, *next_desc; dma_addr_t buf_dma, next_desc_dma; + struct prueth_swdata *swdata; u32 buf_dma_len; =20 first_desc =3D desc; next_desc =3D first_desc; + swdata =3D cppi5_hdesc_get_swdata(first_desc); + if (swdata->type =3D=3D PRUETH_SWDATA_XSK) + goto free_pool; =20 cppi5_hdesc_get_obuf(first_desc, &buf_dma, &buf_dma_len); k3_udma_glue_tx_cppi5_to_dma_addr(tx_chn->tx_chn, &buf_dma); @@ -126,6 +202,7 @@ void prueth_xmit_free(struct prueth_tx_chn *tx_chn, k3_cppi_desc_pool_free(tx_chn->desc_pool, next_desc); } =20 +free_pool: k3_cppi_desc_pool_free(tx_chn->desc_pool, first_desc); } EXPORT_SYMBOL_GPL(prueth_xmit_free); @@ -139,7 +216,9 @@ int emac_tx_complete_packets(struct prueth_emac *emac, = int chn, struct prueth_swdata *swdata; struct prueth_tx_chn *tx_chn; unsigned int total_bytes =3D 0; + int xsk_frames_done =3D 0; struct xdp_frame *xdpf; + unsigned int pkt_len; struct sk_buff *skb; dma_addr_t desc_dma; int res, num_tx =3D 0; @@ -176,6 +255,11 @@ int emac_tx_complete_packets(struct prueth_emac *emac,= int chn, total_bytes +=3D xdpf->len; xdp_return_frame(xdpf); break; + case PRUETH_SWDATA_XSK: + pkt_len =3D cppi5_hdesc_get_pktlen(desc_tx); + dev_sw_netstats_tx_add(ndev, 1, pkt_len); + xsk_frames_done++; + break; default: prueth_xmit_free(tx_chn, desc_tx); ndev->stats.tx_dropped++; @@ -204,6 +288,18 @@ int emac_tx_complete_packets(struct prueth_emac *emac,= int chn, __netif_tx_unlock(netif_txq); } =20 + if (tx_chn->xsk_pool) { + if (xsk_frames_done) + xsk_tx_completed(tx_chn->xsk_pool, xsk_frames_done); + + if (xsk_uses_need_wakeup(tx_chn->xsk_pool)) + xsk_set_tx_need_wakeup(tx_chn->xsk_pool); + + netif_txq =3D netdev_get_tx_queue(ndev, chn); + txq_trans_cond_update(netif_txq); + emac_xsk_xmit_zc(emac, chn); + } + return num_tx; } =20 @@ -212,7 +308,10 @@ static enum hrtimer_restart emac_tx_timer_callback(str= uct hrtimer *timer) struct prueth_tx_chn *tx_chns =3D container_of(timer, struct prueth_tx_chn, tx_hrtimer); =20 - enable_irq(tx_chns->irq); + if (tx_chns->irq_disabled) { + tx_chns->irq_disabled =3D false; + enable_irq(tx_chns->irq); + } return HRTIMER_NORESTART; } =20 @@ -235,7 +334,10 @@ static int emac_napi_tx_poll(struct napi_struct *napi_= tx, int budget) ns_to_ktime(tx_chn->tx_pace_timeout_ns), HRTIMER_MODE_REL_PINNED); } else { - enable_irq(tx_chn->irq); + if (tx_chn->irq_disabled) { + tx_chn->irq_disabled =3D false; + enable_irq(tx_chn->irq); + } } } =20 @@ -246,6 +348,7 @@ static irqreturn_t prueth_tx_irq(int irq, void *dev_id) { struct prueth_tx_chn *tx_chn =3D dev_id; =20 + tx_chn->irq_disabled =3D true; disable_irq_nosync(irq); napi_schedule(&tx_chn->napi_tx); =20 @@ -1032,6 +1135,7 @@ void prueth_tx_cleanup(void *data, dma_addr_t desc_dm= a) { struct prueth_tx_chn *tx_chn =3D data; struct cppi5_host_desc_t *desc_tx; + struct xsk_buff_pool *xsk_pool; struct prueth_swdata *swdata; struct xdp_frame *xdpf; struct sk_buff *skb; @@ -1048,6 +1152,10 @@ void prueth_tx_cleanup(void *data, dma_addr_t desc_d= ma) xdpf =3D swdata->data.xdpf; xdp_return_frame(xdpf); break; + case PRUETH_SWDATA_XSK: + xsk_pool =3D tx_chn->xsk_pool; + xsk_tx_completed(xsk_pool, 1); + break; default: break; } diff --git a/drivers/net/ethernet/ti/icssg/icssg_prueth.c b/drivers/net/eth= ernet/ti/icssg/icssg_prueth.c index e4c3b6b152ea..bdce5a40defe 100644 --- a/drivers/net/ethernet/ti/icssg/icssg_prueth.c +++ b/drivers/net/ethernet/ti/icssg/icssg_prueth.c @@ -1347,12 +1347,25 @@ static int emac_ndo_bpf(struct net_device *ndev, st= ruct netdev_bpf *bpf) int prueth_xsk_wakeup(struct net_device *ndev, u32 qid, u32 flags) { struct prueth_emac *emac =3D netdev_priv(ndev); + struct prueth_tx_chn *tx_chn =3D &emac->tx_chns[qid]; =20 if (qid >=3D PRUETH_MAX_RX_FLOWS || qid >=3D emac->tx_ch_num) { netdev_err(ndev, "Invalid XSK queue ID %d\n", qid); return -EINVAL; } =20 + if (!tx_chn->xsk_pool) { + netdev_err(ndev, "XSK pool not registered for queue %d\n", qid); + return -EINVAL; + } + + if (flags & XDP_WAKEUP_TX) { + if (!napi_if_scheduled_mark_missed(&tx_chn->napi_tx)) { + if (likely(napi_schedule_prep(&tx_chn->napi_tx))) + __napi_schedule(&tx_chn->napi_tx); + } + } + return 0; } =20 diff --git a/drivers/net/ethernet/ti/icssg/icssg_prueth.h b/drivers/net/eth= ernet/ti/icssg/icssg_prueth.h index a5e3774b0388..67339cdf2ddf 100644 --- a/drivers/net/ethernet/ti/icssg/icssg_prueth.h +++ b/drivers/net/ethernet/ti/icssg/icssg_prueth.h @@ -129,6 +129,7 @@ struct prueth_tx_chn { struct hrtimer tx_hrtimer; unsigned long tx_pace_timeout_ns; struct xsk_buff_pool *xsk_pool; + bool irq_disabled; }; =20 struct prueth_rx_chn { @@ -150,6 +151,7 @@ enum prueth_swdata_type { PRUETH_SWDATA_PAGE, PRUETH_SWDATA_CMD, PRUETH_SWDATA_XDPF, + PRUETH_SWDATA_XSK, }; =20 struct prueth_swdata { --=20 2.43.0 From nobody Tue Dec 2 02:44:08 2025 Received: from CO1PR03CU002.outbound.protection.outlook.com (mail-westus2azon11010047.outbound.protection.outlook.com [52.101.46.47]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id EB3B6358D0F; Tue, 18 Nov 2025 13:56:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.46.47 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763474171; cv=fail; b=bbLqeOjIJi8DQLOk/J+S/anCjgcMOZGZzFmZuJ9psnGDavYoGom+Gk0fKqMNOl5T53fLicAxvdnaaKbOdZFD8vhd6Jtdv3h0uhcs8ZpVeTCiLRMHPXtOdcyBMbvutRKByaGOS8iJ/hJ5TUH8BWOcZWYYhp8a94rQv1uL5rffHAI= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763474171; c=relaxed/simple; bh=e3yJk7FDm65rNm94TD/8hCBOSZZDJIVLApfIwlcNKmc=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=bSPl57mo+fedHEgmfTodL7z4TQRVd8YEZuh169kO6VFGtBM3gEwAl+vtaoCJ7y7DMy1RLOAtyQg2b5lU83L0zJ4bt6kv7A5yc5ZwYZQvv1mSZkA3VEs2R850ktgQvpLST6BSynXlsdx52QJm0mAOi/RkMUzwfY6gKoTzgmiJPqg= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=ti.com; spf=pass smtp.mailfrom=ti.com; dkim=pass (1024-bit key) header.d=ti.com header.i=@ti.com header.b=pO+wLodr; arc=fail smtp.client-ip=52.101.46.47 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=ti.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=ti.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=ti.com header.i=@ti.com header.b="pO+wLodr" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=pGwLaY8SIY5tofTti9gMTPaYoTB2/fW5qA499dfYPo41+yGuA1TWPLOWj1yzaA6ZCV/BfypWaZWGhx0R/0J5vTgaswlqTdurI+FbSjJHspsab9sI4HPaB0vYJsWnxQjlVZVsa2TWI5w7KFWKUG5DCnmj4WMJ2UW0pHDLd0j4usjnlypHAqxxmxeaB/RaOH9+RxNrH+KTvtyM0y9niwo+U7ldEGqOBvHHab2AEt5C9dE22dnelWDjXplJHd1Ot7NGrV39Pt1Rvf51xSAl8tkgWtkxfQmoZgotuwvZ2x94wGO8EXwL14M5QYW7Cf3tlXn2rPz1Tfet/9eIxVyOaCJkOA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=jLsFjHke8WVpfXWGgboxL3lmQjo8NONC2uzytbXA6oI=; b=nCfZdKNZdBFK8+otxdPeKrUHaR6KrDOy95NEd6BW2TA5YokfUViE150oSXqXN+yBnbgcioN0xvTEPRA0dbW3vNMwxsRZpP73ESaEDSGBYSNiOZt8G658+cCfwaXIMIkfxcNKb3T4KXPv4QI2k/3gw+0g0+HzPZKc6HgWOgOXFy3XK3XMXgpslydnHa52IazGrwFMz8shSgN4biOweEan3caxHQJ3UNqYHvKHqiABPZMue1k0M7XOEBy13wUvOfND0DN3npllSA28+wGvM4gruIcLS/SSG1kB5r5xdIIP012Ro1XOa00cVC2A1ntdleQZONSNKhdnoyLF/9giETjVrA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 198.47.23.195) smtp.rcpttodomain=kernel.org smtp.mailfrom=ti.com; dmarc=pass (p=quarantine sp=none pct=100) action=none header.from=ti.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ti.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=jLsFjHke8WVpfXWGgboxL3lmQjo8NONC2uzytbXA6oI=; b=pO+wLodrvRbjdIdzRz0ny2JiIofb1E1YYYtAJx+YzMjsUaAOKfCvDHtCNE5/fqV5dQZQQH3IRMTGL0CClUwfU30d1EN1UZa7uXlw3d5+wIHuquz7oS2YAUqi/lP/51olqw8WlzB5uBVu6/UfKzIZf0vuJZzX/OSBLVnZJKstDn4= Received: from BL1PR13CA0182.namprd13.prod.outlook.com (2603:10b6:208:2be::7) by LV0PR10MB997638.namprd10.prod.outlook.com (2603:10b6:408:346::15) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9320.20; Tue, 18 Nov 2025 13:56:04 +0000 Received: from MN1PEPF0000F0E0.namprd04.prod.outlook.com (2603:10b6:208:2be:cafe::d9) by BL1PR13CA0182.outlook.office365.com (2603:10b6:208:2be::7) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.9343.10 via Frontend Transport; Tue, 18 Nov 2025 13:56:02 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 198.47.23.195) smtp.mailfrom=ti.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=ti.com; Received-SPF: Pass (protection.outlook.com: domain of ti.com designates 198.47.23.195 as permitted sender) receiver=protection.outlook.com; client-ip=198.47.23.195; helo=lewvzet201.ext.ti.com; pr=C Received: from lewvzet201.ext.ti.com (198.47.23.195) by MN1PEPF0000F0E0.mail.protection.outlook.com (10.167.242.38) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9343.9 via Frontend Transport; Tue, 18 Nov 2025 13:56:04 +0000 Received: from DLEE212.ent.ti.com (157.170.170.114) by lewvzet201.ext.ti.com (10.4.14.104) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.20; Tue, 18 Nov 2025 07:56:00 -0600 Received: from DLEE206.ent.ti.com (157.170.170.90) by DLEE212.ent.ti.com (157.170.170.114) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.20; Tue, 18 Nov 2025 07:56:00 -0600 Received: from fllvem-mr08.itg.ti.com (10.64.41.88) by DLEE206.ent.ti.com (157.170.170.90) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.20 via Frontend Transport; Tue, 18 Nov 2025 07:56:00 -0600 Received: from lelv0854.itg.ti.com (lelv0854.itg.ti.com [10.181.64.140]) by fllvem-mr08.itg.ti.com (8.18.1/8.18.1) with ESMTP id 5AIDu029648305; Tue, 18 Nov 2025 07:56:00 -0600 Received: from localhost (meghana-pc.dhcp.ti.com [10.24.69.13] (may be forged)) by lelv0854.itg.ti.com (8.14.7/8.14.7) with ESMTP id 5AIDtx3X004192; Tue, 18 Nov 2025 07:55:59 -0600 From: Meghana Malladi To: , , , , , , , , , , , , , , , , CC: , , , , , , , , Vignesh Raghavendra , Roger Quadros , Subject: [PATCH net-next v6 4/6] net: ti: icssg-prueth: Make emac_run_xdp function independent of page Date: Tue, 18 Nov 2025 19:25:40 +0530 Message-ID: <20251118135542.380574-5-m-malladi@ti.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20251118135542.380574-1-m-malladi@ti.com> References: <20251118135542.380574-1-m-malladi@ti.com> 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 X-C2ProcessedOrg: 333ef613-75bf-4e12-a4b1-8e3623f5dcea X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: MN1PEPF0000F0E0:EE_|LV0PR10MB997638:EE_ X-MS-Office365-Filtering-Correlation-Id: c876b318-07a6-4d87-a15b-08de26aa371b X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|36860700013|1800799024|82310400026|376014|7416014|921020; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?13Lh6cVfrxMayo7mzWXdhtJ7Aa5hnawH6E/pH122LvRuyMuY6dvQkx72+PaA?= =?us-ascii?Q?a6XqrjGFdr18oI8STNCz/puW7HnwMPHAaIsP5wg5x2BNAoQOV7Oz/zqxDC/9?= =?us-ascii?Q?MRTDkqUxodWZ17xNFeZZ0CXhnvf1eTonC13nd89SHiWgSXq9CJCSKZGpK9ME?= =?us-ascii?Q?Uvb8gF7EGe0B8JCA+pYnhufrZJQrL6+kPYMQ2SlArixYUq6ns1Ax5XdlNpI8?= =?us-ascii?Q?ZpD7oMZf8n0xfmhv2IGSpyxdL80+M3HIQy3tSI3M5C7o3qA1+83rTE3MIUTI?= =?us-ascii?Q?EkrazQid4Q4ctHIKbP9rnIrhnTQf8K8cQ91XEKslpW+sAvHHB6zsEQFMHwax?= =?us-ascii?Q?hTsRB/YEhmZpeSVmwGYc0QDjRsP3qz0yINCUlf2QZXh+j+3M7P3LVeQOm61w?= =?us-ascii?Q?pd6/M2R7HGvAIfU+Uh4yS3r3gwzE2yZRT7FA1kbO4RglxP/x8UlrjNsMX228?= =?us-ascii?Q?/u+75t58JB0+3rDldKobG7HBzRb0cFWKX7BZzxB+6BekNp5d8FV6sfaXKpCU?= =?us-ascii?Q?oa9GYlnAj5TwPGje5Jc0CZVfaAQouFkztdh/fuyP0Gze435Cw32mrMcxcIER?= =?us-ascii?Q?4Fd1WiW+rb2yREbczfc9p1tUEAcSk98sGejP/ByV4beCIleDd2LYLOYyZW+E?= =?us-ascii?Q?++BhudaOSXdWwMXwmeBoMO9rGf2kcXh2fSC3JR+b18uuPi+Gxl+2DjX41H2S?= =?us-ascii?Q?zBzgXdgu5YG/NcJ2f/vTypM3BFLTNoCIZ+jsCBV7i/Rw/K8An7RA4/6nFAVd?= =?us-ascii?Q?RORQZhtCQ/jigEVyvbYEm3+xojfpdlxjJmjmgLd1Iwf0nbN6u5gxMsGKzgiM?= =?us-ascii?Q?JojV1vj/Ko533nQZrevIapGKXUmde6STIVXtPAa7HOkcwHwIR5tqCaTXGifz?= =?us-ascii?Q?6e01iflzbp+WeDnjmJlU79LeWJH7qk92Syb7n4U69ldDlX9egtKPKRwHxs4i?= =?us-ascii?Q?LWKjfVM7K+LqkU9DTqGbXO4xea+K97llbnWpyMMrNbtsYIxfH+zNRb3V+Rwk?= =?us-ascii?Q?UJsphX3Di1PLYGTz5CGdEmXVkK1wfQ3iFLz9WQaP4jXZL+GpdpnbF3jWWOMI?= =?us-ascii?Q?Zn1Z332XIbn43mQQIpwbu+0hpR2vI80l124KHwy/IOtBHGFCJpKV7hW+iUou?= =?us-ascii?Q?J0F2WiQR142qk4Obe/I1kkCmGycI4YzVKcDkBrplUxu5weXJDt1R5tuDlLcZ?= =?us-ascii?Q?OQJEcQ3mQOvOJYnxnMWVqfLvo/LWddeWwR2vbrJAVcEEfFLl58mdIClzWeov?= =?us-ascii?Q?aACyLv5LHb4xioHiGRPwSs3rNnkBAG+pV5TXDQiJIU6cTcA4uPGHno5E5KLk?= =?us-ascii?Q?t5Raw8cmqcAv0W7wenqQMbTTlLhGf5dy/0bPAN3eGIjto4ZsO+ag9PYAb9na?= =?us-ascii?Q?5U958QFI4q/krg952HKfLVCD6ResLk2TuSr2pcyJKaKkQfmf5nIrKz7AOcUl?= =?us-ascii?Q?QyncJswtFNJUWvfzCtGtNE1nTE+6Tx+hHRgvGpkaUvcvMUnS26GTsQeJJyQb?= =?us-ascii?Q?0NGPQfSUgp6/eIdcV5kSIstTqjW0y37p7toCHIpn/87gMV12YhABX2c9odyu?= =?us-ascii?Q?j13x+icj/3CWfEJ6ZgVPfykXCobI3kT7BfOWdsQ4?= X-Forefront-Antispam-Report: CIP:198.47.23.195;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:lewvzet201.ext.ti.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230040)(36860700013)(1800799024)(82310400026)(376014)(7416014)(921020);DIR:OUT;SFP:1101; X-OriginatorOrg: ti.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Nov 2025 13:56:04.2487 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: c876b318-07a6-4d87-a15b-08de26aa371b X-MS-Exchange-CrossTenant-Id: e5b49634-450b-4709-8abb-1e2b19b982b7 X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=e5b49634-450b-4709-8abb-1e2b19b982b7;Ip=[198.47.23.195];Helo=[lewvzet201.ext.ti.com] X-MS-Exchange-CrossTenant-AuthSource: MN1PEPF0000F0E0.namprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: LV0PR10MB997638 Content-Type: text/plain; charset="utf-8" emac_run_xdp function runs xdp program, at a given hook point in the Rx path of the driver in NAPI context and returns XDP return codes. In zero copy mode the driver receives packets using UMEM frames instead of pages (native XDP). Decouple the usage of page in this function. Reviewed-by: Jacob Keller Signed-off-by: Meghana Malladi --- drivers/net/ethernet/ti/icssg/icssg_common.c | 26 ++++++++++++-------- drivers/net/ethernet/ti/icssg/icssg_prueth.c | 3 ++- drivers/net/ethernet/ti/icssg/icssg_prueth.h | 9 +++++-- 3 files changed, 25 insertions(+), 13 deletions(-) diff --git a/drivers/net/ethernet/ti/icssg/icssg_common.c b/drivers/net/eth= ernet/ti/icssg/icssg_common.c index d7469ad457fd..b88cfe99e8b7 100644 --- a/drivers/net/ethernet/ti/icssg/icssg_common.c +++ b/drivers/net/ethernet/ti/icssg/icssg_common.c @@ -647,15 +647,15 @@ void emac_rx_timestamp(struct prueth_emac *emac, * emac_xmit_xdp_frame - transmits an XDP frame * @emac: emac device * @xdpf: data to transmit - * @page: page from page pool if already DMA mapped * @q_idx: queue id + * @buff_type: Type of buffer to be transmitted * * Return: XDP state */ u32 emac_xmit_xdp_frame(struct prueth_emac *emac, struct xdp_frame *xdpf, - struct page *page, - unsigned int q_idx) + unsigned int q_idx, + enum prueth_tx_buff_type buff_type) { struct cppi5_host_desc_t *first_desc; struct net_device *ndev =3D emac->ndev; @@ -663,6 +663,7 @@ u32 emac_xmit_xdp_frame(struct prueth_emac *emac, struct prueth_tx_chn *tx_chn; dma_addr_t desc_dma, buf_dma; struct prueth_swdata *swdata; + struct page *page; u32 *epib; int ret; =20 @@ -679,7 +680,12 @@ u32 emac_xmit_xdp_frame(struct prueth_emac *emac, return ICSSG_XDP_CONSUMED; /* drop */ } =20 - if (page) { /* already DMA mapped by page_pool */ + if (buff_type =3D=3D PRUETH_TX_BUFF_TYPE_XDP_TX) { /* already DMA mapped = by page_pool */ + page =3D virt_to_head_page(xdpf->data); + if (unlikely(!page)) { + netdev_err(ndev, "xdp tx: failed to get page from xdpf\n"); + goto drop_free_descs; + } buf_dma =3D page_pool_get_dma_addr(page); buf_dma +=3D xdpf->headroom + sizeof(struct xdp_frame); } else { /* Map the linear buffer */ @@ -734,13 +740,11 @@ EXPORT_SYMBOL_GPL(emac_xmit_xdp_frame); * emac_run_xdp - run an XDP program * @emac: emac device * @xdp: XDP buffer containing the frame - * @page: page with RX data if already DMA mapped * @len: Rx descriptor packet length * * Return: XDP state */ -static u32 emac_run_xdp(struct prueth_emac *emac, struct xdp_buff *xdp, - struct page *page, u32 *len) +static u32 emac_run_xdp(struct prueth_emac *emac, struct xdp_buff *xdp, u3= 2 *len) { struct net_device *ndev =3D emac->ndev; struct netdev_queue *netif_txq; @@ -767,7 +771,8 @@ static u32 emac_run_xdp(struct prueth_emac *emac, struc= t xdp_buff *xdp, q_idx =3D cpu % emac->tx_ch_num; netif_txq =3D netdev_get_tx_queue(ndev, q_idx); __netif_tx_lock(netif_txq, cpu); - result =3D emac_xmit_xdp_frame(emac, xdpf, page, q_idx); + result =3D emac_xmit_xdp_frame(emac, xdpf, q_idx, + PRUETH_TX_BUFF_TYPE_XDP_TX); __netif_tx_unlock(netif_txq); if (result =3D=3D ICSSG_XDP_CONSUMED) { ndev->stats.tx_dropped++; @@ -792,7 +797,8 @@ static u32 emac_run_xdp(struct prueth_emac *emac, struc= t xdp_buff *xdp, fallthrough; /* handle aborts by dropping packet */ case XDP_DROP: ndev->stats.rx_dropped++; - page_pool_recycle_direct(emac->rx_chns.pg_pool, page); + page_pool_recycle_direct(emac->rx_chns.pg_pool, + virt_to_head_page(xdp->data)); return ICSSG_XDP_CONSUMED; } } @@ -861,7 +867,7 @@ static int emac_rx_packet(struct prueth_emac *emac, u32= flow_id, u32 *xdp_state) xdp_init_buff(&xdp, PAGE_SIZE, &rx_chn->xdp_rxq); xdp_prepare_buff(&xdp, pa, PRUETH_HEADROOM, pkt_len, false); =20 - *xdp_state =3D emac_run_xdp(emac, &xdp, page, &pkt_len); + *xdp_state =3D emac_run_xdp(emac, &xdp, &pkt_len); if (*xdp_state !=3D ICSSG_XDP_PASS) goto requeue; headroom =3D xdp.data - xdp.data_hard_start; diff --git a/drivers/net/ethernet/ti/icssg/icssg_prueth.c b/drivers/net/eth= ernet/ti/icssg/icssg_prueth.c index bdce5a40defe..bb8d42ba0102 100644 --- a/drivers/net/ethernet/ti/icssg/icssg_prueth.c +++ b/drivers/net/ethernet/ti/icssg/icssg_prueth.c @@ -1185,7 +1185,8 @@ static int emac_xdp_xmit(struct net_device *dev, int = n, struct xdp_frame **frame __netif_tx_lock(netif_txq, cpu); for (i =3D 0; i < n; i++) { xdpf =3D frames[i]; - err =3D emac_xmit_xdp_frame(emac, xdpf, NULL, q_idx); + err =3D emac_xmit_xdp_frame(emac, xdpf, q_idx, + PRUETH_TX_BUFF_TYPE_XDP_NDO); if (err !=3D ICSSG_XDP_TX) { ndev->stats.tx_dropped++; break; diff --git a/drivers/net/ethernet/ti/icssg/icssg_prueth.h b/drivers/net/eth= ernet/ti/icssg/icssg_prueth.h index 67339cdf2ddf..3147a1d8f59a 100644 --- a/drivers/net/ethernet/ti/icssg/icssg_prueth.h +++ b/drivers/net/ethernet/ti/icssg/icssg_prueth.h @@ -154,6 +154,11 @@ enum prueth_swdata_type { PRUETH_SWDATA_XSK, }; =20 +enum prueth_tx_buff_type { + PRUETH_TX_BUFF_TYPE_XDP_TX, + PRUETH_TX_BUFF_TYPE_XDP_NDO, +}; + struct prueth_swdata { enum prueth_swdata_type type; union prueth_data { @@ -506,8 +511,8 @@ void prueth_put_cores(struct prueth *prueth, int slice); u64 icssg_ts_to_ns(u32 hi_sw, u32 hi, u32 lo, u32 cycle_time_ns); u32 emac_xmit_xdp_frame(struct prueth_emac *emac, struct xdp_frame *xdpf, - struct page *page, - unsigned int q_idx); + unsigned int q_idx, + enum prueth_tx_buff_type buff_type); void prueth_rx_cleanup(void *data, dma_addr_t desc_dma); void prueth_tx_cleanup(void *data, dma_addr_t desc_dma); int prueth_xsk_wakeup(struct net_device *ndev, u32 qid, u32 flags); --=20 2.43.0 From nobody Tue Dec 2 02:44:08 2025 Received: from CO1PR03CU002.outbound.protection.outlook.com (mail-westus2azon11010022.outbound.protection.outlook.com [52.101.46.22]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3939435A126; Tue, 18 Nov 2025 13:56:11 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.46.22 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763474176; cv=fail; b=Pqfetzuk1ikiSmYltEQzLyRCOyA6pVBpDYh8PN1oxJv65TX4LbUF0yik5rjAdELhNdEFwRKGBTvsaO8mEYPK37j+nV61IWFTzCin9Egg1CHddfzm0fYL0GJtAg0x+SlMxolcw8cUav+xJsQClOmVGZXyITZ55dB3/DnReYj4dMQ= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763474176; c=relaxed/simple; bh=PtqwfYOhe+h6osMgFnLZlw0vpDC+DGfyKnDZTdKwPpo=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=mFeFq7eGkxxOePtIOZQPPHAM6zfOEDRf6bbD3S9qit38G55KSKF309ugzR3meXDflq17KiXuteItPGIH9tJyQlpDJ+j6sCQuA2MeWN7eyXCxFi90jZ7CnK1HJQheYgt5blpgIaWpr4CElJXt6zEjeYgWZkMOLaRhkCmHcHzSUuA= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=ti.com; spf=pass smtp.mailfrom=ti.com; dkim=pass (1024-bit key) header.d=ti.com header.i=@ti.com header.b=mmVO8/ht; arc=fail smtp.client-ip=52.101.46.22 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=ti.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=ti.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=ti.com header.i=@ti.com header.b="mmVO8/ht" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=rYfyh85Bg9NSmI+8SDqbdy24u4xtGrWAb3yPeppGJQkm3ma/+f1bklG2l/wJsjmSGcI7NfMlrpBEBwWJoDMO/++07e4r4YXXOCwRL0UKmEQf/sefyUzKi9x6nFA2STcDMphn9Wj45mHpW02f73hvGSQv7pLNuwxVtFq96C8ZM+Ouqqfj4yXalDj224UkGl25QYs6jryH1/j0vgvlBknNTpElwfIPFCwxVnzJoBXmklxDj5SXQMq2xJQeD7HuRtNbQfcLGq2PIofiBFZ98ThWejKjPNgEnswqZZmCowyNZKe4hrrFyc0dC3faQgUC3xFZ00TStOeOpWL5xWWy/tu6Qg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=Ov5fg9RnDjFSJF7U/AlkuHO0K2Jh/ytcbujJzad2jgk=; b=YGueSEMbEsp1FM6oPsvuLyoQG9DVFUacyae9o6W/2CNtQsPcrId++ynNXBhSxFktaH1/KgsKsFp5n7eCoA2wsNdrO6Y49yktzoumlKW8oH1aSRanawx2vqZF1NbLDcMf6aSlcVLRNgvFcMIaExT19O0SvnRD57/fqquDHYXkNdAGnOd8lA4819szSjLI5QqVoPJ7FKodLqEGBXebHV5sJFB/djxjuUPlVx5M8KpQ3b9kFX8WLebZHK6qowGzmiGqPnWRpIfYhuIC/tXeqVXgU1n9MUTycMNuY1kXsYNURiVdL2dShhhc9y00F58eDNByW2VxKMUD82oMFq+5OVyF9g== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 198.47.23.194) smtp.rcpttodomain=kernel.org smtp.mailfrom=ti.com; dmarc=pass (p=quarantine sp=none pct=100) action=none header.from=ti.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ti.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=Ov5fg9RnDjFSJF7U/AlkuHO0K2Jh/ytcbujJzad2jgk=; b=mmVO8/htmxmsR3OpYQsrtknDq48EiOmM1IrEX4jSM21jPhmkbN9tVDncSTrU7I5T/bjPrg5rY0JDPxCOSs/skH8GaZn40f5pikOhbqtZpluya82CbldCltK5Paom3Rif563x/lHhN2AFiu3AmvGAT4ZVgaVH8Xa3wpK9VGg0UkE= Received: from SA0PR11CA0184.namprd11.prod.outlook.com (2603:10b6:806:1bc::9) by BL3PR10MB6137.namprd10.prod.outlook.com (2603:10b6:208:3b8::20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9320.21; Tue, 18 Nov 2025 13:56:09 +0000 Received: from SA2PEPF00003AE6.namprd02.prod.outlook.com (2603:10b6:806:1bc:cafe::f6) by SA0PR11CA0184.outlook.office365.com (2603:10b6:806:1bc::9) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.9320.22 via Frontend Transport; Tue, 18 Nov 2025 13:56:09 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 198.47.23.194) smtp.mailfrom=ti.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=ti.com; Received-SPF: Pass (protection.outlook.com: domain of ti.com designates 198.47.23.194 as permitted sender) receiver=protection.outlook.com; client-ip=198.47.23.194; helo=lewvzet200.ext.ti.com; pr=C Received: from lewvzet200.ext.ti.com (198.47.23.194) by SA2PEPF00003AE6.mail.protection.outlook.com (10.167.248.6) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9343.9 via Frontend Transport; Tue, 18 Nov 2025 13:56:08 +0000 Received: from DLEE208.ent.ti.com (157.170.170.97) by lewvzet200.ext.ti.com (10.4.14.103) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.20; Tue, 18 Nov 2025 07:56:03 -0600 Received: from DLEE202.ent.ti.com (157.170.170.77) by DLEE208.ent.ti.com (157.170.170.97) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.20; Tue, 18 Nov 2025 07:56:03 -0600 Received: from fllvem-mr07.itg.ti.com (10.64.41.89) by DLEE202.ent.ti.com (157.170.170.77) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.20 via Frontend Transport; Tue, 18 Nov 2025 07:56:03 -0600 Received: from lelv0854.itg.ti.com (lelv0854.itg.ti.com [10.181.64.140]) by fllvem-mr07.itg.ti.com (8.18.1/8.18.1) with ESMTP id 5AIDu3rB606002; Tue, 18 Nov 2025 07:56:03 -0600 Received: from localhost (meghana-pc.dhcp.ti.com [10.24.69.13] (may be forged)) by lelv0854.itg.ti.com (8.14.7/8.14.7) with ESMTP id 5AIDu1li004199; Tue, 18 Nov 2025 07:56:02 -0600 From: Meghana Malladi To: , , , , , , , , , , , , , , , , CC: , , , , , , , , Vignesh Raghavendra , Roger Quadros , Subject: [PATCH net-next v6 5/6] net: ti: icssg-prueth: Add AF_XDP zero copy for RX Date: Tue, 18 Nov 2025 19:25:41 +0530 Message-ID: <20251118135542.380574-6-m-malladi@ti.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20251118135542.380574-1-m-malladi@ti.com> References: <20251118135542.380574-1-m-malladi@ti.com> 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 X-C2ProcessedOrg: 333ef613-75bf-4e12-a4b1-8e3623f5dcea X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SA2PEPF00003AE6:EE_|BL3PR10MB6137:EE_ X-MS-Office365-Filtering-Correlation-Id: a9fe9af8-85cf-4b6a-418f-08de26aa39c6 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|36860700013|1800799024|82310400026|7416014|376014|7053199007|921020; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?z2KIuz5bXp4bLGnqHyFD2hyrH/F7KVkKXyM/ub9Xaa+UvKuKddKCRv3hK7u3?= =?us-ascii?Q?cbr2ANN5+Q3JZEyoCQEy8AwA7z3nUJnxNQ0JzhNiD7YgiUsV2ALbpmu2UQYw?= =?us-ascii?Q?xTWhI8azz8K0bq0YBNxn6qwElbui8neGD1o7GIJFxk9U2O3Fz170rIe0VFYq?= =?us-ascii?Q?PJCVhPNry/nm3IBLR8T3aayv4EsUqpn4wGHDZqs8Ls0hPHSHOZRm5GoLG7jA?= =?us-ascii?Q?cFekzAdg9uO7hidH9Ftc77b7uzIYsjm3TxiLKJCtvyZpJYLI6F/LWu5ahUn2?= =?us-ascii?Q?7Oy1cEE8MYV0OGs81uLIhQmCApwL6oxfey95lYwKWQjCGwgNL/PQ40JHWckd?= =?us-ascii?Q?E6xHq6JFbtXF17byIrOKh6UcEdylNkii/wfJ4YnUy+uCfYbVpcR7hJC+wwbt?= =?us-ascii?Q?3OJ70A5YPXYWrptqpudPzDihFcaGxasXDY/6nydJqhEdULJwkhZGhMVqOtVh?= =?us-ascii?Q?8iHSGOAtbXrc8duDVeFThqX2Fqh6/c1hwCCVXjOLTTVjhH7EqSUcXgD/O8Bj?= =?us-ascii?Q?3lZgqYjVB2/aFHMyHmg+c/zvSrN7W8XJtPy/kZtsCGJkHaVs4IRay8KEpRAp?= =?us-ascii?Q?xy1ELlj+XquRQLny5m+8CFf7IeS09yWLgL9tNhNRrmcDo230gFJ5X4++4L1Q?= =?us-ascii?Q?wd98wyhN/eb9teftYsFiEP3S02xGGjT3pL9wFiM6hOSjMjSl3lVRdwh6Cz2r?= =?us-ascii?Q?rKeruzJo8ZKeFoTDd00ZKCTsJUVxeAzb01ahD9jOjI2MfgliKD1538uHXJky?= =?us-ascii?Q?IXrLJAGzQ6Ea8bojSvoEUIPSUcXpGGhrFhVmIHJqZg5zI+JVtfGyc1mnshhP?= =?us-ascii?Q?bj2HIM7FSATXUk7EqP/fm7uY0KbsGsRvQIIegsqVC98TC6nORxTw77o3dsqY?= =?us-ascii?Q?cLSY3rHWjJ8VQecm+GKg4j9CAY9cmS29Thqehkl3ZGozyi8FoGjUoxXWu3bG?= =?us-ascii?Q?/6A8ZnPssSHm9L5ywrNeul6BZ3J0c95NSEuvtawzziT3muYhR8IxCid72rZ/?= =?us-ascii?Q?PR/SxItU9VWHafhzl5qLDEpSiHRkEphBzfZB/iuNlm3WUmZ74YdbuqeI5IOV?= =?us-ascii?Q?92V7429TQ/z/0e3FWn+Wcu/vwV/EBi2s9X0OOkHy8U8EfVeTTIlS9HLQmV7U?= =?us-ascii?Q?+MpgJDyGBuOPm+TX0YzWICWb0EKUyL9hGfW6Oam5biUGR97+TvY3D5MDnjyd?= =?us-ascii?Q?6IlSbKwydzdS+Urp63aejzQQdcNGLMQWZLjXZwsIAml2Rch+vlUzI36tyh5K?= =?us-ascii?Q?a3AjG73tLDNNy2fiV+tLteVI4C15WdsL+mfGNqwQT5CGpKmyjy0LOrzpY2Wc?= =?us-ascii?Q?CxTc8GNoNUeSW74H3751ehd2egsnkzyX/mE3vKU58faSJYbYVspUt49LjbpW?= =?us-ascii?Q?o+F6X06NpXmNKa+tOtOGAWTXSl2tfGevxy6r+gonwpdB/aLJaLHY81+XLMZG?= =?us-ascii?Q?Smxxybb9b0qjiXo+Zyn+isvFhJuBuqlEM8F8kUTn73Wqiy7bSsNHn19Znl6u?= =?us-ascii?Q?fD/MKoetXZo66r3YRvcsVomTUHwWsEfx7lh9L3u51kbwdy0rQzJJPd3MvpNX?= =?us-ascii?Q?u1CpGDHZguDooTeQhwlorkovszau/BhhH3FpXXiV?= X-Forefront-Antispam-Report: CIP:198.47.23.194;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:lewvzet200.ext.ti.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230040)(36860700013)(1800799024)(82310400026)(7416014)(376014)(7053199007)(921020);DIR:OUT;SFP:1101; X-OriginatorOrg: ti.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Nov 2025 13:56:08.8494 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: a9fe9af8-85cf-4b6a-418f-08de26aa39c6 X-MS-Exchange-CrossTenant-Id: e5b49634-450b-4709-8abb-1e2b19b982b7 X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=e5b49634-450b-4709-8abb-1e2b19b982b7;Ip=[198.47.23.194];Helo=[lewvzet200.ext.ti.com] X-MS-Exchange-CrossTenant-AuthSource: SA2PEPF00003AE6.namprd02.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: BL3PR10MB6137 Content-Type: text/plain; charset="utf-8" Use xsk_pool inside rx_chn to check if a given Rx queue id is registered for xsk zero copy, which gets populated during xsk enable. Update prueth_create_xdp_rxqs to register and support two different memory models (xsk and page) for a given Rx queue, if registered for zero copy. If xsk_pool is registered, allocate buffers from UMEM and map them to the hardware Rx descriptors. In NAPI context, run the XDP program for each packet and process the xsk buffer according to the XDP result codes. Also allocate new set of buffers from UMEM for the next batch of NAPI Rx processing. Add XDK_WAKEUP_RX support to support xsk wakeup for Rx. Move prueth_create_page_pool to prueth_init_rx_chns to avoid freeing and re-allocating the system memory every time there is a transition from zero copy to copy and prevents any type of memory fragmentation or leak. Reviewed-by: Jacob Keller Signed-off-by: Meghana Malladi --- v6-v5: - Removed the dead code inside prueth_dma_rx_push_mapped_zc() function as reported by Simon Horman drivers/net/ethernet/ti/icssg/icssg_common.c | 323 +++++++++++++++---- drivers/net/ethernet/ti/icssg/icssg_prueth.c | 60 +++- drivers/net/ethernet/ti/icssg/icssg_prueth.h | 2 + 3 files changed, 313 insertions(+), 72 deletions(-) diff --git a/drivers/net/ethernet/ti/icssg/icssg_common.c b/drivers/net/eth= ernet/ti/icssg/icssg_common.c index b88cfe99e8b7..090aa74d3ce7 100644 --- a/drivers/net/ethernet/ti/icssg/icssg_common.c +++ b/drivers/net/ethernet/ti/icssg/icssg_common.c @@ -465,6 +465,29 @@ int prueth_init_tx_chns(struct prueth_emac *emac) } EXPORT_SYMBOL_GPL(prueth_init_tx_chns); =20 +static struct page_pool *prueth_create_page_pool(struct prueth_emac *emac, + struct device *dma_dev, + int size) +{ + struct page_pool_params pp_params =3D { 0 }; + struct page_pool *pool; + + pp_params.order =3D 0; + pp_params.flags =3D PP_FLAG_DMA_MAP | PP_FLAG_DMA_SYNC_DEV; + pp_params.pool_size =3D size; + pp_params.nid =3D dev_to_node(emac->prueth->dev); + pp_params.dma_dir =3D DMA_BIDIRECTIONAL; + pp_params.dev =3D dma_dev; + pp_params.napi =3D &emac->napi_rx; + pp_params.max_len =3D PAGE_SIZE; + + pool =3D page_pool_create(&pp_params); + if (IS_ERR(pool)) + netdev_err(emac->ndev, "cannot create rx page pool\n"); + + return pool; +} + int prueth_init_rx_chns(struct prueth_emac *emac, struct prueth_rx_chn *rx_chn, char *name, u32 max_rflows, @@ -474,6 +497,7 @@ int prueth_init_rx_chns(struct prueth_emac *emac, struct device *dev =3D emac->prueth->dev; struct net_device *ndev =3D emac->ndev; u32 fdqring_id, hdesc_size; + struct page_pool *pool; int i, ret =3D 0, slice; int flow_id_base; =20 @@ -516,6 +540,14 @@ int prueth_init_rx_chns(struct prueth_emac *emac, goto fail; } =20 + pool =3D prueth_create_page_pool(emac, rx_chn->dma_dev, rx_chn->descs_num= ); + if (IS_ERR(pool)) { + ret =3D PTR_ERR(pool); + goto fail; + } + + rx_chn->pg_pool =3D pool; + flow_id_base =3D k3_udma_glue_rx_get_flow_id_base(rx_chn->rx_chn); if (emac->is_sr1 && !strcmp(name, "rxmgm")) { emac->rx_mgm_flow_id_base =3D flow_id_base; @@ -797,12 +829,188 @@ static u32 emac_run_xdp(struct prueth_emac *emac, st= ruct xdp_buff *xdp, u32 *len fallthrough; /* handle aborts by dropping packet */ case XDP_DROP: ndev->stats.rx_dropped++; - page_pool_recycle_direct(emac->rx_chns.pg_pool, - virt_to_head_page(xdp->data)); return ICSSG_XDP_CONSUMED; } } =20 +static int prueth_dma_rx_push_mapped_zc(struct prueth_emac *emac, + struct prueth_rx_chn *rx_chn, + struct xdp_buff *xdp) +{ + struct net_device *ndev =3D emac->ndev; + struct cppi5_host_desc_t *desc_rx; + struct prueth_swdata *swdata; + dma_addr_t desc_dma; + dma_addr_t buf_dma; + int buf_len; + + buf_dma =3D xsk_buff_xdp_get_dma(xdp); + desc_rx =3D k3_cppi_desc_pool_alloc(rx_chn->desc_pool); + if (!desc_rx) { + netdev_err(ndev, "rx push: failed to allocate descriptor\n"); + return -ENOMEM; + } + desc_dma =3D k3_cppi_desc_pool_virt2dma(rx_chn->desc_pool, desc_rx); + + cppi5_hdesc_init(desc_rx, CPPI5_INFO0_HDESC_EPIB_PRESENT, + PRUETH_NAV_PS_DATA_SIZE); + k3_udma_glue_rx_dma_to_cppi5_addr(rx_chn->rx_chn, &buf_dma); + buf_len =3D xsk_pool_get_rx_frame_size(rx_chn->xsk_pool); + cppi5_hdesc_attach_buf(desc_rx, buf_dma, buf_len, buf_dma, buf_len); + swdata =3D cppi5_hdesc_get_swdata(desc_rx); + swdata->type =3D PRUETH_SWDATA_XSK; + swdata->data.xdp =3D xdp; + + return k3_udma_glue_push_rx_chn(rx_chn->rx_chn, PRUETH_RX_FLOW_DATA, + desc_rx, desc_dma); +} + +static int prueth_rx_alloc_zc(struct prueth_emac *emac, int budget) +{ + struct prueth_rx_chn *rx_chn =3D &emac->rx_chns; + struct xdp_buff *xdp; + int i, ret; + + for (i =3D 0; i < budget; i++) { + xdp =3D xsk_buff_alloc(rx_chn->xsk_pool); + if (!xdp) + break; + + ret =3D prueth_dma_rx_push_mapped_zc(emac, rx_chn, xdp); + if (ret) { + netdev_err(emac->ndev, "rx alloc: failed to map descriptors to xdp buff= \n"); + xsk_buff_free(xdp); + break; + } + } + + return i; +} + +static void emac_dispatch_skb_zc(struct prueth_emac *emac, struct xdp_buff= *xdp, u32 *psdata) +{ + unsigned int headroom =3D xdp->data - xdp->data_hard_start; + unsigned int pkt_len =3D xdp->data_end - xdp->data; + struct net_device *ndev =3D emac->ndev; + struct sk_buff *skb; + + skb =3D napi_alloc_skb(&emac->napi_rx, xdp->data_end - xdp->data_hard_sta= rt); + if (unlikely(!skb)) { + ndev->stats.rx_dropped++; + return; + } + + skb_reserve(skb, headroom); + skb_put(skb, pkt_len); + skb->dev =3D ndev; + + /* RX HW timestamp */ + if (emac->rx_ts_enabled) + emac_rx_timestamp(emac, skb, psdata); + + if (emac->prueth->is_switch_mode) + skb->offload_fwd_mark =3D emac->offload_fwd_mark; + skb->protocol =3D eth_type_trans(skb, ndev); + + skb_mark_for_recycle(skb); + napi_gro_receive(&emac->napi_rx, skb); + ndev->stats.rx_bytes +=3D pkt_len; + ndev->stats.rx_packets++; +} + +static int emac_rx_packet_zc(struct prueth_emac *emac, u32 flow_id, + int budget) +{ + struct prueth_rx_chn *rx_chn =3D &emac->rx_chns; + u32 buf_dma_len, pkt_len, port_id =3D 0; + struct net_device *ndev =3D emac->ndev; + struct cppi5_host_desc_t *desc_rx; + struct prueth_swdata *swdata; + dma_addr_t desc_dma, buf_dma; + struct xdp_buff *xdp; + int xdp_status =3D 0; + int count =3D 0; + u32 *psdata; + int ret; + + while (count < budget) { + ret =3D k3_udma_glue_pop_rx_chn(rx_chn->rx_chn, flow_id, &desc_dma); + if (ret) { + if (ret !=3D -ENODATA) + netdev_err(ndev, "rx pop: failed: %d\n", ret); + break; + } + + if (cppi5_desc_is_tdcm(desc_dma)) { + complete(&emac->tdown_complete); + break; + } + + desc_rx =3D k3_cppi_desc_pool_dma2virt(rx_chn->desc_pool, desc_dma); + swdata =3D cppi5_hdesc_get_swdata(desc_rx); + if (swdata->type !=3D PRUETH_SWDATA_XSK) { + netdev_err(ndev, "rx_pkt: invalid swdata->type %d\n", swdata->type); + k3_cppi_desc_pool_free(rx_chn->desc_pool, desc_rx); + break; + } + + xdp =3D swdata->data.xdp; + cppi5_hdesc_get_obuf(desc_rx, &buf_dma, &buf_dma_len); + k3_udma_glue_rx_cppi5_to_dma_addr(rx_chn->rx_chn, &buf_dma); + pkt_len =3D cppi5_hdesc_get_pktlen(desc_rx); + /* firmware adds 4 CRC bytes, strip them */ + pkt_len -=3D 4; + cppi5_desc_get_tags_ids(&desc_rx->hdr, &port_id, NULL); + psdata =3D cppi5_hdesc_get_psdata(desc_rx); + k3_cppi_desc_pool_free(rx_chn->desc_pool, desc_rx); + count++; + xsk_buff_set_size(xdp, pkt_len); + xsk_buff_dma_sync_for_cpu(xdp); + + if (prueth_xdp_is_enabled(emac)) { + ret =3D emac_run_xdp(emac, xdp, &pkt_len); + switch (ret) { + case ICSSG_XDP_PASS: + /* prepare skb and send to n/w stack */ + emac_dispatch_skb_zc(emac, xdp, psdata); + xsk_buff_free(xdp); + break; + case ICSSG_XDP_CONSUMED: + xsk_buff_free(xdp); + break; + case ICSSG_XDP_TX: + case ICSSG_XDP_REDIR: + xdp_status |=3D ret; + break; + } + } else { + /* prepare skb and send to n/w stack */ + emac_dispatch_skb_zc(emac, xdp, psdata); + xsk_buff_free(xdp); + } + } + + if (xdp_status & ICSSG_XDP_REDIR) + xdp_do_flush(); + + /* Allocate xsk buffers from the pool for the "count" number of + * packets processed in order to be able to receive more packets. + */ + ret =3D prueth_rx_alloc_zc(emac, count); + + if (xsk_uses_need_wakeup(rx_chn->xsk_pool)) { + /* If the user space doesn't provide enough buffers then it must + * explicitly wake up the kernel when new buffers are available + */ + if (ret < count) + xsk_set_rx_need_wakeup(rx_chn->xsk_pool); + else + xsk_clear_rx_need_wakeup(rx_chn->xsk_pool); + } + + return count; +} + static int emac_rx_packet(struct prueth_emac *emac, u32 flow_id, u32 *xdp_= state) { struct prueth_rx_chn *rx_chn =3D &emac->rx_chns; @@ -849,7 +1057,6 @@ static int emac_rx_packet(struct prueth_emac *emac, u3= 2 flow_id, u32 *xdp_state) /* firmware adds 4 CRC bytes, strip them */ pkt_len -=3D 4; cppi5_desc_get_tags_ids(&desc_rx->hdr, &port_id, NULL); - k3_cppi_desc_pool_free(rx_chn->desc_pool, desc_rx); =20 /* if allocation fails we drop the packet but push the @@ -921,12 +1128,16 @@ void prueth_rx_cleanup(void *data, dma_addr_t desc_d= ma) struct cppi5_host_desc_t *desc_rx; struct prueth_swdata *swdata; struct page_pool *pool; + struct xdp_buff *xdp; struct page *page; =20 pool =3D rx_chn->pg_pool; desc_rx =3D k3_cppi_desc_pool_dma2virt(rx_chn->desc_pool, desc_dma); swdata =3D cppi5_hdesc_get_swdata(desc_rx); - if (swdata->type =3D=3D PRUETH_SWDATA_PAGE) { + if (rx_chn->xsk_pool) { + xdp =3D swdata->data.xdp; + xsk_buff_free(xdp); + } else { page =3D swdata->data.page; page_pool_recycle_direct(pool, page); } @@ -1174,6 +1385,7 @@ irqreturn_t prueth_rx_irq(int irq, void *dev_id) { struct prueth_emac *emac =3D dev_id; =20 + emac->rx_chns.irq_disabled =3D true; disable_irq_nosync(irq); napi_schedule(&emac->napi_rx); =20 @@ -1201,6 +1413,7 @@ int icssg_napi_rx_poll(struct napi_struct *napi_rx, i= nt budget) PRUETH_RX_FLOW_DATA_SR1 : PRUETH_RX_FLOW_DATA; int flow =3D emac->is_sr1 ? PRUETH_MAX_RX_FLOWS_SR1 : PRUETH_MAX_RX_FLOWS; + struct prueth_rx_chn *rx_chn =3D &emac->rx_chns; int xdp_state_or =3D 0; int num_rx =3D 0; int cur_budget; @@ -1208,14 +1421,18 @@ int icssg_napi_rx_poll(struct napi_struct *napi_rx,= int budget) int ret; =20 while (flow--) { - cur_budget =3D budget - num_rx; - - while (cur_budget--) { - ret =3D emac_rx_packet(emac, flow, &xdp_state); - xdp_state_or |=3D xdp_state; - if (ret) - break; - num_rx++; + if (rx_chn->xsk_pool) { + num_rx =3D emac_rx_packet_zc(emac, flow, budget); + } else { + cur_budget =3D budget - num_rx; + + while (cur_budget--) { + ret =3D emac_rx_packet(emac, flow, &xdp_state); + xdp_state_or |=3D xdp_state; + if (ret) + break; + num_rx++; + } } =20 if (num_rx >=3D budget) @@ -1231,7 +1448,11 @@ int icssg_napi_rx_poll(struct napi_struct *napi_rx, = int budget) ns_to_ktime(emac->rx_pace_timeout_ns), HRTIMER_MODE_REL_PINNED); } else { - enable_irq(emac->rx_chns.irq[rx_flow]); + if (emac->rx_chns.irq_disabled) { + /* re-enable the RX IRQ */ + emac->rx_chns.irq_disabled =3D false; + enable_irq(emac->rx_chns.irq[rx_flow]); + } } } =20 @@ -1239,62 +1460,48 @@ int icssg_napi_rx_poll(struct napi_struct *napi_rx,= int budget) } EXPORT_SYMBOL_GPL(icssg_napi_rx_poll); =20 -static struct page_pool *prueth_create_page_pool(struct prueth_emac *emac, - struct device *dma_dev, - int size) -{ - struct page_pool_params pp_params =3D { 0 }; - struct page_pool *pool; - - pp_params.order =3D 0; - pp_params.flags =3D PP_FLAG_DMA_MAP | PP_FLAG_DMA_SYNC_DEV; - pp_params.pool_size =3D size; - pp_params.nid =3D dev_to_node(emac->prueth->dev); - pp_params.dma_dir =3D DMA_BIDIRECTIONAL; - pp_params.dev =3D dma_dev; - pp_params.napi =3D &emac->napi_rx; - pp_params.max_len =3D PAGE_SIZE; - - pool =3D page_pool_create(&pp_params); - if (IS_ERR(pool)) - netdev_err(emac->ndev, "cannot create rx page pool\n"); - - return pool; -} - int prueth_prepare_rx_chan(struct prueth_emac *emac, struct prueth_rx_chn *chn, int buf_size) { - struct page_pool *pool; struct page *page; + int desc_avail; int i, ret; =20 - pool =3D prueth_create_page_pool(emac, chn->dma_dev, chn->descs_num); - if (IS_ERR(pool)) - return PTR_ERR(pool); - - chn->pg_pool =3D pool; + desc_avail =3D k3_cppi_desc_pool_avail(chn->desc_pool); + if (desc_avail < chn->descs_num) + netdev_warn(emac->ndev, + "not enough RX descriptors available %d < %d\n", + desc_avail, chn->descs_num); =20 - for (i =3D 0; i < chn->descs_num; i++) { - /* NOTE: we're not using memory efficiently here. - * 1 full page (4KB?) used here instead of - * PRUETH_MAX_PKT_SIZE (~1.5KB?) + if (chn->xsk_pool) { + /* get pages from xsk_pool and push to RX ring + * queue as much as possible */ - page =3D page_pool_dev_alloc_pages(pool); - if (!page) { - netdev_err(emac->ndev, "couldn't allocate rx page\n"); - ret =3D -ENOMEM; + ret =3D prueth_rx_alloc_zc(emac, desc_avail); + if (!ret) goto recycle_alloc_pg; - } + } else { + for (i =3D 0; i < desc_avail; i++) { + /* NOTE: we're not using memory efficiently here. + * 1 full page (4KB?) used here instead of + * PRUETH_MAX_PKT_SIZE (~1.5KB?) + */ + page =3D page_pool_dev_alloc_pages(chn->pg_pool); + if (!page) { + netdev_err(emac->ndev, "couldn't allocate rx page\n"); + ret =3D -ENOMEM; + goto recycle_alloc_pg; + } =20 - ret =3D prueth_dma_rx_push_mapped(emac, chn, page, buf_size); - if (ret < 0) { - netdev_err(emac->ndev, - "cannot submit page for rx chan %s ret %d\n", - chn->name, ret); - page_pool_recycle_direct(pool, page); - goto recycle_alloc_pg; + ret =3D prueth_dma_rx_push_mapped(emac, chn, page, buf_size); + if (ret < 0) { + netdev_err(emac->ndev, + "cannot submit page for rx chan %s ret %d\n", + chn->name, ret); + page_pool_recycle_direct(chn->pg_pool, page); + goto recycle_alloc_pg; + } } } =20 diff --git a/drivers/net/ethernet/ti/icssg/icssg_prueth.c b/drivers/net/eth= ernet/ti/icssg/icssg_prueth.c index bb8d42ba0102..22de04ac18cb 100644 --- a/drivers/net/ethernet/ti/icssg/icssg_prueth.c +++ b/drivers/net/ethernet/ti/icssg/icssg_prueth.c @@ -395,7 +395,11 @@ static enum hrtimer_restart emac_rx_timer_callback(str= uct hrtimer *timer) container_of(timer, struct prueth_emac, rx_hrtimer); int rx_flow =3D PRUETH_RX_FLOW_DATA; =20 - enable_irq(emac->rx_chns.irq[rx_flow]); + if (emac->rx_chns.irq_disabled) { + /* re-enable the RX IRQ */ + emac->rx_chns.irq_disabled =3D false; + enable_irq(emac->rx_chns.irq[rx_flow]); + } return HRTIMER_NORESTART; } =20 @@ -569,31 +573,41 @@ const struct icss_iep_clockops prueth_iep_clockops = =3D { .perout_enable =3D prueth_perout_enable, }; =20 +static void prueth_destroy_xdp_rxqs(struct prueth_emac *emac) +{ + struct xdp_rxq_info *rxq =3D &emac->rx_chns.xdp_rxq; + + if (xdp_rxq_info_is_reg(rxq)) + xdp_rxq_info_unreg(rxq); +} + static int prueth_create_xdp_rxqs(struct prueth_emac *emac) { struct xdp_rxq_info *rxq =3D &emac->rx_chns.xdp_rxq; struct page_pool *pool =3D emac->rx_chns.pg_pool; + struct prueth_rx_chn *rx_chn =3D &emac->rx_chns; int ret; =20 ret =3D xdp_rxq_info_reg(rxq, emac->ndev, 0, emac->napi_rx.napi_id); if (ret) return ret; =20 - ret =3D xdp_rxq_info_reg_mem_model(rxq, MEM_TYPE_PAGE_POOL, pool); - if (ret) - xdp_rxq_info_unreg(rxq); - - return ret; -} - -static void prueth_destroy_xdp_rxqs(struct prueth_emac *emac) -{ - struct xdp_rxq_info *rxq =3D &emac->rx_chns.xdp_rxq; + if (rx_chn->xsk_pool) { + ret =3D xdp_rxq_info_reg_mem_model(rxq, MEM_TYPE_XSK_BUFF_POOL, NULL); + if (ret) + goto xdp_unreg; + xsk_pool_set_rxq_info(rx_chn->xsk_pool, rxq); + } else { + ret =3D xdp_rxq_info_reg_mem_model(rxq, MEM_TYPE_PAGE_POOL, pool); + if (ret) + goto xdp_unreg; + } =20 - if (!xdp_rxq_info_is_reg(rxq)) - return; + return 0; =20 - xdp_rxq_info_unreg(rxq); +xdp_unreg: + prueth_destroy_xdp_rxqs(emac); + return ret; } =20 static int icssg_prueth_add_mcast(struct net_device *ndev, const u8 *addr) @@ -1349,6 +1363,12 @@ int prueth_xsk_wakeup(struct net_device *ndev, u32 q= id, u32 flags) { struct prueth_emac *emac =3D netdev_priv(ndev); struct prueth_tx_chn *tx_chn =3D &emac->tx_chns[qid]; + struct prueth_rx_chn *rx_chn =3D &emac->rx_chns; + + if (emac->xsk_qid !=3D qid) { + netdev_err(ndev, "XSK queue %d not registered\n", qid); + return -EINVAL; + } =20 if (qid >=3D PRUETH_MAX_RX_FLOWS || qid >=3D emac->tx_ch_num) { netdev_err(ndev, "Invalid XSK queue ID %d\n", qid); @@ -1360,6 +1380,11 @@ int prueth_xsk_wakeup(struct net_device *ndev, u32 q= id, u32 flags) return -EINVAL; } =20 + if (!rx_chn->xsk_pool) { + netdev_err(ndev, "XSK pool not registered for RX queue %d\n", qid); + return -EINVAL; + } + if (flags & XDP_WAKEUP_TX) { if (!napi_if_scheduled_mark_missed(&tx_chn->napi_tx)) { if (likely(napi_schedule_prep(&tx_chn->napi_tx))) @@ -1367,6 +1392,13 @@ int prueth_xsk_wakeup(struct net_device *ndev, u32 q= id, u32 flags) } } =20 + if (flags & XDP_WAKEUP_RX) { + if (!napi_if_scheduled_mark_missed(&emac->napi_rx)) { + if (likely(napi_schedule_prep(&emac->napi_rx))) + __napi_schedule(&emac->napi_rx); + } + } + return 0; } =20 diff --git a/drivers/net/ethernet/ti/icssg/icssg_prueth.h b/drivers/net/eth= ernet/ti/icssg/icssg_prueth.h index 3147a1d8f59a..10eadd356650 100644 --- a/drivers/net/ethernet/ti/icssg/icssg_prueth.h +++ b/drivers/net/ethernet/ti/icssg/icssg_prueth.h @@ -143,6 +143,7 @@ struct prueth_rx_chn { struct page_pool *pg_pool; struct xdp_rxq_info xdp_rxq; struct xsk_buff_pool *xsk_pool; + bool irq_disabled; }; =20 enum prueth_swdata_type { @@ -166,6 +167,7 @@ struct prueth_swdata { struct page *page; u32 cmd; struct xdp_frame *xdpf; + struct xdp_buff *xdp; } data; }; =20 --=20 2.43.0 From nobody Tue Dec 2 02:44:08 2025 Received: from BYAPR05CU005.outbound.protection.outlook.com (mail-westusazon11010057.outbound.protection.outlook.com [52.101.85.57]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id F144835C183; Tue, 18 Nov 2025 13:56:13 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.85.57 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763474176; cv=fail; b=YhEjLAiQBOPXlQRBkNGHHlCBwfaBtdKezyXQEqOOK7Iop/lGH9dbt2IhsTYx4oPcEBwJC6Yrkbv3m6bTsdRDXGVHHh2iwMKyQQwNtQQ37ndS55nf1WdoO0wea/bSt074WeGL4khYRnjr7K10H4TysiuYIcQ4YgvGXj6jcoXmT6o= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1763474176; c=relaxed/simple; bh=d8XuRsTVRt/6tCehsPJwcTrmHQeWtvV1lXYHsX+/il8=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=R8Ta4SA9gDzYepm6iqHBYOY9LsKvG48FRJOnlI4f0BwHO1jXMq6paMaTmQ/glkQtnxWfWTiY50v8YQmdjrJ6VWDYBTb+jUfCqKB1zUSImY87raN4bYTNLgvua6xm+gRjj9CqInSSLnLCLbtcekSgcf2uHqZlUQMCSNa/07xoAmg= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=ti.com; spf=pass smtp.mailfrom=ti.com; dkim=pass (1024-bit key) header.d=ti.com header.i=@ti.com header.b=HVYBoUEI; arc=fail smtp.client-ip=52.101.85.57 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=ti.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=ti.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=ti.com header.i=@ti.com header.b="HVYBoUEI" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=GZ/lXjAKoRk0iDpadU+PFfWYUfeDHlNAiDYn2IFehv+RhPpVtTI6K0bSuGaO0dAn8az9k0ZVPSBTbnKy0jqbwthTlfN5CRdFqeToV8Tbcp3Undov6cHhKPmnhrl4kjN7wKz1yRfFVC1os10VL8qKipX+9zPbgvcJIPKbH1z0/wELmFqLs5+xnJvAKAdjNTkqNZKqSWP3ASg0CVdVnZx61jfYkZopdUBKwyAKa0W5z6uz88rr//rijd3D2Fp9wIJcYgUp+wOze3ZQyozv5LSW+Otya3IqzQBSyja7wEJRxmc3H8Fw7hNRpantIPvEtiukjNyu+qgUmxwIRhVNJ/PHwA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=fxLTEw1wbmrYbdIYn+VHy3lKwPk7oPIOcjhjOIOC5uI=; b=GBfnnbiXqDfyCBg5doo2BBkxuKS8voHGcfjwYBna0FQ075232GR7vBoAd9mi80Z7Rhsftjg+NsFTt0TxE7al/mUO2nRL9XT1l/+uSOBDmbaWqBkaII/HkAyYma1RwmwI7U609a4E6P1HykwSDiftIvYbBam6EV8GaUay9LEBlN/2V1SRWEb2ATVc4UrzkARrYmBRT8LMDProOMIN2112dlp+zkMTK5CuBE6JiicfdSqzC6aYFcrF+T0EJiQLESjjaUE/Y8mxdvU/bJG9vT8SZZrLNiYClmlxZziVB9/OAYUax7aByFC4oWcATsnpM5ZjHrfi5/JJ5XJhL9VdKU2Yow== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 198.47.23.194) smtp.rcpttodomain=kernel.org smtp.mailfrom=ti.com; dmarc=pass (p=quarantine sp=none pct=100) action=none header.from=ti.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ti.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=fxLTEw1wbmrYbdIYn+VHy3lKwPk7oPIOcjhjOIOC5uI=; b=HVYBoUEIvnBpD8Ccdq0HvmRSGZdw34svYRADKmmQeumS+9G/IgRgShsf46eiINsWn4fcvjlqnYjSnjmw/vhpl+xgn7TCcBtmpM7AR4zo1UrEpmbfxKuHuHx0CTThPrmRKzZlGJpsnQPujBYfjBbfvyrPvMyQcM7c+tX/zYOvVLU= Received: from SA0PR11CA0200.namprd11.prod.outlook.com (2603:10b6:806:1bc::25) by CO1PR10MB4756.namprd10.prod.outlook.com (2603:10b6:303:9b::17) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9320.21; Tue, 18 Nov 2025 13:56:11 +0000 Received: from SA2PEPF00003AE6.namprd02.prod.outlook.com (2603:10b6:806:1bc:cafe::66) by SA0PR11CA0200.outlook.office365.com (2603:10b6:806:1bc::25) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.9343.10 via Frontend Transport; Tue, 18 Nov 2025 13:56:10 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 198.47.23.194) smtp.mailfrom=ti.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=ti.com; Received-SPF: Pass (protection.outlook.com: domain of ti.com designates 198.47.23.194 as permitted sender) receiver=protection.outlook.com; client-ip=198.47.23.194; helo=lewvzet200.ext.ti.com; pr=C Received: from lewvzet200.ext.ti.com (198.47.23.194) by SA2PEPF00003AE6.mail.protection.outlook.com (10.167.248.6) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9343.9 via Frontend Transport; Tue, 18 Nov 2025 13:56:10 +0000 Received: from DLEE210.ent.ti.com (157.170.170.112) by lewvzet200.ext.ti.com (10.4.14.103) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.20; Tue, 18 Nov 2025 07:56:06 -0600 Received: from DLEE211.ent.ti.com (157.170.170.113) by DLEE210.ent.ti.com (157.170.170.112) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.20; Tue, 18 Nov 2025 07:56:05 -0600 Received: from lelvem-mr05.itg.ti.com (10.180.75.9) by DLEE211.ent.ti.com (157.170.170.113) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.20 via Frontend Transport; Tue, 18 Nov 2025 07:56:05 -0600 Received: from lelv0854.itg.ti.com (lelv0854.itg.ti.com [10.181.64.140]) by lelvem-mr05.itg.ti.com (8.18.1/8.18.1) with ESMTP id 5AIDu5c5153023; Tue, 18 Nov 2025 07:56:05 -0600 Received: from localhost (meghana-pc.dhcp.ti.com [10.24.69.13] (may be forged)) by lelv0854.itg.ti.com (8.14.7/8.14.7) with ESMTP id 5AIDu4Uu004206; Tue, 18 Nov 2025 07:56:05 -0600 From: Meghana Malladi To: , , , , , , , , , , , , , , , , CC: , , , , , , , , Vignesh Raghavendra , Roger Quadros , Subject: [PATCH net-next v6 6/6] net: ti: icssg-prueth: Enable zero copy in XDP features Date: Tue, 18 Nov 2025 19:25:42 +0530 Message-ID: <20251118135542.380574-7-m-malladi@ti.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20251118135542.380574-1-m-malladi@ti.com> References: <20251118135542.380574-1-m-malladi@ti.com> 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 X-C2ProcessedOrg: 333ef613-75bf-4e12-a4b1-8e3623f5dcea X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: SA2PEPF00003AE6:EE_|CO1PR10MB4756:EE_ X-MS-Office365-Filtering-Correlation-Id: 3068230c-339c-4521-e158-08de26aa3ada X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|82310400026|1800799024|36860700013|376014|7416014|921020; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?+i9xOXwKXy/BAY3oF2z7Ot8SQD/Q4pWo2OI8n4un9AwcR2mVUd9dHGTO32Zk?= =?us-ascii?Q?7GLNdGDOzP2+xSKPt5rN7Eo7aflYaudklZtIfegX2pOdEJo7d/FDk7+Uw8ol?= =?us-ascii?Q?Np86eBMgIAf/V8vw6PoamWyNsMakvf15E+3i9GMW3B0ZoarM5mSR/b63lHyn?= =?us-ascii?Q?aw9byXCrcyebvb5T1gBsrP+3plwXNxGwUb0+/zclywd2uxouQBr7VvPyKzAt?= =?us-ascii?Q?KKVfciMAqEBsv0a/3rt+N7EgYSPxz/1sWTi8fzMM2OFMYiULag6Ey6Dj3esi?= =?us-ascii?Q?Hh7MjR1RcajZjjQeacF9dlSGhiaE45M+L/Qf3iFIAjEhochSk2JLY33fjk2t?= =?us-ascii?Q?7cAAA82Pq+8WggHwwFoLGdXSozK5ZLV42zYmQqqC549gk/rgJlpUlc/vfprP?= =?us-ascii?Q?zwgRwYQ+WAN6QTITwQA9qTA5HY16aJJ6oEB9ULNpPtvuiU+fRPafPBQA/o71?= =?us-ascii?Q?VycAK8APkKcXLeN8o/1V0525nRgu4Hb7xe7q2Sg5oBfEeeibfApSMerfODXV?= =?us-ascii?Q?E/yDMUH77tq7/HmlWn4b66VagT7Of1PrbL2UeN+9Y6ERFLjsTGRZx0pIJFaV?= =?us-ascii?Q?+GTwPdIDeqxfJaVTDascN9vRyAt2wuveXkfgi2vSy2vSXjxAeF3OPoEFTTXW?= =?us-ascii?Q?8lQs3Ti34rhInhsXlSZRku6L6NT/O7BIAWrBaKbBnJFCuFn7MZ2A18o/dj0u?= =?us-ascii?Q?BgkHsX1okkhKWHZ0u7SbDlrRKOhPbHHiTXDstPMS7qJy7E1wNutjuAvJpSWh?= =?us-ascii?Q?hz4oe6iyF7vcLk6ymxwdiiUU/itAzvsNfCnE7mjf3tMdES8Edtlk7EQwONKF?= =?us-ascii?Q?YrY39qy3QdafiKooq+oVjMU2ldo+kXWY7fTPWQFveR1kz/jpSFYKEme04kcg?= =?us-ascii?Q?Rk5aD/xzLKwvi+t9A6ZtO3KEYwCLxQXR1u+r7s4k1dzGCKbZwlf9abAsMVla?= =?us-ascii?Q?+OV70WPN/aqR8p2hJuGEyCX63YDUg4ZCjCt8qoM/vAwsPmxXPxdTmXbh3Yy3?= =?us-ascii?Q?nelOMu1Wu+RG4s8tLO3HGnac50Rn/2Ax1y/3iGADCjEeOLyUk+25lnBLAK2U?= =?us-ascii?Q?wTxvMLSGdjXU/e6Eb+ozv5Q2O8TfO31Ilk96rplHozr26iTBoETotEx8OpAp?= =?us-ascii?Q?YODgyZsfx7N5tSMyo4ZN61JjkB68JH7/Wk86k1oC4f38ljSGnwggIeXDfEGh?= =?us-ascii?Q?ADVavkaBGWj6jVJ6R4FgsD23s6y84qASC1kvEwbvi9OzZr2yEal0XM71M5MB?= =?us-ascii?Q?BQxEDb/mMTXsdteSe4SnDb9P0BUoja8F5sGP7fwIIPqKpMGkv7JqtWhK/w/R?= =?us-ascii?Q?khl5h1Dgnrai9M24sbCFF6WrGB1ZLpzcr6gaDV217IkDYZDaemHrhIEk21Pd?= =?us-ascii?Q?ubAiYLDgEWGm6e+lQHQqLHM0E+YTA4wrUnfX5YSsriTf6keTurFG02ENvaMq?= =?us-ascii?Q?1DdNcfELLu4o9NX3D9d4/gg/MBmZqRN6C7sxHF0nk72eC1iwCrgR5aYnTFk+?= =?us-ascii?Q?kv3OjS3Js4as7FGgofXFkINuHEHjo5VzgqYWK+UXcwqNBa5NTnjp8I7dI6FH?= =?us-ascii?Q?C2Gwy7xlxeqpqIDr7L8=3D?= X-Forefront-Antispam-Report: CIP:198.47.23.194;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:lewvzet200.ext.ti.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230040)(82310400026)(1800799024)(36860700013)(376014)(7416014)(921020);DIR:OUT;SFP:1101; X-OriginatorOrg: ti.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Nov 2025 13:56:10.6481 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 3068230c-339c-4521-e158-08de26aa3ada X-MS-Exchange-CrossTenant-Id: e5b49634-450b-4709-8abb-1e2b19b982b7 X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=e5b49634-450b-4709-8abb-1e2b19b982b7;Ip=[198.47.23.194];Helo=[lewvzet200.ext.ti.com] X-MS-Exchange-CrossTenant-AuthSource: SA2PEPF00003AE6.namprd02.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: CO1PR10MB4756 Content-Type: text/plain; charset="utf-8" Enable the zero copy feature flag in xdp_set_features_flag() for a given ndev to get the AF-XDP zero copy support running for both Tx and Rx. Reviewed-by: Jacob Keller Signed-off-by: Meghana Malladi --- drivers/net/ethernet/ti/icssg/icssg_prueth.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/net/ethernet/ti/icssg/icssg_prueth.c b/drivers/net/eth= ernet/ti/icssg/icssg_prueth.c index 22de04ac18cb..f65041662173 100644 --- a/drivers/net/ethernet/ti/icssg/icssg_prueth.c +++ b/drivers/net/ethernet/ti/icssg/icssg_prueth.c @@ -1554,7 +1554,8 @@ static int prueth_netdev_init(struct prueth *prueth, xdp_set_features_flag(ndev, NETDEV_XDP_ACT_BASIC | NETDEV_XDP_ACT_REDIRECT | - NETDEV_XDP_ACT_NDO_XMIT); + NETDEV_XDP_ACT_NDO_XMIT | + NETDEV_XDP_ACT_XSK_ZEROCOPY); =20 netif_napi_add(ndev, &emac->napi_rx, icssg_napi_rx_poll); hrtimer_setup(&emac->rx_hrtimer, &emac_rx_timer_callback, CLOCK_MONOTONIC, --=20 2.43.0