Browse Source

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
Manjunathappa Prakash 6 years ago
parent
commit
1253c3d270
4 changed files with 34 additions and 28 deletions
  1. 2 2
      core/dp/txrx/ol_tx_queue.c
  2. 23 17
      core/dp/txrx/ol_txrx.c
  3. 4 4
      core/dp/txrx/ol_txrx_peer_find.c
  4. 5 5
      core/wma/src/wma_dev_if.c

+ 2 - 2
core/dp/txrx/ol_tx_queue.c

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

+ 23 - 17
core/dp/txrx/ol_txrx.c

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

+ 4 - 4
core/dp/txrx/ol_txrx_peer_find.c

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

+ 5 - 5
core/wma/src/wma_dev_if.c

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