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:
Chaithanya Garrepalli
2021-12-29 22:49:48 +05:30
committed by Madan Koyyalamudi
parent 09afbc7282
commit 3d9c419f95
3 changed files with 36 additions and 32 deletions

View File

@@ -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,