Message ID | 20181215090325.31604-14-luca@coelho.fi (mailing list archive) |
---|---|
State | Changes Requested |
Delegated to: | Johannes Berg |
Headers | show |
Series | cfg80211/mac80211 patches from our internal tree 2018-12-15 | expand |
On Sat, 2018-12-15 at 11:03 +0200, Luca Coelho wrote: > From: Johannes Berg <johannes.berg@intel.com> > > When we *don't* have a MAC address attribute, we shouldn't > try to use this - this was intended to copy the local MAC > address instead, so fix it. This patch > > + flush_work(&wdev->pmsr_free_wk); Erroneously got some other stuff merged into it - dropped. johannes
On Tue, 2018-12-18 at 13:17 +0100, Johannes Berg wrote: > On Sat, 2018-12-15 at 11:03 +0200, Luca Coelho wrote: > > From: Johannes Berg <johannes.berg@intel.com> > > > > When we *don't* have a MAC address attribute, we shouldn't > > try to use this - this was intended to copy the local MAC > > address instead, so fix it. > > This patch > > > > > + flush_work(&wdev->pmsr_free_wk); > > Erroneously got some other stuff merged into it - dropped. That's because I squashed some other patches that said to fix this one into it. I'll update the commit message so it makes more sense and resend. -- Cheers, Luca.
On Wed, 2019-02-06 at 07:47 +0200, Luca Coelho wrote: > On Tue, 2018-12-18 at 13:17 +0100, Johannes Berg wrote: > > On Sat, 2018-12-15 at 11:03 +0200, Luca Coelho wrote: > > > From: Johannes Berg <johannes.berg@intel.com> > > > > > > When we *don't* have a MAC address attribute, we shouldn't > > > try to use this - this was intended to copy the local MAC > > > address instead, so fix it. > > > > This patch > > > > > > > > + flush_work(&wdev->pmsr_free_wk); > > > > Erroneously got some other stuff merged into it - dropped. > > That's because I squashed some other patches that said to fix this > one > into it. I'll update the commit message so it makes more sense and > resend. Actually, one of the patches I squashed was marked as fixing this one, but it's not really, so I'll split that one out. -- Luca.
diff --git a/net/wireless/core.c b/net/wireless/core.c index 623dfe5e211c..b36ad8efb5e5 100644 --- a/net/wireless/core.c +++ b/net/wireless/core.c @@ -1068,6 +1068,8 @@ static void __cfg80211_unregister_wdev(struct wireless_dev *wdev, bool sync) ASSERT_RTNL(); + flush_work(&wdev->pmsr_free_wk); + nl80211_notify_iface(rdev, wdev, NL80211_CMD_DEL_INTERFACE); list_del_rcu(&wdev->list); diff --git a/net/wireless/pmsr.c b/net/wireless/pmsr.c index de9286703280..78c3f5633692 100644 --- a/net/wireless/pmsr.c +++ b/net/wireless/pmsr.c @@ -256,8 +256,7 @@ int nl80211_pmsr_start(struct sk_buff *skb, struct genl_info *info) if (err) goto out_err; } else { - memcpy(req->mac_addr, nla_data(info->attrs[NL80211_ATTR_MAC]), - ETH_ALEN); + memcpy(req->mac_addr, wdev_address(wdev), ETH_ALEN); memset(req->mac_addr_mask, 0xff, ETH_ALEN); } @@ -530,14 +529,14 @@ void cfg80211_pmsr_report(struct wireless_dev *wdev, } EXPORT_SYMBOL_GPL(cfg80211_pmsr_report); -void cfg80211_pmsr_free_wk(struct work_struct *work) +static void cfg80211_pmsr_process_abort(struct wireless_dev *wdev) { - struct wireless_dev *wdev = container_of(work, struct wireless_dev, - pmsr_free_wk); struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); struct cfg80211_pmsr_request *req, *tmp; LIST_HEAD(free_list); + lockdep_assert_held(&wdev->mtx); + spin_lock_bh(&wdev->pmsr_lock); list_for_each_entry_safe(req, tmp, &wdev->pmsr_list, list) { if (req->nl_portid) @@ -547,14 +546,22 @@ void cfg80211_pmsr_free_wk(struct work_struct *work) spin_unlock_bh(&wdev->pmsr_lock); list_for_each_entry_safe(req, tmp, &free_list, list) { - wdev_lock(wdev); rdev_abort_pmsr(rdev, wdev, req); - wdev_unlock(wdev); kfree(req); } } +void cfg80211_pmsr_free_wk(struct work_struct *work) +{ + struct wireless_dev *wdev = container_of(work, struct wireless_dev, + pmsr_free_wk); + + wdev_lock(wdev); + cfg80211_pmsr_process_abort(wdev); + wdev_unlock(wdev); +} + void cfg80211_pmsr_wdev_down(struct wireless_dev *wdev) { struct cfg80211_pmsr_request *req; @@ -568,8 +575,8 @@ void cfg80211_pmsr_wdev_down(struct wireless_dev *wdev) spin_unlock_bh(&wdev->pmsr_lock); if (found) - schedule_work(&wdev->pmsr_free_wk); - flush_work(&wdev->pmsr_free_wk); + cfg80211_pmsr_process_abort(wdev); + WARN_ON(!list_empty(&wdev->pmsr_list)); }