qcacmn: Add lock to Set/clear WLAN_VDEV_FEXT2_MLO_STA_LINK flag

Currently, this MLO flag is being set/clear without regard for
concurrency. We need to lock the vdev when updating these values to
prevent race condition.

Change-Id: Ied90d62f10f6f12a35eeac3060dd0fae7d0c6cfd
CRs-Fixed: 3305558
此提交包含在:
David Oladunjoye
2022-09-30 16:22:33 -07:00
提交者 Madan Koyyalamudi
父節點 cfdcbfe733
當前提交 25cb050e32
共有 4 個檔案被更改,包括 69 行新增12 行删除

查看文件

@@ -1603,6 +1603,22 @@ void wlan_vdev_mlme_set_mlo_vdev(struct wlan_objmgr_vdev *vdev);
*/
void wlan_vdev_mlme_clear_mlo_vdev(struct wlan_objmgr_vdev *vdev);
/**
* wlan_vdev_mlme_set_mlo_link_vdev() - Set vdev as an MLO link vdev
* @vdev: VDEV object
*
* Return: void
*/
void wlan_vdev_mlme_set_mlo_link_vdev(struct wlan_objmgr_vdev *vdev);
/**
* wlan_vdev_mlme_clear_mlo_link_vdev() - Mark that the vdev is no longer an
* MLO link vdev
* @vdev: VDEV object
*
* Return: void
*/
void wlan_vdev_mlme_clear_mlo_link_vdev(struct wlan_objmgr_vdev *vdev);
#ifdef WLAN_MCAST_MLO
/**
* wlan_vdev_mlme_is_mlo_mcast_vdev() - whether it is mlo mcast vdev or not
@@ -1696,6 +1712,16 @@ void wlan_vdev_mlme_clear_mlo_vdev(struct wlan_objmgr_vdev *vdev)
{
}
static inline
void wlan_vdev_mlme_set_mlo_link_vdev(struct wlan_objmgr_vdev *vdev)
{
}
static inline
void wlan_vdev_mlme_clear_mlo_link_vdev(struct wlan_objmgr_vdev *vdev)
{
}
static inline
bool wlan_vdev_mlme_is_mlo_link_vdev(struct wlan_objmgr_vdev *vdev)
{

查看文件

@@ -1551,4 +1551,42 @@ void wlan_vdev_mlme_clear_mlo_vdev(struct wlan_objmgr_vdev *vdev)
wlan_release_vdev_mlo_lock(vdev);
}
void wlan_vdev_mlme_set_mlo_link_vdev(struct wlan_objmgr_vdev *vdev)
{
if (!vdev) {
obj_mgr_err("vdev is NULL");
return;
}
wlan_acquire_vdev_mlo_lock(vdev);
if (wlan_vdev_mlme_feat_ext2_cap_get(vdev,
WLAN_VDEV_FEXT2_MLO_STA_LINK)) {
wlan_release_vdev_mlo_lock(vdev);
return;
}
wlan_vdev_mlme_feat_ext2_cap_set(vdev, WLAN_VDEV_FEXT2_MLO_STA_LINK);
wlan_release_vdev_mlo_lock(vdev);
}
void wlan_vdev_mlme_clear_mlo_link_vdev(struct wlan_objmgr_vdev *vdev)
{
if (!vdev) {
obj_mgr_err("vdev is NULL");
return;
}
wlan_acquire_vdev_mlo_lock(vdev);
if (!wlan_vdev_mlme_feat_ext2_cap_get(vdev,
WLAN_VDEV_FEXT2_MLO_STA_LINK)) {
wlan_release_vdev_mlo_lock(vdev);
return;
}
wlan_vdev_mlme_feat_ext2_cap_clear(vdev, WLAN_VDEV_FEXT2_MLO_STA_LINK);
wlan_release_vdev_mlo_lock(vdev);
}
#endif /* WLAN_FEATURE_11BE_MLO */

查看文件

@@ -269,9 +269,7 @@ void mlo_mld_clear_mlo_cap(struct wlan_objmgr_vdev *vdev)
if (!mlo_dev_ctx->wlan_vdev_list[i])
continue;
wlan_vdev_mlme_clear_mlo_vdev(mlo_dev_ctx->wlan_vdev_list[i]);
wlan_vdev_mlme_feat_ext2_cap_clear(
mlo_dev_ctx->wlan_vdev_list[i],
WLAN_VDEV_FEXT2_MLO_STA_LINK);
wlan_vdev_mlme_clear_mlo_link_vdev(mlo_dev_ctx->wlan_vdev_list[i]);
}
}
@@ -612,8 +610,7 @@ mlo_send_link_connect(struct wlan_objmgr_vdev *vdev,
(mlo_dev_ctx->wlan_vdev_list[i] == vdev))
continue;
wlan_vdev_mlme_set_mlo_vdev(mlo_dev_ctx->wlan_vdev_list[i]);
wlan_vdev_mlme_feat_ext2_cap_set(mlo_dev_ctx->wlan_vdev_list[i],
WLAN_VDEV_FEXT2_MLO_STA_LINK);
wlan_vdev_mlme_set_mlo_link_vdev(mlo_dev_ctx->wlan_vdev_list[i]);
wlan_vdev_set_link_id(
mlo_dev_ctx->wlan_vdev_list[i],
ml_parnter_info->partner_link_info[partner_idx].link_id);
@@ -1223,8 +1220,7 @@ void mlo_sta_link_handle_pending_connect(struct wlan_objmgr_vdev *vdev)
if (sta_ctx->connect_req->ml_parnter_info.num_partner_links) {
partner_info = sta_ctx->connect_req->ml_parnter_info;
wlan_vdev_mlme_set_mlo_vdev(vdev);
wlan_vdev_mlme_feat_ext2_cap_clear(
vdev, WLAN_VDEV_FEXT2_MLO_STA_LINK);
wlan_vdev_mlme_clear_mlo_link_vdev(vdev);
mlo_clear_connect_req_links_bmap(vdev);
mlo_update_connect_req_links(vdev, 1);
for (i = 0; i < partner_info.num_partner_links; i++) {
@@ -1235,9 +1231,7 @@ void mlo_sta_link_handle_pending_connect(struct wlan_objmgr_vdev *vdev)
if (tmp_vdev) {
mlo_update_connect_req_links(tmp_vdev, 1);
wlan_vdev_mlme_set_mlo_vdev(tmp_vdev);
wlan_vdev_mlme_feat_ext2_cap_set(
tmp_vdev,
WLAN_VDEV_FEXT2_MLO_STA_LINK);
wlan_vdev_mlme_set_mlo_link_vdev(tmp_vdev);
wlan_vdev_set_link_id(
tmp_vdev,
partner_link_info.link_id);