From 298951a4024ef42c36fc31416f181cace1bcac56 Mon Sep 17 00:00:00 2001 From: Andrew Rybchenko Date: Fri, 31 Mar 2017 11:22:12 +0100 Subject: [PATCH] net/sfc: bind EvQ DMA space to EvQ type and type-local index 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") Cc: stable@dpdk.org Signed-off-by: Andrew Rybchenko Reviewed-by: Andy Moreton --- 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 800b08ea34..46de7a500a 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 e8d3090be9..f5e6415371 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 3a0e175b42..bdaf21baaa 100644 --- a/drivers/net/sfc/sfc_rx.c +++ b/drivers/net/sfc/sfc_rx.c @@ -901,7 +901,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 3c4717f09f..2c45e1aba9 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.20.1