From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from smtpout-02.galae.net (smtpout-02.galae.net [185.246.84.56]) (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 D608A3F5BC5 for ; Wed, 1 Jul 2026 15:59:14 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.246.84.56 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782921557; cv=none; b=cH3+0hXeAUEOf6cPLg6adX/JXLBskCx2nBUFH9RLth2f/RapIzSs8AVDujD7/+Fo1UjWPBkdyXQPGRY0nBk3PUIKK48g/TBgjE5D4Qn0b5XzTXXSMXvryNRqD8+cqp8RJ9DRdobxqsnIN89htMyUKEhiv4CxSRmIisID/a6SGF0= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1782921557; c=relaxed/simple; bh=prPFly5ezm3C1Dvts+psV9mCn00GZ3shOaavLauKZkc=; h=From:Subject:Date:Message-Id:MIME-Version:Content-Type:To:Cc; b=l3lOulm5CAFAFieArjX2FYAwJ//Xy9hQtrHkT1b8bA7F5kDWgVuT/DQnCBfkfZGuAS5Ym5IwluBbw2eHGy4zqJHrCkUCcdZEFZx3DYOdgZvETry+AR64iDNBQ5GnaluBcgwTbdPJuzV8uQg8j78047rS7/fjgL4SOv3f0RofsMo= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=jGH2Q3wn; arc=none smtp.client-ip=185.246.84.56 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="jGH2Q3wn" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-02.galae.net (Postfix) with ESMTPS id 484721A0D45; Wed, 1 Jul 2026 15:59:13 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 1331960288; Wed, 1 Jul 2026 15:59:13 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id BEE71104C967E; Wed, 1 Jul 2026 17:59:06 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1782921551; h=from:subject:date:message-id:to:cc:mime-version:content-type: content-transfer-encoding; bh=pqPkWt3NjnuYgtecTC80VCR92378sKkmYJAPWo/XleM=; b=jGH2Q3wnl07s+ox9GFLyeLfJfNcZp+ZTRb+XMbkpltj6lYFGwrLtWYyt6n/SO+8WdFGcYs xlo1U500XBt8kwpnNlBf5J6P7yj7cki72oCPuS3FJx56ohAIFLjLhd1IUN0SQJaiCPKPbH 52lHRZYO9pa273qEWAvYLPZjAVqKJnQi7FV+SDx/Xyky07EJpWae1IwYa95V0P/DMw7wcK g+wnMNEER3i3oA87hj0a6Eil6pkuX+YqDJNtyhIrQXxSofrB7qWwG9o5otV31Mrdk8F4El lnm6VnvnxVu4XoasFK6TtmQVZDtWpmcN3rk6cuYd0aH4V/vXecuEvW0cHhEVUA== From: =?utf-8?q?Th=C3=A9o_Lebrun?= Subject: [PATCH net-next v3 00/15] net: macb: implement context swapping Date: Wed, 01 Jul 2026 17:59:03 +0200 Message-Id: <20260701-macb-context-v3-0-00268d5b1502@bootlin.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 8bit X-B4-Tracking: v=1; b=H4sIAAAAAAAC/22Nyw7CIBREf6VhLeZCX6kr/8O44GkxFgwgqWn67 1LcqHE5mTlnFhSUNyqgQ7Ugr5IJxtkc6l2FxMjsRWEjc0YUaAcNEDwxwbFwNqo5Yi5BME2hIY1 EGbl7pc1cdCdkVcQ2r9D53YQHvyoRN9u2HU2Izj/LcyKF+H+SCAY8tAOIlvGe9vTInYs3Y/fCT UWe6AdO4AenGWe6HnRPZAO8+8bXdX0BKEm7vwUBAAA= X-Change-ID: 20260401-macb-context-bd0caf20414d To: =?utf-8?q?Th=C3=A9o_Lebrun?= , Conor Dooley , Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Richard Cochran , Russell King Cc: netdev@vger.kernel.org, linux-kernel@vger.kernel.org, Nicolas Ferre , Claudiu Beznea , Paolo Valerio , Nicolai Buchwitz , Vladimir Kondratiev , Gregory CLEMENT , =?utf-8?q?Beno=C3=AEt_Monin?= , Tawfik Bayouk , Thomas Petazzoni , Maxime Chevallier X-Mailer: b4 0.15.2 X-Last-TLS-Session-Version: TLSv1.3 MACB has a pretty primitive approach to buffer management. They are all stored in `struct macb *bp`. On operations that require buffer realloc (set_ringparam & change_mtu at the moment), the only option is to close the interface, change our global state and re-open the interface. Two issues: - It doesn't fly on memory pressured systems; we free our precious buffers and don't manage to reallocate fully, meaning our machine just lost its network access. - Anecdotally, it is pretty slow because it implies a full PHY reinit. Instead, we shall: - allocate a new context (including buffers) first - if it fails, early return without any impact to the interface - stop interface - update global state (bp, netdev, etc) - pass newly allocated buffer pointers to the hardware - start interface - free old context This is what we implement here. Both .set_ringparam() and .ndo_change_mtu() are covered by this series. In the future, at least .set_channels() [0], XDP [1] and XSK [2] would benefit. The change is super intrusive so conflicts will be major. Sorry! Thanks, Have a nice day, Théo [0]: https://lore.kernel.org/netdev/20260317-macb-set-channels-v4-0-1bd4f4ffcfca@bootlin.com/ [1]: https://lore.kernel.org/netdev/20260323221047.2749577-1-pvalerio@redhat.com/ [2]: https://lore.kernel.org/netdev/20260304-macb-xsk-v1-0-ba2ebe2bdaa3@bootlin.com/ Signed-off-by: Théo Lebrun --- Changes in v3: - Use `const struct macb_info *info` instead of bare `u32 caps` as helper arguments, for type safety. - macb_interrupt(): the pre-lock readl(ISR) to detect spurious interrupts is only done if CLEAR_ON_WRITE. - Don't forget allocating context in at91ether_open(). - swap: - Refuse swap for EMAC HW; it would crash because codepaths are so different. - Grab new bp->mac_cfg_lock to serialise with phylink MAC callbacks. We cannot rely on phydev->lock because it isn't present in the SFP or fixed-link cases. We also want to avoid phylink_stop() which triggers a slow PHY retrain. - swap start: - We used to do disable-irqs-and-hw then drain-all-bh-features, but then HW might be raced against. Instead we disable-irqs then drain-all-bh then disable-hw which means at disable-hw step no BH context can be active. - Use macb_halt_tx() helper to properly stop HW. - Disable BH features before netif_tx_disable() call to avoid queue wakeup races. - Use macb_queue_isr_clear() helper instead of manual if-then-writel. - swap end: - Grab bp->lock for the hardware reinit sequence composed of DMACFG and NCR writes. - Drop now useless EMAC check (we refuse EMAC HW before swapping). - nits: - New patch to rename macb_{alloc,free}_consistent() which don't only allocate consistent buffers since a long time ago. - Fix the start_xmit verbose netdev_vdbg() format string from %hu to %u because the queue index type changed. - Strong commit reword from "unify `struct macb *` naming convention" to "unify variable naming convention in at91ether functions" which was underselling the changes. - Rebase upon latest net-next/main (1c664ec4b9ea). - Link to v2: https://patch.msgid.link/20260410-macb-context-v2-0-af39f71d40b6@bootlin.com Changes in v2: - Patch "add subset of `struct macb` to `struct macb_context`" was messed up. It contained much more than what the name implied. Split into three commits (I caused trouble by rebase reordering). - Fix tieoff; V1 allocated it without initialisation. - Fix NULL pointer dereference on context in mab_get_regs() and macb_get_ringparam() when interface is offline. - Patch "unify device pointer naming convention": - Fix build issue when CONFIG_NETCONSOLE=y. - Rename `struct net_device *dev` to `netdev` in macb.h. - Rename `struct phy_device *phy` to `phydev` in macb_main.c. - On swap, call netdev_tx_reset_queue() to reset all DQL counters. - At end of swap, add missing kfree(old_ctx). - During HW disabling in swap, grab bp->lock to protect against IRQ handler. - On swap, cancel the three BH features MACB has: bp->hresp_err_bh_work, bp->tx_lpi_work and queue->tx_error_task. - On swap, call macb_configure_dma() which writes buffer size to hardware registers. This is important because the change_mtu codepath changes the buffer size. - Rebase onto latest net-next/main (58dd34dbd5b0) & resolve conflicts. - Link to v1: https://patch.msgid.link/20260401-macb-context-v1-0-9590c5ab7272@bootlin.com --- Théo Lebrun (15): net: macb: drop "consistent" from alloc/free function names net: macb: unify device pointer naming convention net: macb: unify variable naming convention in at91ether functions net: macb: unify queue index variable naming convention and types net: macb: enforce reverse christmas tree (RCT) convention net: macb: allocate tieoff descriptor once across device lifetime net: macb: introduce macb_context struct for buffer management net: macb: avoid macb_init_rx_buffer_size() modifying state net: macb: make `struct macb` subset reachable from macb_context struct net: macb: change caps helpers signatures net: macb: change function signatures to take contexts net: macb: introduce macb_context_alloc() helper net: macb: re-read ISR inside IRQ handler locked section net: macb: use context swapping in .set_ringparam() net: macb: use context swapping in .ndo_change_mtu() drivers/net/ethernet/cadence/macb.h | 127 +- drivers/net/ethernet/cadence/macb_main.c | 1849 +++++++++++++++++------------- drivers/net/ethernet/cadence/macb_pci.c | 46 +- drivers/net/ethernet/cadence/macb_ptp.c | 26 +- 4 files changed, 1199 insertions(+), 849 deletions(-) --- base-commit: 64e6f7613459a9b344fb09a129584435b281088b change-id: 20260401-macb-context-bd0caf20414d Best regards, -- Théo Lebrun