Selaa lähdekoodia

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
Deepak Dhamdhere 7 vuotta sitten
vanhempi
sitoutus
66bb63ddda
1 muutettua tiedostoa jossa 15 lisäystä ja 3 poistoa
  1. 15 3
      core/dp/txrx/ol_txrx_peer_find.c

+ 15 - 3
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);
 }