Эх сурвалжийг харах

qcacmn: Reuse the tx descriptors in direct switch

Reuse the tx descriptors released in tx completions
without releasing the associated skbs to reduce
the cpu utilization in direct switch mode.

Change-Id: I4ab3ac58977a626344877b8a818a4dbc4864aaf3
CRs-Fixed: 3393968
Pavankumar Nandeshwar 2 жил өмнө
parent
commit
0a7d729a98

+ 4 - 5
dp/wifi3.0/be/dp_be.c

@@ -1787,11 +1787,10 @@ static QDF_STATUS dp_soc_ppeds_srng_init(struct dp_soc *soc)
 		goto fail;
 	}
 
-	wlan_minidump_remove(be_soc->ppeds_wbm_release_ring.base_vaddr_unaligned,
-			     be_soc->ppeds_wbm_release_ring.alloc_size,
-			     soc->ctrl_psoc,
-			     WLAN_MD_DP_SRNG_PPE_WBM2SW_RELEASE,
-			     "ppeds_wbm_release_ring");
+	wlan_minidump_log(be_soc->ppeds_wbm_release_ring.base_vaddr_unaligned,
+			  be_soc->ppeds_wbm_release_ring.alloc_size,
+			  soc->ctrl_psoc, WLAN_MD_DP_SRNG_PPE_WBM2SW_RELEASE,
+			  "ppeds_wbm_release_ring");
 
 	return QDF_STATUS_SUCCESS;
 fail:

+ 6 - 0
dp/wifi3.0/be/dp_be.h

@@ -252,8 +252,10 @@ struct dp_ppe_vp_profile {
 /**
  * struct dp_ppeds_tx_desc_pool_s - PPEDS Tx Descriptor Pool
  * @elem_size: Size of each descriptor
+ * @hot_list_len: Length of hotlist chain
  * @num_allocated: Number of used descriptors
  * @freelist: Chain of free descriptors
+ * @hotlist: Chain of descriptors with attached nbufs
  * @desc_pages: multiple page allocation information for actual descriptors
  * @elem_count: Number of descriptors in the pool
  * @num_free: Number of free descriptors
@@ -262,7 +264,9 @@ struct dp_ppe_vp_profile {
 struct dp_ppeds_tx_desc_pool_s {
 	uint16_t elem_size;
 	uint32_t num_allocated;
+	uint32_t hot_list_len;
 	struct dp_tx_desc_s *freelist;
+	struct dp_tx_desc_s *hotlist;
 	struct qdf_mem_multi_page_t desc_pages;
 	uint16_t elem_count;
 	uint32_t num_free;
@@ -303,6 +307,7 @@ struct dp_ppeds_napi {
  * @ppeds_tx_desc: PPEDS tx desc pool
  * @ppeds_napi_ctxt:
  * @ppeds_handle: PPEDS soc instance handle
+ * @dp_ppeds_txdesc_hotlist_len: PPEDS tx desc hotlist length
  * @ppe_vp_tbl_lock: PPE VP table lock
  * @num_ppe_vp_entries: Number of PPE VP entries
  * @num_ppe_vp_search_idx_entries: PPEDS VP search idx entries
@@ -342,6 +347,7 @@ struct dp_soc_be {
 	struct dp_ppeds_tx_desc_pool_s ppeds_tx_desc;
 	struct dp_ppeds_napi ppeds_napi_ctxt;
 	void *ppeds_handle;
+	int dp_ppeds_txdesc_hotlist_len;
 	qdf_mutex_t ppe_vp_tbl_lock;
 	uint8_t num_ppe_vp_entries;
 	uint8_t num_ppe_vp_search_idx_entries;

+ 3 - 2
dp/wifi3.0/be/dp_be_tx.c

@@ -993,6 +993,7 @@ int dp_ppeds_tx_comp_handler(struct dp_soc_be *be_soc, uint32_t quota)
 	struct dp_soc *soc = &be_soc->soc;
 	void *last_prefetch_hw_desc = NULL;
 	struct dp_tx_desc_s *last_prefetch_sw_desc = NULL;
+	qdf_nbuf_t  nbuf;
 	hal_soc_handle_t hal_soc = soc->hal_soc;
 	hal_ring_handle_t hal_ring_hdl =
 				be_soc->ppeds_wbm_release_ring.hal_srng;
@@ -1050,8 +1051,8 @@ int dp_ppeds_tx_comp_handler(struct dp_soc_be *be_soc, uint32_t quota)
 			if (status != HTT_TX_FW2WBM_TX_STATUS_OK)
 				dp_ppeds_stats(soc, tx_desc->peer_id);
 
-			qdf_nbuf_free(tx_desc->nbuf);
-			dp_ppeds_tx_desc_free(soc, tx_desc);
+			nbuf = dp_ppeds_tx_desc_free(soc, tx_desc);
+			qdf_nbuf_free(nbuf);
 		} else {
 			tx_desc->tx_status =
 				hal_tx_comp_get_tx_status(tx_comp_hal_desc);

+ 24 - 2
dp/wifi3.0/dp_tx.c

@@ -5420,6 +5420,19 @@ dp_tx_nbuf_dev_queue_free(qdf_nbuf_queue_head_t *nbuf_queue_head,
 		qdf_nbuf_free(nbuf);
 }
 
+static inline void
+dp_tx_nbuf_dev_queue_free_no_flag(qdf_nbuf_queue_head_t *nbuf_queue_head,
+				  qdf_nbuf_t nbuf)
+{
+	if (!nbuf)
+		return;
+
+	if (nbuf->is_from_recycler)
+		qdf_nbuf_dev_queue_head(nbuf_queue_head, nbuf);
+	else
+		qdf_nbuf_free(nbuf);
+}
+
 static inline void
 dp_tx_nbuf_dev_kfree_list(qdf_nbuf_queue_head_t *nbuf_queue_head)
 {
@@ -5438,6 +5451,13 @@ dp_tx_nbuf_dev_queue_free(qdf_nbuf_queue_head_t *nbuf_queue_head,
 	qdf_nbuf_free(desc->nbuf);
 }
 
+static inline void
+dp_tx_nbuf_dev_queue_free_no_flag(qdf_nbuf_queue_head_t *nbuf_queue_head,
+				  qdf_nbuf_t nbuf)
+{
+	qdf_nbuf_free(nbuf);
+}
+
 static inline void
 dp_tx_nbuf_dev_kfree_list(qdf_nbuf_queue_head_t *nbuf_queue_head)
 {
@@ -5481,13 +5501,15 @@ dp_tx_comp_process_desc_list(struct dp_soc *soc,
 		}
 
 		if (desc->flags & DP_TX_DESC_FLAG_PPEDS) {
+			qdf_nbuf_t nbuf;
+
 			if (qdf_likely(txrx_peer))
 				dp_tx_update_peer_basic_stats(txrx_peer,
 							      desc->length,
 							      desc->tx_status,
 							      false);
-			dp_tx_nbuf_dev_queue_free(&h, desc);
-			dp_ppeds_tx_desc_free(soc, desc);
+			nbuf = dp_ppeds_tx_desc_free(soc, desc);
+			dp_tx_nbuf_dev_queue_free_no_flag(&h, nbuf);
 			desc = next;
 			continue;
 		}

+ 5 - 3
dp/wifi3.0/dp_tx.h

@@ -410,11 +410,13 @@ qdf_nbuf_t dp_tx_exc_drop(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
 			  struct cdp_tx_exception_metadata *tx_exc_metadata);
 #endif
 #ifdef WLAN_SUPPORT_PPEDS
-void dp_ppeds_tx_desc_free(struct dp_soc *soc, struct dp_tx_desc_s *tx_desc);
+qdf_nbuf_t
+dp_ppeds_tx_desc_free(struct dp_soc *soc, struct dp_tx_desc_s *tx_desc);
 #else
-static inline
-void dp_ppeds_tx_desc_free(struct dp_soc *soc, struct dp_tx_desc_s *tx_desc)
+static inline qdf_nbuf_t
+dp_ppeds_tx_desc_free(struct dp_soc *soc, struct dp_tx_desc_s *tx_desc)
 {
+	return NULL;
 }
 #endif
 #ifndef QCA_HOST_MODE_WIFI_DISABLED

+ 12 - 0
wlan_cfg/cfg_dp.h

@@ -1699,6 +1699,10 @@
 #define WLAN_CFG_NUM_PPEDS_TX_CMP_NAPI_MAX 256
 #define WLAN_CFG_NUM_PPEDS_TX_CMP_NAPI 64
 
+#define WLAN_CFG_PPEDS_TX_DESC_HOTLIST_LEN_MIN 0
+#define WLAN_CFG_PPEDS_TX_DESC_HOTLIST_LEN_MAX 0x2000
+#define WLAN_CFG_PPEDS_TX_DESC_HOTLIST_LEN 0x400
+
 #define CFG_DP_PPEDS_TX_DESC \
 		CFG_INI_UINT("dp_ppeds_tx_desc", \
 		WLAN_CFG_NUM_PPEDS_TX_DESC_MIN, \
@@ -1706,6 +1710,13 @@
 		WLAN_CFG_NUM_PPEDS_TX_DESC, \
 		CFG_VALUE_OR_DEFAULT, "DP PPEDS Tx Descriptors")
 
+#define CFG_DP_PPEDS_TX_DESC_HOTLIST_LEN \
+		CFG_INI_UINT("dp_ppeds_tx_desc_hotlist_len", \
+		WLAN_CFG_PPEDS_TX_DESC_HOTLIST_LEN_MIN, \
+		WLAN_CFG_PPEDS_TX_DESC_HOTLIST_LEN_MAX, \
+		WLAN_CFG_PPEDS_TX_DESC_HOTLIST_LEN, \
+		CFG_VALUE_OR_DEFAULT, "DP PPEDS Tx Desc hotlist length")
+
 #define CFG_DP_PPEDS_TX_CMP_NAPI_BUDGET \
 		CFG_INI_UINT("dp_ppeds_tx_cmp_napi_budget", \
 		WLAN_CFG_NUM_PPEDS_TX_CMP_NAPI_MIN, \
@@ -1733,6 +1744,7 @@
 
 #define CFG_DP_PPEDS_CONFIG \
 		CFG(CFG_DP_PPEDS_TX_CMP_NAPI_BUDGET) \
+		CFG(CFG_DP_PPEDS_TX_DESC_HOTLIST_LEN) \
 		CFG(CFG_DP_PPEDS_TX_DESC) \
 		CFG(CFG_DP_PPEDS_ENABLE) \
 		CFG(CFG_DP_REO2PPE_RING) \

+ 8 - 0
wlan_cfg/wlan_cfg.c

@@ -2668,6 +2668,8 @@ wlan_soc_ppe_cfg_attach(struct cdp_ctrl_objmgr_psoc *psoc,
 	wlan_cfg_ctx->reo2ppe_ring = cfg_get(psoc, CFG_DP_REO2PPE_RING);
 	wlan_cfg_ctx->ppe2tcl_ring = cfg_get(psoc, CFG_DP_PPE2TCL_RING);
 	wlan_cfg_ctx->ppeds_num_tx_desc = cfg_get(psoc, CFG_DP_PPEDS_TX_DESC);
+	wlan_cfg_ctx->ppeds_tx_desc_hotlist_len =
+				cfg_get(psoc, CFG_DP_PPEDS_TX_DESC_HOTLIST_LEN);
 	wlan_cfg_ctx->ppeds_tx_comp_napi_budget =
 				cfg_get(psoc, CFG_DP_PPEDS_TX_CMP_NAPI_BUDGET);
 }
@@ -4230,6 +4232,12 @@ wlan_cfg_get_dp_soc_ppeds_tx_comp_napi_budget(struct wlan_cfg_dp_soc_ctxt *cfg)
 {
 	return cfg->ppeds_tx_comp_napi_budget;
 }
+
+int
+wlan_cfg_get_dp_soc_ppeds_tx_desc_hotlist_len(struct wlan_cfg_dp_soc_ctxt *cfg)
+{
+	return cfg->ppeds_tx_desc_hotlist_len;
+}
 #endif
 
 void

+ 16 - 0
wlan_cfg/wlan_cfg.h

@@ -309,6 +309,7 @@ struct wlan_srng_cfg {
  * @ppe2tcl_ring: PPE2TCL ring size
  * @ppeds_num_tx_desc: Number of tx descs for PPE DS
  * @ppeds_tx_comp_napi_budget: Napi budget for tx completions
+ * @ppeds_tx_desc_hotlist_len: PPE DS tx desc hotlist max length
  * @pkt_capture_mode: Packet capture mode config
  * @rx_mon_buf_ring_size: Rx monitor buf ring size
  * @tx_mon_buf_ring_size: Tx monitor buf ring size
@@ -491,6 +492,7 @@ struct wlan_cfg_dp_soc_ctxt {
 	int ppe2tcl_ring;
 	int ppeds_num_tx_desc;
 	int ppeds_tx_comp_napi_budget;
+	int ppeds_tx_desc_hotlist_len;
 #endif
 #ifdef WLAN_FEATURE_PKT_CAPTURE_V2
 	uint32_t pkt_capture_mode;
@@ -2138,6 +2140,14 @@ wlan_cfg_get_dp_soc_ppe2tcl_ring_size(struct wlan_cfg_dp_soc_ctxt *cfg);
 int
 wlan_cfg_get_dp_soc_ppeds_num_tx_desc(struct wlan_cfg_dp_soc_ctxt *cfg);
 
+/**
+ * wlan_cfg_get_dp_soc_ppeds_tx_desc_hotlist_len() - Max hotlist len of tx descs
+ * @cfg: Configuration Handle
+ *
+ * Return: hotlist len
+ */
+int
+wlan_cfg_get_dp_soc_ppeds_tx_desc_hotlist_len(struct wlan_cfg_dp_soc_ctxt *cfg);
 /**
  * wlan_cfg_get_dp_soc_ppeds_tx_comp_napi_budget() - ppeds Tx comp napi budget
  * @cfg: Configuration Handle
@@ -2176,6 +2186,12 @@ wlan_cfg_get_dp_soc_ppeds_tx_comp_napi_budget(struct wlan_cfg_dp_soc_ctxt *cfg)
 {
 	return 0;
 }
+
+static inline int
+wlan_cfg_get_dp_soc_ppeds_tx_desc_hotlist_len(struct wlan_cfg_dp_soc_ctxt *cfg)
+{
+	return 0;
+}
 #endif
 
 /**