Skip to contentSkip to conversation

net/mana: use trace points for data path logs

PATCH New [email protected] 1 participant 1 message Mar 3, 2023

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

PATCH 1/1 net/mana: use trace points for data path logs

From: Long Li <[email protected]>

Change all the logging statements on the data path to use trace points to reduce CPU overhead when fast path tracing is not enabled.

Fixes 517ed6e2d5 ("net/mana: add basic driver with build environment")
---
 drivers/net/mana/gdma.c              |  50 +++---
 drivers/net/mana/mana_trace.h        | 222 +++++++++++++++++++++++++++
 drivers/net/mana/mana_trace_points.c |  33 ++++
 drivers/net/mana/meson.build         |   1 +
 drivers/net/mana/mp.c                |   5 +-
 drivers/net/mana/mr.c                |  46 ++----
 drivers/net/mana/rx.c                |  20 ++-
 drivers/net/mana/tx.c                |  45 ++----
 8 files changed, 321 insertions(+), 101 deletions(-)
 create mode 100644 drivers/net/mana/mana_trace.h
 create mode 100644 drivers/net/mana/mana_trace_points.c
drivers/net/mana/gdma.c +23 -27
index 3d4039014f..92c1717911 100644
@@ -6,6 +6,7 @@
 #include <rte_io.h>
 
 #include "mana.h"
+#include "mana_trace.h"
 
 uint8_t *
 gdma_get_wqe_pointer(struct mana_gdma_queue *queue)
@@ -14,12 +15,11 @@ gdma_get_wqe_pointer(struct mana_gdma_queue *queue)
 		(queue->head * GDMA_WQE_ALIGNMENT_UNIT_SIZE) &
 		(queue->size - 1);
 
-	DRV_LOG(DEBUG, "txq sq_head %u sq_size %u offset_in_bytes %u",
-		queue->head, queue->size, offset_in_bytes);
+	mana_trace_gdma_wqe_pointer(queue->head, queue->size, offset_in_bytes);
 
 	if (offset_in_bytes + GDMA_WQE_ALIGNMENT_UNIT_SIZE > queue->size)
 		DRV_LOG(ERR, "fatal error: offset_in_bytes %u too big",
-			offset_in_bytes);
+		       offset_in_bytes);
 
 	return ((uint8_t *)queue->buffer) + offset_in_bytes;
 }
@@ -39,11 +39,12 @@ write_dma_client_oob(uint8_t *work_queue_buffer_pointer,
 		client_oob_size / sizeof(uint32_t);
 	header->client_data_unit = work_request->client_data_unit;
 
-	DRV_LOG(DEBUG, "queue buf %p sgl %u oob_h %u du %u oob_buf %p oob_b %u",
-		work_queue_buffer_pointer, header->num_sgl_entries,
-		header->inline_client_oob_size_in_dwords,
-		header->client_data_unit, work_request->inline_oob_data,
-		work_request->inline_oob_size_in_bytes);
+	mana_trace_gdma_write_dma_oob((uintptr_t)work_queue_buffer_pointer,
+			header->num_sgl_entries,
+			header->inline_client_oob_size_in_dwords,
+			header->client_data_unit,
+			(uintptr_t)work_request->inline_oob_data,
+			work_request->inline_oob_size_in_bytes);
 
 	p += sizeof(struct gdma_wqe_dma_oob);
 	if (work_request->inline_oob_data &&
@@ -73,9 +74,6 @@ write_scatter_gather_list(uint8_t *work_queue_head_pointer,
 	uint32_t size_to_queue_end;
 	uint32_t sge_list_size;
 
-	DRV_LOG(DEBUG, "work_queue_cur_pointer %p work_request->flags %x",
-		work_queue_cur_pointer, work_request->flags);
-
 	num_sge = work_request->num_sgl_elements;
 	sge_list = work_request->sgl;
 	size_to_queue_end = (uint32_t)(work_queue_end_pointer -
@@ -110,9 +108,9 @@ write_scatter_gather_list(uint8_t *work_queue_head_pointer,
 		sge_list_size = size;
 	}
 
-	DRV_LOG(DEBUG, "sge %u address 0x%" PRIx64 " size %u key %u list_s %u",
-		num_sge, sge_list->address, sge_list->size,
-		sge_list->memory_key, sge_list_size);
+	mana_trace_gdma_write_sgl(num_sge, (uintptr_t)sge_list->address,
+			sge_list->size, sge_list->memory_key, sge_list_size,
+			work_request->flags);
 
 	return sge_list_size;
 }
@@ -141,13 +139,12 @@ gdma_post_work_request(struct mana_gdma_queue *queue,
 	uint32_t queue_free_units = queue->count - (queue->head - queue->tail);
 
 	if (wqe_size / GDMA_WQE_ALIGNMENT_UNIT_SIZE > queue_free_units) {
-		DRV_LOG(DEBUG, "WQE size %u queue count %u head %u tail %u",
-			wqe_size, queue->count, queue->head, queue->tail);
+		mana_trace_gdma_queue_busy(wqe_size, queue->count, queue->head,
+				queue->tail);
 		return -EBUSY;
 	}
 
-	DRV_LOG(DEBUG, "client_oob_size %u sgl_data_size %u wqe_size %u",
-		client_oob_size, sgl_data_size, wqe_size);
+	mana_trace_gdma_queued(client_oob_size, sgl_data_size, wqe_size);
 
 	if (wqe_info) {
 		wqe_info->wqe_index =
@@ -248,11 +245,11 @@ mana_ring_doorbell(void *db_page, enum gdma_queue_types queue_type,
 
 	/* Ensure all writes are done before ringing doorbell */
 	rte_wmb();
+	rte_write64(e.as_uint64, addr);
 
-	DRV_LOG(DEBUG, "db_page %p addr %p queue_id %u type %u tail %u arm %u",
-		db_page, addr, queue_id, queue_type, tail, arm);
+	mana_trace_gdma_ring_doorbell((uintptr_t)db_page, (uintptr_t)addr, queue_id,
+			queue_type, tail, arm);
 
-	rte_write64(e.as_uint64, addr);
 	return 0;
 }
 
@@ -274,15 +271,14 @@ gdma_poll_completion_queue(struct mana_gdma_queue *cq, struct gdma_comp *comp)
 				COMPLETION_QUEUE_OWNER_MASK;
 	cqe_owner_bits = cqe->owner_bits;
 
-	DRV_LOG(DEBUG, "comp cqe bits 0x%x owner bits 0x%x",
-		cqe_owner_bits, old_owner_bits);
+	mana_trace_gdma_poll_cq(cqe_owner_bits, old_owner_bits);
 
 	if (cqe_owner_bits == old_owner_bits)
 		return 0; /* No new entry */
 
 	if (cqe_owner_bits != new_owner_bits) {
 		DRV_LOG(ERR, "CQ overflowed, ID %u cqe 0x%x new 0x%x",
-			cq->id, cqe_owner_bits, new_owner_bits);
+		       cq->id, cqe_owner_bits, new_owner_bits);
 		return -1;
 	}
 
@@ -296,8 +292,8 @@ gdma_poll_completion_queue(struct mana_gdma_queue *cq, struct gdma_comp *comp)
 
 	cq->head++;
 
-	DRV_LOG(DEBUG, "comp new 0x%x old 0x%x cqe 0x%x wq %u sq %u head %u",
-		new_owner_bits, old_owner_bits, cqe_owner_bits,
-		comp->work_queue_number, comp->send_work_queue, cq->head);
+	mana_trace_gdma_polled_cq(new_owner_bits, old_owner_bits,
+			cqe_owner_bits, comp->work_queue_number,
+			comp->send_work_queue, cq->head);
 	return 1;
 }
drivers/net/mana/mana_trace.h new file +222 -0

222 lines not on this page · raw message

drivers/net/mana/mana_trace_points.c new file +33 -0
new file mode 100644
index 0000000000..2b7942cf94
@@ -0,0 +1,33 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright 2022 Microsoft Corporation
+ */
+
+#include <rte_trace_point_register.h>
+#include "mana_trace.h"
+
+RTE_TRACE_POINT_REGISTER(mana_trace_mr_chunk, mana.mr.chunk)
+RTE_TRACE_POINT_REGISTER(mana_trace_mr_ibv, mana.mr.ibv)
+RTE_TRACE_POINT_REGISTER(mana_trace_mr_search, mana.mr.search)
+RTE_TRACE_POINT_REGISTER(mana_trace_mr_found, mana.mr.found)
+RTE_TRACE_POINT_REGISTER(mana_trace_local_cache_insert, mana.cache.local.insert)
+RTE_TRACE_POINT_REGISTER(mana_trace_btree_miss, mana.btree.miss)
+RTE_TRACE_POINT_REGISTER(mana_trace_btree_found, mana.btree.found)
+RTE_TRACE_POINT_REGISTER(mana_trace_btree_shift, mana.btree.shift)
+RTE_TRACE_POINT_REGISTER(mana_trace_btree_inserted, mana.btree.inserted)
+RTE_TRACE_POINT_REGISTER(mana_trace_gdma_wqe_pointer, mana.gdma.wqe.pointer)
+RTE_TRACE_POINT_REGISTER(mana_trace_gdma_write_dma_oob, mana.gdma.write.dma.oob)
+RTE_TRACE_POINT_REGISTER(mana_trace_gdma_write_sgl, mana.gdma.write.sgl)
+RTE_TRACE_POINT_REGISTER(mana_trace_gdma_queue_busy, mana.gdma.queue.busy)
+RTE_TRACE_POINT_REGISTER(mana_trace_gdma_queued, mana.gdma.queued)
+RTE_TRACE_POINT_REGISTER(mana_trace_gdma_ring_doorbell, mana.gdma.ring.doorbell)
+RTE_TRACE_POINT_REGISTER(mana_trace_gdma_poll_cq, mana.gdma.cq.poll)
+RTE_TRACE_POINT_REGISTER(mana_trace_gdma_polled_cq, mana.gdma.cq.polled)
+RTE_TRACE_POINT_REGISTER(mana_trace_tx_error, mana.tx.error)
+RTE_TRACE_POINT_REGISTER(mana_trace_tx_packet, mana.tx.packet)
+RTE_TRACE_POINT_REGISTER(mana_trace_rx_queue_mismatch, mana.rx.queue.mismatch)
+RTE_TRACE_POINT_REGISTER(mana_trace_rx_truncated, mana.rx.truncated)
+RTE_TRACE_POINT_REGISTER(mana_trace_rx_coalesced, mana.rx.coalesced)
+RTE_TRACE_POINT_REGISTER(mana_trace_rx_unknown_cqe, mana.rx.unknown_cqe)
+RTE_TRACE_POINT_REGISTER(mana_trace_rx_cqe, mana.rx.cqe)
+RTE_TRACE_POINT_REGISTER(mana_trace_arm_cq, mana.arm.cq)
+RTE_TRACE_POINT_REGISTER(mana_trace_handle_secondary_mr, mana.secondary.mr)
drivers/net/mana/meson.build +1 -0
index 493f0d26d4..eb5a479cd2 100644
@@ -16,6 +16,7 @@ sources += files(
         'mr.c',
         'rx.c',
         'tx.c',
+        'mana_trace_points.c',
 )
 
 libnames = ['ibverbs', 'mana']
drivers/net/mana/mp.c +3 -2
index 92432c431d..75d897567c 100644
@@ -9,6 +9,7 @@
 #include <infiniband/verbs.h>
 
 #include "mana.h"
+#include "mana_trace.h"
 
 extern struct mana_shared_data *mana_shared_data;
 
@@ -28,8 +29,8 @@ mana_mp_mr_create(struct mana_priv *priv, uintptr_t addr, uint32_t len)
 	if (!ibv_mr)
 		return -errno;
 
-	DRV_LOG(DEBUG, "MR (2nd) lkey %u addr %p len %zu",
-		ibv_mr->lkey, ibv_mr->addr, ibv_mr->length);
+	mana_trace_handle_secondary_mr(ibv_mr->lkey, (uintptr_t)ibv_mr->addr,
+			ibv_mr->length);
 
 	mr = rte_calloc("MANA MR", 1, sizeof(*mr), 0);
 	if (!mr) {
drivers/net/mana/mr.c +16 -30

132 lines not on this page · raw message

drivers/net/mana/rx.c +9 -11
index 55247889c1..ce7c43ca04 100644
@@ -7,6 +7,7 @@
 #include <infiniband/manadv.h>
 
 #include "mana.h"
+#include "mana_trace.h"
 
 static uint8_t mana_rss_hash_key_default[TOEPLITZ_HASH_KEY_SIZE_IN_BYTES] = {
 	0x2c, 0xc6, 0x81, 0xd1,
@@ -97,7 +98,6 @@ mana_alloc_and_post_rx_wqe(struct mana_rxq *rxq)
 		desc->wqe_size_in_bu = wqe_info.wqe_size_in_bu;
 		rxq->desc_ring_head = (rxq->desc_ring_head + 1) % rxq->num_desc;
 	} else {
-		DRV_LOG(ERR, "failed to post recv ret %d", ret);
 		return ret;
 	}
 
@@ -395,8 +395,8 @@ mana_rx_burst(void *dpdk_rxq, struct rte_mbuf **pkts, uint16_t pkts_n)
 			(struct mana_rx_comp_oob *)&comp.completion_data[0];
 
 		if (comp.work_queue_number != rxq->gdma_rq.id) {
-			DRV_LOG(ERR, "rxq comp id mismatch wqid=0x%x rcid=0x%x",
-				comp.work_queue_number, rxq->gdma_rq.id);
+			mana_trace_rx_queue_mismatch(comp.work_queue_number,
+					rxq->gdma_rq.id);
 			rxq->stats.errors++;
 			break;
 		}
@@ -411,22 +411,21 @@ mana_rx_burst(void *dpdk_rxq, struct rte_mbuf **pkts, uint16_t pkts_n)
 			break;
 
 		case CQE_RX_TRUNCATED:
-			DRV_LOG(ERR, "Drop a truncated packet");
+			mana_trace_rx_truncated();
 			rxq->stats.errors++;
 			rte_pktmbuf_free(mbuf);
 			goto drop;
 
 		case CQE_RX_COALESCED_4:
-			DRV_LOG(ERR, "RX coalescing is not supported");
+			mana_trace_rx_coalesced();
 			continue;
 
 		default:
-			DRV_LOG(ERR, "Unknown RX CQE type %d",
-				oob->cqe_hdr.cqe_type);
+			mana_trace_rx_unknown_cqe(oob->cqe_hdr.cqe_type);
 			continue;
 		}
 
-		DRV_LOG(DEBUG, "mana_rx_comp_oob CQE_RX_OKAY rxq %p", rxq);
+		mana_trace_rx_cqe();
 
 		mbuf->data_off = RTE_PKTMBUF_HEADROOM;
 		mbuf->nb_segs = 1;
@@ -490,8 +489,7 @@ mana_arm_cq(struct mana_rxq *rxq, uint8_t arm)
 	uint32_t head = rxq->gdma_cq.head %
 		(rxq->gdma_cq.count << COMPLETION_QUEUE_ENTRY_OWNER_BITS_SIZE);
 
-	DRV_LOG(ERR, "Ringing completion queue ID %u head %u arm %d",
-		rxq->gdma_cq.id, head, arm);
+	mana_trace_arm_cq(rxq->gdma_cq.id, head, arm);
 
 	return mana_ring_doorbell(priv->db_page, GDMA_QUEUE_COMPLETION,
 				  rxq->gdma_cq.id, head, arm);
@@ -522,7 +520,7 @@ mana_rx_intr_disable(struct rte_eth_dev *dev, uint16_t rx_queue_id)
 	if (ret) {
 		if (ret != EAGAIN)
 			DRV_LOG(ERR, "Can't disable RX intr queue %d",
-				rx_queue_id);
+			       rx_queue_id);
 	} else {
 		ibv_ack_cq_events(rxq->cq, 1);
 	}
drivers/net/mana/tx.c +14 -31

90 lines not on this page · raw message

Signature · 1 line
2.32.0