summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorJakub Kicinski <kuba@kernel.org>2025-01-15 06:53:12 +0300
committerJakub Kicinski <kuba@kernel.org>2025-01-16 06:13:34 +0300
commit5112457f3d8e41f987908266068af88ef9f3ab78 (patch)
treeec3e6d0be146eb59b7e8560502bea96b140f9043 /include
parent2628f4958cd4a8be2f14b611c67ef9766c5ee564 (diff)
downloadlinux-5112457f3d8e41f987908266068af88ef9f3ab78.tar.xz
net: add netdev->up protected by netdev_lock()
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@fastly.com> Reviewed-by: Eric Dumazet <edumazet@google.com> Reviewed-by: Kuniyuki Iwashima <kuniyu@amazon.com> Link: https://patch.msgid.link/20250115035319.559603-5-kuba@kernel.org Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Diffstat (limited to 'include')
-rw-r--r--include/linux/netdevice.h14
1 files changed, 13 insertions, 1 deletions
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
index 007bcfa383c9..cac81b0a166f 100644
--- a/include/linux/netdevice.h
+++ b/include/linux/netdevice.h
@@ -2444,11 +2444,23 @@ struct net_device {
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;