diff --git a/core/dp/txrx/ol_tx.c b/core/dp/txrx/ol_tx.c index 274af2b1bbf0..4192c4dbb1c8 100644 --- a/core/dp/txrx/ol_tx.c +++ b/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; diff --git a/core/dp/txrx/ol_tx_classify.c b/core/dp/txrx/ol_tx_classify.c index 62c1e80eafec..eb4702425657 100644 --- a/core/dp/txrx/ol_tx_classify.c +++ b/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; } } diff --git a/core/dp/txrx/ol_tx_queue.c b/core/dp/txrx/ol_tx_queue.c index 001455503845..581ed49ce5ed 100644 --- a/core/dp/txrx/ol_tx_queue.c +++ b/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); } diff --git a/core/dp/txrx/ol_txrx.c b/core/dp/txrx/ol_txrx.c index 2e10de5fb3fd..205d83449bb5 100644 --- a/core/dp/txrx/ol_txrx.c +++ b/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; } diff --git a/core/dp/txrx/ol_txrx.h b/core/dp/txrx/ol_txrx.h index de60f40db6e6..2ebcf00903c0 100644 --- a/core/dp/txrx/ol_txrx.h +++ b/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 diff --git a/core/dp/txrx/ol_txrx_peer_find.c b/core/dp/txrx/ol_txrx_peer_find.c index ad21218f78e3..914bf815ce82 100644 --- a/core/dp/txrx/ol_txrx_peer_find.c +++ b/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; } diff --git a/core/dp/txrx/ol_txrx_peer_find.h b/core/dp/txrx/ol_txrx_peer_find.h index 5e826af90c6b..df717a59c3cc 100644 --- a/core/dp/txrx/ol_txrx_peer_find.h +++ b/core/dp/txrx/ol_txrx_peer_find.h @@ -36,6 +36,17 @@ #include /* ol_txrx_pdev_t, etc. */ #include /* 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