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 <arybche...@solarflare.com> Reviewed-by: Andy Moreton <amore...@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