From 66bb63dddaf8896bd2ad2a70236d9efefd304a72 Mon Sep 17 00:00:00 2001 From: Deepak Dhamdhere Date: Fri, 27 Oct 2017 01:48:01 -0700 Subject: [PATCH] qcacld-3.0: Fix QDF_TRACE() in ol_txrx_peer_remove_obj_map_entries Save peer_ids[] array during cleanup and print it later, after releasing peer_map_unmap_lock. It avoids usage of multiple QDF_TRACE() calls inside critical region. CRs-Fixed: 2027795 Change-Id: I77474f75d0889604e30ba637a04d39fddcaf754c --- core/dp/txrx/ol_txrx_peer_find.c | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/core/dp/txrx/ol_txrx_peer_find.c b/core/dp/txrx/ol_txrx_peer_find.c index 8e4a5da3cf4f..fad184b6fee5 100644 --- a/core/dp/txrx/ol_txrx_peer_find.c +++ b/core/dp/txrx/ol_txrx_peer_find.c @@ -669,10 +669,13 @@ void ol_txrx_peer_remove_obj_map_entries(ol_txrx_pdev_handle pdev, uint16_t peer_id; int32_t peer_id_ref_cnt; int32_t num_deleted_maps = 0; + uint16_t save_peer_ids[MAX_NUM_PEER_ID_PER_PEER]; + uint16_t save_peer_id_ref_cnt[MAX_NUM_PEER_ID_PER_PEER]; qdf_spin_lock_bh(&pdev->peer_map_unmap_lock); for (i = 0; i < MAX_NUM_PEER_ID_PER_PEER; i++) { peer_id = peer->peer_ids[i]; + save_peer_ids[i] = HTT_INVALID_PEER; if (peer_id == HTT_INVALID_PEER || pdev->peer_id_to_obj_map[peer_id].peer == NULL) { /* unused peer_id, or object is already dereferenced */ @@ -687,9 +690,9 @@ void ol_txrx_peer_remove_obj_map_entries(ol_txrx_pdev_handle pdev, peer_id_ref_cnt = qdf_atomic_read( &pdev->peer_id_to_obj_map[peer_id]. peer_id_ref_cnt); - QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_INFO_LOW, - FL("peer_id = %d, peer_id_ref_cnt = %d, index = %d"), - peer_id, peer_id_ref_cnt, i); + save_peer_ids[i] = peer_id; + save_peer_id_ref_cnt[i] = peer_id_ref_cnt; + /* * Transfer peer_id_ref_cnt into del_peer_id_ref_cnt so that * OL_TXRX_PEER_UNREF_DELETE will decrement del_peer_id_ref_cnt @@ -709,6 +712,15 @@ void ol_txrx_peer_remove_obj_map_entries(ol_txrx_pdev_handle pdev, } qdf_spin_unlock_bh(&pdev->peer_map_unmap_lock); + /* Debug print the information after releasing bh spinlock */ + for (i = 0; i < MAX_NUM_PEER_ID_PER_PEER; i++) { + if (save_peer_ids[i] == HTT_INVALID_PEER) + continue; + QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_INFO_LOW, + FL("peer_id = %d, peer_id_ref_cnt = %d, index = %d"), + save_peer_ids[i], save_peer_id_ref_cnt[i], i); + } + while (num_deleted_maps-- > 0) OL_TXRX_PEER_UNREF_DELETE(peer); }