From patchwork Sat Sep 26 15:49:02 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Hilliard X-Patchwork-Id: 3480 Return-Path: X-Original-To: noreply@patchwork.local Delivered-To: noreply@patchwork.local Received: from sea.lore.kernel.org (sea.lore.kernel.org [172.234.253.10]) by mxe881.netcup.net (Postfix) with ESMTPS id 793101C2AA6 for ; Sat, 26 Sep 2026 17:56:15 +0200 (CEST) Authentication-Results: mxe881; dkim=pass header.d=gmail.com; spf=pass (sender IP is 172.234.253.10) smtp.mailfrom=linux-sunxi+bounces-26271-noreply=patchwork.local@lists.linux.dev smtp.helo=sea.lore.kernel.org Received-SPF: pass (mxe881: domain of lists.linux.dev designates 172.234.253.10 as permitted sender) client-ip=172.234.253.10; envelope-from=linux-sunxi+bounces-26271-noreply=patchwork.local@lists.linux.dev; helo=sea.lore.kernel.org; Received: from smtp.subspace.kernel.org (conduit.subspace.kernel.org [100.90.174.1]) by sea.lore.kernel.org (Postfix) with ESMTP id DF08D3D672 for ; Sat, 26 Sep 2026 15:50:14 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id BA835370AC2; Sat, 26 Sep 2026 15:49:40 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="d+ST6ofx" X-Original-To: linux-sunxi@lists.linux.dev Received: from mail-oo2-f43.google.com (mail-oo2-f43.google.com [74.125.231.171]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3C7F92E2663 for ; Sat, 26 Sep 2026 15:49:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.231.171 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790437780; cv=none; b=FqburIu3rI1LtkEd6bsIWlqdtP3SchQZ5Vk2YqJ4vQ958X17z2MPODYs5D/NAO5tWF0oHWz6QLPuCAv3jpX7qUlDUXdtFg4PdhVddT19rhVBtM2kq/DOehpte7kwzMirpAqRAp8t56GZbWpt0lagw1+A+XyZeGZz5mf9tgndLxI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790437780; c=relaxed/simple; bh=UTFnmKMIa/HphfeRGv/w2u8lZ3AUss0q6DN+VLPgUAA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=ecMqbZovxECh6yfA6+igJzYYnH5KwBFw4hHcFHncPCtuZX+IWcz7/cI4fsyq2qUK03f4m5U4Am5AWBcr0EWeh6dFF7AGcTMuOTHlpziYx4dtwuF0PiWWkTM5yFY8prEFpg6cbfYr70UaMqbcgqASKiIJbjd7tuNGGvUahEORJek= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=d+ST6ofx; arc=none smtp.client-ip=74.125.231.171 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Received: by mail-oo2-f43.google.com with SMTP id 46e09a7af769-81b485c8368so89154a34.3 for ; Sat, 26 Sep 2026 08:49:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1790437774; x=1791042574; darn=lists.linux.dev; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=r2upeAgz4ZvptOHZYdf2cN5u9HukHte/X4VwE60m55w=; b=d+ST6ofxfVnLoJB6COZIEBsrZ+9Z1HoqwAN3njfVYIsB7YHODxXahVepZB+GiT39uC wC4qgYyVDNMw5UusNX7/FAOMdeBVcym6gLmbgZGni7BRAex0GIPVG4uXpfXXwM7CysS/ IX6sp7ZYPwIrP5dYzXvpux4wRDlVfFCM5LsAuZPF/nHGNLap/manONDhTapI0g2gfQuu Pi/0UFKkYOqDrw6ttVgKcmYXE2XPm0Drw+Shu5gIa8o8ao6b0MZHY6Nfl0UPbEsd1jR6 T0ztILv74S2twz9EhraDdyz7ZSloIIx5ujUD4eCk7JVN0jwHQGD3sdyKpQq6xhKPKs7c CMSg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1790437774; x=1791042574; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=r2upeAgz4ZvptOHZYdf2cN5u9HukHte/X4VwE60m55w=; b=hmumdOCLOz2VioVmhInM4T02PqJ93EeXmRJRjjOtZRtlNHrpKUUIqlEnkDD2J8O+9G PmQ1rzA1quaAouE9UUwOYbJV1U4H22UOOjhA+cYWfwx1Xaa2Bl/SbDTWt7sAFtQ/n3Yh d6uS1/s1WXeh85se4GzvLSGXEY4BhVa2ic36/CJKZxm4JZgkjBU57Wg/+geEB7PrGzOe MDykB6h+wMpU8ckFvVBSEoxpxqTXwbE45ZtwJXtkaOyX+fDNFuK3rjFfkETiIF4waupE vXSOnAjGyUfRZTltnxge5cFRH8gZSf3N3TXZGjyHiZ05T6j72jCBrxpiHE9Y129ViDdh aRtw== X-Forwarded-Encrypted: i=1; AKwUvBwDAdt3vcWwCByDrx0rwebneuDP02GAdoZFbB8GntzR7c6+9dS/K05QovuJSYmExpLhi9SPOzOe8QWuZg==@lists.linux.dev X-Gm-Message-State: AFuF++myawMZfndrWgtOqIiMrMH7VAoGf3r0VUG1MnkqpUpinK2l6TK/ lBs3QM9XnTVbKgPXjOnMZECu3xYA2BABPmpXSRs6SuNtchDJ1BZMY2gf X-Gm-Gg: AYBFou3ZIopIimDN9Y9Ox/HpuoiLyNpSwstjAeWXhlm6eaDwVneP4zaNYXnjRn0V5Zt 00fgtTS1cNTjiTloCG4ZgYS3e3tHWJtl8Nkrc0H7wAAow1GYLXOjXFiuD2n1mmNNY8yZptxCZ/j vFsI5vqbp7QaUxTWVNSGxAezQsCniXCnKJ8iDLZwXuf1gNS4f2aJmrApU1L3gmQvCeHtmwSzSlB /X3NCWbluWjQXS94J7aWToqITDdERSmjXZAkPxR23KBcnXWjbsA02s0clHUSvIxYiaZFWYEXXf7 gHp6T//kawG6BMq2lb+Ch8x+nXTIRxeCtWCGG6rwhj7wpjosB4wV3FjVAIIcGYFy3EawVBbq/i8 ER+roitkI9dKXl57huoBdRO6W6VNTiRfKurZGfs9Y8SymkfB+KlkXKsftIGiq9q44rm7K3VJaVc xIxzm67Iz68ZMqm8gAp++KWHOixxmupRHWJ5pE1L/3cBJDJqSfC9CeyHOFKg6UX6jIAMuqPl86z PPAy0VjLqvOi2QslZ8Hq4Ulf9biQ/B3Y6+TlLtK/Pvm+SRXDTCnBlE+/Aydt2lV/Ln15e8HvSkY C+s5EAKzXKeLIFAIR3aa1bTzpg29Jd9AJw09wMBE1ed5tBSYNlqp6bFFEbZQbCEP6e+Ew5KzSIa PE5OTIh1oUN/3+pMJUvdF X-Received: by 2002:a05:6830:628c:b0:804:bb22:6d42 with SMTP id 46e09a7af769-81781d92d4cmr10071685a34.17.1790437773995; Sat, 26 Sep 2026 08:49:33 -0700 (PDT) Received: from [127.0.1.1] (174-29-1-49.hlrn.qwest.net. [174.29.1.49]) by smtp.gmail.com with ESMTPSA id 46e09a7af769-818e98b16d4sm5442366a34.26.2026.09.26.08.49.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 26 Sep 2026 08:49:33 -0700 (PDT) From: James Hilliard Date: Sat, 26 Sep 2026 09:49:02 -0600 Subject: [PATCH net v4 07/15] net: stmmac: unwind partially allocated DMA configurations Precedence: bulk X-Mailing-List: linux-sunxi@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20260926-submit-stmmac-reset-fixes-v1-v4-7-ec1c0250b3c9@gmail.com> References: <20260926-submit-stmmac-reset-fixes-v1-v4-0-ec1c0250b3c9@gmail.com> In-Reply-To: <20260926-submit-stmmac-reset-fixes-v1-v4-0-ec1c0250b3c9@gmail.com> To: Russell King , Andrew Lunn , Heiner Kallweit , "David S. Miller" , Jakub Kicinski , Paolo Abeni , Joakim Zhang , "Russell King (Oracle)" , Maxime Chevallier , Andrew Lunn , Maxime Coquelin , Alexandre Torgue , Christian Marangi , Tiezhu Yang , Huacai Chen , Alexei Starovoitov , Daniel Borkmann , Jesper Dangaard Brouer , John Fastabend , Stanislav Fomichev , Serge Semin , Suraj Jaiswal , Richard Cochran , Joao Pinto , Vladimir Oltean , Ong Boon Leong , Voon Weifeng , "Song, Yoong Siang" , Linus Walleij , Martin Blumenstingl , Magnus Karlsson , Maciej Fijalkowski , Simon Horman , =?utf-8?b?QmrDtnJuIFTDtnBlbA==?= , Thierry Reding , Jonathan Hunter , Chen-Yu Tsai , Jernej Skrabec , Samuel Holland , Eric Dumazet Cc: Richard Genoud , Alastair D'Silva , Maxime Ripard , netdev@vger.kernel.org, linux-kernel@vger.kernel.org, linux-stm32@st-md-mailman.stormreply.com, linux-arm-kernel@lists.infradead.org, bpf@vger.kernel.org, ZhaoJinming , Lorenzo Bianconi , Ding Hui , James Hilliard , linux-tegra@vger.kernel.org, linux-sunxi@lists.linux.dev X-Mailer: b4 0.15.2 X-Rspamd-Server: rspamd-worker-8404 X-Spamd-Result: default: False [-1.16 / 15.00]; BAYES_HAM(-5.50)[100.00%]; RBL_SENDERSCORE(2.00)[172.234.253.10:from]; SUSPICIOUS_RECIPS(1.50)[]; DMARC_POLICY_SOFTFAIL(1.00)[gmail.com : SPF not aligned (relaxed), No valid DKIM,none]; MAILLIST(-0.15)[generic]; MIME_GOOD(-0.10)[text/plain]; BAD_REP_POLICIES(0.10)[]; HAS_LIST_UNSUB(-0.01)[]; DBL_BLOCKED_OPENRESOLVER(0.00)[sea.lore.kernel.org:rdns,sea.lore.kernel.org:helo]; FORGED_SENDER_MAILLIST(0.00)[]; RCVD_COUNT_FIVE(0.00)[6]; FORGED_RECIPIENTS_MAILLIST(0.00)[]; FROM_HAS_DN(0.00)[]; TAGGED_RCPT(0.00)[kernel,netdev]; PRECEDENCE_BULK(0.00)[]; FREEMAIL_CC(0.00)[bootlin.com,d-silva.org,kernel.org,vger.kernel.org,st-md-mailman.stormreply.com,lists.infradead.org,uniontech.com,oss.qualcomm.com,163.com,gmail.com,lists.linux.dev]; FROM_NEQ_ENVFROM(0.00)[jameshilliard1@gmail.com,linux-sunxi@lists.linux.dev]; ASN(0.00)[asn:63949, ipnet:172.234.224.0/19, country:SG]; MID_RHS_MATCH_FROM(0.00)[]; FREEMAIL_FROM(0.00)[gmail.com]; R_SPF_ALLOW(0.00)[+ip4:172.234.253.10]; TO_DN_SOME(0.00)[]; RBL_SPAMHAUS_BLOCKED_OPENRESOLVER(0.00)[172.234.253.10:from]; RECEIVED_SPAMHAUS_BLOCKED_OPENRESOLVER(0.00)[100.90.174.1:received,74.125.231.171:received]; TAGGED_FROM(0.00)[bounces-26271-noreply=patchwork.local]; RCPT_COUNT_GT_50(0.00)[54]; RECEIVED_SPAMHAUS_PBL(0.00)[174.29.1.49:received]; ARC_ALLOW(0.00)[subspace.kernel.org:s=arc-20240116:i=1]; FREEMAIL_TO(0.00)[armlinux.org.uk,lunn.ch,gmail.com,davemloft.net,kernel.org,redhat.com,nxp.com,bootlin.com,foss.st.com,loongson.cn,iogearbox.net,fomichev.me,quicinc.com,synopsys.com,intel.com,googlemail.com,nvidia.com,sholland.org]; RCVD_TLS_LAST(0.00)[]; MIME_TRACE(0.00)[0:+]; RCVD_VIA_SMTP_AUTH(0.00)[] X-Rspamd-Queue-Id: 793101C2AA6 X-MORS-Enabled: yes X-MORS-DOMAIN: patchwork.local X-MORS-HOSTING: hosting172546 X-MORS-USER: hosting172546 X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= RX and TX allocation failure paths release all configured queues, even when the failing queue has not allocated its buffer array or descriptors. Only walk buffer arrays and free coherent memory when those allocations exist. If TX allocation fails after RX allocation succeeds, release the RX resources too. Propagate RXQ memory-model registration errors instead of continuing with an unusable RXQ. Clear XSK RXQ bindings before the RXQ goes away, release any saved partial packet, and clear released resource pointers. This also leaves configurations which are reused after close or XDP reconfiguration with a consistent empty state. The MTU transaction added later relies on preparation failures being fully unwound without touching the currently active configuration. Take ownership of saved partial RX state at poll entry by clearing the saved flag and skb pointer immediately. Preserve incomplete state if the next descriptor is still DMA-owned. A budget-one completion must not leave an already delivered or freed skb reachable by the new teardown cleanup. Fixes: 71fedb0198cb ("net: stmmac: break some functions into RX and TX scopes") Signed-off-by: James Hilliard --- drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 69 +++++++++++++++++------ 1 file changed, 52 insertions(+), 17 deletions(-) diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c index bdebc5bfa2b8..1cc68c1cf37d 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c @@ -1766,6 +1766,9 @@ static void dma_free_rx_skbufs(struct stmmac_priv *priv, struct stmmac_rx_queue *rx_q = &dma_conf->rx_queue[queue]; int i; + if (!rx_q->buf_pool) + return; + for (i = 0; i < dma_conf->dma_rx_size; i++) stmmac_free_rx_buffer(priv, rx_q, i); } @@ -1889,17 +1892,19 @@ static int __init_dma_rx_desc_rings(struct stmmac_priv *priv, rx_q->xsk_pool = stmmac_get_xsk_pool(priv, queue); if (rx_q->xsk_pool) { - WARN_ON(xdp_rxq_info_reg_mem_model(&rx_q->xdp_rxq, - MEM_TYPE_XSK_BUFF_POOL, - NULL)); + ret = xdp_rxq_info_reg_mem_model(&rx_q->xdp_rxq, + MEM_TYPE_XSK_BUFF_POOL, NULL); + if (ret) + return ret; netdev_info(priv->dev, "Register MEM_TYPE_XSK_BUFF_POOL RxQ-%d\n", queue); xsk_pool_set_rxq_info(rx_q->xsk_pool, &rx_q->xdp_rxq); } else { - WARN_ON(xdp_rxq_info_reg_mem_model(&rx_q->xdp_rxq, - MEM_TYPE_PAGE_POOL, - rx_q->page_pool)); + ret = xdp_rxq_info_reg_mem_model(&rx_q->xdp_rxq, + MEM_TYPE_PAGE_POOL, rx_q->page_pool); + if (ret) + return ret; netdev_info(priv->dev, "Register MEM_TYPE_PAGE_POOL RxQ-%d\n", queue); @@ -1961,6 +1966,8 @@ static int init_dma_rx_desc_rings(struct net_device *dev, dma_free_rx_skbufs(priv, dma_conf, queue); rx_q->buf_alloc_num = 0; + if (rx_q->xsk_pool) + xsk_pool_set_rxq_info(rx_q->xsk_pool, NULL); rx_q->xsk_pool = NULL; queue--; @@ -2104,6 +2111,9 @@ static void dma_free_tx_skbufs(struct stmmac_priv *priv, tx_q->xsk_frames_done = 0; + if (!tx_q->tx_skbuff_dma || !tx_q->tx_skbuff) + return; + for (i = 0; i < dma_conf->dma_tx_size; i++) stmmac_free_tx_buffer(priv, dma_conf, queue, i); @@ -2142,10 +2152,16 @@ static void __free_dma_rx_desc_resources(struct stmmac_priv *priv, void *addr; /* Release the DMA RX socket buffers */ - if (rx_q->xsk_pool) + if (rx_q->xsk_pool) { dma_free_rx_xskbufs(priv, dma_conf, queue); - else + xsk_pool_set_rxq_info(rx_q->xsk_pool, NULL); + } else { dma_free_rx_skbufs(priv, dma_conf, queue); + } + if (rx_q->state_saved) + dev_kfree_skb_any(rx_q->state.skb); + rx_q->state.skb = NULL; + rx_q->state_saved = 0; rx_q->buf_alloc_num = 0; rx_q->xsk_pool = NULL; @@ -2158,7 +2174,8 @@ static void __free_dma_rx_desc_resources(struct stmmac_priv *priv, size = stmmac_get_rx_desc_size(priv) * dma_conf->dma_rx_size; - dma_free_coherent(priv->device, size, addr, rx_q->dma_rx_phy); + if (addr) + dma_free_coherent(priv->device, size, addr, rx_q->dma_rx_phy); if (xdp_rxq_info_is_reg(&rx_q->xdp_rxq)) xdp_rxq_info_unreg(&rx_q->xdp_rxq); @@ -2166,6 +2183,10 @@ static void __free_dma_rx_desc_resources(struct stmmac_priv *priv, kfree(rx_q->buf_pool); if (rx_q->page_pool) page_pool_destroy(rx_q->page_pool); + rx_q->buf_pool = NULL; + rx_q->page_pool = NULL; + rx_q->dma_erx = NULL; + rx_q->dma_rx = NULL; } static void free_dma_rx_desc_resources(struct stmmac_priv *priv, @@ -2206,10 +2227,16 @@ static void __free_dma_tx_desc_resources(struct stmmac_priv *priv, size = stmmac_get_tx_desc_size(priv, tx_q) * dma_conf->dma_tx_size; - dma_free_coherent(priv->device, size, addr, tx_q->dma_tx_phy); + if (addr) + dma_free_coherent(priv->device, size, addr, tx_q->dma_tx_phy); kfree(tx_q->tx_skbuff_dma); kfree(tx_q->tx_skbuff); + tx_q->tx_skbuff_dma = NULL; + tx_q->tx_skbuff = NULL; + tx_q->dma_etx = NULL; + tx_q->dma_entx = NULL; + tx_q->dma_tx = NULL; } static void free_dma_tx_desc_resources(struct stmmac_priv *priv, @@ -2416,6 +2443,8 @@ static int alloc_dma_desc_resources(struct stmmac_priv *priv, return ret; ret = alloc_dma_tx_desc_resources(priv, dma_conf); + if (ret) + free_dma_rx_desc_resources(priv, dma_conf); return ret; } @@ -5726,6 +5755,7 @@ static int stmmac_rx(struct stmmac_priv *priv, int limit, u32 queue) struct sk_buff *skb = NULL; struct stmmac_xdp_buff ctx; int xdp_status = 0; + bool in_progress = rx_q->state_saved; int bufsz; dma_dir = page_pool_get_dma_dir(rx_q->page_pool); @@ -5740,6 +5770,14 @@ static int stmmac_rx(struct stmmac_priv *priv, int limit, u32 queue) stmmac_display_ring(priv, rx_head, priv->dma_conf.dma_rx_size, true, rx_q->dma_rx_phy, desc_size); } + if (in_progress) { + skb = rx_q->state.skb; + error = rx_q->state.error; + len = rx_q->state.len; + rx_q->state.skb = NULL; + rx_q->state_saved = false; + } + while (count < limit) { unsigned int buf1_len = 0, buf2_len = 0; enum pkt_hash_types hash_type; @@ -5748,12 +5786,7 @@ static int stmmac_rx(struct stmmac_priv *priv, int limit, u32 queue) int entry; u32 hash; - if (!count && rx_q->state_saved) { - skb = rx_q->state.skb; - error = rx_q->state.error; - len = rx_q->state.len; - } else { - rx_q->state_saved = false; + if (!in_progress) { skb = NULL; error = 0; len = 0; @@ -5787,6 +5820,8 @@ static int stmmac_rx(struct stmmac_priv *priv, int limit, u32 queue) prefetch(np); + in_progress = status & rx_not_ls; + if (priv->extend_desc) stmmac_rx_extended_status(priv, &priv->xstats, rx_q->dma_erx + entry); if (unlikely(status == discard_frame)) { @@ -5961,7 +5996,7 @@ static int stmmac_rx(struct stmmac_priv *priv, int limit, u32 queue) count++; } - if (status & rx_not_ls || skb) { + if (in_progress || skb) { rx_q->state_saved = true; rx_q->state.skb = skb; rx_q->state.error = error;