Patch "net: make netdev_lock() protect netdev->reg_state" has been added to the 6.13-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    net: make netdev_lock() protect netdev->reg_state

to the 6.13-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     net-make-netdev_lock-protect-netdev-reg_state.patch
and it can be found in the queue-6.13 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 9ecd605aef6d75542cf0ec6864c4602deaf809c6
Author: Jakub Kicinski <kuba@xxxxxxxxxx>
Date:   Tue Jan 14 19:53:10 2025 -0800

    net: make netdev_lock() protect netdev->reg_state
    
    [ Upstream commit 5fda3f35349b6b7f22f5f5095a3821261d515075 ]
    
    Protect writes to netdev->reg_state with netdev_lock().
    From now on holding netdev_lock() is sufficient to prevent
    the net_device from getting unregistered, so code which
    wants to hold just a single netdev around no longer needs
    to hold rtnl_lock.
    
    We do not protect the NETREG_UNREGISTERED -> NETREG_RELEASED
    transition. We'd need to move mutex_destroy(netdev->lock)
    to .release, but the real reason is that trying to stop
    the unregistration process mid-way would be unsafe / crazy.
    Taking references on such devices is not safe, either.
    So the intended semantics are to lock REGISTERED devices.
    
    Reviewed-by: Joe Damato <jdamato@xxxxxxxxxx>
    Reviewed-by: Eric Dumazet <edumazet@xxxxxxxxxx>
    Reviewed-by: Kuniyuki Iwashima <kuniyu@xxxxxxxxxx>
    Link: https://patch.msgid.link/20250115035319.559603-3-kuba@xxxxxxxxxx
    Signed-off-by: Jakub Kicinski <kuba@xxxxxxxxxx>
    Stable-dep-of: 6bc7e4eb0499 ("Revert "net: skb: introduce and use a single page frag cache"")
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
index 4b2964d0d885e..e0a8093c9be80 100644
--- a/include/linux/netdevice.h
+++ b/include/linux/netdevice.h
@@ -2446,7 +2446,7 @@ struct net_device {
 	 * Should always be taken using netdev_lock() / netdev_unlock() helpers.
 	 * Drivers are free to use it for other protection.
 	 *
-	 * Protects: @net_shaper_hierarchy.
+	 * Protects: @reg_state, @net_shaper_hierarchy.
 	 * Ordering: take after rtnl_lock.
 	 */
 	struct mutex		lock;
diff --git a/net/core/dev.c b/net/core/dev.c
index c5e5b827bb800..d1e8613151a4a 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -10687,7 +10687,9 @@ int register_netdevice(struct net_device *dev)
 
 	ret = netdev_register_kobject(dev);
 
+	netdev_lock(dev);
 	WRITE_ONCE(dev->reg_state, ret ? NETREG_UNREGISTERED : NETREG_REGISTERED);
+	netdev_unlock(dev);
 
 	if (ret)
 		goto err_uninit_notify;
@@ -10985,7 +10987,9 @@ void netdev_run_todo(void)
 			continue;
 		}
 
+		netdev_lock(dev);
 		WRITE_ONCE(dev->reg_state, NETREG_UNREGISTERED);
+		netdev_unlock(dev);
 		linkwatch_sync_dev(dev);
 	}
 
@@ -11591,7 +11595,9 @@ void unregister_netdevice_many_notify(struct list_head *head,
 	list_for_each_entry(dev, head, unreg_list) {
 		/* And unlink it from device chain. */
 		unlist_netdevice(dev);
+		netdev_lock(dev);
 		WRITE_ONCE(dev->reg_state, NETREG_UNREGISTERING);
+		netdev_unlock(dev);
 	}
 	flush_all_backlogs();
 




[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux