mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-09 21:59:12 -04:00
qcacld-3.0: peer_handling: Add more debug_ids to narrow down
Fix and add debug_ids iappropriately account for function holding the peer reference. This will help to further narrow down the peer leak. Also add signatures in ref_release functions to catch error path. Change-Id: I7f091ca8270ba724e24550e80208739d63d57b22 CRs-Fixed: 2293477
This commit is contained in:
parent
f989879feb
commit
1253c3d270
4 changed files with 34 additions and 28 deletions
|
|
@ -104,7 +104,7 @@ ol_tx_queue_vdev_flush(struct ol_txrx_pdev_t *pdev, struct ol_txrx_vdev_t *vdev)
|
|||
if (txq->frms) {
|
||||
ol_txrx_peer_get_ref
|
||||
(peer,
|
||||
PEER_DEBUG_ID_OL_INTERNAL);
|
||||
PEER_DEBUG_ID_OL_TXQ_VDEV_FL);
|
||||
peers[peer_count++] = peer;
|
||||
break;
|
||||
}
|
||||
|
|
@ -123,7 +123,7 @@ ol_tx_queue_vdev_flush(struct ol_txrx_pdev_t *pdev, struct ol_txrx_vdev_t *vdev)
|
|||
ol_txrx_info(
|
||||
"%s: Delete Peer %pK\n", __func__, peer);
|
||||
ol_txrx_peer_release_ref(peers[i],
|
||||
PEER_DEBUG_ID_OL_INTERNAL);
|
||||
PEER_DEBUG_ID_OL_TXQ_VDEV_FL);
|
||||
}
|
||||
} while (peer_count >= PEER_ARRAY_COUNT);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2189,7 +2189,7 @@ ol_txrx_peer_attach(struct cdp_vdev *pvdev, uint8_t *peer_mac_addr,
|
|||
qdf_atomic_init(&peer->access_list[i]);
|
||||
|
||||
/* keep one reference for attach */
|
||||
ol_txrx_peer_get_ref(peer, PEER_DEBUG_ID_OL_INTERNAL);
|
||||
ol_txrx_peer_get_ref(peer, PEER_DEBUG_ID_OL_PEER_ATTACH);
|
||||
|
||||
/* Set a flag to indicate peer create is pending in firmware */
|
||||
qdf_atomic_init(&peer->fw_create_pending);
|
||||
|
|
@ -2852,27 +2852,29 @@ int ol_txrx_peer_release_ref(ol_txrx_peer_handle peer,
|
|||
struct ol_txrx_pdev_t *pdev;
|
||||
bool ref_silent = false;
|
||||
int access_list = 0;
|
||||
uint32_t err_code = 0;
|
||||
|
||||
/* preconditions */
|
||||
TXRX_ASSERT2(peer);
|
||||
|
||||
vdev = peer->vdev;
|
||||
if (NULL == vdev) {
|
||||
ol_txrx_dbg(
|
||||
"The vdev is not present anymore\n");
|
||||
return -EINVAL;
|
||||
ol_txrx_err("The vdev is not present anymore\n");
|
||||
err_code = 0xbad1;
|
||||
goto ERR_STATE;
|
||||
}
|
||||
|
||||
pdev = vdev->pdev;
|
||||
if (NULL == pdev) {
|
||||
ol_txrx_dbg(
|
||||
"The pdev is not present anymore\n");
|
||||
return -EINVAL;
|
||||
ol_txrx_err("The pdev is not present anymore\n");
|
||||
err_code = 0xbad2;
|
||||
goto ERR_STATE;
|
||||
}
|
||||
|
||||
if (debug_id >= PEER_DEBUG_ID_MAX || debug_id < 0) {
|
||||
ol_txrx_err("incorrect debug_id %d ", debug_id);
|
||||
return -EINVAL;
|
||||
err_code = 0xbad3;
|
||||
goto ERR_STATE;
|
||||
}
|
||||
|
||||
if (debug_id == PEER_DEBUG_ID_OL_RX_THREAD)
|
||||
|
|
@ -2881,7 +2883,7 @@ int ol_txrx_peer_release_ref(ol_txrx_peer_handle peer,
|
|||
if (!ref_silent)
|
||||
wlan_roam_debug_log(vdev->vdev_id, DEBUG_PEER_UNREF_DELETE,
|
||||
DEBUG_INVALID_PEER_ID, &peer->mac_addr.raw,
|
||||
peer, 0,
|
||||
peer, 0xdead,
|
||||
qdf_atomic_read(&peer->ref_cnt));
|
||||
|
||||
|
||||
|
|
@ -3035,16 +3037,20 @@ int ol_txrx_peer_release_ref(ol_txrx_peer_handle peer,
|
|||
|
||||
qdf_mem_free(peer);
|
||||
} else {
|
||||
access_list = qdf_atomic_read(
|
||||
&peer->access_list[debug_id]);
|
||||
access_list = qdf_atomic_read(&peer->access_list[debug_id]);
|
||||
qdf_spin_unlock_bh(&pdev->peer_ref_mutex);
|
||||
if (!ref_silent)
|
||||
ol_txrx_dbg("[%d][%d]: ref delete peer %pK ref_cnt -> %d",
|
||||
debug_id,
|
||||
access_list,
|
||||
peer, rc);
|
||||
ol_txrx_info_high("[%d][%d]: ref delete peer %pK ref_cnt -> %d",
|
||||
debug_id,
|
||||
access_list,
|
||||
peer, rc);
|
||||
}
|
||||
return rc;
|
||||
ERR_STATE:
|
||||
wlan_roam_debug_log(vdev->vdev_id, DEBUG_PEER_UNREF_DELETE,
|
||||
DEBUG_INVALID_PEER_ID, &peer->mac_addr.raw,
|
||||
peer, err_code, qdf_atomic_read(&peer->ref_cnt));
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -3112,7 +3118,7 @@ static QDF_STATUS ol_txrx_clear_peer(struct cdp_pdev *ppdev, uint8_t sta_id)
|
|||
|
||||
void peer_unmap_timer_work_function(void *param)
|
||||
{
|
||||
WMA_LOGE("Enter: %s", __func__);
|
||||
WMA_LOGI("Enter: %s", __func__);
|
||||
/* Added for debugging only */
|
||||
ol_txrx_dump_peer_access_list(param);
|
||||
wlan_roam_debug_dump_table();
|
||||
|
|
@ -3219,7 +3225,7 @@ static void ol_txrx_peer_detach(void *ppeer, uint32_t bitmap)
|
|||
* PEER_UNMAP message arrives to remove the other
|
||||
* reference, added by the PEER_MAP message.
|
||||
*/
|
||||
ol_txrx_peer_release_ref(peer, PEER_DEBUG_ID_OL_INTERNAL);
|
||||
ol_txrx_peer_release_ref(peer, PEER_DEBUG_ID_OL_PEER_ATTACH);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -302,9 +302,9 @@ void ol_txrx_peer_find_hash_erase(struct ol_txrx_pdev_t *pdev)
|
|||
*/
|
||||
qdf_atomic_init(&peer->ref_cnt); /* set to 0 */
|
||||
ol_txrx_peer_get_ref(peer,
|
||||
PEER_DEBUG_ID_OL_INTERNAL);
|
||||
PEER_DEBUG_ID_OL_HASH_ERS);
|
||||
ol_txrx_peer_release_ref(peer,
|
||||
PEER_DEBUG_ID_OL_INTERNAL);
|
||||
PEER_DEBUG_ID_OL_HASH_ERS);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -389,7 +389,7 @@ static inline void ol_txrx_peer_find_add_id(struct ol_txrx_pdev_t *pdev,
|
|||
peer =
|
||||
ol_txrx_peer_find_hash_find_get_ref(pdev, peer_mac_addr,
|
||||
1 /* is aligned */, 0,
|
||||
PEER_DEBUG_ID_OL_INTERNAL);
|
||||
PEER_DEBUG_ID_OL_PEER_MAP);
|
||||
|
||||
if (!peer || peer_id == HTT_INVALID_PEER) {
|
||||
/*
|
||||
|
|
@ -649,7 +649,7 @@ void ol_rx_peer_unmap_handler(ol_txrx_pdev_handle pdev, uint16_t peer_id)
|
|||
* Remove a reference to the peer.
|
||||
* If there are no more references, delete the peer object.
|
||||
*/
|
||||
ol_txrx_peer_release_ref(peer, PEER_DEBUG_ID_OL_INTERNAL);
|
||||
ol_txrx_peer_release_ref(peer, PEER_DEBUG_ID_OL_PEER_MAP);
|
||||
|
||||
QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_DEBUG,
|
||||
"%s: peer_id %d peer %pK peer_id_ref_cnt %d",
|
||||
|
|
|
|||
|
|
@ -1820,7 +1820,7 @@ static int wma_remove_bss_peer(tp_wma_handle wma, void *pdev,
|
|||
|
||||
peer = cdp_peer_get_ref_by_addr(soc, pdev, mac_addr,
|
||||
&peer_id,
|
||||
PEER_DEBUG_ID_OL_INTERNAL);
|
||||
PEER_DEBUG_ID_WMA_DEL_BSS);
|
||||
if (!peer) {
|
||||
WMA_LOGE(FL("peer NULL for vdev_id = %d"), vdev_id);
|
||||
wma_cleanup_target_req_param(req_msg);
|
||||
|
|
@ -1848,7 +1848,7 @@ static int wma_remove_bss_peer(tp_wma_handle wma, void *pdev,
|
|||
}
|
||||
if (peer)
|
||||
cdp_peer_release_ref(soc, peer,
|
||||
PEER_DEBUG_ID_OL_INTERNAL);
|
||||
PEER_DEBUG_ID_WMA_DEL_BSS);
|
||||
return ret_value;
|
||||
}
|
||||
|
||||
|
|
@ -2130,8 +2130,8 @@ int wma_vdev_stop_resp_handler(void *handle, uint8_t *cmd_param_info,
|
|||
(tpLinkStateParams) req_msg->user_data;
|
||||
|
||||
peer = cdp_peer_get_ref_by_addr(soc, pdev, params->bssid,
|
||||
&peer_id,
|
||||
PEER_DEBUG_ID_OL_INTERNAL);
|
||||
&peer_id,
|
||||
PEER_DEBUG_ID_WMA_VDEV_STOP_RESP);
|
||||
if (peer) {
|
||||
WMA_LOGP(FL("Deleting peer %pM vdev id %d"),
|
||||
params->bssid, req_msg->vdev_id);
|
||||
|
|
@ -2167,7 +2167,7 @@ int wma_vdev_stop_resp_handler(void *handle, uint8_t *cmd_param_info,
|
|||
free_req_msg:
|
||||
if (peer)
|
||||
cdp_peer_release_ref(soc, peer,
|
||||
PEER_DEBUG_ID_OL_INTERNAL);
|
||||
PEER_DEBUG_ID_WMA_VDEV_STOP_RESP);
|
||||
qdf_mc_timer_destroy(&req_msg->event_timeout);
|
||||
qdf_mem_free(req_msg);
|
||||
return status;
|
||||
|
|
|
|||
Loading…
Reference in a new issue