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:
Manjunathappa Prakash 2018-08-22 15:52:14 -07:00 • committed by nshrivas
commit 1253c3d270
4 changed files with 34 additions and 28 deletions

View file

@ -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);
}

View file

@ -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);
}
/**

View file

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

View file

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