Merge keystone/mirror-android12-5.10 into keystone/android12-5.10-keystone-qcom-dev
* keystone/mirror-android12-5.10: ANDROID: GKI: fix up abi breakage from "cfg80211: fix management registrations locking" UPSTREAM: cfg80211: fix management registrations locking Signed-off-by: Daniel Norman <danielnorman@google.com> Change-Id: Ia622e37ce7a0502213c37294b0e1f1998960b2f4
This commit is contained in:
commit
daa5d38561
@ -5259,7 +5259,6 @@ struct cfg80211_cqm_config;
|
|||||||
* netdev and may otherwise be used by driver read-only, will be update
|
* netdev and may otherwise be used by driver read-only, will be update
|
||||||
* by cfg80211 on change_interface
|
* by cfg80211 on change_interface
|
||||||
* @mgmt_registrations: list of registrations for management frames
|
* @mgmt_registrations: list of registrations for management frames
|
||||||
* @mgmt_registrations_lock: lock for the list
|
|
||||||
* @mgmt_registrations_need_update: mgmt registrations were updated,
|
* @mgmt_registrations_need_update: mgmt registrations were updated,
|
||||||
* need to propagate the update to the driver
|
* need to propagate the update to the driver
|
||||||
* @mtx: mutex used to lock data in this struct, may be used by drivers
|
* @mtx: mutex used to lock data in this struct, may be used by drivers
|
||||||
@ -5306,6 +5305,12 @@ struct wireless_dev {
|
|||||||
u32 identifier;
|
u32 identifier;
|
||||||
|
|
||||||
struct list_head mgmt_registrations;
|
struct list_head mgmt_registrations;
|
||||||
|
/*
|
||||||
|
* ANDROID: mgmt_registrations_lock was restored to preserve ABI in
|
||||||
|
* 5.10.77 due to backport of 09b1d5dc6ce1 ("cfg80211: fix management
|
||||||
|
* registrations locking") but it is not used for anything so do not
|
||||||
|
* touch this variable!
|
||||||
|
*/
|
||||||
spinlock_t mgmt_registrations_lock;
|
spinlock_t mgmt_registrations_lock;
|
||||||
u8 mgmt_registrations_need_update:1;
|
u8 mgmt_registrations_need_update:1;
|
||||||
|
|
||||||
|
@ -501,6 +501,7 @@ struct wiphy *wiphy_new_nm(const struct cfg80211_ops *ops, int sizeof_priv,
|
|||||||
INIT_WORK(&rdev->propagate_cac_done_wk, cfg80211_propagate_cac_done_wk);
|
INIT_WORK(&rdev->propagate_cac_done_wk, cfg80211_propagate_cac_done_wk);
|
||||||
INIT_WORK(&rdev->mgmt_registrations_update_wk,
|
INIT_WORK(&rdev->mgmt_registrations_update_wk,
|
||||||
cfg80211_mgmt_registrations_update_wk);
|
cfg80211_mgmt_registrations_update_wk);
|
||||||
|
spin_lock_init(&rdev->mgmt_registrations_lock);
|
||||||
|
|
||||||
#ifdef CONFIG_CFG80211_DEFAULT_PS
|
#ifdef CONFIG_CFG80211_DEFAULT_PS
|
||||||
rdev->wiphy.flags |= WIPHY_FLAG_PS_ON_BY_DEFAULT;
|
rdev->wiphy.flags |= WIPHY_FLAG_PS_ON_BY_DEFAULT;
|
||||||
@ -1256,7 +1257,6 @@ void cfg80211_init_wdev(struct wireless_dev *wdev)
|
|||||||
INIT_LIST_HEAD(&wdev->event_list);
|
INIT_LIST_HEAD(&wdev->event_list);
|
||||||
spin_lock_init(&wdev->event_lock);
|
spin_lock_init(&wdev->event_lock);
|
||||||
INIT_LIST_HEAD(&wdev->mgmt_registrations);
|
INIT_LIST_HEAD(&wdev->mgmt_registrations);
|
||||||
spin_lock_init(&wdev->mgmt_registrations_lock);
|
|
||||||
INIT_LIST_HEAD(&wdev->pmsr_list);
|
INIT_LIST_HEAD(&wdev->pmsr_list);
|
||||||
spin_lock_init(&wdev->pmsr_lock);
|
spin_lock_init(&wdev->pmsr_lock);
|
||||||
INIT_WORK(&wdev->pmsr_free_wk, cfg80211_pmsr_free_wk);
|
INIT_WORK(&wdev->pmsr_free_wk, cfg80211_pmsr_free_wk);
|
||||||
|
@ -101,6 +101,8 @@ struct cfg80211_registered_device {
|
|||||||
struct work_struct propagate_cac_done_wk;
|
struct work_struct propagate_cac_done_wk;
|
||||||
|
|
||||||
struct work_struct mgmt_registrations_update_wk;
|
struct work_struct mgmt_registrations_update_wk;
|
||||||
|
/* lock for all wdev lists */
|
||||||
|
spinlock_t mgmt_registrations_lock;
|
||||||
|
|
||||||
/* must be last because of the way we do wiphy_priv(),
|
/* must be last because of the way we do wiphy_priv(),
|
||||||
* and it should at least be aligned to NETDEV_ALIGN */
|
* and it should at least be aligned to NETDEV_ALIGN */
|
||||||
|
@ -448,9 +448,9 @@ static void cfg80211_mgmt_registrations_update(struct wireless_dev *wdev)
|
|||||||
|
|
||||||
ASSERT_RTNL();
|
ASSERT_RTNL();
|
||||||
|
|
||||||
spin_lock_bh(&wdev->mgmt_registrations_lock);
|
spin_lock_bh(&rdev->mgmt_registrations_lock);
|
||||||
if (!wdev->mgmt_registrations_need_update) {
|
if (!wdev->mgmt_registrations_need_update) {
|
||||||
spin_unlock_bh(&wdev->mgmt_registrations_lock);
|
spin_unlock_bh(&rdev->mgmt_registrations_lock);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -475,7 +475,7 @@ static void cfg80211_mgmt_registrations_update(struct wireless_dev *wdev)
|
|||||||
rcu_read_unlock();
|
rcu_read_unlock();
|
||||||
|
|
||||||
wdev->mgmt_registrations_need_update = 0;
|
wdev->mgmt_registrations_need_update = 0;
|
||||||
spin_unlock_bh(&wdev->mgmt_registrations_lock);
|
spin_unlock_bh(&rdev->mgmt_registrations_lock);
|
||||||
|
|
||||||
rdev_update_mgmt_frame_registrations(rdev, wdev, &upd);
|
rdev_update_mgmt_frame_registrations(rdev, wdev, &upd);
|
||||||
}
|
}
|
||||||
@ -499,6 +499,7 @@ int cfg80211_mlme_register_mgmt(struct wireless_dev *wdev, u32 snd_portid,
|
|||||||
int match_len, bool multicast_rx,
|
int match_len, bool multicast_rx,
|
||||||
struct netlink_ext_ack *extack)
|
struct netlink_ext_ack *extack)
|
||||||
{
|
{
|
||||||
|
struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
|
||||||
struct cfg80211_mgmt_registration *reg, *nreg;
|
struct cfg80211_mgmt_registration *reg, *nreg;
|
||||||
int err = 0;
|
int err = 0;
|
||||||
u16 mgmt_type;
|
u16 mgmt_type;
|
||||||
@ -544,7 +545,7 @@ int cfg80211_mlme_register_mgmt(struct wireless_dev *wdev, u32 snd_portid,
|
|||||||
if (!nreg)
|
if (!nreg)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
spin_lock_bh(&wdev->mgmt_registrations_lock);
|
spin_lock_bh(&rdev->mgmt_registrations_lock);
|
||||||
|
|
||||||
list_for_each_entry(reg, &wdev->mgmt_registrations, list) {
|
list_for_each_entry(reg, &wdev->mgmt_registrations, list) {
|
||||||
int mlen = min(match_len, reg->match_len);
|
int mlen = min(match_len, reg->match_len);
|
||||||
@ -579,7 +580,7 @@ int cfg80211_mlme_register_mgmt(struct wireless_dev *wdev, u32 snd_portid,
|
|||||||
list_add(&nreg->list, &wdev->mgmt_registrations);
|
list_add(&nreg->list, &wdev->mgmt_registrations);
|
||||||
}
|
}
|
||||||
wdev->mgmt_registrations_need_update = 1;
|
wdev->mgmt_registrations_need_update = 1;
|
||||||
spin_unlock_bh(&wdev->mgmt_registrations_lock);
|
spin_unlock_bh(&rdev->mgmt_registrations_lock);
|
||||||
|
|
||||||
cfg80211_mgmt_registrations_update(wdev);
|
cfg80211_mgmt_registrations_update(wdev);
|
||||||
|
|
||||||
@ -587,7 +588,7 @@ int cfg80211_mlme_register_mgmt(struct wireless_dev *wdev, u32 snd_portid,
|
|||||||
|
|
||||||
out:
|
out:
|
||||||
kfree(nreg);
|
kfree(nreg);
|
||||||
spin_unlock_bh(&wdev->mgmt_registrations_lock);
|
spin_unlock_bh(&rdev->mgmt_registrations_lock);
|
||||||
|
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
@ -598,7 +599,7 @@ void cfg80211_mlme_unregister_socket(struct wireless_dev *wdev, u32 nlportid)
|
|||||||
struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
|
struct cfg80211_registered_device *rdev = wiphy_to_rdev(wiphy);
|
||||||
struct cfg80211_mgmt_registration *reg, *tmp;
|
struct cfg80211_mgmt_registration *reg, *tmp;
|
||||||
|
|
||||||
spin_lock_bh(&wdev->mgmt_registrations_lock);
|
spin_lock_bh(&rdev->mgmt_registrations_lock);
|
||||||
|
|
||||||
list_for_each_entry_safe(reg, tmp, &wdev->mgmt_registrations, list) {
|
list_for_each_entry_safe(reg, tmp, &wdev->mgmt_registrations, list) {
|
||||||
if (reg->nlportid != nlportid)
|
if (reg->nlportid != nlportid)
|
||||||
@ -611,7 +612,7 @@ void cfg80211_mlme_unregister_socket(struct wireless_dev *wdev, u32 nlportid)
|
|||||||
schedule_work(&rdev->mgmt_registrations_update_wk);
|
schedule_work(&rdev->mgmt_registrations_update_wk);
|
||||||
}
|
}
|
||||||
|
|
||||||
spin_unlock_bh(&wdev->mgmt_registrations_lock);
|
spin_unlock_bh(&rdev->mgmt_registrations_lock);
|
||||||
|
|
||||||
if (nlportid && rdev->crit_proto_nlportid == nlportid) {
|
if (nlportid && rdev->crit_proto_nlportid == nlportid) {
|
||||||
rdev->crit_proto_nlportid = 0;
|
rdev->crit_proto_nlportid = 0;
|
||||||
@ -624,15 +625,16 @@ void cfg80211_mlme_unregister_socket(struct wireless_dev *wdev, u32 nlportid)
|
|||||||
|
|
||||||
void cfg80211_mlme_purge_registrations(struct wireless_dev *wdev)
|
void cfg80211_mlme_purge_registrations(struct wireless_dev *wdev)
|
||||||
{
|
{
|
||||||
|
struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
|
||||||
struct cfg80211_mgmt_registration *reg, *tmp;
|
struct cfg80211_mgmt_registration *reg, *tmp;
|
||||||
|
|
||||||
spin_lock_bh(&wdev->mgmt_registrations_lock);
|
spin_lock_bh(&rdev->mgmt_registrations_lock);
|
||||||
list_for_each_entry_safe(reg, tmp, &wdev->mgmt_registrations, list) {
|
list_for_each_entry_safe(reg, tmp, &wdev->mgmt_registrations, list) {
|
||||||
list_del(®->list);
|
list_del(®->list);
|
||||||
kfree(reg);
|
kfree(reg);
|
||||||
}
|
}
|
||||||
wdev->mgmt_registrations_need_update = 1;
|
wdev->mgmt_registrations_need_update = 1;
|
||||||
spin_unlock_bh(&wdev->mgmt_registrations_lock);
|
spin_unlock_bh(&rdev->mgmt_registrations_lock);
|
||||||
|
|
||||||
cfg80211_mgmt_registrations_update(wdev);
|
cfg80211_mgmt_registrations_update(wdev);
|
||||||
}
|
}
|
||||||
@ -780,7 +782,7 @@ bool cfg80211_rx_mgmt_khz(struct wireless_dev *wdev, int freq, int sig_dbm,
|
|||||||
data = buf + ieee80211_hdrlen(mgmt->frame_control);
|
data = buf + ieee80211_hdrlen(mgmt->frame_control);
|
||||||
data_len = len - ieee80211_hdrlen(mgmt->frame_control);
|
data_len = len - ieee80211_hdrlen(mgmt->frame_control);
|
||||||
|
|
||||||
spin_lock_bh(&wdev->mgmt_registrations_lock);
|
spin_lock_bh(&rdev->mgmt_registrations_lock);
|
||||||
|
|
||||||
list_for_each_entry(reg, &wdev->mgmt_registrations, list) {
|
list_for_each_entry(reg, &wdev->mgmt_registrations, list) {
|
||||||
if (reg->frame_type != ftype)
|
if (reg->frame_type != ftype)
|
||||||
@ -804,7 +806,7 @@ bool cfg80211_rx_mgmt_khz(struct wireless_dev *wdev, int freq, int sig_dbm,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
spin_unlock_bh(&wdev->mgmt_registrations_lock);
|
spin_unlock_bh(&rdev->mgmt_registrations_lock);
|
||||||
|
|
||||||
trace_cfg80211_return_bool(result);
|
trace_cfg80211_return_bool(result);
|
||||||
return result;
|
return result;
|
||||||
|
Loading…
Reference in New Issue
Block a user