[dpdk-dev] [PATCH 02/13] net/sfc: bind EvQ DMA space to EvQ type and type-local index

Andrew Rybchenko arybchenko at solarflare.com
Fri Mar 31 12:22:12 CEST 2017


The index of an event queue index is computed from the index of the
corresponding transmit or receive queue, and depends on the total
number of receive queues. As a consequence, the index of an event
queue bound to a transmit queue changes if the total number of
receive queues is changed.

Fixes: 58294ee65afb ("net/sfc: support event queue")

Signed-off-by: Andrew Rybchenko <arybchenko at solarflare.com>
Reviewed-by: Andy Moreton <amoreton at solarflare.com>
---
 drivers/net/sfc/sfc_ev.c | 27 +++++++++++++++++++++++----
 drivers/net/sfc/sfc_ev.h | 10 ++++++++++
 drivers/net/sfc/sfc_rx.c |  3 ++-
 drivers/net/sfc/sfc_tx.c |  3 ++-
 4 files changed, 37 insertions(+), 6 deletions(-)

diff --git a/drivers/net/sfc/sfc_ev.c b/drivers/net/sfc/sfc_ev.c
index 800b08e..46de7a5 100644
--- a/drivers/net/sfc/sfc_ev.c
+++ b/drivers/net/sfc/sfc_ev.c
@@ -55,6 +55,21 @@
 /* Management event queue polling period in microseconds */
 #define SFC_MGMT_EV_QPOLL_PERIOD_US	(US_PER_S)
 
+static const char *
+sfc_evq_type2str(enum sfc_evq_type type)
+{
+	switch (type) {
+	case SFC_EVQ_TYPE_MGMT:
+		return "mgmt-evq";
+	case SFC_EVQ_TYPE_RX:
+		return "rx-evq";
+	case SFC_EVQ_TYPE_TX:
+		return "tx-evq";
+	default:
+		SFC_ASSERT(B_FALSE);
+		return NULL;
+	}
+}
 
 static boolean_t
 sfc_ev_initialized(void *arg)
@@ -786,13 +801,15 @@ sfc_ev_stop(struct sfc_adapter *sa)
 
 int
 sfc_ev_qinit(struct sfc_adapter *sa, unsigned int sw_index,
+	     enum sfc_evq_type type, unsigned int type_index,
 	     unsigned int entries, int socket_id)
 {
 	struct sfc_evq_info *evq_info;
 	struct sfc_evq *evq;
 	int rc;
 
-	sfc_log_init(sa, "sw_index=%u", sw_index);
+	sfc_log_init(sa, "sw_index=%u type=%s type_index=%u",
+		     sw_index, sfc_evq_type2str(type), type_index);
 
 	evq_info = &sa->evq_info[sw_index];
 
@@ -808,9 +825,11 @@ sfc_ev_qinit(struct sfc_adapter *sa, unsigned int sw_index,
 
 	evq->sa = sa;
 	evq->evq_index = sw_index;
+	evq->type = type;
 
 	/* Allocate DMA space */
-	rc = sfc_dma_alloc(sa, "evq", sw_index, EFX_EVQ_SIZE(evq_info->entries),
+	rc = sfc_dma_alloc(sa, sfc_evq_type2str(type), type_index,
+			   EFX_EVQ_SIZE(evq_info->entries),
 			   socket_id, &evq->mem);
 	if (rc != 0)
 		goto fail_dma_alloc;
@@ -930,8 +949,8 @@ sfc_ev_init(struct sfc_adapter *sa)
 			goto fail_ev_qinit_info;
 	}
 
-	rc = sfc_ev_qinit(sa, sa->mgmt_evq_index, SFC_MGMT_EVQ_ENTRIES,
-			  sa->socket_id);
+	rc = sfc_ev_qinit(sa, sa->mgmt_evq_index, SFC_EVQ_TYPE_MGMT, 0,
+			  SFC_MGMT_EVQ_ENTRIES, sa->socket_id);
 	if (rc != 0)
 		goto fail_mgmt_evq_init;
 
diff --git a/drivers/net/sfc/sfc_ev.h b/drivers/net/sfc/sfc_ev.h
index e8d3090..f5e6415 100644
--- a/drivers/net/sfc/sfc_ev.h
+++ b/drivers/net/sfc/sfc_ev.h
@@ -58,6 +58,14 @@ enum sfc_evq_state {
 	SFC_EVQ_NSTATES
 };
 
+enum sfc_evq_type {
+	SFC_EVQ_TYPE_MGMT = 0,
+	SFC_EVQ_TYPE_RX,
+	SFC_EVQ_TYPE_TX,
+
+	SFC_EVQ_NTYPES
+};
+
 struct sfc_evq {
 	/* Used on datapath */
 	efx_evq_t			*common;
@@ -72,6 +80,7 @@ struct sfc_evq {
 	struct sfc_adapter		*sa;
 	unsigned int			evq_index;
 	enum sfc_evq_state		init_state;
+	enum sfc_evq_type		type;
 };
 
 struct sfc_evq_info {
@@ -138,6 +147,7 @@ int sfc_ev_start(struct sfc_adapter *sa);
 void sfc_ev_stop(struct sfc_adapter *sa);
 
 int sfc_ev_qinit(struct sfc_adapter *sa, unsigned int sw_index,
+		 enum sfc_evq_type type, unsigned int type_index,
 		 unsigned int entries, int socket_id);
 void sfc_ev_qfini(struct sfc_adapter *sa, unsigned int sw_index);
 int sfc_ev_qstart(struct sfc_adapter *sa, unsigned int sw_index);
diff --git a/drivers/net/sfc/sfc_rx.c b/drivers/net/sfc/sfc_rx.c
index 403e991..8c929f8 100644
--- a/drivers/net/sfc/sfc_rx.c
+++ b/drivers/net/sfc/sfc_rx.c
@@ -902,7 +902,8 @@ sfc_rx_qinit(struct sfc_adapter *sa, unsigned int sw_index,
 
 	evq_index = sfc_evq_index_by_rxq_sw_index(sa, sw_index);
 
-	rc = sfc_ev_qinit(sa, evq_index, rxq_info->entries, socket_id);
+	rc = sfc_ev_qinit(sa, evq_index, SFC_EVQ_TYPE_RX, sw_index,
+			  rxq_info->entries, socket_id);
 	if (rc != 0)
 		goto fail_ev_qinit;
 
diff --git a/drivers/net/sfc/sfc_tx.c b/drivers/net/sfc/sfc_tx.c
index 3c4717f..2c45e1a 100644
--- a/drivers/net/sfc/sfc_tx.c
+++ b/drivers/net/sfc/sfc_tx.c
@@ -150,7 +150,8 @@ sfc_tx_qinit(struct sfc_adapter *sa, unsigned int sw_index,
 	SFC_ASSERT(nb_tx_desc <= sa->txq_max_entries);
 	txq_info->entries = nb_tx_desc;
 
-	rc = sfc_ev_qinit(sa, evq_index, txq_info->entries, socket_id);
+	rc = sfc_ev_qinit(sa, evq_index, SFC_EVQ_TYPE_TX, sw_index,
+			  txq_info->entries, socket_id);
 	if (rc != 0)
 		goto fail_ev_qinit;
 
-- 
2.9.3



More information about the dev mailing list