1: 16aa37c03b3d = 1: 78c0b4c9c381 wifi: cfg80211: track netdev running state under wiphy mutex  2: 0f85bcfc1312 = 2: b20e78e917ac wifi: nl80211: allow device lookup under RCU  3: 0b68a4bee462 ! 3: 752341d0cc6d wifi: nl80211: avoid rtnl for commands that don't want it @@ net/wireless/nl80211.c: cfg80211_get_dev_from_info(struct net *netns, struct gen  + wiphy_lock(&rdev->wiphy);  +  + if (!rdev->wiphy.registered || -+ !net_eq(wiphy_net(&rdev->wiphy), netns) || -+ (wdev->netdev && !net_eq(dev_net(wdev->netdev), netns))) { ++ !net_eq(wiphy_net(&rdev->wiphy), netns)) {  + wiphy_unlock(&rdev->wiphy);  + put_device(&rdev->wiphy.dev);  + return ERR_PTR(-ENODEV); @@ net/wireless/nl80211.c: cfg80211_get_dev_from_info(struct net *netns, struct gen  + return NULL;  +  + list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) { -+ if (wdev->identifier == wdev_id) -+ return wdev; ++ if (wdev->identifier != wdev_id) ++ continue; ++ if (wdev->netdev && !net_eq(dev_net(wdev->netdev), netns)) ++ break; ++ return wdev;  + }  + wiphy_unlock(&rdev->wiphy);  + @@ net/wireless/nl80211.c: static int nl80211_pre_doit(const struct genl_split_ops  + if (wdev)  + wdev_id = wdev->identifier;  + rcu_read_unlock(); +  ++ /* RTM_NEWLINK is sent before NETDEV_UP, wait for dev_open() */ ++ if (internal_flags & NL80211_FLAG_CHECK_NETDEV_UP && dev && ++ !READ_ONCE(wdev->is_running) && netif_running(dev)) { ++ rtnl_lock(); ++ rtnl_unlock(); ++ }  + }  +  + if (rdev && !(internal_flags & NL80211_FLAG_NO_WIPHY_MTX)) { @@ net/wireless/nl80211.c: static int nl80211_pre_doit(const struct genl_split_ops  + goto out;  + }  + } -  ++  + if (wdev) { if (internal_flags & NL80211_FLAG_NEED_NETDEV) { if (!dev) {  4: e060c35b9b9e = 4: 102d77c8c50b wifi: nl80211: don't take rtnl for most dumps  5: 180232956812 = 5: 28dda95babde wifi: cfg80211: reg: update channels under wiphy mutex  6: 97ca783eb7af = 6: 81ab3a2d06c1 wifi: cfg80211: reg: set intersected regd under wiphy mutex  7: 81a9cb47386d = 7: 46684019ff42 wifi: cfg80211: update channel DFS data under wiphy mutex  8: cbc6bacf2bab = 8: 1967fa719b74 wifi: mac80211_hwsim: call cfg80211 event with wiphy mutex  9: 25dc00904000 = 9: 4897910e35c9 wifi: cfg80211: document wiphy mutex for radar/CAC events 10: cff6594cfe2d = 10: c97e4fa9a688 wifi: cfg80211: add a mutex for regulatory/device list 11: 805128325874 = 11: fa00cfbc8ff7 wifi: cfg80211: allow walking wiphy list under cfg80211_mutex 12: 709ea15c4b20 = 12: d376c22d2a40 wifi: ath: use freq_reg_info() under RCU 13: 432e992bf03e = 13: 811e1f9bc64e wifi: brcmsmac: use freq_reg_info() under RCU 14: 30608354bba2 = 14: 54e16ab812e3 wifi: rtlwifi: use freq_reg_info() under RCU 15: 1763b71bfa57 = 15: 3d74f8a00c72 wifi: nl80211: read WMM reg rule under RCU 16: 2bd16afe8834 = 16: 5394ea662eec wifi: ath11k: read wiphy regd under RCU 17: ac2e03c0f246 = 17: fdeceb8084c5 wifi: ath12k: read wiphy regd under RCU 18: 80ed56fd592f = 18: 63ec953146e3 wifi: cfg80211: regulatory: stop using RTNL