Ver Fonte

qcacmn: Replenish more RX buffers when refill ring runs low

When nbuf allocation failure happens, there is no retry scheme.
So RX buffers in refill ring may shrink and not got enlarged.
This change is aimed to replenish more RX buffers when watermark
is less than critical low threshold.

Change-Id: I201b9e252ba08ba1bff47e0b5ec819a45f1b1ddf
CRs-Fixed: 3245915
Yu Tian há 3 anos atrás
pai
commit
ed3ba3ca44
3 ficheiros alterados com 29 adições e 0 exclusões
  1. 2 0
      dp/inc/cdp_txrx_stats_struct.h
  2. 26 0
      dp/wifi3.0/dp_rx.c
  3. 1 0
      dp/wifi3.0/dp_rx.h

+ 2 - 0
dp/inc/cdp_txrx_stats_struct.h

@@ -2689,6 +2689,7 @@ struct cdp_peer_telemetry_stats {
  * @map_err: Mapping failure
  * @x86_fail: x86 failures
  * @low_thresh_intrs: low threshold interrupts
+ * @free_list: RX descriptors moving back to free list
  * @rx_raw_pkts: Rx Raw Packets
  * @mesh_mem_alloc: Mesh Rx Stats Alloc fail
  * @tso_desc_cnt: TSO descriptors
@@ -2738,6 +2739,7 @@ struct cdp_pdev_stats {
 		uint32_t map_err;
 		uint32_t x86_fail;
 		uint32_t low_thresh_intrs;
+		int32_t free_list;
 	} replenish;
 
 	uint32_t rx_raw_pkts;

+ 26 - 0
dp/wifi3.0/dp_rx.c

@@ -600,6 +600,9 @@ QDF_STATUS __dp_rx_buffers_replenish(struct dp_soc *dp_soc, uint32_t mac_id,
 	union dp_rx_desc_list_elem_t *next;
 	QDF_STATUS ret;
 	void *rxdma_srng;
+	union dp_rx_desc_list_elem_t *desc_list_append = NULL;
+	union dp_rx_desc_list_elem_t *tail_append = NULL;
+	union dp_rx_desc_list_elem_t *temp_list = NULL;
 
 	rxdma_srng = dp_rxdma_srng->hal_srng;
 
@@ -633,6 +636,28 @@ QDF_STATUS __dp_rx_buffers_replenish(struct dp_soc *dp_soc, uint32_t mac_id,
 	} else if (num_entries_avail < num_req_buffers) {
 		num_desc_to_free = num_req_buffers - num_entries_avail;
 		num_req_buffers = num_entries_avail;
+	} else if ((*desc_list) &&
+		   dp_rxdma_srng->num_entries - num_entries_avail <
+		   CRITICAL_BUFFER_THRESHOLD) {
+		/* Append some free descriptors to tail */
+		num_alloc_desc =
+			dp_rx_get_free_desc_list(dp_soc, mac_id,
+						 rx_desc_pool,
+						 CRITICAL_BUFFER_THRESHOLD,
+						 &desc_list_append,
+						 &tail_append);
+
+		if (num_alloc_desc) {
+			temp_list = *desc_list;
+			*desc_list = desc_list_append;
+			tail_append->next = temp_list;
+			num_req_buffers += num_alloc_desc;
+
+			DP_STATS_DEC(dp_pdev,
+				     replenish.free_list,
+				     num_alloc_desc);
+		} else
+			dp_err_rl("%pK:  no free rx_descs in freelist", dp_soc);
 	}
 
 	if (qdf_unlikely(!num_req_buffers)) {
@@ -736,6 +761,7 @@ QDF_STATUS __dp_rx_buffers_replenish(struct dp_soc *dp_soc, uint32_t mac_id,
 	 * Therefore set replenish.pkts.bytes as 0.
 	 */
 	DP_STATS_INC_PKT(dp_pdev, replenish.pkts, count, 0);
+	DP_STATS_INC(dp_pdev, replenish.free_list, num_req_buffers - count);
 
 free_descs:
 	DP_STATS_INC(dp_pdev, buf_freelist, num_desc_to_free);

+ 1 - 0
dp/wifi3.0/dp_rx.h

@@ -1482,6 +1482,7 @@ dp_rx_update_flow_tag(struct dp_soc *soc, struct dp_vdev *vdev,
 }
 #endif /* WLAN_SUPPORT_RX_FLOW_TAG */
 
+#define CRITICAL_BUFFER_THRESHOLD	64
 /*
  * dp_rx_buffers_replenish() - replenish rxdma ring with rx nbufs
  *			       called during dp rx initialization