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; return QDF_STATUS_E_FAILURE;
} }
#ifdef WLAN_DP_PENDING_MEM_FLUSH
/** /**
* dp_pdev_flush_pending_vdevs() - Flush all delete pending vdevs in pdev * dp_pdev_flush_pending_vdevs() - Flush all delete pending vdevs in pdev
* @pdev: Datapath PDEV handle * @pdev: Datapath PDEV handle
@@ -5214,33 +5211,33 @@ fail0:
*/ */
static void dp_pdev_flush_pending_vdevs(struct dp_pdev *pdev) static void dp_pdev_flush_pending_vdevs(struct dp_pdev *pdev)
{ {
struct dp_vdev *vdev = NULL;
struct dp_soc *soc = pdev->soc; 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)) if (TAILQ_EMPTY(&soc->inactive_vdev_list))
return; return;
while (true) {
qdf_spin_lock_bh(&soc->inactive_vdev_list_lock); qdf_spin_lock_bh(&soc->inactive_vdev_list_lock);
TAILQ_FOREACH(vdev, &soc->inactive_vdev_list, TAILQ_FOREACH(vdev, &soc->inactive_vdev_list,
inactive_list_elem) { inactive_list_elem) {
if (vdev->pdev == pdev) if (vdev->pdev != pdev)
break; continue;
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); qdf_spin_unlock_bh(&soc->inactive_vdev_list_lock);
/* vdev will be freed when all peers get cleanup */ for (i = 0; i < num_vdevs; i++) {
if (vdev) dp_vdev_flush_peers((struct cdp_vdev *)vdev_arr[i], 0);
dp_vdev_flush_peers((struct cdp_vdev *)vdev, 0); dp_vdev_unref_delete(soc, vdev_arr[i], DP_MOD_ID_CDP);
else
break;
} }
} }
#else
static void dp_pdev_flush_pending_vdevs(struct dp_pdev *pdev)
{
}
#endif
#ifdef QCA_VDEV_STATS_HW_OFFLOAD_SUPPORT #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_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); qdf_spin_lock_bh(&soc->inactive_peer_list_lock);
TAILQ_INSERT_TAIL(&soc->inactive_peer_list, peer, TAILQ_INSERT_TAIL(&soc->inactive_peer_list, peer,

View File

@@ -2523,12 +2523,16 @@ static inline struct dp_peer *dp_peer_find_add_id(struct dp_soc *soc,
return NULL; return NULL;
} }
QDF_ASSERT(peer->peer_id == HTT_INVALID_PEER); if (peer->peer_id == HTT_INVALID_PEER) {
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, dp_monitor_peer_tid_peer_id_update(soc, peer,
peer->peer_id); 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_peer_update_state(soc, peer, DP_PEER_STATE_ACTIVE); dp_peer_update_state(soc, peer, DP_PEER_STATE_ACTIVE);
return peer; return peer;

View File

@@ -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 * dp_peer_mlo_delete() - peer MLO related delete operation
* @soc: Soc handle
* @peer: DP peer handle * @peer: DP peer handle
* Return: None * Return: None
*/ */
static inline static inline
void dp_peer_mlo_delete(struct dp_soc *soc, void dp_peer_mlo_delete(struct dp_peer *peer)
struct dp_peer *peer)
{ {
struct dp_peer *ml_peer;
struct dp_soc *soc;
/* MLO connection link peer */ /* MLO connection link peer */
if (IS_MLO_DP_LINK_PEER(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 last link peer deletion, delete MLD peer */
if (dp_mld_peer_del_link_peer(peer->mld_peer, peer) == 0) if (dp_mld_peer_del_link_peer(peer->mld_peer, peer) == 0)
dp_peer_delete(soc, peer->mld_peer, NULL); 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 static inline
void dp_peer_mlo_delete(struct dp_soc *soc, void dp_peer_mlo_delete(struct dp_peer *peer)
struct dp_peer *peer)
{ {
} }