Browse Source

qcacmn: Per ring - Per core statistics

Add ring_packets variable to collect packet count on rx
path. This stat variable is incremented on
per ring - per core basis.

Change-Id: If8b51a757b28c231a6444e6b7f2e336b8c0cdd8e
CRs-Fixed: 2035142
Venkata Sharath Chandra Manchala 8 years ago
parent
commit
918aefe25b
5 changed files with 52 additions and 1 deletions
  1. 1 0
      dp/inc/cdp_txrx_cmn_struct.h
  2. 31 0
      dp/wifi3.0/dp_main.c
  3. 6 0
      dp/wifi3.0/dp_rx.c
  4. 3 0
      dp/wifi3.0/dp_types.h
  5. 11 1
      dp/wifi3.0/hal_rx.h

+ 1 - 0
dp/inc/cdp_txrx_cmn_struct.h

@@ -63,6 +63,7 @@
 #define CDP_LRO_STATS               8
 #define CDP_NAPI_STATS              9
 #define CDP_WLAN_RX_BUF_DEBUG_STATS 10
+#define CDP_RX_RING_STATS          11
 #define CDP_SCHEDULER_STATS        21
 #define CDP_TX_QUEUE_STATS         22
 #define CDP_BUNDLE_STATS           23

+ 31 - 0
dp/wifi3.0/dp_main.c

@@ -3300,6 +3300,29 @@ static int dp_txrx_stats(struct cdp_vdev *vdev,
 	return 0;
 }
 
+/*
+ * dp_print_per_ring_stats(): Packet count per ring
+ * @soc - soc handle
+ */
+static void dp_print_per_ring_stats(struct dp_soc *soc)
+{
+	uint8_t core, ring;
+	uint64_t total_packets;
+
+	DP_TRACE(NONE, "Reo packets per ring:");
+	for (ring = 0; ring < MAX_REO_DEST_RINGS; ring++) {
+		total_packets = 0;
+		DP_TRACE(NONE, "Packets on ring %u:", ring);
+		for (core = 0; core < NR_CPUS; core++) {
+			DP_TRACE(NONE, "Packets arriving on core %u: %llu",
+				core, soc->stats.rx.ring_packets[core][ring]);
+			total_packets += soc->stats.rx.ring_packets[core][ring];
+		}
+		DP_TRACE(NONE, "Total packets on ring %u: %llu",
+			ring, total_packets);
+	}
+}
+
 /*
  * dp_txrx_path_stats() - Function to display dump stats
  * @soc - soc handle
@@ -3456,15 +3479,23 @@ static QDF_STATUS dp_txrx_dump_stats(void *psoc, uint16_t value)
 	case CDP_TXRX_PATH_STATS:
 		dp_txrx_path_stats(soc);
 		break;
+
+	case CDP_RX_RING_STATS:
+		dp_print_per_ring_stats(soc);
+		break;
+
 	case CDP_TXRX_TSO_STATS:
 		/* TODO: NOT IMPLEMENTED */
 		break;
+
 	case CDP_DUMP_TX_FLOW_POOL_INFO:
 		/* TODO: NOT IMPLEMENTED */
 		break;
+
 	case CDP_TXRX_DESC_STATS:
 		/* TODO: NOT IMPLEMENTED */
 		break;
+
 	default:
 		status = QDF_STATUS_E_INVAL;
 		break;

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

@@ -672,6 +672,8 @@ dp_rx_process(struct dp_intr *int_ctx, void *hal_ring, uint32_t quota)
 	struct dp_srng *dp_rxdma_srng;
 	struct rx_desc_pool *rx_desc_pool;
 	struct dp_soc *soc = int_ctx->soc;
+	uint8_t ring_id;
+	uint8_t core_id;
 
 	DP_HIST_INIT();
 	/* Debug -- Remove later */
@@ -728,6 +730,10 @@ dp_rx_process(struct dp_intr *int_ctx, void *hal_ring, uint32_t quota)
 		qdf_nbuf_unmap_single(soc->osdev, rx_desc->nbuf,
 					QDF_DMA_BIDIRECTIONAL);
 
+		ring_id = hal_srng_ring_id_get(hal_ring);
+		core_id = smp_processor_id();
+		DP_STATS_INC(soc, rx.ring_packets[core_id][ring_id], 1);
+
 		/* Get MPDU DESC info */
 		hal_rx_mpdu_desc_info_get(ring_desc, &mpdu_desc_info);
 		peer_id = DP_PEER_METADATA_PEER_ID_GET(

+ 3 - 0
dp/wifi3.0/dp_types.h

@@ -659,6 +659,9 @@ struct dp_soc {
 				/* REO Error count */
 				uint32_t reo_error[REO_ERROR_TYPE_MAX];
 			} err;
+
+			/* packet count per core - per ring */
+			uint64_t ring_packets[NR_CPUS][MAX_REO_DEST_RINGS];
 		} rx;
 	} stats;
 

+ 11 - 1
dp/wifi3.0/hal_rx.h

@@ -2441,7 +2441,17 @@ static inline void hal_rx_dump_pkt_tlvs(uint8_t *buf, uint8_t dbg_level)
 	hal_rx_dump_pkt_hdr_tlv(pkt_hdr_tlv, dbg_level);
 }
 
-
+/**
+ * hal_srng_ring_id_get: API to retreive ring id from hal ring
+ *                       structure
+ * @hal_ring: pointer to hal_srng structure
+ *
+ * Return: ring_id
+ */
+static inline uint8_t hal_srng_ring_id_get(void *hal_ring)
+{
+	return ((struct hal_srng *)hal_ring)->ring_id;
+}
 
 #endif /* _HAL_RX_H */