qcacmn: Take peer ref count and dec it after using

Currently peer reference is used with out taking any ref count.
In parallel context execution on different core peer reference may
be cleaned up in peer unmap event. So take ref count while using
the peer reference and decrement after done with it.

Change-Id: I02ca172cbdc4309fabd3bbbad00940826662bbd3
CRs-Fixed: 2301963
This commit is contained in:
Sravan Kumar Kairam
2018-08-14 23:51:58 +05:30
committed by nshrivas
父節點 97d6a98c03
當前提交 26d471ec56
共有 12 個文件被更改,包括 210 次插入125 次删除

查看文件

@@ -2312,8 +2312,9 @@ static void dp_tx_inspect_handler(struct dp_tx_desc_s *tx_desc, uint8_t *status)
#ifdef FEATURE_PERPKT_INFO
/**
* dp_get_completion_indication_for_stack() - send completion to stack
* @soc : dp_soc handle
* @pdev: dp_pdev handle
* @soc : dp_soc handle
* @pdev: dp_pdev handle
* @peer: dp peer handle
* @peer_id: peer_id of the peer for which completion came
* @ppdu_id: ppdu_id
* @first_msdu: first msdu
@@ -2324,20 +2325,18 @@ static void dp_tx_inspect_handler(struct dp_tx_desc_s *tx_desc, uint8_t *status)
* send to stack for free or not
*/
QDF_STATUS
dp_get_completion_indication_for_stack(struct dp_soc *soc, struct dp_pdev *pdev,
uint16_t peer_id, uint32_t ppdu_id, uint8_t first_msdu,
uint8_t last_msdu, qdf_nbuf_t netbuf)
dp_get_completion_indication_for_stack(struct dp_soc *soc,
struct dp_pdev *pdev,
struct dp_peer *peer, uint16_t peer_id,
uint32_t ppdu_id, uint8_t first_msdu,
uint8_t last_msdu, qdf_nbuf_t netbuf)
{
struct tx_capture_hdr *ppdu_hdr;
struct dp_peer *peer = NULL;
struct ether_header *eh;
if (qdf_unlikely(!pdev->tx_sniffer_enable && !pdev->mcopy_mode))
return QDF_STATUS_E_NOSUPPORT;
peer = (peer_id == HTT_INVALID_PEER) ? NULL :
dp_peer_find_by_id(soc, peer_id);
if (!peer) {
QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
FL("Peer Invalid"));
@@ -2402,9 +2401,11 @@ void dp_send_completion_to_stack(struct dp_soc *soc, struct dp_pdev *pdev,
}
#else
static QDF_STATUS
dp_get_completion_indication_for_stack(struct dp_soc *soc, struct dp_pdev *pdev,
uint16_t peer_id, uint32_t ppdu_id, uint8_t first_msdu,
uint8_t last_msdu, qdf_nbuf_t netbuf)
dp_get_completion_indication_for_stack(struct dp_soc *soc,
struct dp_pdev *pdev,
struct dp_peer *peer, uint16_t peer_id,
uint32_t ppdu_id, uint8_t first_msdu,
uint8_t last_msdu, qdf_nbuf_t netbuf)
{
return QDF_STATUS_E_NOSUPPORT;
}
@@ -2863,16 +2864,17 @@ static inline void dp_tx_sojourn_stats_process(struct dp_pdev *pdev,
* dp_tx_comp_process_tx_status() - Parse and Dump Tx completion status info
* @tx_desc: software descriptor head pointer
* @length: packet length
* @peer: peer handle
*
* Return: none
*/
static inline void dp_tx_comp_process_tx_status(struct dp_tx_desc_s *tx_desc,
uint32_t length)
static inline
void dp_tx_comp_process_tx_status(struct dp_tx_desc_s *tx_desc,
uint32_t length, struct dp_peer *peer)
{
struct hal_tx_completion_status ts = {0};
struct dp_soc *soc = NULL;
struct dp_vdev *vdev = tx_desc->vdev;
struct dp_peer *peer = NULL;
struct ether_header *eh =
(struct ether_header *)qdf_nbuf_data(tx_desc->nbuf);
@@ -2925,7 +2927,6 @@ static inline void dp_tx_comp_process_tx_status(struct dp_tx_desc_s *tx_desc,
dp_tx_comp_fill_tx_completion_stats(tx_desc, &ts);
/* Update peer level stats */
peer = dp_peer_find_by_id(soc, ts.peer_id);
if (!peer) {
QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_INFO,
"invalid peer");
@@ -2979,7 +2980,7 @@ static void dp_tx_comp_process_desc(struct dp_soc *soc,
if (QDF_NBUF_CB_TX_EXTRA_FRAG_FLAGS_NOTIFY_COMP(desc->nbuf))
dp_tx_notify_completion(soc, desc, desc->nbuf);
dp_tx_comp_process_tx_status(desc, length);
dp_tx_comp_process_tx_status(desc, length, peer);
DPTRACE(qdf_dp_trace_ptr
(desc->nbuf,
@@ -2991,19 +2992,23 @@ static void dp_tx_comp_process_desc(struct dp_soc *soc,
);
/*currently m_copy/tx_capture is not supported for scatter gather packets*/
if (!(desc->msdu_ext_desc) && (dp_get_completion_indication_for_stack(soc,
desc->pdev, ts.peer_id, ts.ppdu_id,
if (!(desc->msdu_ext_desc) &&
(dp_get_completion_indication_for_stack(soc, desc->pdev,
peer, ts.peer_id, ts.ppdu_id,
ts.first_msdu, ts.last_msdu,
desc->nbuf) == QDF_STATUS_SUCCESS)) {
qdf_nbuf_unmap(soc->osdev, desc->nbuf,
QDF_DMA_TO_DEVICE);
QDF_DMA_TO_DEVICE);
dp_send_completion_to_stack(soc, desc->pdev, ts.peer_id,
ts.ppdu_id, desc->nbuf);
ts.ppdu_id, desc->nbuf);
} else {
dp_tx_comp_free_buf(soc, desc);
}
if (peer)
dp_peer_unref_del_find_by_id(peer);
DP_HIST_PACKET_COUNT_INC(desc->pdev->pdev_id);
next = desc->next;