Patch "net: add netdev->up protected by netdev_lock()" 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: add netdev->up protected by netdev_lock()

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-add-netdev-up-protected-by-netdev_lock.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 996f44c563e77c7a00e23892c4a95f664c97ffe4
Author: Jakub Kicinski <kuba@xxxxxxxxxx>
Date:   Tue Jan 14 19:53:12 2025 -0800

    net: add netdev->up protected by netdev_lock()
    
    [ Upstream commit 5112457f3d8e41f987908266068af88ef9f3ab78 ]
    
    Some uAPI (netdev netlink) hide net_device's sub-objects while
    the interface is down to ensure uniform behavior across drivers.
    To remove the rtnl_lock dependency from those uAPIs we need a way
    to safely tell if the device is down or up.
    
    Add an indication of whether device is open or closed, protected
    by netdev->lock. The semantics are the same as IFF_UP, but taking
    netdev_lock around every write to ->flags would be a lot of code
    churn.
    
    We don't want to blanket the entire open / close path by netdev_lock,
    because it will prevent us from applying it to specific structures -
    core helpers won't be able to take that lock from any function
    called by the drivers on open/close paths.
    
    So the state of the flag is "pessimistic", as in it may report false
    negatives, but never false positives.
    
    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-5-kuba@xxxxxxxxxx
    Signed-off-by: Jakub Kicinski <kuba@xxxxxxxxxx>
    Stable-dep-of: 011b03359038 ("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 47f817bcea503..64013fd389f28 100644
--- a/include/linux/netdevice.h
+++ b/include/linux/netdevice.h
@@ -2441,12 +2441,24 @@ struct net_device {
 	unsigned long		gro_flush_timeout;
 	u32			napi_defer_hard_irqs;
 
+	/**
+	 * @up: copy of @state's IFF_UP, but safe to read with just @lock.
+	 *	May report false negatives while the device is being opened
+	 *	or closed (@lock does not protect .ndo_open, or .ndo_close).
+	 */
+	bool			up;
+
 	/**
 	 * @lock: netdev-scope lock, protects a small selection of fields.
 	 * Should always be taken using netdev_lock() / netdev_unlock() helpers.
 	 * Drivers are free to use it for other protection.
 	 *
-	 * Protects: @reg_state, @net_shaper_hierarchy.
+	 * Protects:
+	 *	@net_shaper_hierarchy, @reg_state
+	 *
+	 * Partially protects (writers must hold both @lock and rtnl_lock):
+	 *	@up
+	 *
 	 * Ordering: take after rtnl_lock.
 	 */
 	struct mutex		lock;
diff --git a/net/core/dev.c b/net/core/dev.c
index 75996e1aac46c..67f2bb84db543 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -1512,7 +1512,7 @@ static int __dev_open(struct net_device *dev, struct netlink_ext_ack *extack)
 	if (ret)
 		clear_bit(__LINK_STATE_START, &dev->state);
 	else {
-		dev->flags |= IFF_UP;
+		netif_set_up(dev, true);
 		dev_set_rx_mode(dev);
 		dev_activate(dev);
 		add_device_randomness(dev->dev_addr, dev->addr_len);
@@ -1591,7 +1591,7 @@ static void __dev_close_many(struct list_head *head)
 		if (ops->ndo_stop)
 			ops->ndo_stop(dev);
 
-		dev->flags &= ~IFF_UP;
+		netif_set_up(dev, false);
 		netpoll_poll_enable(dev);
 	}
 }
diff --git a/net/core/dev.h b/net/core/dev.h
index deb5eae5749fa..e17c640c05fb9 100644
--- a/net/core/dev.h
+++ b/net/core/dev.h
@@ -111,6 +111,18 @@ void __dev_notify_flags(struct net_device *dev, unsigned int old_flags,
 void unregister_netdevice_many_notify(struct list_head *head,
 				      u32 portid, const struct nlmsghdr *nlh);
 
+static inline void netif_set_up(struct net_device *dev, bool value)
+{
+	if (value)
+		dev->flags |= IFF_UP;
+	else
+		dev->flags &= ~IFF_UP;
+
+	netdev_lock(dev);
+	dev->up = value;
+	netdev_unlock(dev);
+}
+
 static inline void netif_set_gso_max_size(struct net_device *dev,
 					  unsigned int size)
 {




[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