Browse Source

qcacld-3.0: Add macros to inc/dec peer->ref_cnt

Currently peer ref_cnt increments and decrements are done by the caller
function. Wrap peer->ref_cnt increment and decrement into MACRO calls so
they can be tracked.

Change-Id: I64d8b85d5898545bbc5a4b81101d1fd306de3fc9
CRs-Fixed: 2005652
Mohit Khanna 8 years ago
parent
commit
b04dfcd09a

+ 6 - 6
core/dp/txrx/ol_tx.c

@@ -1524,7 +1524,7 @@ int ol_txrx_mgmt_send_frame(
 					     1 /* error */);
 		if (tx_msdu_info->peer) {
 			/* remove the peer reference added above */
-			ol_txrx_peer_unref_delete(tx_msdu_info->peer);
+			OL_TXRX_PEER_UNREF_DELETE(tx_msdu_info->peer);
 		}
 		return 1; /* can't accept the tx mgmt frame */
 	}
@@ -1549,7 +1549,7 @@ int ol_txrx_mgmt_send_frame(
 	ol_tx_enqueue(vdev->pdev, txq, tx_desc, tx_msdu_info);
 	if (tx_msdu_info->peer) {
 		/* remove the peer reference added above */
-		ol_txrx_peer_unref_delete(tx_msdu_info->peer);
+		OL_TXRX_PEER_UNREF_DELETE(tx_msdu_info->peer);
 	}
 	ol_tx_sched(vdev->pdev);
 
@@ -1739,7 +1739,7 @@ ol_tx_hl_base(
 				if (tx_msdu_info.peer) {
 					/* remove the peer reference
 					 * added above */
-					ol_txrx_peer_unref_delete(
+					OL_TXRX_PEER_UNREF_DELETE(
 							tx_msdu_info.peer);
 				}
 				goto MSDU_LOOP_BOTTOM;
@@ -1757,7 +1757,7 @@ ol_tx_hl_base(
 					ol_tx_desc_frame_free_nonstd(pdev,
 								     tx_desc,
 								     1);
-					ol_txrx_peer_unref_delete(
+					OL_TXRX_PEER_UNREF_DELETE(
 							tx_msdu_info.peer);
 					msdu = next;
 					continue;
@@ -1773,7 +1773,7 @@ ol_tx_hl_base(
 						ol_tx_desc_frame_free_nonstd(
 								pdev,
 								tx_desc, 1);
-						ol_txrx_peer_unref_delete(
+						OL_TXRX_PEER_UNREF_DELETE(
 							tx_msdu_info.peer);
 						msdu = next;
 						continue;
@@ -1822,7 +1822,7 @@ ol_tx_hl_base(
 				OL_TX_PEER_STATS_UPDATE(tx_msdu_info.peer,
 							msdu);
 				/* remove the peer reference added above */
-				ol_txrx_peer_unref_delete(tx_msdu_info.peer);
+				OL_TXRX_PEER_UNREF_DELETE(tx_msdu_info.peer);
 			}
 MSDU_LOOP_BOTTOM:
 			msdu = next;

+ 4 - 8
core/dp/txrx/ol_tx_classify.c

@@ -357,7 +357,7 @@ struct ol_txrx_peer_t *ol_tx_tdls_peer_find(struct ol_txrx_pdev_t *pdev,
 			peer = NULL;
 		} else {
 			if (peer)
-				qdf_atomic_inc(&peer->ref_cnt);
+				OL_TXRX_PEER_INC_REF_CNT(peer);
 		}
 	}
 	if (!peer)
@@ -582,7 +582,7 @@ ol_tx_classify(
 					   "%s: remove the peer for invalid peer_id %p\n",
 					   __func__, peer);
 				/* remove the peer reference added above */
-				ol_txrx_peer_unref_delete(peer);
+				OL_TXRX_PEER_UNREF_DELETE(peer);
 				tx_msdu_info->peer = NULL;
 			}
 			return NULL;
@@ -605,7 +605,7 @@ ol_tx_classify(
 			   "%s: remove the peer reference %p\n",
 			   __func__, peer);
 		/* remove the peer reference added above */
-		ol_txrx_peer_unref_delete(tx_msdu_info->peer);
+		OL_TXRX_PEER_UNREF_DELETE(tx_msdu_info->peer);
 		/* Making peer NULL in case if multicast non STA mode */
 		tx_msdu_info->peer = NULL;
 	}
@@ -688,11 +688,7 @@ ol_tx_classify_mgmt(
 				if (ol_txrx_peer_find_mac_addr_cmp(
 							mac_addr,
 							&peer->mac_addr) != 0) {
-					rcnt = ol_txrx_peer_unref_delete(peer);
-					QDF_TRACE(QDF_MODULE_ID_TXRX,
-						 QDF_TRACE_LEVEL_INFO_HIGH,
-						 "%s: peer %p peer->ref_cnt %d",
-						 __func__, peer, rcnt);
+					rcnt = OL_TXRX_PEER_UNREF_DELETE(peer);
 					peer = NULL;
 				}
 			}

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

@@ -111,13 +111,7 @@ ol_tx_queue_vdev_flush(struct ol_txrx_pdev_t *pdev, struct ol_txrx_vdev_t *vdev)
 			for (i = 0; i < OL_TX_NUM_TIDS; i++) {
 				txq = &peer->txqs[i];
 				if (txq->frms) {
-					qdf_atomic_inc(&peer->ref_cnt);
-					QDF_TRACE(QDF_MODULE_ID_TXRX,
-						 QDF_TRACE_LEVEL_INFO_HIGH,
-						 "%s: peer %p peer->ref_cnt %d",
-						  __func__, peer,
-						  qdf_atomic_read
-							(&peer->ref_cnt));
+					OL_TXRX_PEER_INC_REF_CNT(peer);
 					peers[peer_count++] = peer;
 					break;
 				}
@@ -135,7 +129,7 @@ ol_tx_queue_vdev_flush(struct ol_txrx_pdev_t *pdev, struct ol_txrx_vdev_t *vdev)
 			}
 			ol_txrx_info(
 				   "%s: Delete Peer %p\n", __func__, peer);
-			ol_txrx_peer_unref_delete(peers[i]);
+			OL_TXRX_PEER_UNREF_DELETE(peers[i]);
 		}
 	} while (peer_count >= PEER_ARRAY_COUNT);
 }

+ 18 - 32
core/dp/txrx/ol_txrx.c

@@ -310,10 +310,7 @@ ol_txrx_find_peer_by_addr_and_vdev(struct cdp_pdev *ppdev,
 	if (!peer)
 		return NULL;
 	*peer_id = peer->local_id;
-	qdf_atomic_dec(&peer->ref_cnt);
-	QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_INFO_HIGH,
-		 "%s: peer %p peer->ref_cnt %d", __func__, peer,
-		 qdf_atomic_read(&peer->ref_cnt));
+	OL_TXRX_PEER_DEC_REF_CNT(peer);
 	return peer;
 }
 
@@ -369,11 +366,8 @@ void *ol_txrx_find_peer_by_addr(struct cdp_pdev *ppdev,
 	if (!peer)
 		return NULL;
 	*peer_id = peer->local_id;
-	qdf_atomic_dec(&peer->ref_cnt);
-	QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_INFO_HIGH,
-		 "%s: peer %p peer->ref_cnt %d", __func__, peer,
-		 qdf_atomic_read(&peer->ref_cnt));
-	return (void *)peer;
+	OL_TXRX_PEER_DEC_REF_CNT(peer);
+	return peer;
 }
 
 static uint16_t ol_txrx_local_peer_id(void *ppeer)
@@ -2505,7 +2499,7 @@ ol_txrx_peer_attach(struct cdp_vdev *pvdev, uint8_t *peer_mac_addr)
 	qdf_atomic_init(&peer->ref_cnt);
 
 	/* keep one reference for attach */
-	qdf_atomic_inc(&peer->ref_cnt);
+	OL_TXRX_PEER_INC_REF_CNT(peer);
 
 	/*
 	 * Set a flag to indicate peer create is pending in firmware and
@@ -2516,7 +2510,7 @@ ol_txrx_peer_attach(struct cdp_vdev *pvdev, uint8_t *peer_mac_addr)
 	 */
 	qdf_atomic_init(&peer->fw_create_pending);
 	qdf_atomic_set(&peer->fw_create_pending, 1);
-	qdf_atomic_inc(&peer->ref_cnt);
+	OL_TXRX_PEER_INC_REF_CNT(peer);
 
 	peer->valid = 1;
 	qdf_timer_init(pdev->osdev, &peer->peer_unmap_timer,
@@ -2943,11 +2937,7 @@ QDF_STATUS ol_txrx_peer_state_update(struct cdp_pdev *ppdev,
 			   "%s: no state change, returns directly\n",
 			   __func__);
 #endif
-		peer_ref_cnt = ol_txrx_peer_unref_delete(peer);
-		QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_INFO_HIGH,
-			  "%s: peer %p peer->ref_cnt %d",
-			  __func__, peer, peer_ref_cnt);
-
+		peer_ref_cnt = OL_TXRX_PEER_UNREF_DELETE(peer);
 		return QDF_STATUS_SUCCESS;
 	}
 
@@ -2977,15 +2967,12 @@ QDF_STATUS ol_txrx_peer_state_update(struct cdp_pdev *ppdev,
 				ol_txrx_peer_tid_unpause(peer, tid);
 		}
 	}
-	peer_ref_cnt = ol_txrx_peer_unref_delete(peer);
-	QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_INFO_HIGH,
-		 "%s: peer %p peer->ref_cnt %d",
-		 __func__, peer, peer_ref_cnt);
+	peer_ref_cnt = OL_TXRX_PEER_UNREF_DELETE(peer);
 	/*
-	 * after ol_txrx_peer_unref_delete, peer object cannot be accessed
+	 * after OL_TXRX_PEER_UNREF_DELETE, peer object cannot be accessed
 	 * if the return code was 0
 	 */
-	if (peer_ref_cnt)
+	if (peer_ref_cnt > 0)
 		/*
 		 * Set the state after the Pause to avoid the race condiction
 		 * with ADDBA check in tx path
@@ -3090,10 +3077,7 @@ ol_txrx_peer_update(ol_txrx_vdev_handle vdev,
 		break;
 	}
 	} /* switch */
-	peer_ref_cnt = ol_txrx_peer_unref_delete(peer);
-	QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_INFO_HIGH,
-		 "%s: peer %p peer->ref_cnt %d",
-		 __func__, peer, peer_ref_cnt);
+	peer_ref_cnt = OL_TXRX_PEER_UNREF_DELETE(peer);
 }
 
 uint8_t
@@ -3119,7 +3103,9 @@ ol_txrx_peer_qoscapable_get(struct ol_txrx_pdev_t *txrx_pdev, uint16_t peer_id)
 	return 0;
 }
 
-int ol_txrx_peer_unref_delete(ol_txrx_peer_handle peer)
+int ol_txrx_peer_unref_delete(ol_txrx_peer_handle peer,
+					const char *fname,
+					int line)
 {
 	int    rc;
 	struct ol_txrx_vdev_t *vdev;
@@ -3285,8 +3271,8 @@ int ol_txrx_peer_unref_delete(ol_txrx_peer_handle peer)
 	} else {
 		qdf_spin_unlock_bh(&pdev->peer_ref_mutex);
 		QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_DEBUG,
-			  "%s: peer %p peer->ref_cnt = %d",
-			  __func__, peer, rc);
+			  "ref delete(%s): peer %p peer->ref_cnt = %d",
+			  fname, peer, rc);
 	}
 
 	return rc;
@@ -3449,7 +3435,7 @@ static void ol_txrx_peer_detach(void *ppeer)
 	 * PEER_UNMAP message arrives to remove the other
 	 * reference, added by the PEER_MAP message.
 	 */
-	ol_txrx_peer_unref_delete(peer);
+	OL_TXRX_PEER_UNREF_DELETE(peer);
 }
 
 /**
@@ -3477,7 +3463,7 @@ static void ol_txrx_peer_detach_force_delete(void *ppeer)
 	qdf_spin_unlock_bh(&pdev->peer_map_unmap_lock);
 
 	/*
-	 * Set ref_cnt = 1 so that ol_txrx_peer_unref_delete() called by
+	 * Set ref_cnt = 1 so that OL_TXRX_PEER_UNREF_DELETE() called by
 	 * ol_txrx_peer_detach() will actually delete this peer entry properly.
 	 */
 	qdf_spin_lock_bh(&pdev->peer_ref_mutex);
@@ -3497,7 +3483,7 @@ ol_txrx_peer_find_by_addr(struct ol_txrx_pdev_t *pdev, uint8_t *peer_mac_addr)
 		ol_txrx_info_high(
 			   "%s: Delete extra reference %p", __func__, peer);
 		/* release the extra reference */
-		ol_txrx_peer_unref_delete(peer);
+		OL_TXRX_PEER_UNREF_DELETE(peer);
 	}
 	return peer;
 }

+ 6 - 1
core/dp/txrx/ol_txrx.h

@@ -39,8 +39,13 @@
  * only for forwarding path.
  */
 #define OL_TX_NON_FWD_RESERVE	100
+#define OL_TXRX_PEER_UNREF_DELETE(peer) \
+	ol_txrx_peer_unref_delete(peer, __func__, __LINE__);
+
+int ol_txrx_peer_unref_delete(ol_txrx_peer_handle peer,
+					      const char *fname,
+					      int line);
 
-int ol_txrx_peer_unref_delete(struct ol_txrx_peer_t *peer);
 
 /**
  * ol_tx_desc_pool_size_hl() - allocate tx descriptor pool size for HL systems

+ 39 - 41
core/dp/txrx/ol_txrx_peer_find.c

@@ -69,6 +69,26 @@ static int ol_txrx_log2_ceil(unsigned int value)
 	return log2;
 }
 
+/**
+ * __ol_txrx_peer_change_ref_cnt() - change peer ref count by the input value
+ * @peer: pointer to peer structure
+ * @change: value to add to the peer->ref_cnt, can be negative
+ * @fname: name of the calling function
+ * @line: line number of the calling function
+ *
+ * Return: the QDF_STATUS return from hdd_execute_config_command
+ */
+void __ol_txrx_peer_change_ref_cnt(struct ol_txrx_peer_t *peer,
+						int change,
+						const char *fname,
+						int line)
+{
+	qdf_atomic_add(change, &peer->ref_cnt);
+	QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_INFO_HIGH,
+		"[%s][%d]: peer %p peer->ref_cnt changed by(%d) to %d",
+		fname, line, peer, change, qdf_atomic_read(&peer->ref_cnt));
+}
+
 /*=== function definitions for peer MAC addr --> peer object hash table =====*/
 
 /*
@@ -178,15 +198,9 @@ struct ol_txrx_peer_t *ol_txrx_peer_vdev_find_hash(struct ol_txrx_pdev_t *pdev,
 		if (ol_txrx_peer_find_mac_addr_cmp(mac_addr, &peer->mac_addr) ==
 		    0 && (check_valid == 0 || peer->valid)
 		    && peer->vdev == vdev) {
-			/*
-			 * found it - increment the ref count before releasing
-			 * the lock
-			 */
-			qdf_atomic_inc(&peer->ref_cnt);
-			QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_INFO_HIGH,
-				 "%s: peer %p peer->ref_cnt %d",
-				 __func__, peer,
-				 qdf_atomic_read(&peer->ref_cnt));
+
+			/* found it */
+			OL_TXRX_PEER_INC_REF_CNT(peer);
 			qdf_spin_unlock_bh(&pdev->peer_ref_mutex);
 			return peer;
 		}
@@ -216,16 +230,9 @@ struct ol_txrx_peer_t *ol_txrx_peer_find_hash_find(struct ol_txrx_pdev_t *pdev,
 	TAILQ_FOREACH(peer, &pdev->peer_hash.bins[index], hash_list_elem) {
 		if (ol_txrx_peer_find_mac_addr_cmp(mac_addr, &peer->mac_addr) ==
 		    0 && (check_valid == 0 || peer->valid)) {
-			/*
-			 * found it - increment the ref count before
-			 * releasing the lock
-			 */
-			qdf_atomic_inc(&peer->ref_cnt);
+			/* found it */
+			OL_TXRX_PEER_INC_REF_CNT(peer);
 			qdf_spin_unlock_bh(&pdev->peer_ref_mutex);
-			QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_INFO_HIGH,
-				 "%s: peer %p peer->ref_cnt %d",
-				 __func__, peer,
-				 qdf_atomic_read(&peer->ref_cnt));
 			return peer;
 		}
 	}
@@ -286,16 +293,11 @@ void ol_txrx_peer_find_hash_erase(struct ol_txrx_pdev_t *pdev)
 				/*
 				 * Artificially adjust the peer's ref count to
 				 * 1, so it will get deleted by
-				 * ol_txrx_peer_unref_delete.
+				 * OL_TXRX_PEER_UNREF_DELETE.
 				 */
 				qdf_atomic_init(&peer->ref_cnt); /* set to 0 */
-				qdf_atomic_inc(&peer->ref_cnt); /* incr to 1 */
-				QDF_TRACE(QDF_MODULE_ID_TXRX,
-					 QDF_TRACE_LEVEL_INFO_HIGH,
-					 "%s: Delete Peer %p ref_cnt %d\n",
-					 __func__, peer,
-					 qdf_atomic_read(&peer->ref_cnt));
-				ol_txrx_peer_unref_delete(peer);
+				OL_TXRX_PEER_INC_REF_CNT(peer); /* incr to 1 */
+				OL_TXRX_PEER_UNREF_DELETE(peer);
 			}
 		}
 	}
@@ -345,6 +347,8 @@ static inline void ol_txrx_peer_find_add_id(struct ol_txrx_pdev_t *pdev,
 	struct ol_txrx_peer_t *peer;
 	int status;
 	int i;
+	uint32_t peer_id_ref_cnt;
+	uint32_t peer_ref_cnt;
 
 	/* check if there's already a peer object with this MAC address */
 	peer =
@@ -395,18 +399,17 @@ static inline void ol_txrx_peer_find_add_id(struct ol_txrx_pdev_t *pdev,
 		 * was sent to firmware.
 		 */
 		qdf_atomic_set(&peer->fw_create_pending, 0);
-		ol_txrx_peer_unref_delete(peer);
+		OL_TXRX_PEER_UNREF_DELETE(peer);
 	}
 
 	qdf_spin_unlock(&pdev->peer_map_unmap_lock);
 
-	QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR,
+	peer_id_ref_cnt = qdf_atomic_read(&pdev->
+				peer_id_to_obj_map[peer_id].peer_id_ref_cnt);
+	peer_ref_cnt = qdf_atomic_read(&peer->ref_cnt);
+	QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_INFO_HIGH,
 	   "%s: peer %p ID %d peer_id[%d] peer_id_ref_cnt %d peer->ref_cnt %d",
-	   __func__, peer, peer_id, i,
-	   qdf_atomic_read(&pdev->
-				peer_id_to_obj_map[peer_id].
-				peer_id_ref_cnt),
-	   qdf_atomic_read(&peer->ref_cnt));
+	   __func__, peer, peer_id, i, peer_id_ref_cnt, peer_ref_cnt);
 
 	if (status) {
 		/* TBDXXX: assert for now */
@@ -591,7 +594,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_unref_delete(peer);
+	OL_TXRX_PEER_UNREF_DELETE(peer);
 
 	QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_DEBUG,
 	   "%s: Remove the ID %d reference to peer %p peer_id_ref_cnt %d",
@@ -633,7 +636,7 @@ void ol_txrx_peer_remove_obj_map_entries(ol_txrx_pdev_handle pdev,
 			  peer_id, peer_id_ref_cnt, i);
 		/*
 		 * 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
+		 * OL_TXRX_PEER_UNREF_DELETE will decrement del_peer_id_ref_cnt
 		 * and any map events will increment peer_id_ref_cnt. Otherwise
 		 * accounting will be messed up.
 		 *
@@ -660,13 +663,8 @@ struct ol_txrx_peer_t *ol_txrx_assoc_peer_find(struct ol_txrx_vdev_t *vdev)
 	 */
 	if (vdev->last_real_peer
 	    && vdev->last_real_peer->peer_ids[0] != HTT_INVALID_PEER_ID) {
-		qdf_atomic_inc(&vdev->last_real_peer->ref_cnt);
+		OL_TXRX_PEER_INC_REF_CNT(vdev->last_real_peer);
 		peer = vdev->last_real_peer;
-		QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_INFO_HIGH,
-			 "%s: peer %p peer->ref_cnt %d",
-			 __func__, peer,
-			 qdf_atomic_read
-				(&peer->ref_cnt));
 	} else {
 		peer = NULL;
 	}

+ 11 - 2
core/dp/txrx/ol_txrx_peer_find.h

@@ -36,6 +36,17 @@
 #include <cdp_txrx_cmn.h>       /* ol_txrx_pdev_t, etc. */
 #include <ol_txrx_internal.h>   /* TXRX_ASSERT */
 
+
+#define OL_TXRX_PEER_INC_REF_CNT(peer) \
+	__ol_txrx_peer_change_ref_cnt(peer, 1, __func__, __LINE__);
+
+#define OL_TXRX_PEER_DEC_REF_CNT(peer) \
+	__ol_txrx_peer_change_ref_cnt(peer, (-1), __func__, __LINE__);
+
+void __ol_txrx_peer_change_ref_cnt(struct ol_txrx_peer_t *peer,
+						int change,
+						const char *fname,
+						int line);
 int ol_txrx_peer_find_attach(struct ol_txrx_pdev_t *pdev);
 
 void ol_txrx_peer_find_detach(struct ol_txrx_pdev_t *pdev);
@@ -107,10 +118,8 @@ ol_txrx_peer_find_hash_remove(struct ol_txrx_pdev_t *pdev,
 void ol_txrx_peer_find_hash_erase(struct ol_txrx_pdev_t *pdev);
 
 struct ol_txrx_peer_t *ol_txrx_assoc_peer_find(struct ol_txrx_vdev_t *vdev);
-
 void ol_txrx_peer_remove_obj_map_entries(ol_txrx_pdev_handle pdev,
 					struct ol_txrx_peer_t *peer);
-
 #if defined(TXRX_DEBUG_LEVEL) && TXRX_DEBUG_LEVEL > 5
 void ol_txrx_peer_find_display(ol_txrx_pdev_handle pdev, int indent);
 #else