qcacmn: Fix ML peer refleaks reported in wifi down
Delete MLO peer from primary SOC while ML peer delete Change-Id: Ideb78964718699397a1fb5da22c28ec787c5bd0c
This commit is contained in:

committed by
Madan Koyyalamudi

parent
09afbc7282
commit
3d9c419f95
@@ -5199,9 +5199,6 @@ fail0:
|
||||
return QDF_STATUS_E_FAILURE;
|
||||
}
|
||||
|
||||
|
||||
|
||||
#ifdef WLAN_DP_PENDING_MEM_FLUSH
|
||||
/**
|
||||
* dp_pdev_flush_pending_vdevs() - Flush all delete pending vdevs in pdev
|
||||
* @pdev: Datapath PDEV handle
|
||||
@@ -5214,33 +5211,33 @@ fail0:
|
||||
*/
|
||||
static void dp_pdev_flush_pending_vdevs(struct dp_pdev *pdev)
|
||||
{
|
||||
struct dp_vdev *vdev = NULL;
|
||||
struct dp_soc *soc = pdev->soc;
|
||||
struct dp_vdev *vdev_arr[MAX_VDEV_CNT] = {0};
|
||||
uint32_t i = 0;
|
||||
uint32_t num_vdevs = 0;
|
||||
struct dp_vdev *vdev = NULL;
|
||||
|
||||
if (TAILQ_EMPTY(&soc->inactive_vdev_list))
|
||||
return;
|
||||
|
||||
while (true) {
|
||||
qdf_spin_lock_bh(&soc->inactive_vdev_list_lock);
|
||||
TAILQ_FOREACH(vdev, &soc->inactive_vdev_list,
|
||||
inactive_list_elem) {
|
||||
if (vdev->pdev == pdev)
|
||||
break;
|
||||
}
|
||||
qdf_spin_unlock_bh(&soc->inactive_vdev_list_lock);
|
||||
qdf_spin_lock_bh(&soc->inactive_vdev_list_lock);
|
||||
TAILQ_FOREACH(vdev, &soc->inactive_vdev_list,
|
||||
inactive_list_elem) {
|
||||
if (vdev->pdev != pdev)
|
||||
continue;
|
||||
|
||||
/* vdev will be freed when all peers get cleanup */
|
||||
if (vdev)
|
||||
dp_vdev_flush_peers((struct cdp_vdev *)vdev, 0);
|
||||
else
|
||||
break;
|
||||
vdev_arr[num_vdevs] = vdev;
|
||||
num_vdevs++;
|
||||
/* take reference to free */
|
||||
dp_vdev_get_ref(soc, vdev, DP_MOD_ID_CDP);
|
||||
}
|
||||
qdf_spin_unlock_bh(&soc->inactive_vdev_list_lock);
|
||||
|
||||
for (i = 0; i < num_vdevs; i++) {
|
||||
dp_vdev_flush_peers((struct cdp_vdev *)vdev_arr[i], 0);
|
||||
dp_vdev_unref_delete(soc, vdev_arr[i], DP_MOD_ID_CDP);
|
||||
}
|
||||
}
|
||||
#else
|
||||
static void dp_pdev_flush_pending_vdevs(struct dp_pdev *pdev)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef QCA_VDEV_STATS_HW_OFFLOAD_SUPPORT
|
||||
/**
|
||||
@@ -8093,7 +8090,7 @@ static QDF_STATUS dp_peer_delete_wifi3(struct cdp_soc_t *soc_hdl,
|
||||
|
||||
dp_peer_vdev_list_remove(soc, vdev, peer);
|
||||
|
||||
dp_peer_mlo_delete(soc, peer);
|
||||
dp_peer_mlo_delete(peer);
|
||||
|
||||
qdf_spin_lock_bh(&soc->inactive_peer_list_lock);
|
||||
TAILQ_INSERT_TAIL(&soc->inactive_peer_list, peer,
|
||||
|
@@ -2523,12 +2523,16 @@ static inline struct dp_peer *dp_peer_find_add_id(struct dp_soc *soc,
|
||||
return NULL;
|
||||
}
|
||||
|
||||
QDF_ASSERT(peer->peer_id == HTT_INVALID_PEER);
|
||||
|
||||
if (peer->peer_id == HTT_INVALID_PEER) {
|
||||
dp_monitor_peer_tid_peer_id_update(soc, peer,
|
||||
peer->peer_id);
|
||||
} else {
|
||||
dp_peer_unref_delete(peer, DP_MOD_ID_CONFIG);
|
||||
QDF_ASSERT(0);
|
||||
return NULL;
|
||||
}
|
||||
dp_peer_find_id_to_obj_add(soc, peer, peer_id);
|
||||
dp_mlo_partner_chips_map(soc, peer, peer_id);
|
||||
dp_monitor_peer_tid_peer_id_update(soc, peer,
|
||||
peer->peer_id);
|
||||
|
||||
dp_peer_update_state(soc, peer, DP_PEER_STATE_ACTIVE);
|
||||
return peer;
|
||||
|
@@ -1398,16 +1398,20 @@ struct dp_peer *dp_peer_get_tgt_peer_by_id(struct dp_soc *soc,
|
||||
|
||||
/**
|
||||
* dp_peer_mlo_delete() - peer MLO related delete operation
|
||||
* @soc: Soc handle
|
||||
* @peer: DP peer handle
|
||||
* Return: None
|
||||
*/
|
||||
static inline
|
||||
void dp_peer_mlo_delete(struct dp_soc *soc,
|
||||
struct dp_peer *peer)
|
||||
void dp_peer_mlo_delete(struct dp_peer *peer)
|
||||
{
|
||||
struct dp_peer *ml_peer;
|
||||
struct dp_soc *soc;
|
||||
|
||||
/* MLO connection link peer */
|
||||
if (IS_MLO_DP_LINK_PEER(peer)) {
|
||||
ml_peer = peer->mld_peer;
|
||||
soc = ml_peer->vdev->pdev->soc;
|
||||
|
||||
/* if last link peer deletion, delete MLD peer */
|
||||
if (dp_mld_peer_del_link_peer(peer->mld_peer, peer) == 0)
|
||||
dp_peer_delete(soc, peer->mld_peer, NULL);
|
||||
@@ -1479,8 +1483,7 @@ void dp_link_peer_del_mld_peer(struct dp_peer *link_peer)
|
||||
}
|
||||
|
||||
static inline
|
||||
void dp_peer_mlo_delete(struct dp_soc *soc,
|
||||
struct dp_peer *peer)
|
||||
void dp_peer_mlo_delete(struct dp_peer *peer)
|
||||
{
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user