From e4798ea69bceb26112f8afd8fb9f9cd2bcba2664 Mon Sep 17 00:00:00 2001 From: Tallapragada Kalyan Date: Sun, 19 Mar 2023 18:08:18 +0530 Subject: [PATCH] qcacmn: optimization changes to improve RX KPI for WIN done the following changes to improve the RX path KPI 1. remove the extra invalidate in RX path as we no longer dirty the RX TLV cache lines. we now store the rx error codes in nbuf cb instead of RX TLVs reserved memory bytes. 2. with features like flow tag and wds extended mode enabled by default, the rx_fast_flag is always set to false, this resulted in lot more instructions being executed in RX path. Now we ensured this flag is at least set for other features which are not enabled by default. Change-Id: I04c6bdc52a2b3f1248b822a108d8bd1a70abcc7c CRs-Fixed: 3406505 --- dp/wifi3.0/be/dp_be_rx.c | 29 +++++++++----------- dp/wifi3.0/dp_main.c | 13 +-------- dp/wifi3.0/dp_rx.h | 52 ++++++++++++++++++++++++++---------- dp/wifi3.0/dp_rx_err.c | 5 +--- dp/wifi3.0/li/dp_li_rx.c | 10 +++---- qdf/linux/src/i_qdf_nbuf_w.h | 4 +++ 6 files changed, 60 insertions(+), 53 deletions(-) diff --git a/dp/wifi3.0/be/dp_be_rx.c b/dp/wifi3.0/be/dp_be_rx.c index da62bc408a..ceb0ba3deb 100644 --- a/dp/wifi3.0/be/dp_be_rx.c +++ b/dp/wifi3.0/be/dp_be_rx.c @@ -759,15 +759,6 @@ done: dp_rx_update_flow_tag(soc, vdev, nbuf, rx_tlv_hdr, true); - if (qdf_likely(vdev->rx_decap_type == - htt_cmn_pkt_type_ethernet) && - qdf_likely(!vdev->mesh_vdev)) { - dp_rx_wds_learn(soc, vdev, - rx_tlv_hdr, - txrx_peer, - nbuf); - } - if (qdf_unlikely(vdev->mesh_vdev)) { if (dp_rx_filter_mesh_packets(vdev, nbuf, rx_tlv_hdr) @@ -787,6 +778,15 @@ done: } } + if (qdf_likely(vdev->rx_decap_type == + htt_cmn_pkt_type_ethernet) && + qdf_likely(!vdev->mesh_vdev)) { + dp_rx_wds_learn(soc, vdev, + rx_tlv_hdr, + txrx_peer, + nbuf); + } + dp_rx_msdu_stats_update(soc, nbuf, rx_tlv_hdr, txrx_peer, reo_ring_num, tid_stats, link_id); @@ -1905,12 +1905,9 @@ dp_rx_wbm_err_reap_desc_be(struct dp_intr *int_ctx, struct dp_soc *soc, * info when we do the actual nbuf processing */ wbm_err_info.pool_id = rx_desc->pool_id; - hal_rx_priv_info_set_in_tlv(soc->hal_soc, - qdf_nbuf_data(nbuf), - (uint8_t *)&wbm_err_info, - sizeof(wbm_err_info)); - dp_rx_err_tlv_invalidate(soc, nbuf); + dp_rx_set_err_info(soc, nbuf, wbm_err_info); + rx_bufs_reaped[rx_desc->chip_id][rx_desc->pool_id]++; if (qdf_nbuf_is_rx_chfrag_cont(nbuf) || process_sg_buf) { @@ -1967,12 +1964,12 @@ done: rx_desc_pool = &replenish_soc->rx_desc_buf[mac_id]; - dp_rx_buffers_replenish(replenish_soc, mac_id, + dp_rx_buffers_replenish_simple(replenish_soc, mac_id, dp_rxdma_srng, rx_desc_pool, rx_bufs_reaped[chip_id][mac_id], &head[chip_id][mac_id], - &tail[chip_id][mac_id], false); + &tail[chip_id][mac_id]); *rx_bufs_used += rx_bufs_reaped[chip_id][mac_id]; } } diff --git a/dp/wifi3.0/dp_main.c b/dp/wifi3.0/dp_main.c index a82fa2f741..bc2b9f6210 100644 --- a/dp/wifi3.0/dp_main.c +++ b/dp/wifi3.0/dp_main.c @@ -1329,13 +1329,8 @@ void dp_pdev_update_fast_rx_flag(struct dp_soc *soc, struct dp_pdev *pdev) struct dp_vdev *vdev = NULL; uint8_t rx_fast_flag = true; - if (wlan_cfg_is_rx_flow_tag_enabled(soc->wlan_cfg_ctx)) { - rx_fast_flag = false; - goto update_flag; - } - /* Check if protocol tagging enable */ - if (pdev->is_rx_protocol_tagging_enabled) { + if (pdev->is_rx_protocol_tagging_enabled && !pdev->enhanced_stats_en) { rx_fast_flag = false; goto update_flag; } @@ -1359,12 +1354,6 @@ void dp_pdev_update_fast_rx_flag(struct dp_soc *soc, struct dp_pdev *pdev) rx_fast_flag = false; break; } - - /* Check if any VDEV has WDS ext enabled */ - if (dp_vdev_is_wds_ext_enabled(vdev)) { - rx_fast_flag = false; - break; - } } qdf_spin_unlock_bh(&pdev->vdev_list_lock); diff --git a/dp/wifi3.0/dp_rx.h b/dp/wifi3.0/dp_rx.h index c38cea13d7..c703ff3979 100644 --- a/dp/wifi3.0/dp_rx.h +++ b/dp/wifi3.0/dp_rx.h @@ -2505,6 +2505,20 @@ void dp_audio_smmu_unmap(qdf_device_t qdf_dev, qdf_dma_addr_t iova, #endif #if defined(QCA_DP_RX_NBUF_NO_MAP_UNMAP) && !defined(BUILD_X86) +static inline +void dp_rx_set_err_info(struct dp_soc *soc, qdf_nbuf_t nbuf, + struct hal_wbm_err_desc_info wbm_err_info) +{ + QDF_NBUF_CB_RX_ERR_CODES(nbuf) = *((uint32_t *)&wbm_err_info); +} + +static inline +struct hal_wbm_err_desc_info dp_rx_get_err_info(struct dp_soc *soc, + qdf_nbuf_t nbuf) +{ + return *(struct hal_wbm_err_desc_info *)&QDF_NBUF_CB_RX_ERR_CODES(nbuf); +} + static inline QDF_STATUS dp_pdev_rx_buffers_attach_simple(struct dp_soc *soc, uint32_t mac_id, struct dp_srng *rxdma_srng, @@ -2577,22 +2591,9 @@ qdf_dma_addr_t dp_rx_nbuf_sync_no_dsb(struct dp_soc *dp_soc, if (unlikely(!nbuf->fast_recycled)) { qdf_nbuf_dma_inv_range_no_dsb((void *)nbuf->data, (void *)(nbuf->data + buf_size)); - } else { - /* - * In case of fast_recycled is set we can avoid invalidating - * the complete buffer as it would have been invalidated - * by tx driver before giving to recycler. - * - * But we need to still invalidate rx_pkt_tlv_size as this - * area will not be invalidated in TX path - */ - DP_STATS_INC(dp_soc, rx.fast_recycled, 1); - qdf_nbuf_dma_inv_range_no_dsb((void *)nbuf->data, - (void *)(nbuf->data + - dp_soc->rx_pkt_tlv_size + - L3_HEADER_PAD)); } + DP_STATS_INC(dp_soc, rx.fast_recycled, 1); nbuf->fast_recycled = 0; return (qdf_dma_addr_t)qdf_mem_virt_to_phys(nbuf->data); @@ -2672,6 +2673,29 @@ void dp_rx_nbuf_free(qdf_nbuf_t nbuf) qdf_nbuf_free_simple(nbuf); } #else +static inline +void dp_rx_set_err_info(struct dp_soc *soc, qdf_nbuf_t nbuf, + struct hal_wbm_err_desc_info wbm_err_info) +{ + hal_rx_priv_info_set_in_tlv(soc->hal_soc, + qdf_nbuf_data(nbuf), + (uint8_t *)&wbm_err_info, + sizeof(wbm_err_info)); +} + +static inline +struct hal_wbm_err_desc_info dp_rx_get_err_info(struct dp_soc *soc, + qdf_nbuf_t nbuf) +{ + struct hal_wbm_err_desc_info wbm_err_info = { 0 }; + + hal_rx_priv_info_get_from_tlv(soc->hal_soc, qdf_nbuf_data(nbuf), + (uint8_t *)&wbm_err_info, + sizeof(struct hal_wbm_err_desc_info)); + + return wbm_err_info; +} + static inline QDF_STATUS dp_pdev_rx_buffers_attach_simple(struct dp_soc *soc, uint32_t mac_id, struct dp_srng *rxdma_srng, diff --git a/dp/wifi3.0/dp_rx_err.c b/dp/wifi3.0/dp_rx_err.c index 9c19c2e141..e34dba0e34 100644 --- a/dp/wifi3.0/dp_rx_err.c +++ b/dp/wifi3.0/dp_rx_err.c @@ -2372,10 +2372,7 @@ dp_rx_wbm_err_process(struct dp_intr *int_ctx, struct dp_soc *soc, * retrieve the wbm desc info from nbuf TLV, so we can * handle error cases appropriately */ - hal_rx_priv_info_get_from_tlv(soc->hal_soc, rx_tlv_hdr, - (uint8_t *)&wbm_err_info, - sizeof(wbm_err_info)); - + wbm_err_info = dp_rx_get_err_info(soc, nbuf); peer_meta_data = hal_rx_tlv_peer_meta_data_get(soc->hal_soc, rx_tlv_hdr); peer_id = dp_rx_peer_metadata_peer_id_get(soc, peer_meta_data); diff --git a/dp/wifi3.0/li/dp_li_rx.c b/dp/wifi3.0/li/dp_li_rx.c index f16e793e29..1253844761 100644 --- a/dp/wifi3.0/li/dp_li_rx.c +++ b/dp/wifi3.0/li/dp_li_rx.c @@ -1244,12 +1244,8 @@ dp_rx_wbm_err_reap_desc_li(struct dp_intr *int_ctx, struct dp_soc *soc, * info when we do the actual nbuf processing */ wbm_err_info.pool_id = rx_desc->pool_id; - hal_rx_priv_info_set_in_tlv(soc->hal_soc, - qdf_nbuf_data(nbuf), - (uint8_t *)&wbm_err_info, - sizeof(wbm_err_info)); + dp_rx_set_err_info(soc, nbuf, wbm_err_info); - dp_rx_err_tlv_invalidate(soc, nbuf); rx_bufs_reaped[rx_desc->chip_id][rx_desc->pool_id]++; if (qdf_nbuf_is_rx_chfrag_cont(nbuf) || process_sg_buf) { @@ -1306,12 +1302,12 @@ done: rx_desc_pool = &replenish_soc->rx_desc_buf[mac_id]; - dp_rx_buffers_replenish(replenish_soc, mac_id, + dp_rx_buffers_replenish_simple(replenish_soc, mac_id, dp_rxdma_srng, rx_desc_pool, rx_bufs_reaped[chip_id][mac_id], &head[chip_id][mac_id], - &tail[chip_id][mac_id], false); + &tail[chip_id][mac_id]); *rx_bufs_used += rx_bufs_reaped[chip_id][mac_id]; } } diff --git a/qdf/linux/src/i_qdf_nbuf_w.h b/qdf/linux/src/i_qdf_nbuf_w.h index 7854b4ab89..b8602d5451 100644 --- a/qdf/linux/src/i_qdf_nbuf_w.h +++ b/qdf/linux/src/i_qdf_nbuf_w.h @@ -411,6 +411,10 @@ QDF_COMPILE_TIME_ASSERT(qdf_nbuf_cb_size, (((struct qdf_nbuf_cb *) \ ((skb)->cb))->u.rx.hw_info.desc_info.msdu_desc_info) +#define QDF_NBUF_CB_RX_ERR_CODES(skb) \ + (((struct qdf_nbuf_cb *) \ + ((skb)->cb))->u.rx.hw_info.desc_info.rx_error_codes) + #define QDF_NBUF_CB_RX_MPDU_DESC_INFO(skb) \ (((struct qdf_nbuf_cb *) \ ((skb)->cb))->u.rx.hw_info.desc_info.mpdu_desc_info)