net: let lockdep compare instance locks
authorJakub Kicinski <kuba@kernel.org>
Sat, 17 May 2025 20:08:10 +0000 (13:08 -0700)
committerJakub Kicinski <kuba@kernel.org>
Wed, 21 May 2025 01:14:33 +0000 (18:14 -0700)
AFAIU always returning -1 from lockdep's compare function
basically disables checking of dependencies between given
locks. Try to be a little more precise about what guarantees
that instance locks won't deadlock.

Right now we only nest them under protection of rtnl_lock.
Mostly in unregister_netdevice_many() and dev_close_many().

Acked-by: Stanislav Fomichev <sdf@fomichev.me>
Reviewed-by: Kuniyuki Iwashima <kuniyu@amazon.com>
Link: https://patch.msgid.link/20250517200810.466531-1-kuba@kernel.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
include/net/netdev_lock.h

index 2a753813f84962cdd9ab66d4052b9bc6af97ce3a..c345afecd4c5d5b3fdaa7bb931cccdf08e788fb9 100644 (file)
@@ -99,16 +99,15 @@ static inline void netdev_unlock_ops_compat(struct net_device *dev)
 static inline int netdev_lock_cmp_fn(const struct lockdep_map *a,
                                     const struct lockdep_map *b)
 {
-       /* Only lower devices currently grab the instance lock, so no
-        * real ordering issues can occur. In the near future, only
-        * hardware devices will grab instance lock which also does not
-        * involve any ordering. Suppress lockdep ordering warnings
-        * until (if) we start grabbing instance lock on pure SW
-        * devices (bond/team/veth/etc).
-        */
        if (a == b)
                return 0;
-       return -1;
+
+       /* Allow locking multiple devices only under rtnl_lock,
+        * the exact order doesn't matter.
+        * Note that upper devices don't lock their ops, so nesting
+        * mostly happens in batched device removal for now.
+        */
+       return lockdep_rtnl_is_held() ? -1 : 1;
 }
 
 #define netdev_lockdep_set_classes(dev)                                \