Netdev List
 help / color / mirror / Atom feed
* [PATCH net v3] net: ethernet: mtk_eth_soc: allocate dummy netdev
@ 2026-09-24 20:51 Sandeep Haemoon
  2026-09-26 16:07 ` Simon Horman
  2026-09-30  1:20 ` patchwork-bot+netdevbpf
  0 siblings, 2 replies; 3+ messages in thread
From: Sandeep Haemoon @ 2026-09-24 20:51 UTC (permalink / raw)
  To: netdev; +Cc: Felix Fietkau, Lorenzo Bianconi, stable

The RX rings and the shared NAPI are carried by an internal "dummy" netdev
(eth->dummy_dev). mtk_probe() creates that dummy device, and adds the
shared tx/rx NAPI to it, only after the MAC netdevs have been registered.
That order has been there since the MT7623 support was added and leaves a
window in which the netdevs are visible to the network core before the
shared NAPI and the dummy device exist.

If anything brings the first netdev up during that window (e.g. netifd
opening the WAN link the instant the interface is registered), the
first-open path runs without them. On NETSYS v2 and later SoCs
mtk_rx_alloc() -> __xdp_rxq_info_reg() then dereferences eth->dummy_dev ==
NULL:

  WARNING: CPU: ... Missing net_device from driver

in net/core/xdp.c and mtk_open() fails with -ENODEV. On NETSYS v1 SoCs
(MT7621/MT7622/MT7623/MT7629) there is no page pool, so the same open
instead calls napi_enable() on a napi_struct that netif_napi_add() has not
initialised yet and dereferences a NULL napi->dev.

Allocate the dummy netdev and add the shared tx/rx NAPI to it before the
register_netdev() loop. Both the dummy-allocation failure and a
register_netdev() failure now unwind through mtk_unreg_dev(), which
unregisters the net_device notifiers and the netdevs registered so far,
stopping a concurrently-opened netdev (ndo_stop) and its NAPI before the
dummy carrier is freed.

A netdev that opened during the window can also have queued the
frame-engine reset worker (via the tx watchdog or phylink), so the probe
error path now cancels eth->pending_work before freeing the shared state,
as mtk_cleanup() already does on remove.

Fixes: 656e705243fd ("net-next: mediatek: add support for MT7623 ethernet")
Signed-off-by: Sandeep Haemoon <sandeeph@loljews.com>
---

Changes in v3:
  - Changelog now also covers the NETSYS v1 SoCs (MT7621/MT7622/MT7623/
    MT7629): there is no page pool, so the same early ndo_open reaches
    napi_enable() on a NAPI that netif_napi_add() has not initialised yet
    and dereferences a NULL napi->dev, not the __xdp_rxq_info_reg() WARN.
  - Fixes: now points at 656e705243fd ("net-next: mediatek: add support for
    MT7623 ethernet"), which introduced the register_netdev()-before-
    init_dummy_netdev() ordering, rather than b209bd6d0bff, which only turned
    the embedded dummy_dev into a late-allocated pointer.
  - The probe error path now cancels eth->pending_work before freeing the
    dummy carrier and the rest of the shared state: a netdev opened during the
    window can have queued the frame-engine reset worker (tx watchdog or
    phylink), which takes rtnl and drives the hardware.
  - Rebased on current net (includes Lorenzo's unregister-net-devices fix).

The notifier-unregister gap on the pre-register error paths (devm_request_irq()/
mtk_mdio_init()/mtk_ppe_init() failures) flagged in the same review is
pre-existing and intentionally left for a separate change.
 drivers/net/ethernet/mediatek/mtk_eth_soc.c | 38 ++++++++++++++-------
 1 file changed, 26 insertions(+), 12 deletions(-)

diff --git a/drivers/net/ethernet/mediatek/mtk_eth_soc.c b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
index 2ea5dfe85..ad0fdc413 100644
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
@@ -5341,6 +5341,22 @@ static int mtk_probe(struct platform_device *pdev)
 		}
 	}
 
+	/* we run 2 devices on the same DMA ring so we need a dummy device
+	 * for NAPI to work. Allocate it before registering the netdevs so a
+	 * concurrent ndo_open (e.g. netifd bringing the first netdev up the
+	 * instant it is registered) never observes eth->dummy_dev == NULL in
+	 * mtk_dma_init() -> mtk_rx_alloc() -> __xdp_rxq_info_reg() (net/core/xdp.c
+	 * "Missing net_device from driver") and fails the first open.
+	 */
+	eth->dummy_dev = alloc_netdev_dummy(0);
+	if (!eth->dummy_dev) {
+		err = -ENOMEM;
+		dev_err(eth->dev, "failed to allocated dummy device\n");
+		goto err_unreg_netdev;
+	}
+	netif_napi_add(eth->dummy_dev, &eth->tx_napi, mtk_napi_tx);
+	netif_napi_add(eth->dummy_dev, &eth->rx_napi, mtk_napi_rx);
+
 	for (i = 0; i < MTK_MAX_DEVS; i++) {
 		if (!eth->netdev[i])
 			continue;
@@ -5355,18 +5371,6 @@ static int mtk_probe(struct platform_device *pdev)
 				   eth->netdev[i]->base_addr, eth->irq[MTK_FE_IRQ_SHARED]);
 	}
 
-	/* we run 2 devices on the same DMA ring so we need a dummy device
-	 * for NAPI to work
-	 */
-	eth->dummy_dev = alloc_netdev_dummy(0);
-	if (!eth->dummy_dev) {
-		err = -ENOMEM;
-		dev_err(eth->dev, "failed to allocated dummy device\n");
-		goto err_unreg_netdev;
-	}
-	netif_napi_add(eth->dummy_dev, &eth->tx_napi, mtk_napi_tx);
-	netif_napi_add(eth->dummy_dev, &eth->rx_napi, mtk_napi_rx);
-
 	platform_set_drvdata(pdev, eth);
 	schedule_delayed_work(&eth->reset.monitor_work,
 			      MTK_DMA_MONITOR_TIMEOUT);
@@ -5376,6 +5380,16 @@ static int mtk_probe(struct platform_device *pdev)
 err_unreg_netdev:
 	mtk_unreg_dev(eth);
 err_deinit_ppe:
+	/* A netdev opened while probe was still registering can have queued
+	 * the frame-engine reset worker, which takes rtnl and drives the
+	 * hardware; cancel it before anything below is torn down.
+	 */
+	cancel_work_sync(&eth->pending_work);
+	if (eth->dummy_dev) {
+		netif_napi_del(&eth->tx_napi);
+		netif_napi_del(&eth->rx_napi);
+		free_netdev(eth->dummy_dev);
+	}
 	mtk_ppe_deinit(eth);
 	mtk_mdio_cleanup(eth);
 err_free_dev:
-- 
2.53.0


^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH net v3] net: ethernet: mtk_eth_soc: allocate dummy netdev
  2026-09-24 20:51 [PATCH net v3] net: ethernet: mtk_eth_soc: allocate dummy netdev Sandeep Haemoon
@ 2026-09-26 16:07 ` Simon Horman
  2026-09-30  1:20 ` patchwork-bot+netdevbpf
  1 sibling, 0 replies; 3+ messages in thread
From: Simon Horman @ 2026-09-26 16:07 UTC (permalink / raw)
  To: Sandeep Haemoon; +Cc: netdev, Felix Fietkau, Lorenzo Bianconi, stable

On Thu, Sep 24, 2026 at 11:51:37PM +0300, Sandeep Haemoon wrote:
> The RX rings and the shared NAPI are carried by an internal "dummy" netdev
> (eth->dummy_dev). mtk_probe() creates that dummy device, and adds the
> shared tx/rx NAPI to it, only after the MAC netdevs have been registered.
> That order has been there since the MT7623 support was added and leaves a
> window in which the netdevs are visible to the network core before the
> shared NAPI and the dummy device exist.
> 
> If anything brings the first netdev up during that window (e.g. netifd
> opening the WAN link the instant the interface is registered), the
> first-open path runs without them. On NETSYS v2 and later SoCs
> mtk_rx_alloc() -> __xdp_rxq_info_reg() then dereferences eth->dummy_dev ==
> NULL:
> 
>   WARNING: CPU: ... Missing net_device from driver
> 
> in net/core/xdp.c and mtk_open() fails with -ENODEV. On NETSYS v1 SoCs
> (MT7621/MT7622/MT7623/MT7629) there is no page pool, so the same open
> instead calls napi_enable() on a napi_struct that netif_napi_add() has not
> initialised yet and dereferences a NULL napi->dev.
> 
> Allocate the dummy netdev and add the shared tx/rx NAPI to it before the
> register_netdev() loop. Both the dummy-allocation failure and a
> register_netdev() failure now unwind through mtk_unreg_dev(), which
> unregisters the net_device notifiers and the netdevs registered so far,
> stopping a concurrently-opened netdev (ndo_stop) and its NAPI before the
> dummy carrier is freed.
> 
> A netdev that opened during the window can also have queued the
> frame-engine reset worker (via the tx watchdog or phylink), so the probe
> error path now cancels eth->pending_work before freeing the shared state,
> as mtk_cleanup() already does on remove.
> 
> Fixes: 656e705243fd ("net-next: mediatek: add support for MT7623 ethernet")
> Signed-off-by: Sandeep Haemoon <sandeeph@loljews.com>
> ---
> 
> Changes in v3:
>   - Changelog now also covers the NETSYS v1 SoCs (MT7621/MT7622/MT7623/
>     MT7629): there is no page pool, so the same early ndo_open reaches
>     napi_enable() on a NAPI that netif_napi_add() has not initialised yet
>     and dereferences a NULL napi->dev, not the __xdp_rxq_info_reg() WARN.
>   - Fixes: now points at 656e705243fd ("net-next: mediatek: add support for
>     MT7623 ethernet"), which introduced the register_netdev()-before-
>     init_dummy_netdev() ordering, rather than b209bd6d0bff, which only turned
>     the embedded dummy_dev into a late-allocated pointer.
>   - The probe error path now cancels eth->pending_work before freeing the
>     dummy carrier and the rest of the shared state: a netdev opened during the
>     window can have queued the frame-engine reset worker (tx watchdog or
>     phylink), which takes rtnl and drives the hardware.
>   - Rebased on current net (includes Lorenzo's unregister-net-devices fix).
> 
> The notifier-unregister gap on the pre-register error paths (devm_request_irq()/
> mtk_mdio_init()/mtk_ppe_init() failures) flagged in the same review is
> pre-existing and intentionally left for a separate change.

Reviewed-by: Simon Horman <horms@kernel.org>


^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH net v3] net: ethernet: mtk_eth_soc: allocate dummy netdev
  2026-09-24 20:51 [PATCH net v3] net: ethernet: mtk_eth_soc: allocate dummy netdev Sandeep Haemoon
  2026-09-26 16:07 ` Simon Horman
@ 2026-09-30  1:20 ` patchwork-bot+netdevbpf
  1 sibling, 0 replies; 3+ messages in thread
From: patchwork-bot+netdevbpf @ 2026-09-30  1:20 UTC (permalink / raw)
  To: Sandeep Haemoon; +Cc: netdev, nbd, lorenzo, stable

Hello:

This patch was applied to netdev/net.git (main)
by Jakub Kicinski <kuba@kernel.org>:

On Thu, 24 Sep 2026 23:51:37 +0300 you wrote:
> The RX rings and the shared NAPI are carried by an internal "dummy" netdev
> (eth->dummy_dev). mtk_probe() creates that dummy device, and adds the
> shared tx/rx NAPI to it, only after the MAC netdevs have been registered.
> That order has been there since the MT7623 support was added and leaves a
> window in which the netdevs are visible to the network core before the
> shared NAPI and the dummy device exist.
> 
> [...]

Here is the summary with links:
  - [net,v3] net: ethernet: mtk_eth_soc: allocate dummy netdev
    https://git.kernel.org/netdev/net/c/6f0c2c4f5e71

You are awesome, thank you!
-- 
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/patchwork/pwbot.html



^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2026-09-30  1:20 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-09-24 20:51 [PATCH net v3] net: ethernet: mtk_eth_soc: allocate dummy netdev Sandeep Haemoon
2026-09-26 16:07 ` Simon Horman
2026-09-30  1:20 ` patchwork-bot+netdevbpf

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox