Re: [PATCH net v4 3/3] netconsole: recheck device registration after waiting for carrier
From: Breno Leitao
Date: Tue Oct 27 2026 - 05:24:11 EST
On Wed, Oct 21, 2026 at 03:19:07PM +0100, Gustavo Luiz Duarte wrote:
> netcons_netpoll_setup() drops RTNL while it waits for carrier when the
> device is not yet up. If the device is unregistered in that window, the
> NETDEV_UNREGISTER notifier runs before np->dev is set and has nothing
> to match.
>
> We might then end up setting up netpoll on a device that is being
> unregistered while holding a reference to it, stalling
> unregister_netdevice() in netdev_wait_allrefs_any().
>
> Add a check to confirm the device is still registered once we retake
> RTNL. Release the device reference and return -ENODEV otherwise.
>
> Closes: https://netdev-ai.bots.linux.dev/sashiko/#/patchset/20261012-netcons-fixes-v3-1-1aac85ed7665@xxxxxxxxx
> Signed-off-by: Gustavo Luiz Duarte <gustavold@xxxxxxxxx>
> ---
> drivers/net/netconsole.c | 10 ++++++++++
> 1 file changed, 10 insertions(+)
>
> diff --git a/drivers/net/netconsole.c b/drivers/net/netconsole.c
> index be7eb632ee42..bd36ebd334aa 100644
> --- a/drivers/net/netconsole.c
> +++ b/drivers/net/netconsole.c
> @@ -534,6 +534,16 @@ static int netcons_netpoll_setup(struct netconsole_target *nt)
> rtnl_unlock();
> netcons_wait_carrier(np, ndev);
> rtnl_lock();
> +
> + /* Check that ndev hasn't been unregistered when we released
> + * the RTNL above.
> + */
> + if (ndev->reg_state != NETREG_REGISTERED) {
> + np_err(np, "%s was unregistered while waiting for carrier, aborting\n",
> + netcons_egress_dev(np, buf, sizeof(buf)));
> + err = -ENODEV;
> + goto put;
> + }
> }
I think there is a better way to do it, inside netcons_wait_carrier().
netcons_wait_carrier() loops waiting for the carrier, and exit if in
time_after(). I think it will be cleaner to exit there.
then netcons_wait_carrier() would return a bool, and you goto 'put' in
both case (ndev->reg_state != NETREG_REGISTERED) or in the
time_after() exit.
Wouldn't it be better?
Thanks for the fixes,
--breno