qcacmn: use batch peer reference in TX path

In Tx data path get the peer reference and use
until there is a peer_id mismatch. This is to avoid
per packet atomic operations

Change-Id: I59cdbef19001c694654f0967381a9242788d9cbc
此提交包含在:
Chaithanya Garrepalli
2020-08-25 21:30:20 +05:30
提交者 snandini
父節點 d5f803a63e
當前提交 7db23eeca2

查看文件

@@ -3750,17 +3750,24 @@ dp_tx_comp_process_desc_list(struct dp_soc *soc,
struct dp_tx_desc_s *desc; struct dp_tx_desc_s *desc;
struct dp_tx_desc_s *next; struct dp_tx_desc_s *next;
struct hal_tx_completion_status ts; struct hal_tx_completion_status ts;
struct dp_peer *peer; struct dp_peer *peer = NULL;
uint16_t peer_id = DP_INVALID_PEER;
qdf_nbuf_t netbuf; qdf_nbuf_t netbuf;
desc = comp_head; desc = comp_head;
while (desc) { while (desc) {
if (peer_id != desc->peer_id) {
if (peer)
dp_peer_unref_delete(peer,
DP_MOD_ID_TX_COMP);
peer_id = desc->peer_id;
peer = dp_peer_get_ref_by_id(soc, peer_id,
DP_MOD_ID_TX_COMP);
}
if (qdf_likely(desc->flags & DP_TX_DESC_FLAG_SIMPLE)) { if (qdf_likely(desc->flags & DP_TX_DESC_FLAG_SIMPLE)) {
struct dp_pdev *pdev = desc->pdev; struct dp_pdev *pdev = desc->pdev;
peer = dp_peer_get_ref_by_id(soc, desc->peer_id,
DP_MOD_ID_TX_COMP);
if (qdf_likely(peer)) { if (qdf_likely(peer)) {
/* /*
* Increment peer statistics * Increment peer statistics
@@ -3771,9 +3778,7 @@ dp_tx_comp_process_desc_list(struct dp_soc *soc,
if (desc->tx_status != if (desc->tx_status !=
HAL_TX_TQM_RR_FRAME_ACKED) HAL_TX_TQM_RR_FRAME_ACKED)
peer->stats.tx.tx_failed++; DP_STATS_INC(peer, tx.tx_failed, 1);
dp_peer_unref_delete(peer, DP_MOD_ID_TX_COMP);
} }
qdf_assert(pdev); qdf_assert(pdev);
@@ -3794,8 +3799,7 @@ dp_tx_comp_process_desc_list(struct dp_soc *soc,
continue; continue;
} }
hal_tx_comp_get_status(&desc->comp, &ts, soc->hal_soc); hal_tx_comp_get_status(&desc->comp, &ts, soc->hal_soc);
peer = dp_peer_get_ref_by_id(soc, ts.peer_id,
DP_MOD_ID_TX_COMP);
dp_tx_comp_process_tx_status(soc, desc, &ts, peer, ring_id); dp_tx_comp_process_tx_status(soc, desc, &ts, peer, ring_id);
netbuf = desc->nbuf; netbuf = desc->nbuf;
@@ -3807,14 +3811,13 @@ dp_tx_comp_process_desc_list(struct dp_soc *soc,
dp_tx_comp_process_desc(soc, desc, &ts, peer); dp_tx_comp_process_desc(soc, desc, &ts, peer);
if (peer)
dp_peer_unref_delete(peer, DP_MOD_ID_TX_COMP);
next = desc->next; next = desc->next;
dp_tx_desc_release(desc, desc->pool_id); dp_tx_desc_release(desc, desc->pool_id);
desc = next; desc = next;
} }
if (peer)
dp_peer_unref_delete(peer, DP_MOD_ID_TX_COMP);
} }
/** /**
@@ -4099,18 +4102,17 @@ more_data:
dp_tx_process_htt_completion(tx_desc, dp_tx_process_htt_completion(tx_desc,
htt_tx_status, ring_id); htt_tx_status, ring_id);
} else { } else {
tx_desc->peer_id =
hal_tx_comp_get_peer_id(tx_comp_hal_desc);
tx_desc->tx_status =
hal_tx_comp_get_tx_status(tx_comp_hal_desc);
/* /*
* If the fast completion mode is enabled extended * If the fast completion mode is enabled extended
* metadata from descriptor is not copied * metadata from descriptor is not copied
*/ */
if (qdf_likely(tx_desc->flags & if (qdf_likely(tx_desc->flags &
DP_TX_DESC_FLAG_SIMPLE)) { DP_TX_DESC_FLAG_SIMPLE))
tx_desc->peer_id =
hal_tx_comp_get_peer_id(tx_comp_hal_desc);
tx_desc->tx_status =
hal_tx_comp_get_tx_status(tx_comp_hal_desc);
goto add_to_pool; goto add_to_pool;
}
/* /*
* If the descriptor is already freed in vdev_detach, * If the descriptor is already freed in vdev_detach,