DPDK patches and discussions
 help / color / mirror / Atom feed
* [dpdk-dev] [PATCH 00/30] net/sfc: improve multi-process support
@ 2019-02-07 12:17 Andrew Rybchenko
  2019-02-07 12:17 ` [dpdk-dev] [PATCH 01/30] net/sfc: log port ID as 16-bit unsigned integer on panic Andrew Rybchenko
                   ` (30 more replies)
  0 siblings, 31 replies; 34+ messages in thread
From: Andrew Rybchenko @ 2019-02-07 12:17 UTC (permalink / raw)
  To: dev

The patch series improves multi-process support in net/sfc.
It carefully distinguishes shared and process private data.

Andrew Rybchenko (29):
  net/sfc: remove control path logging from Rx queue count
  net/sfc: fix logging from secondary process
  net/sfc: avoid usage of RxQ control structure in info get
  net/sfc: avoid usage of TxQ control structure in info get
  net/sfc: remove wrappers around Rx descriptor count and done
  net/sfc: make it simpler to change datapath ops location
  net/sfc: move datapath ops pointers to process private data
  net/sfc: move main log type to process private data
  net/sfc: move RxQ state to multi-process shared location
  net/sfc: move datapath RxQ handle to shared RxQ info
  net/sfc: support Rx descriptor status in secondary process
  net/sfc: move TxQ state to multi-process shared location
  net/sfc: move datapath TxQ handle to shared TxQ info
  net/sfc: support Tx descriptor status in secondary process
  net/sfc: support RSS RETA and hash config get in secondary
  net/sfc: remove unnecessary functions to get RxQ index
  net/sfc: remove unnecessary functions to get TxQ index
  net/sfc: remove RxQ control from shared RxQ info
  net/sfc: remove TxQ control from shared TxQ info
  net/sfc: start to factor out multi-process shared data
  net/sfc: move Rx/Tx datapath names to shared state
  net/sfc: make main logging macro reusable in secondary
  net/sfc: move RxQ shared information to adapter shared
  net/sfc: move TxQ shared information to adapter shared
  net/sfc: move RSS config to adapter shared
  net/sfc: move isolated flag in adapter shared
  net/sfc: remove adapter locks from secondary process ops
  net/sfc: separate adapter primary process and shared data
  net/sfc: support Rx packet types get in secondary process

Ivan Malov (1):
  net/sfc: log port ID as 16-bit unsigned integer on panic

 doc/guides/rel_notes/release_19_05.rst |  11 +
 drivers/net/sfc/sfc.c                  |  35 ++-
 drivers/net/sfc/sfc.h                  |  96 ++++--
 drivers/net/sfc/sfc_debug.h            |  12 +-
 drivers/net/sfc/sfc_dp_rx.h            |   3 +
 drivers/net/sfc/sfc_dp_tx.h            |   3 +
 drivers/net/sfc/sfc_ethdev.c           | 405 +++++++++++++++----------
 drivers/net/sfc/sfc_ev.c               |  30 +-
 drivers/net/sfc/sfc_flow.c             |  35 +--
 drivers/net/sfc/sfc_log.h              |  37 +--
 drivers/net/sfc/sfc_mcdi.c             |   3 +-
 drivers/net/sfc/sfc_port.c             |   2 +-
 drivers/net/sfc/sfc_rx.c               | 326 +++++++++++---------
 drivers/net/sfc/sfc_rx.h               |  37 +--
 drivers/net/sfc/sfc_tx.c               | 257 +++++++++-------
 drivers/net/sfc/sfc_tx.h               |  29 +-
 16 files changed, 767 insertions(+), 554 deletions(-)

-- 
2.17.1

^ permalink raw reply	[flat|nested] 34+ messages in thread

* [dpdk-dev] [PATCH 01/30] net/sfc: log port ID as 16-bit unsigned integer on panic
  2019-02-07 12:17 [dpdk-dev] [PATCH 00/30] net/sfc: improve multi-process support Andrew Rybchenko
@ 2019-02-07 12:17 ` Andrew Rybchenko
  2019-02-08 10:13   ` Ferruh Yigit
  2019-02-07 12:17 ` [dpdk-dev] [PATCH 02/30] net/sfc: remove control path logging from Rx queue count Andrew Rybchenko
                   ` (29 subsequent siblings)
  30 siblings, 1 reply; 34+ messages in thread
From: Andrew Rybchenko @ 2019-02-07 12:17 UTC (permalink / raw)
  To: dev; +Cc: Ivan Malov, stable

From: Ivan Malov <ivan.malov@oktetlabs.ru>

Fixes: f8244c6399d9 ("ethdev: increase port id range")
Cc: stable@dpdk.org

Signed-off-by: Ivan Malov <ivan.malov@oktetlabs.ru>
Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
---
 drivers/net/sfc/sfc_debug.h | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/drivers/net/sfc/sfc_debug.h b/drivers/net/sfc/sfc_debug.h
index 6b600ff4d..62f3937e8 100644
--- a/drivers/net/sfc/sfc_debug.h
+++ b/drivers/net/sfc/sfc_debug.h
@@ -27,7 +27,8 @@
 	do {								\
 		const struct sfc_adapter *_sa = (sa);			\
 									\
-		rte_panic("sfc " PCI_PRI_FMT " #%" PRIu8 ": " fmt "\n",	\
+		rte_panic("sfc " PCI_PRI_FMT				\
+			  " #%" PRIu16 ": " fmt "\n",			\
 			  _sa->pci_addr.domain, _sa->pci_addr.bus,	\
 			  _sa->pci_addr.devid, _sa->pci_addr.function,	\
 			  _sa->port_id, ##args);			\
-- 
2.17.1

^ permalink raw reply	[flat|nested] 34+ messages in thread

* [dpdk-dev] [PATCH 02/30] net/sfc: remove control path logging from Rx queue count
  2019-02-07 12:17 [dpdk-dev] [PATCH 00/30] net/sfc: improve multi-process support Andrew Rybchenko
  2019-02-07 12:17 ` [dpdk-dev] [PATCH 01/30] net/sfc: log port ID as 16-bit unsigned integer on panic Andrew Rybchenko
@ 2019-02-07 12:17 ` Andrew Rybchenko
  2019-02-07 12:17 ` [dpdk-dev] [PATCH 03/30] net/sfc: fix logging from secondary process Andrew Rybchenko
                   ` (28 subsequent siblings)
  30 siblings, 0 replies; 34+ messages in thread
From: Andrew Rybchenko @ 2019-02-07 12:17 UTC (permalink / raw)
  To: dev; +Cc: stable

Rx queue count may be used from data core and it should not
generate control path logs.

Fixes: 04aa6b9c5fd7 ("net/sfc: get RxQ pending descriptors count")
Cc: stable@dpdk.org

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
---
 drivers/net/sfc/sfc_ethdev.c | 2 --
 1 file changed, 2 deletions(-)

diff --git a/drivers/net/sfc/sfc_ethdev.c b/drivers/net/sfc/sfc_ethdev.c
index a7322a1eb..67ce5a22f 100644
--- a/drivers/net/sfc/sfc_ethdev.c
+++ b/drivers/net/sfc/sfc_ethdev.c
@@ -1124,8 +1124,6 @@ sfc_rx_queue_count(struct rte_eth_dev *dev, uint16_t rx_queue_id)
 {
 	struct sfc_adapter *sa = dev->data->dev_private;
 
-	sfc_log_init(sa, "RxQ=%u", rx_queue_id);
-
 	return sfc_rx_qdesc_npending(sa, rx_queue_id);
 }
 
-- 
2.17.1

^ permalink raw reply	[flat|nested] 34+ messages in thread

* [dpdk-dev] [PATCH 03/30] net/sfc: fix logging from secondary process
  2019-02-07 12:17 [dpdk-dev] [PATCH 00/30] net/sfc: improve multi-process support Andrew Rybchenko
  2019-02-07 12:17 ` [dpdk-dev] [PATCH 01/30] net/sfc: log port ID as 16-bit unsigned integer on panic Andrew Rybchenko
  2019-02-07 12:17 ` [dpdk-dev] [PATCH 02/30] net/sfc: remove control path logging from Rx queue count Andrew Rybchenko
@ 2019-02-07 12:17 ` Andrew Rybchenko
  2019-02-07 12:17 ` [dpdk-dev] [PATCH 04/30] net/sfc: avoid usage of RxQ control structure in info get Andrew Rybchenko
                   ` (27 subsequent siblings)
  30 siblings, 0 replies; 34+ messages in thread
From: Andrew Rybchenko @ 2019-02-07 12:17 UTC (permalink / raw)
  To: dev; +Cc: stable

Dynamic log type value may differ in different processes.

Fixes: f28ede500c2e ("net/sfc: support multi-process")
Cc: stable@dpdk.org

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
---
 drivers/net/sfc/sfc.c        |  6 +++---
 drivers/net/sfc/sfc.h        |  2 +-
 drivers/net/sfc/sfc_ethdev.c | 25 ++++++++++++++++---------
 drivers/net/sfc/sfc_mcdi.c   |  3 ++-
 4 files changed, 22 insertions(+), 14 deletions(-)

diff --git a/drivers/net/sfc/sfc.c b/drivers/net/sfc/sfc.c
index 6690053f2..0d7311d68 100644
--- a/drivers/net/sfc/sfc.c
+++ b/drivers/net/sfc/sfc.c
@@ -1071,8 +1071,8 @@ sfc_unprobe(struct sfc_adapter *sa)
 }
 
 uint32_t
-sfc_register_logtype(struct sfc_adapter *sa, const char *lt_prefix_str,
-		     uint32_t ll_default)
+sfc_register_logtype(const struct rte_pci_addr *pci_addr,
+		     const char *lt_prefix_str, uint32_t ll_default)
 {
 	size_t lt_prefix_str_size = strlen(lt_prefix_str);
 	size_t lt_str_size_max;
@@ -1092,7 +1092,7 @@ sfc_register_logtype(struct sfc_adapter *sa, const char *lt_prefix_str,
 
 	strncpy(lt_str, lt_prefix_str, lt_prefix_str_size);
 	lt_str[lt_prefix_str_size - 1] = '.';
-	rte_pci_device_name(&sa->pci_addr, lt_str + lt_prefix_str_size,
+	rte_pci_device_name(pci_addr, lt_str + lt_prefix_str_size,
 			    lt_str_size_max - lt_prefix_str_size);
 	lt_str[lt_str_size_max - 1] = '\0';
 
diff --git a/drivers/net/sfc/sfc.h b/drivers/net/sfc/sfc.h
index a94ca8e75..f1cb83002 100644
--- a/drivers/net/sfc/sfc.h
+++ b/drivers/net/sfc/sfc.h
@@ -311,7 +311,7 @@ int sfc_dma_alloc(const struct sfc_adapter *sa, const char *name, uint16_t id,
 		  size_t len, int socket_id, efsys_mem_t *esmp);
 void sfc_dma_free(const struct sfc_adapter *sa, efsys_mem_t *esmp);
 
-uint32_t sfc_register_logtype(struct sfc_adapter *sa,
+uint32_t sfc_register_logtype(const struct rte_pci_addr *pci_addr,
 			      const char *lt_prefix_str,
 			      uint32_t ll_default);
 
diff --git a/drivers/net/sfc/sfc_ethdev.c b/drivers/net/sfc/sfc_ethdev.c
index 67ce5a22f..10e032400 100644
--- a/drivers/net/sfc/sfc_ethdev.c
+++ b/drivers/net/sfc/sfc_ethdev.c
@@ -1875,7 +1875,7 @@ static const struct eth_dev_ops sfc_eth_dev_secondary_ops = {
 };
 
 static int
-sfc_eth_dev_secondary_set_ops(struct rte_eth_dev *dev)
+sfc_eth_dev_secondary_set_ops(struct rte_eth_dev *dev, uint32_t logtype_main)
 {
 	/*
 	 * Device private data has really many process-local pointers.
@@ -1889,12 +1889,14 @@ sfc_eth_dev_secondary_set_ops(struct rte_eth_dev *dev)
 
 	dp_rx = sfc_dp_find_rx_by_name(&sfc_dp_head, sa->dp_rx_name);
 	if (dp_rx == NULL) {
-		sfc_err(sa, "cannot find %s Rx datapath", sa->dp_rx_name);
+		SFC_LOG(sa, RTE_LOG_ERR, logtype_main,
+			"cannot find %s Rx datapath", sa->dp_rx_name);
 		rc = ENOENT;
 		goto fail_dp_rx;
 	}
 	if (~dp_rx->features & SFC_DP_RX_FEAT_MULTI_PROCESS) {
-		sfc_err(sa, "%s Rx datapath does not support multi-process",
+		SFC_LOG(sa, RTE_LOG_ERR, logtype_main,
+			"%s Rx datapath does not support multi-process",
 			sa->dp_rx_name);
 		rc = EINVAL;
 		goto fail_dp_rx_multi_process;
@@ -1902,12 +1904,14 @@ sfc_eth_dev_secondary_set_ops(struct rte_eth_dev *dev)
 
 	dp_tx = sfc_dp_find_tx_by_name(&sfc_dp_head, sa->dp_tx_name);
 	if (dp_tx == NULL) {
-		sfc_err(sa, "cannot find %s Tx datapath", sa->dp_tx_name);
+		SFC_LOG(sa, RTE_LOG_ERR, logtype_main,
+			"cannot find %s Tx datapath", sa->dp_tx_name);
 		rc = ENOENT;
 		goto fail_dp_tx;
 	}
 	if (~dp_tx->features & SFC_DP_TX_FEAT_MULTI_PROCESS) {
-		sfc_err(sa, "%s Tx datapath does not support multi-process",
+		SFC_LOG(sa, RTE_LOG_ERR, logtype_main,
+			"%s Tx datapath does not support multi-process",
 			sa->dp_tx_name);
 		rc = EINVAL;
 		goto fail_dp_tx_multi_process;
@@ -1955,27 +1959,30 @@ sfc_eth_dev_init(struct rte_eth_dev *dev)
 {
 	struct sfc_adapter *sa = dev->data->dev_private;
 	struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(dev);
+	uint32_t logtype_main;
 	int rc;
 	const efx_nic_cfg_t *encp;
 	const struct ether_addr *from;
 
 	sfc_register_dp();
 
+	logtype_main = sfc_register_logtype(&pci_dev->addr,
+					    SFC_LOGTYPE_MAIN_STR,
+					    RTE_LOG_NOTICE);
+
 	if (rte_eal_process_type() != RTE_PROC_PRIMARY)
-		return -sfc_eth_dev_secondary_set_ops(dev);
+		return -sfc_eth_dev_secondary_set_ops(dev, logtype_main);
 
 	/* Required for logging */
 	sa->pci_addr = pci_dev->addr;
 	sa->port_id = dev->data->port_id;
+	sa->logtype_main = logtype_main;
 
 	sa->eth_dev = dev;
 
 	/* Copy PCI device info to the dev->data */
 	rte_eth_copy_pci_info(dev, pci_dev);
 
-	sa->logtype_main = sfc_register_logtype(sa, SFC_LOGTYPE_MAIN_STR,
-						RTE_LOG_NOTICE);
-
 	rc = sfc_kvargs_parse(sa);
 	if (rc != 0)
 		goto fail_kvargs_parse;
diff --git a/drivers/net/sfc/sfc_mcdi.c b/drivers/net/sfc/sfc_mcdi.c
index 007506b4e..e485e07d6 100644
--- a/drivers/net/sfc/sfc_mcdi.c
+++ b/drivers/net/sfc/sfc_mcdi.c
@@ -256,7 +256,8 @@ sfc_mcdi_init(struct sfc_adapter *sa)
 	if (rc != 0)
 		goto fail_dma_alloc;
 
-	mcdi->logtype = sfc_register_logtype(sa, SFC_LOGTYPE_MCDI_STR,
+	mcdi->logtype = sfc_register_logtype(&sa->pci_addr,
+					     SFC_LOGTYPE_MCDI_STR,
 					     RTE_LOG_NOTICE);
 
 	emtp = &mcdi->transport;
-- 
2.17.1

^ permalink raw reply	[flat|nested] 34+ messages in thread

* [dpdk-dev] [PATCH 04/30] net/sfc: avoid usage of RxQ control structure in info get
  2019-02-07 12:17 [dpdk-dev] [PATCH 00/30] net/sfc: improve multi-process support Andrew Rybchenko
                   ` (2 preceding siblings ...)
  2019-02-07 12:17 ` [dpdk-dev] [PATCH 03/30] net/sfc: fix logging from secondary process Andrew Rybchenko
@ 2019-02-07 12:17 ` Andrew Rybchenko
  2019-02-07 12:17 ` [dpdk-dev] [PATCH 05/30] net/sfc: avoid usage of TxQ " Andrew Rybchenko
                   ` (26 subsequent siblings)
  30 siblings, 0 replies; 34+ messages in thread
From: Andrew Rybchenko @ 2019-02-07 12:17 UTC (permalink / raw)
  To: dev

RxQ control structure contains primary process only data and will
become primary process only. RxQ info get is supported in secondary
process.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
---
 drivers/net/sfc/sfc_ethdev.c |  7 ++-----
 drivers/net/sfc/sfc_rx.c     | 10 +++++-----
 drivers/net/sfc/sfc_rx.h     |  4 ++--
 3 files changed, 9 insertions(+), 12 deletions(-)

diff --git a/drivers/net/sfc/sfc_ethdev.c b/drivers/net/sfc/sfc_ethdev.c
index 10e032400..da697c134 100644
--- a/drivers/net/sfc/sfc_ethdev.c
+++ b/drivers/net/sfc/sfc_ethdev.c
@@ -1067,18 +1067,15 @@ sfc_rx_queue_info_get(struct rte_eth_dev *dev, uint16_t rx_queue_id,
 {
 	struct sfc_adapter *sa = dev->data->dev_private;
 	struct sfc_rxq_info *rxq_info;
-	struct sfc_rxq *rxq;
 
 	sfc_adapter_lock(sa);
 
 	SFC_ASSERT(rx_queue_id < sa->rxq_count);
 
 	rxq_info = &sa->rxq_info[rx_queue_id];
-	rxq = rxq_info->rxq;
-	SFC_ASSERT(rxq != NULL);
 
-	qinfo->mp = rxq->refill_mb_pool;
-	qinfo->conf.rx_free_thresh = rxq->refill_threshold;
+	qinfo->mp = rxq_info->refill_mb_pool;
+	qinfo->conf.rx_free_thresh = rxq_info->refill_threshold;
 	qinfo->conf.rx_drop_en = 1;
 	qinfo->conf.rx_deferred_start = rxq_info->deferred_start;
 	qinfo->conf.offloads = dev->data->dev_conf.rxmode.offloads;
diff --git a/drivers/net/sfc/sfc_rx.c b/drivers/net/sfc/sfc_rx.c
index c792e0b2e..dcccb96b1 100644
--- a/drivers/net/sfc/sfc_rx.c
+++ b/drivers/net/sfc/sfc_rx.c
@@ -688,7 +688,7 @@ sfc_rx_qstart(struct sfc_adapter *sa, unsigned int sw_index)
 			rxq_info->type_flags, evq->common, &rxq->common);
 		break;
 	case EFX_RXQ_TYPE_ES_SUPER_BUFFER: {
-		struct rte_mempool *mp = rxq->refill_mb_pool;
+		struct rte_mempool *mp = rxq_info->refill_mb_pool;
 		struct rte_mempool_info mp_info;
 
 		rc = rte_mempool_ops_get_info(mp, &mp_info);
@@ -1033,9 +1033,9 @@ sfc_rx_qinit(struct sfc_adapter *sa, unsigned int sw_index,
 
 	rxq->evq = evq;
 	rxq->hw_index = sw_index;
-	rxq->refill_threshold =
+	rxq_info->refill_threshold =
 		RTE_MAX(rx_conf->rx_free_thresh, SFC_RX_REFILL_BULK);
-	rxq->refill_mb_pool = mb_pool;
+	rxq_info->refill_mb_pool = mb_pool;
 	rxq->buf_size = buf_size;
 
 	rc = sfc_dma_alloc(sa, "rxq", sw_index, EFX_RXQ_SIZE(rxq_info->entries),
@@ -1044,9 +1044,9 @@ sfc_rx_qinit(struct sfc_adapter *sa, unsigned int sw_index,
 		goto fail_dma_alloc;
 
 	memset(&info, 0, sizeof(info));
-	info.refill_mb_pool = rxq->refill_mb_pool;
+	info.refill_mb_pool = rxq_info->refill_mb_pool;
 	info.max_fill_level = rxq_max_fill_level;
-	info.refill_threshold = rxq->refill_threshold;
+	info.refill_threshold = rxq_info->refill_threshold;
 	info.buf_size = buf_size;
 	info.batch_max = encp->enc_rx_batch_max;
 	info.prefix_size = encp->enc_rx_prefix_size;
diff --git a/drivers/net/sfc/sfc_rx.h b/drivers/net/sfc/sfc_rx.h
index 3fba7d8ac..7231379a6 100644
--- a/drivers/net/sfc/sfc_rx.h
+++ b/drivers/net/sfc/sfc_rx.h
@@ -58,8 +58,6 @@ struct sfc_rxq {
 	efx_rxq_t		*common;
 	efsys_mem_t		mem;
 	unsigned int		hw_index;
-	unsigned int		refill_threshold;
-	struct rte_mempool	*refill_mb_pool;
 	uint16_t		buf_size;
 	struct sfc_dp_rxq	*dp;
 	unsigned int		state;
@@ -128,6 +126,8 @@ struct sfc_rxq_info {
 	struct sfc_rxq		*rxq;
 	boolean_t		deferred_start;
 	boolean_t		deferred_started;
+	unsigned int		refill_threshold;
+	struct rte_mempool	*refill_mb_pool;
 };
 
 int sfc_rx_configure(struct sfc_adapter *sa);
-- 
2.17.1

^ permalink raw reply	[flat|nested] 34+ messages in thread

* [dpdk-dev] [PATCH 05/30] net/sfc: avoid usage of TxQ control structure in info get
  2019-02-07 12:17 [dpdk-dev] [PATCH 00/30] net/sfc: improve multi-process support Andrew Rybchenko
                   ` (3 preceding siblings ...)
  2019-02-07 12:17 ` [dpdk-dev] [PATCH 04/30] net/sfc: avoid usage of RxQ control structure in info get Andrew Rybchenko
@ 2019-02-07 12:17 ` Andrew Rybchenko
  2019-02-07 12:17 ` [dpdk-dev] [PATCH 06/30] net/sfc: remove wrappers around Rx descriptor count and done Andrew Rybchenko
                   ` (25 subsequent siblings)
  30 siblings, 0 replies; 34+ messages in thread
From: Andrew Rybchenko @ 2019-02-07 12:17 UTC (permalink / raw)
  To: dev

TxQ control structure contains primary process only data and will become
primary process only. TxQ info get is supported in secondary process.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
---
 drivers/net/sfc/sfc.c        |  2 +-
 drivers/net/sfc/sfc_ethdev.c |  5 ++---
 drivers/net/sfc/sfc_tx.c     | 16 ++++++++--------
 drivers/net/sfc/sfc_tx.h     |  4 ++--
 4 files changed, 13 insertions(+), 14 deletions(-)

diff --git a/drivers/net/sfc/sfc.c b/drivers/net/sfc/sfc.c
index 0d7311d68..bead373ea 100644
--- a/drivers/net/sfc/sfc.c
+++ b/drivers/net/sfc/sfc.c
@@ -281,7 +281,7 @@ sfc_set_fw_subvariant(struct sfc_adapter *sa)
 		struct sfc_txq_info *txq_info = &sa->txq_info[txq_index];
 
 		if (txq_info->txq != NULL)
-			tx_offloads |= txq_info->txq->offloads;
+			tx_offloads |= txq_info->offloads;
 	}
 
 	if (tx_offloads & (DEV_TX_OFFLOAD_IPV4_CKSUM |
diff --git a/drivers/net/sfc/sfc_ethdev.c b/drivers/net/sfc/sfc_ethdev.c
index da697c134..87a2c9431 100644
--- a/drivers/net/sfc/sfc_ethdev.c
+++ b/drivers/net/sfc/sfc_ethdev.c
@@ -1104,12 +1104,11 @@ sfc_tx_queue_info_get(struct rte_eth_dev *dev, uint16_t tx_queue_id,
 	SFC_ASSERT(tx_queue_id < sa->txq_count);
 
 	txq_info = &sa->txq_info[tx_queue_id];
-	SFC_ASSERT(txq_info->txq != NULL);
 
 	memset(qinfo, 0, sizeof(*qinfo));
 
-	qinfo->conf.offloads = txq_info->txq->offloads;
-	qinfo->conf.tx_free_thresh = txq_info->txq->free_thresh;
+	qinfo->conf.offloads = txq_info->offloads;
+	qinfo->conf.tx_free_thresh = txq_info->free_thresh;
 	qinfo->conf.tx_deferred_start = txq_info->deferred_start;
 	qinfo->nb_desc = txq_info->entries;
 
diff --git a/drivers/net/sfc/sfc_tx.c b/drivers/net/sfc/sfc_tx.c
index aa73d2642..c3b089fd8 100644
--- a/drivers/net/sfc/sfc_tx.c
+++ b/drivers/net/sfc/sfc_tx.c
@@ -168,10 +168,10 @@ sfc_tx_qinit(struct sfc_adapter *sa, unsigned int sw_index,
 
 	txq->hw_index = sw_index;
 	txq->evq = evq;
-	txq->free_thresh =
+	txq_info->free_thresh =
 		(tx_conf->tx_free_thresh) ? tx_conf->tx_free_thresh :
 		SFC_TX_DEFAULT_FREE_THRESH;
-	txq->offloads = offloads;
+	txq_info->offloads = offloads;
 
 	rc = sfc_dma_alloc(sa, "txq", sw_index, EFX_TXQ_SIZE(txq_info->entries),
 			   socket_id, &txq->mem);
@@ -180,7 +180,7 @@ sfc_tx_qinit(struct sfc_adapter *sa, unsigned int sw_index,
 
 	memset(&info, 0, sizeof(info));
 	info.max_fill_level = txq_max_fill_level;
-	info.free_thresh = txq->free_thresh;
+	info.free_thresh = txq_info->free_thresh;
 	info.offloads = offloads;
 	info.txq_entries = txq_info->entries;
 	info.dma_desc_size_max = encp->enc_tx_dma_desc_size_max;
@@ -434,21 +434,21 @@ sfc_tx_qstart(struct sfc_adapter *sa, unsigned int sw_index)
 	if (rc != 0)
 		goto fail_ev_qstart;
 
-	if (txq->offloads & DEV_TX_OFFLOAD_IPV4_CKSUM)
+	if (txq_info->offloads & DEV_TX_OFFLOAD_IPV4_CKSUM)
 		flags |= EFX_TXQ_CKSUM_IPV4;
 
-	if (txq->offloads & DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM)
+	if (txq_info->offloads & DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM)
 		flags |= EFX_TXQ_CKSUM_INNER_IPV4;
 
-	if ((txq->offloads & DEV_TX_OFFLOAD_TCP_CKSUM) ||
-	    (txq->offloads & DEV_TX_OFFLOAD_UDP_CKSUM)) {
+	if ((txq_info->offloads & DEV_TX_OFFLOAD_TCP_CKSUM) ||
+	    (txq_info->offloads & DEV_TX_OFFLOAD_UDP_CKSUM)) {
 		flags |= EFX_TXQ_CKSUM_TCPUDP;
 
 		if (offloads_supported & DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM)
 			flags |= EFX_TXQ_CKSUM_INNER_TCPUDP;
 	}
 
-	if (txq->offloads & DEV_TX_OFFLOAD_TCP_TSO)
+	if (txq_info->offloads & DEV_TX_OFFLOAD_TCP_TSO)
 		flags |= EFX_TXQ_FATSOV2;
 
 	rc = efx_tx_qcreate(sa->nic, txq->hw_index, 0, &txq->mem,
diff --git a/drivers/net/sfc/sfc_tx.h b/drivers/net/sfc/sfc_tx.h
index 146b805ca..efb486d32 100644
--- a/drivers/net/sfc/sfc_tx.h
+++ b/drivers/net/sfc/sfc_tx.h
@@ -57,8 +57,6 @@ struct sfc_txq {
 	efsys_mem_t			mem;
 	struct sfc_dp_txq		*dp;
 	efx_txq_t			*common;
-	unsigned int			free_thresh;
-	uint64_t			offloads;
 };
 
 static inline unsigned int
@@ -113,6 +111,8 @@ struct sfc_txq_info {
 	struct sfc_txq		*txq;
 	boolean_t		deferred_start;
 	boolean_t		deferred_started;
+	unsigned int		free_thresh;
+	uint64_t		offloads;
 };
 
 int sfc_tx_configure(struct sfc_adapter *sa);
-- 
2.17.1

^ permalink raw reply	[flat|nested] 34+ messages in thread

* [dpdk-dev] [PATCH 06/30] net/sfc: remove wrappers around Rx descriptor count and done
  2019-02-07 12:17 [dpdk-dev] [PATCH 00/30] net/sfc: improve multi-process support Andrew Rybchenko
                   ` (4 preceding siblings ...)
  2019-02-07 12:17 ` [dpdk-dev] [PATCH 05/30] net/sfc: avoid usage of TxQ " Andrew Rybchenko
@ 2019-02-07 12:17 ` Andrew Rybchenko
  2019-02-07 12:17 ` [dpdk-dev] [PATCH 07/30] net/sfc: make it simpler to change datapath ops location Andrew Rybchenko
                   ` (24 subsequent siblings)
  30 siblings, 0 replies; 34+ messages in thread
From: Andrew Rybchenko @ 2019-02-07 12:17 UTC (permalink / raw)
  To: dev

These wrappers are used in single place and just complicate reading
and understanding if these ops could be supported in secondary process.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
---
 drivers/net/sfc/sfc_ethdev.c | 12 ++++++++++--
 drivers/net/sfc/sfc_rx.c     | 22 ----------------------
 drivers/net/sfc/sfc_rx.h     |  4 ----
 3 files changed, 10 insertions(+), 28 deletions(-)

diff --git a/drivers/net/sfc/sfc_ethdev.c b/drivers/net/sfc/sfc_ethdev.c
index 87a2c9431..36dc580ae 100644
--- a/drivers/net/sfc/sfc_ethdev.c
+++ b/drivers/net/sfc/sfc_ethdev.c
@@ -1119,16 +1119,24 @@ static uint32_t
 sfc_rx_queue_count(struct rte_eth_dev *dev, uint16_t rx_queue_id)
 {
 	struct sfc_adapter *sa = dev->data->dev_private;
+	struct sfc_rxq *rxq;
+
+	SFC_ASSERT(rx_queue_id < sa->rxq_count);
+	rxq = sa->rxq_info[rx_queue_id].rxq;
 
-	return sfc_rx_qdesc_npending(sa, rx_queue_id);
+	if (rxq == NULL || (rxq->state & SFC_RXQ_STARTED) == 0)
+		return 0;
+
+	return sa->dp_rx->qdesc_npending(rxq->dp);
 }
 
 static int
 sfc_rx_descriptor_done(void *queue, uint16_t offset)
 {
 	struct sfc_dp_rxq *dp_rxq = queue;
+	struct sfc_rxq *rxq = sfc_rxq_by_dp_rxq(dp_rxq);
 
-	return sfc_rx_qdesc_done(dp_rxq, offset);
+	return offset < rxq->evq->sa->dp_rx->qdesc_npending(dp_rxq);
 }
 
 static int
diff --git a/drivers/net/sfc/sfc_rx.c b/drivers/net/sfc/sfc_rx.c
index dcccb96b1..44aee29e9 100644
--- a/drivers/net/sfc/sfc_rx.c
+++ b/drivers/net/sfc/sfc_rx.c
@@ -530,28 +530,6 @@ struct sfc_dp_rx sfc_efx_rx = {
 	.pkt_burst		= sfc_efx_recv_pkts,
 };
 
-unsigned int
-sfc_rx_qdesc_npending(struct sfc_adapter *sa, unsigned int sw_index)
-{
-	struct sfc_rxq *rxq;
-
-	SFC_ASSERT(sw_index < sa->rxq_count);
-	rxq = sa->rxq_info[sw_index].rxq;
-
-	if (rxq == NULL || (rxq->state & SFC_RXQ_STARTED) == 0)
-		return 0;
-
-	return sa->dp_rx->qdesc_npending(rxq->dp);
-}
-
-int
-sfc_rx_qdesc_done(struct sfc_dp_rxq *dp_rxq, unsigned int offset)
-{
-	struct sfc_rxq *rxq = sfc_rxq_by_dp_rxq(dp_rxq);
-
-	return offset < rxq->evq->sa->dp_rx->qdesc_npending(dp_rxq);
-}
-
 static void
 sfc_rx_qflush(struct sfc_adapter *sa, unsigned int sw_index)
 {
diff --git a/drivers/net/sfc/sfc_rx.h b/drivers/net/sfc/sfc_rx.h
index 7231379a6..06e8eac8d 100644
--- a/drivers/net/sfc/sfc_rx.h
+++ b/drivers/net/sfc/sfc_rx.h
@@ -149,10 +149,6 @@ uint64_t sfc_rx_get_queue_offload_caps(struct sfc_adapter *sa);
 void sfc_rx_qflush_done(struct sfc_rxq *rxq);
 void sfc_rx_qflush_failed(struct sfc_rxq *rxq);
 
-unsigned int sfc_rx_qdesc_npending(struct sfc_adapter *sa,
-				   unsigned int sw_index);
-int sfc_rx_qdesc_done(struct sfc_dp_rxq *dp_rxq, unsigned int offset);
-
 int sfc_rx_hash_init(struct sfc_adapter *sa);
 void sfc_rx_hash_fini(struct sfc_adapter *sa);
 int sfc_rx_hf_rte_to_efx(struct sfc_adapter *sa, uint64_t rte,
-- 
2.17.1

^ permalink raw reply	[flat|nested] 34+ messages in thread

* [dpdk-dev] [PATCH 07/30] net/sfc: make it simpler to change datapath ops location
  2019-02-07 12:17 [dpdk-dev] [PATCH 00/30] net/sfc: improve multi-process support Andrew Rybchenko
                   ` (5 preceding siblings ...)
  2019-02-07 12:17 ` [dpdk-dev] [PATCH 06/30] net/sfc: remove wrappers around Rx descriptor count and done Andrew Rybchenko
@ 2019-02-07 12:17 ` Andrew Rybchenko
  2019-02-07 12:17 ` [dpdk-dev] [PATCH 08/30] net/sfc: move datapath ops pointers to process private data Andrew Rybchenko
                   ` (23 subsequent siblings)
  30 siblings, 0 replies; 34+ messages in thread
From: Andrew Rybchenko @ 2019-02-07 12:17 UTC (permalink / raw)
  To: dev

Rx and Tx datapath ops should be stored in process private
data since these structures are located in the data section
(not allocated from shared memory).

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
---
 drivers/net/sfc/sfc_ethdev.c | 38 ++++++++++++++++++------------------
 1 file changed, 19 insertions(+), 19 deletions(-)

diff --git a/drivers/net/sfc/sfc_ethdev.c b/drivers/net/sfc/sfc_ethdev.c
index 36dc580ae..f49a1073a 100644
--- a/drivers/net/sfc/sfc_ethdev.c
+++ b/drivers/net/sfc/sfc_ethdev.c
@@ -1735,6 +1735,8 @@ static int
 sfc_eth_dev_set_ops(struct rte_eth_dev *dev)
 {
 	struct sfc_adapter *sa = dev->data->dev_private;
+	const struct sfc_dp_rx *dp_rx;
+	const struct sfc_dp_tx *dp_tx;
 	const efx_nic_cfg_t *encp;
 	unsigned int avail_caps = 0;
 	const char *rx_name = NULL;
@@ -1761,13 +1763,13 @@ sfc_eth_dev_set_ops(struct rte_eth_dev *dev)
 		goto fail_kvarg_rx_datapath;
 
 	if (rx_name != NULL) {
-		sa->dp_rx = sfc_dp_find_rx_by_name(&sfc_dp_head, rx_name);
-		if (sa->dp_rx == NULL) {
+		dp_rx = sfc_dp_find_rx_by_name(&sfc_dp_head, rx_name);
+		if (dp_rx == NULL) {
 			sfc_err(sa, "Rx datapath %s not found", rx_name);
 			rc = ENOENT;
 			goto fail_dp_rx;
 		}
-		if (!sfc_dp_match_hw_fw_caps(&sa->dp_rx->dp, avail_caps)) {
+		if (!sfc_dp_match_hw_fw_caps(&dp_rx->dp, avail_caps)) {
 			sfc_err(sa,
 				"Insufficient Hw/FW capabilities to use Rx datapath %s",
 				rx_name);
@@ -1775,8 +1777,8 @@ sfc_eth_dev_set_ops(struct rte_eth_dev *dev)
 			goto fail_dp_rx_caps;
 		}
 	} else {
-		sa->dp_rx = sfc_dp_find_rx_by_caps(&sfc_dp_head, avail_caps);
-		if (sa->dp_rx == NULL) {
+		dp_rx = sfc_dp_find_rx_by_caps(&sfc_dp_head, avail_caps);
+		if (dp_rx == NULL) {
 			sfc_err(sa, "Rx datapath by caps %#x not found",
 				avail_caps);
 			rc = ENOENT;
@@ -1784,7 +1786,7 @@ sfc_eth_dev_set_ops(struct rte_eth_dev *dev)
 		}
 	}
 
-	sa->dp_rx_name = sfc_strdup(sa->dp_rx->dp.name);
+	sa->dp_rx_name = sfc_strdup(dp_rx->dp.name);
 	if (sa->dp_rx_name == NULL) {
 		rc = ENOMEM;
 		goto fail_dp_rx_name;
@@ -1792,21 +1794,19 @@ sfc_eth_dev_set_ops(struct rte_eth_dev *dev)
 
 	sfc_notice(sa, "use %s Rx datapath", sa->dp_rx_name);
 
-	dev->rx_pkt_burst = sa->dp_rx->pkt_burst;
-
 	rc = sfc_kvargs_process(sa, SFC_KVARG_TX_DATAPATH,
 				sfc_kvarg_string_handler, &tx_name);
 	if (rc != 0)
 		goto fail_kvarg_tx_datapath;
 
 	if (tx_name != NULL) {
-		sa->dp_tx = sfc_dp_find_tx_by_name(&sfc_dp_head, tx_name);
-		if (sa->dp_tx == NULL) {
+		dp_tx = sfc_dp_find_tx_by_name(&sfc_dp_head, tx_name);
+		if (dp_tx == NULL) {
 			sfc_err(sa, "Tx datapath %s not found", tx_name);
 			rc = ENOENT;
 			goto fail_dp_tx;
 		}
-		if (!sfc_dp_match_hw_fw_caps(&sa->dp_tx->dp, avail_caps)) {
+		if (!sfc_dp_match_hw_fw_caps(&dp_tx->dp, avail_caps)) {
 			sfc_err(sa,
 				"Insufficient Hw/FW capabilities to use Tx datapath %s",
 				tx_name);
@@ -1814,8 +1814,8 @@ sfc_eth_dev_set_ops(struct rte_eth_dev *dev)
 			goto fail_dp_tx_caps;
 		}
 	} else {
-		sa->dp_tx = sfc_dp_find_tx_by_caps(&sfc_dp_head, avail_caps);
-		if (sa->dp_tx == NULL) {
+		dp_tx = sfc_dp_find_tx_by_caps(&sfc_dp_head, avail_caps);
+		if (dp_tx == NULL) {
 			sfc_err(sa, "Tx datapath by caps %#x not found",
 				avail_caps);
 			rc = ENOENT;
@@ -1823,7 +1823,7 @@ sfc_eth_dev_set_ops(struct rte_eth_dev *dev)
 		}
 	}
 
-	sa->dp_tx_name = sfc_strdup(sa->dp_tx->dp.name);
+	sa->dp_tx_name = sfc_strdup(dp_tx->dp.name);
 	if (sa->dp_tx_name == NULL) {
 		rc = ENOMEM;
 		goto fail_dp_tx_name;
@@ -1831,7 +1831,11 @@ sfc_eth_dev_set_ops(struct rte_eth_dev *dev)
 
 	sfc_notice(sa, "use %s Tx datapath", sa->dp_tx_name);
 
-	dev->tx_pkt_burst = sa->dp_tx->pkt_burst;
+	sa->dp_rx = dp_rx;
+	sa->dp_tx = dp_tx;
+
+	dev->rx_pkt_burst = dp_rx->pkt_burst;
+	dev->tx_pkt_burst = dp_tx->pkt_burst;
 
 	dev->dev_ops = &sfc_eth_dev_ops;
 
@@ -1839,8 +1843,6 @@ sfc_eth_dev_set_ops(struct rte_eth_dev *dev)
 
 fail_dp_tx_name:
 fail_dp_tx_caps:
-	sa->dp_tx = NULL;
-
 fail_dp_tx:
 fail_kvarg_tx_datapath:
 	rte_free(sa->dp_rx_name);
@@ -1848,8 +1850,6 @@ sfc_eth_dev_set_ops(struct rte_eth_dev *dev)
 
 fail_dp_rx_name:
 fail_dp_rx_caps:
-	sa->dp_rx = NULL;
-
 fail_dp_rx:
 fail_kvarg_rx_datapath:
 	return rc;
-- 
2.17.1

^ permalink raw reply	[flat|nested] 34+ messages in thread

* [dpdk-dev] [PATCH 08/30] net/sfc: move datapath ops pointers to process private data
  2019-02-07 12:17 [dpdk-dev] [PATCH 00/30] net/sfc: improve multi-process support Andrew Rybchenko
                   ` (6 preceding siblings ...)
  2019-02-07 12:17 ` [dpdk-dev] [PATCH 07/30] net/sfc: make it simpler to change datapath ops location Andrew Rybchenko
@ 2019-02-07 12:17 ` Andrew Rybchenko
  2019-02-07 12:17 ` [dpdk-dev] [PATCH 09/30] net/sfc: move main log type " Andrew Rybchenko
                   ` (22 subsequent siblings)
  30 siblings, 0 replies; 34+ messages in thread
From: Andrew Rybchenko @ 2019-02-07 12:17 UTC (permalink / raw)
  To: dev

The change is required to support datapath-dependent device operations
for secondary process. It is just a step in the direction.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
---
 drivers/net/sfc/sfc.c        |  2 +-
 drivers/net/sfc/sfc.h        | 24 +++++++++++--
 drivers/net/sfc/sfc_ethdev.c | 68 ++++++++++++++++++++++++++----------
 drivers/net/sfc/sfc_ev.c     | 18 +++++-----
 drivers/net/sfc/sfc_flow.c   |  2 +-
 drivers/net/sfc/sfc_rx.c     | 30 ++++++++--------
 drivers/net/sfc/sfc_tx.c     | 26 +++++++-------
 7 files changed, 112 insertions(+), 58 deletions(-)

diff --git a/drivers/net/sfc/sfc.c b/drivers/net/sfc/sfc.c
index bead373ea..63bc0a568 100644
--- a/drivers/net/sfc/sfc.c
+++ b/drivers/net/sfc/sfc.c
@@ -727,7 +727,7 @@ sfc_attach(struct sfc_adapter *sa)
 
 	encp = efx_nic_cfg_get(sa->nic);
 
-	if (sa->dp_tx->features & SFC_DP_TX_FEAT_TSO) {
+	if (sa->priv.dp_tx->features & SFC_DP_TX_FEAT_TSO) {
 		sa->tso = encp->enc_fw_assisted_tso_v2_enabled;
 		if (!sa->tso)
 			sfc_warn(sa,
diff --git a/drivers/net/sfc/sfc.h b/drivers/net/sfc/sfc.h
index f1cb83002..5c836b1c3 100644
--- a/drivers/net/sfc/sfc.h
+++ b/drivers/net/sfc/sfc.h
@@ -171,8 +171,30 @@ struct sfc_rss {
 	uint8_t				key[EFX_RSS_KEY_SIZE];
 };
 
+/* Adapter process private data */
+struct sfc_adapter_priv {
+	const struct sfc_dp_rx		*dp_rx;
+	const struct sfc_dp_tx		*dp_tx;
+};
+
+static inline struct sfc_adapter_priv *
+sfc_adapter_priv_by_eth_dev(struct rte_eth_dev *eth_dev)
+{
+	struct sfc_adapter_priv *sap = eth_dev->process_private;
+
+	SFC_ASSERT(sap != NULL);
+	return sap;
+}
+
 /* Adapter private data */
 struct sfc_adapter {
+	/*
+	 * It must be the first field of the sfc_adapter structure since
+	 * sfc_adapter is the primary process private data (i.e.  process
+	 * private data plus additional primary process specific data).
+	 */
+	struct sfc_adapter_priv		priv;
+
 	/*
 	 * PMD setup and configuration is not thread safe. Since it is not
 	 * performance sensitive, it is better to guarantee thread-safety
@@ -249,14 +271,12 @@ struct sfc_adapter {
 	 * the secondary process to find Rx datapath to be used.
 	 */
 	char				*dp_rx_name;
-	const struct sfc_dp_rx		*dp_rx;
 
 	/*
 	 * Shared memory copy of the Tx datapath name to be used by
 	 * the secondary process to find Tx datapath to be used.
 	 */
 	char				*dp_tx_name;
-	const struct sfc_dp_tx		*dp_tx;
 };
 
 /*
diff --git a/drivers/net/sfc/sfc_ethdev.c b/drivers/net/sfc/sfc_ethdev.c
index f49a1073a..46cd36fa5 100644
--- a/drivers/net/sfc/sfc_ethdev.c
+++ b/drivers/net/sfc/sfc_ethdev.c
@@ -84,6 +84,7 @@ sfc_fw_version_get(struct rte_eth_dev *dev, char *fw_version, size_t fw_size)
 static void
 sfc_dev_infos_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
 {
+	const struct sfc_adapter_priv *sap = sfc_adapter_priv_by_eth_dev(dev);
 	struct sfc_adapter *sa = dev->data->dev_private;
 	struct sfc_rss *rss = &sa->rss;
 	uint64_t txq_offloads_def = 0;
@@ -167,10 +168,10 @@ sfc_dev_infos_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
 	 */
 	dev_info->tx_desc_lim.nb_align = EFX_TXQ_MINNDESCS;
 
-	if (sa->dp_rx->get_dev_info != NULL)
-		sa->dp_rx->get_dev_info(dev_info);
-	if (sa->dp_tx->get_dev_info != NULL)
-		sa->dp_tx->get_dev_info(dev_info);
+	if (sap->dp_rx->get_dev_info != NULL)
+		sap->dp_rx->get_dev_info(dev_info);
+	if (sap->dp_tx->get_dev_info != NULL)
+		sap->dp_tx->get_dev_info(dev_info);
 
 	dev_info->dev_capa = RTE_ETH_DEV_CAPA_RUNTIME_RX_QUEUE_SETUP |
 			     RTE_ETH_DEV_CAPA_RUNTIME_TX_QUEUE_SETUP;
@@ -179,11 +180,12 @@ sfc_dev_infos_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
 static const uint32_t *
 sfc_dev_supported_ptypes_get(struct rte_eth_dev *dev)
 {
+	const struct sfc_adapter_priv *sap = sfc_adapter_priv_by_eth_dev(dev);
 	struct sfc_adapter *sa = dev->data->dev_private;
 	const efx_nic_cfg_t *encp = efx_nic_cfg_get(sa->nic);
 	uint32_t tunnel_encaps = encp->enc_tunnel_encapsulations_supported;
 
-	return sa->dp_rx->supported_ptypes_get(tunnel_encaps);
+	return sap->dp_rx->supported_ptypes_get(tunnel_encaps);
 }
 
 static int
@@ -1118,6 +1120,7 @@ sfc_tx_queue_info_get(struct rte_eth_dev *dev, uint16_t tx_queue_id,
 static uint32_t
 sfc_rx_queue_count(struct rte_eth_dev *dev, uint16_t rx_queue_id)
 {
+	const struct sfc_adapter_priv *sap = sfc_adapter_priv_by_eth_dev(dev);
 	struct sfc_adapter *sa = dev->data->dev_private;
 	struct sfc_rxq *rxq;
 
@@ -1127,7 +1130,7 @@ sfc_rx_queue_count(struct rte_eth_dev *dev, uint16_t rx_queue_id)
 	if (rxq == NULL || (rxq->state & SFC_RXQ_STARTED) == 0)
 		return 0;
 
-	return sa->dp_rx->qdesc_npending(rxq->dp);
+	return sap->dp_rx->qdesc_npending(rxq->dp);
 }
 
 static int
@@ -1136,7 +1139,7 @@ sfc_rx_descriptor_done(void *queue, uint16_t offset)
 	struct sfc_dp_rxq *dp_rxq = queue;
 	struct sfc_rxq *rxq = sfc_rxq_by_dp_rxq(dp_rxq);
 
-	return offset < rxq->evq->sa->dp_rx->qdesc_npending(dp_rxq);
+	return offset < rxq->evq->sa->priv.dp_rx->qdesc_npending(dp_rxq);
 }
 
 static int
@@ -1145,7 +1148,7 @@ sfc_rx_descriptor_status(void *queue, uint16_t offset)
 	struct sfc_dp_rxq *dp_rxq = queue;
 	struct sfc_rxq *rxq = sfc_rxq_by_dp_rxq(dp_rxq);
 
-	return rxq->evq->sa->dp_rx->qdesc_status(dp_rxq, offset);
+	return rxq->evq->sa->priv.dp_rx->qdesc_status(dp_rxq, offset);
 }
 
 static int
@@ -1154,7 +1157,7 @@ sfc_tx_descriptor_status(void *queue, uint16_t offset)
 	struct sfc_dp_txq *dp_txq = queue;
 	struct sfc_txq *txq = sfc_txq_by_dp_txq(dp_txq);
 
-	return txq->evq->sa->dp_tx->qdesc_status(dp_txq, offset);
+	return txq->evq->sa->priv.dp_tx->qdesc_status(dp_txq, offset);
 }
 
 static int
@@ -1645,16 +1648,16 @@ sfc_dev_filter_ctrl(struct rte_eth_dev *dev, enum rte_filter_type filter_type,
 static int
 sfc_pool_ops_supported(struct rte_eth_dev *dev, const char *pool)
 {
-	struct sfc_adapter *sa = dev->data->dev_private;
+	const struct sfc_adapter_priv *sap = sfc_adapter_priv_by_eth_dev(dev);
 
 	/*
 	 * If Rx datapath does not provide callback to check mempool,
 	 * all pools are supported.
 	 */
-	if (sa->dp_rx->pool_ops_supported == NULL)
+	if (sap->dp_rx->pool_ops_supported == NULL)
 		return 1;
 
-	return sa->dp_rx->pool_ops_supported(pool);
+	return sap->dp_rx->pool_ops_supported(pool);
 }
 
 static const struct eth_dev_ops sfc_eth_dev_ops = {
@@ -1831,8 +1834,8 @@ sfc_eth_dev_set_ops(struct rte_eth_dev *dev)
 
 	sfc_notice(sa, "use %s Tx datapath", sa->dp_tx_name);
 
-	sa->dp_rx = dp_rx;
-	sa->dp_tx = dp_tx;
+	sa->priv.dp_rx = dp_rx;
+	sa->priv.dp_tx = dp_tx;
 
 	dev->rx_pkt_burst = dp_rx->pkt_burst;
 	dev->tx_pkt_burst = dp_tx->pkt_burst;
@@ -1866,11 +1869,11 @@ sfc_eth_dev_clear_ops(struct rte_eth_dev *dev)
 
 	rte_free(sa->dp_tx_name);
 	sa->dp_tx_name = NULL;
-	sa->dp_tx = NULL;
+	sa->priv.dp_tx = NULL;
 
 	rte_free(sa->dp_rx_name);
 	sa->dp_rx_name = NULL;
-	sa->dp_rx = NULL;
+	sa->priv.dp_rx = NULL;
 }
 
 static const struct eth_dev_ops sfc_eth_dev_secondary_ops = {
@@ -1879,7 +1882,7 @@ static const struct eth_dev_ops sfc_eth_dev_secondary_ops = {
 };
 
 static int
-sfc_eth_dev_secondary_set_ops(struct rte_eth_dev *dev, uint32_t logtype_main)
+sfc_eth_dev_secondary_init(struct rte_eth_dev *dev, uint32_t logtype_main)
 {
 	/*
 	 * Device private data has really many process-local pointers.
@@ -1887,10 +1890,21 @@ sfc_eth_dev_secondary_set_ops(struct rte_eth_dev *dev, uint32_t logtype_main)
 	 * in shared memory only.
 	 */
 	struct sfc_adapter *sa = dev->data->dev_private;
+	struct sfc_adapter_priv *sap;
 	const struct sfc_dp_rx *dp_rx;
 	const struct sfc_dp_tx *dp_tx;
 	int rc;
 
+	/*
+	 * Allocate process private data from heap, since it should not
+	 * be located in shared memory allocated using rte_malloc() API.
+	 */
+	sap = calloc(1, sizeof(*sap));
+	if (sap == NULL) {
+		rc = ENOMEM;
+		goto fail_alloc_priv;
+	}
+
 	dp_rx = sfc_dp_find_rx_by_name(&sfc_dp_head, sa->dp_rx_name);
 	if (dp_rx == NULL) {
 		SFC_LOG(sa, RTE_LOG_ERR, logtype_main,
@@ -1921,6 +1935,10 @@ sfc_eth_dev_secondary_set_ops(struct rte_eth_dev *dev, uint32_t logtype_main)
 		goto fail_dp_tx_multi_process;
 	}
 
+	sap->dp_rx = dp_rx;
+	sap->dp_tx = dp_tx;
+
+	dev->process_private = sap;
 	dev->rx_pkt_burst = dp_rx->pkt_burst;
 	dev->tx_pkt_burst = dp_tx->pkt_burst;
 	dev->dev_ops = &sfc_eth_dev_secondary_ops;
@@ -1931,12 +1949,17 @@ sfc_eth_dev_secondary_set_ops(struct rte_eth_dev *dev, uint32_t logtype_main)
 fail_dp_tx:
 fail_dp_rx_multi_process:
 fail_dp_rx:
+	free(sap);
+
+fail_alloc_priv:
 	return rc;
 }
 
 static void
 sfc_eth_dev_secondary_clear_ops(struct rte_eth_dev *dev)
 {
+	free(dev->process_private);
+	dev->process_private = NULL;
 	dev->dev_ops = NULL;
 	dev->tx_pkt_burst = NULL;
 	dev->rx_pkt_burst = NULL;
@@ -1975,7 +1998,15 @@ sfc_eth_dev_init(struct rte_eth_dev *dev)
 					    RTE_LOG_NOTICE);
 
 	if (rte_eal_process_type() != RTE_PROC_PRIMARY)
-		return -sfc_eth_dev_secondary_set_ops(dev, logtype_main);
+		return -sfc_eth_dev_secondary_init(dev, logtype_main);
+
+	/*
+	 * sfc_adapter is a mixture of shared and process private data.
+	 * During transition period use it in both kinds. When the
+	 * driver becomes ready to separate it, sfc_adapter will become
+	 * primary process private only.
+	 */
+	dev->process_private = sa;
 
 	/* Required for logging */
 	sa->pci_addr = pci_dev->addr;
@@ -2048,6 +2079,7 @@ sfc_eth_dev_init(struct rte_eth_dev *dev)
 
 fail_kvargs_parse:
 	sfc_log_init(sa, "failed %d", rc);
+	dev->process_private = NULL;
 	SFC_ASSERT(rc > 0);
 	return -rc;
 }
diff --git a/drivers/net/sfc/sfc_ev.c b/drivers/net/sfc/sfc_ev.c
index f93d30e5c..717835cab 100644
--- a/drivers/net/sfc/sfc_ev.c
+++ b/drivers/net/sfc/sfc_ev.c
@@ -158,8 +158,8 @@ sfc_ev_dp_rx(void *arg, __rte_unused uint32_t label, uint32_t id,
 	dp_rxq = evq->dp_rxq;
 	SFC_ASSERT(dp_rxq != NULL);
 
-	SFC_ASSERT(evq->sa->dp_rx->qrx_ev != NULL);
-	return evq->sa->dp_rx->qrx_ev(dp_rxq, id);
+	SFC_ASSERT(evq->sa->priv.dp_rx->qrx_ev != NULL);
+	return evq->sa->priv.dp_rx->qrx_ev(dp_rxq, id);
 }
 
 static boolean_t
@@ -185,8 +185,8 @@ sfc_ev_dp_rx_ps(void *arg, __rte_unused uint32_t label, uint32_t id,
 	dp_rxq = evq->dp_rxq;
 	SFC_ASSERT(dp_rxq != NULL);
 
-	if (evq->sa->dp_rx->qrx_ps_ev != NULL)
-		return evq->sa->dp_rx->qrx_ps_ev(dp_rxq, id);
+	if (evq->sa->priv.dp_rx->qrx_ps_ev != NULL)
+		return evq->sa->priv.dp_rx->qrx_ps_ev(dp_rxq, id);
 	else
 		return B_FALSE;
 }
@@ -239,8 +239,8 @@ sfc_ev_dp_tx(void *arg, __rte_unused uint32_t label, uint32_t id)
 	dp_txq = evq->dp_txq;
 	SFC_ASSERT(dp_txq != NULL);
 
-	SFC_ASSERT(evq->sa->dp_tx->qtx_ev != NULL);
-	return evq->sa->dp_tx->qtx_ev(dp_txq, id);
+	SFC_ASSERT(evq->sa->priv.dp_tx->qtx_ev != NULL);
+	return evq->sa->priv.dp_tx->qtx_ev(dp_txq, id);
 }
 
 static boolean_t
@@ -609,12 +609,14 @@ sfc_ev_qstart(struct sfc_evq *evq, unsigned int hw_index)
 
 	SFC_ASSERT(evq->dp_rxq == NULL || evq->dp_txq == NULL);
 	if (evq->dp_rxq != 0) {
-		if (strcmp(sa->dp_rx->dp.name, SFC_KVARG_DATAPATH_EFX) == 0)
+		if (strcmp(sa->priv.dp_rx->dp.name,
+			   SFC_KVARG_DATAPATH_EFX) == 0)
 			evq->callbacks = &sfc_ev_callbacks_efx_rx;
 		else
 			evq->callbacks = &sfc_ev_callbacks_dp_rx;
 	} else if (evq->dp_txq != 0) {
-		if (strcmp(sa->dp_tx->dp.name, SFC_KVARG_DATAPATH_EFX) == 0)
+		if (strcmp(sa->priv.dp_tx->dp.name,
+			   SFC_KVARG_DATAPATH_EFX) == 0)
 			evq->callbacks = &sfc_ev_callbacks_efx_tx;
 		else
 			evq->callbacks = &sfc_ev_callbacks_dp_tx;
diff --git a/drivers/net/sfc/sfc_flow.c b/drivers/net/sfc/sfc_flow.c
index 371648b0e..41d388735 100644
--- a/drivers/net/sfc/sfc_flow.c
+++ b/drivers/net/sfc/sfc_flow.c
@@ -1527,7 +1527,7 @@ sfc_flow_parse_actions(struct sfc_adapter *sa,
 		       struct rte_flow_error *error)
 {
 	int rc;
-	const unsigned int dp_rx_features = sa->dp_rx->features;
+	const unsigned int dp_rx_features = sa->priv.dp_rx->features;
 	uint32_t actions_set = 0;
 	const uint32_t fate_actions_mask = (1UL << RTE_FLOW_ACTION_TYPE_QUEUE) |
 					   (1UL << RTE_FLOW_ACTION_TYPE_RSS) |
diff --git a/drivers/net/sfc/sfc_rx.c b/drivers/net/sfc/sfc_rx.c
index 44aee29e9..0ee3cfdcd 100644
--- a/drivers/net/sfc/sfc_rx.c
+++ b/drivers/net/sfc/sfc_rx.c
@@ -581,7 +581,7 @@ sfc_rx_qflush(struct sfc_adapter *sa, unsigned int sw_index)
 			sfc_notice(sa, "RxQ %u flushed", sw_index);
 	}
 
-	sa->dp_rx->qpurge(rxq->dp);
+	sa->priv.dp_rx->qpurge(rxq->dp);
 }
 
 static int
@@ -695,7 +695,7 @@ sfc_rx_qstart(struct sfc_adapter *sa, unsigned int sw_index)
 
 	efx_rx_qenable(rxq->common);
 
-	rc = sa->dp_rx->qstart(rxq->dp, evq->read_ptr);
+	rc = sa->priv.dp_rx->qstart(rxq->dp, evq->read_ptr);
 	if (rc != 0)
 		goto fail_dp_qstart;
 
@@ -714,7 +714,7 @@ sfc_rx_qstart(struct sfc_adapter *sa, unsigned int sw_index)
 	return 0;
 
 fail_mac_filter_default_rxq_set:
-	sa->dp_rx->qstop(rxq->dp, &rxq->evq->read_ptr);
+	sa->priv.dp_rx->qstop(rxq->dp, &rxq->evq->read_ptr);
 
 fail_dp_qstart:
 	sfc_rx_qflush(sa, sw_index);
@@ -749,7 +749,7 @@ sfc_rx_qstop(struct sfc_adapter *sa, unsigned int sw_index)
 	sa->eth_dev->data->rx_queue_state[sw_index] =
 		RTE_ETH_QUEUE_STATE_STOPPED;
 
-	sa->dp_rx->qstop(rxq->dp, &rxq->evq->read_ptr);
+	sa->priv.dp_rx->qstop(rxq->dp, &rxq->evq->read_ptr);
 
 	if (sw_index == 0)
 		efx_mac_filter_default_rxq_clear(sa->nic);
@@ -771,14 +771,14 @@ sfc_rx_get_dev_offload_caps(struct sfc_adapter *sa)
 
 	caps |= DEV_RX_OFFLOAD_JUMBO_FRAME;
 
-	if (sa->dp_rx->features & SFC_DP_RX_FEAT_CHECKSUM) {
+	if (sa->priv.dp_rx->features & SFC_DP_RX_FEAT_CHECKSUM) {
 		caps |= DEV_RX_OFFLOAD_IPV4_CKSUM;
 		caps |= DEV_RX_OFFLOAD_UDP_CKSUM;
 		caps |= DEV_RX_OFFLOAD_TCP_CKSUM;
 	}
 
 	if (encp->enc_tunnel_encapsulations_supported &&
-	    (sa->dp_rx->features & SFC_DP_RX_FEAT_TUNNELS))
+	    (sa->priv.dp_rx->features & SFC_DP_RX_FEAT_TUNNELS))
 		caps |= DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM;
 
 	return caps;
@@ -789,7 +789,7 @@ sfc_rx_get_queue_offload_caps(struct sfc_adapter *sa)
 {
 	uint64_t caps = 0;
 
-	if (sa->dp_rx->features & SFC_DP_RX_FEAT_SCATTER)
+	if (sa->priv.dp_rx->features & SFC_DP_RX_FEAT_SCATTER)
 		caps |= DEV_RX_OFFLOAD_SCATTER;
 
 	return caps;
@@ -943,8 +943,8 @@ sfc_rx_qinit(struct sfc_adapter *sa, unsigned int sw_index,
 	struct sfc_rxq *rxq;
 	struct sfc_dp_rx_qcreate_info info;
 
-	rc = sa->dp_rx->qsize_up_rings(nb_rx_desc, mb_pool, &rxq_entries,
-				       &evq_entries, &rxq_max_fill_level);
+	rc = sa->priv.dp_rx->qsize_up_rings(nb_rx_desc, mb_pool, &rxq_entries,
+					    &evq_entries, &rxq_max_fill_level);
 	if (rc != 0)
 		goto fail_size_up_rings;
 	SFC_ASSERT(rxq_entries >= EFX_RXQ_MINNDESCS);
@@ -983,7 +983,7 @@ sfc_rx_qinit(struct sfc_adapter *sa, unsigned int sw_index,
 	SFC_ASSERT(rxq_entries <= rxq_info->max_entries);
 	rxq_info->entries = rxq_entries;
 
-	if (sa->dp_rx->dp.hw_fw_caps & SFC_DP_HW_FW_CAP_RX_ES_SUPER_BUFFER)
+	if (sa->priv.dp_rx->dp.hw_fw_caps & SFC_DP_HW_FW_CAP_RX_ES_SUPER_BUFFER)
 		rxq_info->type = EFX_RXQ_TYPE_ES_SUPER_BUFFER;
 	else
 		rxq_info->type = EFX_RXQ_TYPE_DEFAULT;
@@ -993,7 +993,7 @@ sfc_rx_qinit(struct sfc_adapter *sa, unsigned int sw_index,
 		EFX_RXQ_FLAG_SCATTER : EFX_RXQ_FLAG_NONE;
 
 	if ((encp->enc_tunnel_encapsulations_supported != 0) &&
-	    (sa->dp_rx->features & SFC_DP_RX_FEAT_TUNNELS))
+	    (sa->priv.dp_rx->features & SFC_DP_RX_FEAT_TUNNELS))
 		rxq_info->type_flags |= EFX_RXQ_FLAG_INNER_CLASSES;
 
 	rc = sfc_ev_qinit(sa, SFC_EVQ_TYPE_RX, sw_index,
@@ -1040,9 +1040,9 @@ sfc_rx_qinit(struct sfc_adapter *sa, unsigned int sw_index,
 	info.mem_bar = sa->mem_bar.esb_base;
 	info.vi_window_shift = encp->enc_vi_window_shift;
 
-	rc = sa->dp_rx->qcreate(sa->eth_dev->data->port_id, sw_index,
-				&RTE_ETH_DEV_TO_PCI(sa->eth_dev)->addr,
-				socket_id, &info, &rxq->dp);
+	rc = sa->priv.dp_rx->qcreate(sa->eth_dev->data->port_id, sw_index,
+				     &RTE_ETH_DEV_TO_PCI(sa->eth_dev)->addr,
+				     socket_id, &info, &rxq->dp);
 	if (rc != 0)
 		goto fail_dp_rx_qcreate;
 
@@ -1087,7 +1087,7 @@ sfc_rx_qfini(struct sfc_adapter *sa, unsigned int sw_index)
 	rxq = rxq_info->rxq;
 	SFC_ASSERT(rxq->state == SFC_RXQ_INITIALIZED);
 
-	sa->dp_rx->qdestroy(rxq->dp);
+	sa->priv.dp_rx->qdestroy(rxq->dp);
 	rxq->dp = NULL;
 
 	rxq_info->rxq = NULL;
diff --git a/drivers/net/sfc/sfc_tx.c b/drivers/net/sfc/sfc_tx.c
index c3b089fd8..5d31fedbb 100644
--- a/drivers/net/sfc/sfc_tx.c
+++ b/drivers/net/sfc/sfc_tx.c
@@ -40,15 +40,15 @@ sfc_tx_get_dev_offload_caps(struct sfc_adapter *sa)
 	const efx_nic_cfg_t *encp = efx_nic_cfg_get(sa->nic);
 	uint64_t caps = 0;
 
-	if ((sa->dp_tx->features & SFC_DP_TX_FEAT_VLAN_INSERT) &&
+	if ((sa->priv.dp_tx->features & SFC_DP_TX_FEAT_VLAN_INSERT) &&
 	    encp->enc_hw_tx_insert_vlan_enabled)
 		caps |= DEV_TX_OFFLOAD_VLAN_INSERT;
 
-	if (sa->dp_tx->features & SFC_DP_TX_FEAT_MULTI_SEG)
+	if (sa->priv.dp_tx->features & SFC_DP_TX_FEAT_MULTI_SEG)
 		caps |= DEV_TX_OFFLOAD_MULTI_SEGS;
 
-	if ((~sa->dp_tx->features & SFC_DP_TX_FEAT_MULTI_POOL) &&
-	    (~sa->dp_tx->features & SFC_DP_TX_FEAT_REFCNT))
+	if ((~sa->priv.dp_tx->features & SFC_DP_TX_FEAT_MULTI_POOL) &&
+	    (~sa->priv.dp_tx->features & SFC_DP_TX_FEAT_REFCNT))
 		caps |= DEV_TX_OFFLOAD_MBUF_FAST_FREE;
 
 	return caps;
@@ -134,8 +134,8 @@ sfc_tx_qinit(struct sfc_adapter *sa, unsigned int sw_index,
 
 	sfc_log_init(sa, "TxQ = %u", sw_index);
 
-	rc = sa->dp_tx->qsize_up_rings(nb_tx_desc, &txq_entries, &evq_entries,
-				       &txq_max_fill_level);
+	rc = sa->priv.dp_tx->qsize_up_rings(nb_tx_desc, &txq_entries,
+					    &evq_entries, &txq_max_fill_level);
 	if (rc != 0)
 		goto fail_size_up_rings;
 	SFC_ASSERT(txq_entries >= EFX_TXQ_MINNDESCS);
@@ -193,9 +193,9 @@ sfc_tx_qinit(struct sfc_adapter *sa, unsigned int sw_index,
 	info.tso_tcp_header_offset_limit =
 		encp->enc_tx_tso_tcp_header_offset_limit;
 
-	rc = sa->dp_tx->qcreate(sa->eth_dev->data->port_id, sw_index,
-				&RTE_ETH_DEV_TO_PCI(sa->eth_dev)->addr,
-				socket_id, &info, &txq->dp);
+	rc = sa->priv.dp_tx->qcreate(sa->eth_dev->data->port_id, sw_index,
+				     &RTE_ETH_DEV_TO_PCI(sa->eth_dev)->addr,
+				     socket_id, &info, &txq->dp);
 	if (rc != 0)
 		goto fail_dp_tx_qinit;
 
@@ -243,7 +243,7 @@ sfc_tx_qfini(struct sfc_adapter *sa, unsigned int sw_index)
 	SFC_ASSERT(txq != NULL);
 	SFC_ASSERT(txq->state == SFC_TXQ_INITIALIZED);
 
-	sa->dp_tx->qdestroy(txq->dp);
+	sa->priv.dp_tx->qdestroy(txq->dp);
 	txq->dp = NULL;
 
 	txq_info->txq = NULL;
@@ -466,7 +466,7 @@ sfc_tx_qstart(struct sfc_adapter *sa, unsigned int sw_index)
 
 	txq->state |= SFC_TXQ_STARTED;
 
-	rc = sa->dp_tx->qstart(txq->dp, evq->read_ptr, desc_index);
+	rc = sa->priv.dp_tx->qstart(txq->dp, evq->read_ptr, desc_index);
 	if (rc != 0)
 		goto fail_dp_qstart;
 
@@ -511,7 +511,7 @@ sfc_tx_qstop(struct sfc_adapter *sa, unsigned int sw_index)
 
 	SFC_ASSERT(txq->state & SFC_TXQ_STARTED);
 
-	sa->dp_tx->qstop(txq->dp, &txq->evq->read_ptr);
+	sa->priv.dp_tx->qstop(txq->dp, &txq->evq->read_ptr);
 
 	/*
 	 * Retry TX queue flushing in case of flush failed or
@@ -548,7 +548,7 @@ sfc_tx_qstop(struct sfc_adapter *sa, unsigned int sw_index)
 			sfc_notice(sa, "TxQ %u flushed", sw_index);
 	}
 
-	sa->dp_tx->qreap(txq->dp);
+	sa->priv.dp_tx->qreap(txq->dp);
 
 	txq->state = SFC_TXQ_INITIALIZED;
 
-- 
2.17.1

^ permalink raw reply	[flat|nested] 34+ messages in thread

* [dpdk-dev] [PATCH 09/30] net/sfc: move main log type to process private data
  2019-02-07 12:17 [dpdk-dev] [PATCH 00/30] net/sfc: improve multi-process support Andrew Rybchenko
                   ` (7 preceding siblings ...)
  2019-02-07 12:17 ` [dpdk-dev] [PATCH 08/30] net/sfc: move datapath ops pointers to process private data Andrew Rybchenko
@ 2019-02-07 12:17 ` Andrew Rybchenko
  2019-02-07 12:17 ` [dpdk-dev] [PATCH 10/30] net/sfc: move RxQ state to multi-process shared location Andrew Rybchenko
                   ` (21 subsequent siblings)
  30 siblings, 0 replies; 34+ messages in thread
From: Andrew Rybchenko @ 2019-02-07 12:17 UTC (permalink / raw)
  To: dev

Dynamic log type value may differ in primary and secondary processes.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
---
 drivers/net/sfc/sfc.h        |  2 +-
 drivers/net/sfc/sfc_ethdev.c |  4 +++-
 drivers/net/sfc/sfc_log.h    | 10 +++++-----
 3 files changed, 9 insertions(+), 7 deletions(-)

diff --git a/drivers/net/sfc/sfc.h b/drivers/net/sfc/sfc.h
index 5c836b1c3..f04127bbc 100644
--- a/drivers/net/sfc/sfc.h
+++ b/drivers/net/sfc/sfc.h
@@ -175,6 +175,7 @@ struct sfc_rss {
 struct sfc_adapter_priv {
 	const struct sfc_dp_rx		*dp_rx;
 	const struct sfc_dp_tx		*dp_tx;
+	uint32_t			logtype_main;
 };
 
 static inline struct sfc_adapter_priv *
@@ -207,7 +208,6 @@ struct sfc_adapter {
 	uint16_t			port_id;
 	struct rte_eth_dev		*eth_dev;
 	struct rte_kvargs		*kvargs;
-	uint32_t			logtype_main;
 	int				socket_id;
 	efsys_bar_t			mem_bar;
 	efx_family_t			family;
diff --git a/drivers/net/sfc/sfc_ethdev.c b/drivers/net/sfc/sfc_ethdev.c
index 46cd36fa5..bb53c7d53 100644
--- a/drivers/net/sfc/sfc_ethdev.c
+++ b/drivers/net/sfc/sfc_ethdev.c
@@ -1905,6 +1905,8 @@ sfc_eth_dev_secondary_init(struct rte_eth_dev *dev, uint32_t logtype_main)
 		goto fail_alloc_priv;
 	}
 
+	sap->logtype_main = logtype_main;
+
 	dp_rx = sfc_dp_find_rx_by_name(&sfc_dp_head, sa->dp_rx_name);
 	if (dp_rx == NULL) {
 		SFC_LOG(sa, RTE_LOG_ERR, logtype_main,
@@ -2011,7 +2013,7 @@ sfc_eth_dev_init(struct rte_eth_dev *dev)
 	/* Required for logging */
 	sa->pci_addr = pci_dev->addr;
 	sa->port_id = dev->data->port_id;
-	sa->logtype_main = logtype_main;
+	sa->priv.logtype_main = logtype_main;
 
 	sa->eth_dev = dev;
 
diff --git a/drivers/net/sfc/sfc_log.h b/drivers/net/sfc/sfc_log.h
index b11fbfb0a..405cc2a26 100644
--- a/drivers/net/sfc/sfc_log.h
+++ b/drivers/net/sfc/sfc_log.h
@@ -52,7 +52,7 @@ extern uint32_t sfc_logtype_driver;
 	do {								\
 		const struct sfc_adapter *_sa = (sa);			\
 									\
-		SFC_LOG(_sa, RTE_LOG_ERR, _sa->logtype_main,		\
+		SFC_LOG(_sa, RTE_LOG_ERR, _sa->priv.logtype_main,	\
 			__VA_ARGS__);					\
 	} while (0)
 
@@ -60,7 +60,7 @@ extern uint32_t sfc_logtype_driver;
 	do {								\
 		const struct sfc_adapter *_sa = (sa);			\
 									\
-		SFC_LOG(_sa, RTE_LOG_WARNING, _sa->logtype_main,	\
+		SFC_LOG(_sa, RTE_LOG_WARNING, _sa->priv.logtype_main,	\
 			__VA_ARGS__);					\
 	} while (0)
 
@@ -68,7 +68,7 @@ extern uint32_t sfc_logtype_driver;
 	do {								\
 		const struct sfc_adapter *_sa = (sa);			\
 									\
-		SFC_LOG(_sa, RTE_LOG_NOTICE, _sa->logtype_main,		\
+		SFC_LOG(_sa, RTE_LOG_NOTICE, _sa->priv.logtype_main,	\
 			__VA_ARGS__);					\
 	} while (0)
 
@@ -76,7 +76,7 @@ extern uint32_t sfc_logtype_driver;
 	do {								\
 		const struct sfc_adapter *_sa = (sa);			\
 									\
-		SFC_LOG(_sa, RTE_LOG_INFO, _sa->logtype_main,		\
+		SFC_LOG(_sa, RTE_LOG_INFO, _sa->priv.logtype_main,	\
 			__VA_ARGS__);					\
 	} while (0)
 
@@ -84,7 +84,7 @@ extern uint32_t sfc_logtype_driver;
 	do {								\
 		const struct sfc_adapter *_sa = (sa);			\
 									\
-		SFC_LOG(_sa, RTE_LOG_INFO, _sa->logtype_main,		\
+		SFC_LOG(_sa, RTE_LOG_INFO, _sa->priv.logtype_main,	\
 			RTE_FMT("%s(): "				\
 				RTE_FMT_HEAD(__VA_ARGS__ ,),		\
 				__func__,				\
-- 
2.17.1

^ permalink raw reply	[flat|nested] 34+ messages in thread

* [dpdk-dev] [PATCH 10/30] net/sfc: move RxQ state to multi-process shared location
  2019-02-07 12:17 [dpdk-dev] [PATCH 00/30] net/sfc: improve multi-process support Andrew Rybchenko
                   ` (8 preceding siblings ...)
  2019-02-07 12:17 ` [dpdk-dev] [PATCH 09/30] net/sfc: move main log type " Andrew Rybchenko
@ 2019-02-07 12:17 ` Andrew Rybchenko
  2019-02-07 12:17 ` [dpdk-dev] [PATCH 11/30] net/sfc: move datapath RxQ handle to shared RxQ info Andrew Rybchenko
                   ` (20 subsequent siblings)
  30 siblings, 0 replies; 34+ messages in thread
From: Andrew Rybchenko @ 2019-02-07 12:17 UTC (permalink / raw)
  To: dev

Secondary process needs to know RxQ state.
RxQ control structure will become primary process private.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
---
 drivers/net/sfc/sfc_ethdev.c |  6 ++--
 drivers/net/sfc/sfc_ev.c     |  8 +++--
 drivers/net/sfc/sfc_rx.c     | 67 ++++++++++++++++++++----------------
 drivers/net/sfc/sfc_rx.h     |  8 +++--
 4 files changed, 53 insertions(+), 36 deletions(-)

diff --git a/drivers/net/sfc/sfc_ethdev.c b/drivers/net/sfc/sfc_ethdev.c
index bb53c7d53..7118d2293 100644
--- a/drivers/net/sfc/sfc_ethdev.c
+++ b/drivers/net/sfc/sfc_ethdev.c
@@ -1122,12 +1122,14 @@ sfc_rx_queue_count(struct rte_eth_dev *dev, uint16_t rx_queue_id)
 {
 	const struct sfc_adapter_priv *sap = sfc_adapter_priv_by_eth_dev(dev);
 	struct sfc_adapter *sa = dev->data->dev_private;
+	struct sfc_rxq_info *rxq_info;
 	struct sfc_rxq *rxq;
 
 	SFC_ASSERT(rx_queue_id < sa->rxq_count);
-	rxq = sa->rxq_info[rx_queue_id].rxq;
+	rxq_info = &sa->rxq_info[rx_queue_id];
+	rxq = rxq_info->rxq;
 
-	if (rxq == NULL || (rxq->state & SFC_RXQ_STARTED) == 0)
+	if (rxq == NULL || (rxq_info->state & SFC_RXQ_STARTED) == 0)
 		return 0;
 
 	return sap->dp_rx->qdesc_npending(rxq->dp);
diff --git a/drivers/net/sfc/sfc_ev.c b/drivers/net/sfc/sfc_ev.c
index 717835cab..5965e2350 100644
--- a/drivers/net/sfc/sfc_ev.c
+++ b/drivers/net/sfc/sfc_ev.c
@@ -293,7 +293,9 @@ sfc_ev_rxq_flush_done(void *arg, __rte_unused uint32_t rxq_hw_index)
 	SFC_ASSERT(rxq != NULL);
 	SFC_ASSERT(rxq->hw_index == rxq_hw_index);
 	SFC_ASSERT(rxq->evq == evq);
-	sfc_rx_qflush_done(rxq);
+	RTE_SET_USED(rxq);
+
+	sfc_rx_qflush_done(sfc_rxq_info_by_dp_rxq(dp_rxq));
 
 	return B_FALSE;
 }
@@ -322,7 +324,9 @@ sfc_ev_rxq_flush_failed(void *arg, __rte_unused uint32_t rxq_hw_index)
 	SFC_ASSERT(rxq != NULL);
 	SFC_ASSERT(rxq->hw_index == rxq_hw_index);
 	SFC_ASSERT(rxq->evq == evq);
-	sfc_rx_qflush_failed(rxq);
+	RTE_SET_USED(rxq);
+
+	sfc_rx_qflush_failed(sfc_rxq_info_by_dp_rxq(dp_rxq));
 
 	return B_FALSE;
 }
diff --git a/drivers/net/sfc/sfc_rx.c b/drivers/net/sfc/sfc_rx.c
index 0ee3cfdcd..130270dba 100644
--- a/drivers/net/sfc/sfc_rx.c
+++ b/drivers/net/sfc/sfc_rx.c
@@ -39,17 +39,17 @@
 #define SFC_RX_QFLUSH_POLL_ATTEMPTS	(2000)
 
 void
-sfc_rx_qflush_done(struct sfc_rxq *rxq)
+sfc_rx_qflush_done(struct sfc_rxq_info *rxq_info)
 {
-	rxq->state |= SFC_RXQ_FLUSHED;
-	rxq->state &= ~SFC_RXQ_FLUSHING;
+	rxq_info->state |= SFC_RXQ_FLUSHED;
+	rxq_info->state &= ~SFC_RXQ_FLUSHING;
 }
 
 void
-sfc_rx_qflush_failed(struct sfc_rxq *rxq)
+sfc_rx_qflush_failed(struct sfc_rxq_info *rxq_info)
 {
-	rxq->state |= SFC_RXQ_FLUSH_FAILED;
-	rxq->state &= ~SFC_RXQ_FLUSHING;
+	rxq_info->state |= SFC_RXQ_FLUSH_FAILED;
+	rxq_info->state &= ~SFC_RXQ_FLUSHING;
 }
 
 static void
@@ -360,13 +360,12 @@ sfc_efx_rx_qdesc_status(struct sfc_dp_rxq *dp_rxq, uint16_t offset)
 	return RTE_ETH_RX_DESC_UNAVAIL;
 }
 
-struct sfc_rxq *
-sfc_rxq_by_dp_rxq(const struct sfc_dp_rxq *dp_rxq)
+struct sfc_rxq_info *
+sfc_rxq_info_by_dp_rxq(const struct sfc_dp_rxq *dp_rxq)
 {
 	const struct sfc_dp_queue *dpq = &dp_rxq->dpq;
 	struct rte_eth_dev *eth_dev;
 	struct sfc_adapter *sa;
-	struct sfc_rxq *rxq;
 
 	SFC_ASSERT(rte_eth_dev_is_valid_port(dpq->port_id));
 	eth_dev = &rte_eth_devices[dpq->port_id];
@@ -374,10 +373,18 @@ sfc_rxq_by_dp_rxq(const struct sfc_dp_rxq *dp_rxq)
 	sa = eth_dev->data->dev_private;
 
 	SFC_ASSERT(dpq->queue_id < sa->rxq_count);
-	rxq = sa->rxq_info[dpq->queue_id].rxq;
+	return &sa->rxq_info[dpq->queue_id];
+}
 
-	SFC_ASSERT(rxq != NULL);
-	return rxq;
+struct sfc_rxq *
+sfc_rxq_by_dp_rxq(const struct sfc_dp_rxq *dp_rxq)
+{
+	struct sfc_rxq_info *rxq_info;
+
+	rxq_info = sfc_rxq_info_by_dp_rxq(dp_rxq);
+
+	SFC_ASSERT(rxq_info->rxq != NULL);
+	return rxq_info->rxq;
 }
 
 static sfc_dp_rx_qsize_up_rings_t sfc_efx_rx_qsize_up_rings;
@@ -533,30 +540,32 @@ struct sfc_dp_rx sfc_efx_rx = {
 static void
 sfc_rx_qflush(struct sfc_adapter *sa, unsigned int sw_index)
 {
+	struct sfc_rxq_info *rxq_info;
 	struct sfc_rxq *rxq;
 	unsigned int retry_count;
 	unsigned int wait_count;
 	int rc;
 
-	rxq = sa->rxq_info[sw_index].rxq;
-	SFC_ASSERT(rxq->state & SFC_RXQ_STARTED);
+	rxq_info = &sa->rxq_info[sw_index];
+	rxq = rxq_info->rxq;
+	SFC_ASSERT(rxq_info->state & SFC_RXQ_STARTED);
 
 	/*
 	 * Retry Rx queue flushing in the case of flush failed or
 	 * timeout. In the worst case it can delay for 6 seconds.
 	 */
 	for (retry_count = 0;
-	     ((rxq->state & SFC_RXQ_FLUSHED) == 0) &&
+	     ((rxq_info->state & SFC_RXQ_FLUSHED) == 0) &&
 	     (retry_count < SFC_RX_QFLUSH_ATTEMPTS);
 	     ++retry_count) {
 		rc = efx_rx_qflush(rxq->common);
 		if (rc != 0) {
-			rxq->state |= (rc == EALREADY) ?
+			rxq_info->state |= (rc == EALREADY) ?
 				SFC_RXQ_FLUSHED : SFC_RXQ_FLUSH_FAILED;
 			break;
 		}
-		rxq->state &= ~SFC_RXQ_FLUSH_FAILED;
-		rxq->state |= SFC_RXQ_FLUSHING;
+		rxq_info->state &= ~SFC_RXQ_FLUSH_FAILED;
+		rxq_info->state |= SFC_RXQ_FLUSHING;
 
 		/*
 		 * Wait for Rx queue flush done or failed event at least
@@ -568,16 +577,16 @@ sfc_rx_qflush(struct sfc_adapter *sa, unsigned int sw_index)
 		do {
 			rte_delay_ms(SFC_RX_QFLUSH_POLL_WAIT_MS);
 			sfc_ev_qpoll(rxq->evq);
-		} while ((rxq->state & SFC_RXQ_FLUSHING) &&
+		} while ((rxq_info->state & SFC_RXQ_FLUSHING) &&
 			 (wait_count++ < SFC_RX_QFLUSH_POLL_ATTEMPTS));
 
-		if (rxq->state & SFC_RXQ_FLUSHING)
+		if (rxq_info->state & SFC_RXQ_FLUSHING)
 			sfc_err(sa, "RxQ %u flush timed out", sw_index);
 
-		if (rxq->state & SFC_RXQ_FLUSH_FAILED)
+		if (rxq_info->state & SFC_RXQ_FLUSH_FAILED)
 			sfc_err(sa, "RxQ %u flush failed", sw_index);
 
-		if (rxq->state & SFC_RXQ_FLUSHED)
+		if (rxq_info->state & SFC_RXQ_FLUSHED)
 			sfc_notice(sa, "RxQ %u flushed", sw_index);
 	}
 
@@ -651,7 +660,7 @@ sfc_rx_qstart(struct sfc_adapter *sa, unsigned int sw_index)
 	rxq_info = &sa->rxq_info[sw_index];
 	rxq = rxq_info->rxq;
 	SFC_ASSERT(rxq != NULL);
-	SFC_ASSERT(rxq->state == SFC_RXQ_INITIALIZED);
+	SFC_ASSERT(rxq_info->state == SFC_RXQ_INITIALIZED);
 
 	evq = rxq->evq;
 
@@ -699,7 +708,7 @@ sfc_rx_qstart(struct sfc_adapter *sa, unsigned int sw_index)
 	if (rc != 0)
 		goto fail_dp_qstart;
 
-	rxq->state |= SFC_RXQ_STARTED;
+	rxq_info->state |= SFC_RXQ_STARTED;
 
 	if ((sw_index == 0) && !port->isolated) {
 		rc = sfc_rx_default_rxq_set_filter(sa, rxq);
@@ -741,9 +750,9 @@ sfc_rx_qstop(struct sfc_adapter *sa, unsigned int sw_index)
 	rxq_info = &sa->rxq_info[sw_index];
 	rxq = rxq_info->rxq;
 
-	if (rxq == NULL || rxq->state == SFC_RXQ_INITIALIZED)
+	if (rxq == NULL || rxq_info->state == SFC_RXQ_INITIALIZED)
 		return;
-	SFC_ASSERT(rxq->state & SFC_RXQ_STARTED);
+	SFC_ASSERT(rxq_info->state & SFC_RXQ_STARTED);
 
 	/* It seems to be used by DPDK for debug purposes only ('rte_ether') */
 	sa->eth_dev->data->rx_queue_state[sw_index] =
@@ -756,7 +765,7 @@ sfc_rx_qstop(struct sfc_adapter *sa, unsigned int sw_index)
 
 	sfc_rx_qflush(sa, sw_index);
 
-	rxq->state = SFC_RXQ_INITIALIZED;
+	rxq_info->state = SFC_RXQ_INITIALIZED;
 
 	efx_rx_qdestroy(rxq->common);
 
@@ -1048,7 +1057,7 @@ sfc_rx_qinit(struct sfc_adapter *sa, unsigned int sw_index,
 
 	evq->dp_rxq = rxq->dp;
 
-	rxq->state = SFC_RXQ_INITIALIZED;
+	rxq_info->state = SFC_RXQ_INITIALIZED;
 
 	rxq_info->deferred_start = (rx_conf->rx_deferred_start != 0);
 
@@ -1085,7 +1094,7 @@ sfc_rx_qfini(struct sfc_adapter *sa, unsigned int sw_index)
 	rxq_info = &sa->rxq_info[sw_index];
 
 	rxq = rxq_info->rxq;
-	SFC_ASSERT(rxq->state == SFC_RXQ_INITIALIZED);
+	SFC_ASSERT(rxq_info->state == SFC_RXQ_INITIALIZED);
 
 	sa->priv.dp_rx->qdestroy(rxq->dp);
 	rxq->dp = NULL;
diff --git a/drivers/net/sfc/sfc_rx.h b/drivers/net/sfc/sfc_rx.h
index 06e8eac8d..be64004d0 100644
--- a/drivers/net/sfc/sfc_rx.h
+++ b/drivers/net/sfc/sfc_rx.h
@@ -60,7 +60,6 @@ struct sfc_rxq {
 	unsigned int		hw_index;
 	uint16_t		buf_size;
 	struct sfc_dp_rxq	*dp;
-	unsigned int		state;
 };
 
 static inline unsigned int
@@ -119,6 +118,7 @@ sfc_efx_rxq_by_dp_rxq(struct sfc_dp_rxq *dp_rxq)
  * Allocated on the same socket as adapter data.
  */
 struct sfc_rxq_info {
+	unsigned int		state;
 	unsigned int		max_entries;
 	unsigned int		entries;
 	efx_rxq_type_t		type;
@@ -130,6 +130,8 @@ struct sfc_rxq_info {
 	struct rte_mempool	*refill_mb_pool;
 };
 
+struct sfc_rxq_info *sfc_rxq_info_by_dp_rxq(const struct sfc_dp_rxq *dp_rxq);
+
 int sfc_rx_configure(struct sfc_adapter *sa);
 void sfc_rx_close(struct sfc_adapter *sa);
 int sfc_rx_start(struct sfc_adapter *sa);
@@ -146,8 +148,8 @@ void sfc_rx_qstop(struct sfc_adapter *sa, unsigned int sw_index);
 uint64_t sfc_rx_get_dev_offload_caps(struct sfc_adapter *sa);
 uint64_t sfc_rx_get_queue_offload_caps(struct sfc_adapter *sa);
 
-void sfc_rx_qflush_done(struct sfc_rxq *rxq);
-void sfc_rx_qflush_failed(struct sfc_rxq *rxq);
+void sfc_rx_qflush_done(struct sfc_rxq_info *rxq_info);
+void sfc_rx_qflush_failed(struct sfc_rxq_info *rxq_info);
 
 int sfc_rx_hash_init(struct sfc_adapter *sa);
 void sfc_rx_hash_fini(struct sfc_adapter *sa);
-- 
2.17.1

^ permalink raw reply	[flat|nested] 34+ messages in thread

* [dpdk-dev] [PATCH 11/30] net/sfc: move datapath RxQ handle to shared RxQ info
  2019-02-07 12:17 [dpdk-dev] [PATCH 00/30] net/sfc: improve multi-process support Andrew Rybchenko
                   ` (9 preceding siblings ...)
  2019-02-07 12:17 ` [dpdk-dev] [PATCH 10/30] net/sfc: move RxQ state to multi-process shared location Andrew Rybchenko
@ 2019-02-07 12:17 ` Andrew Rybchenko
  2019-02-07 12:17 ` [dpdk-dev] [PATCH 12/30] net/sfc: support Rx descriptor status in secondary process Andrew Rybchenko
                   ` (19 subsequent siblings)
  30 siblings, 0 replies; 34+ messages in thread
From: Andrew Rybchenko @ 2019-02-07 12:17 UTC (permalink / raw)
  To: dev

If datapath supports multi-process, it should be possible to get
its RxQ structure by the queue index.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
---
 drivers/net/sfc/sfc_ethdev.c |  8 +++-----
 drivers/net/sfc/sfc_rx.c     | 16 ++++++++--------
 drivers/net/sfc/sfc_rx.h     |  2 +-
 3 files changed, 12 insertions(+), 14 deletions(-)

diff --git a/drivers/net/sfc/sfc_ethdev.c b/drivers/net/sfc/sfc_ethdev.c
index 7118d2293..71be88f3e 100644
--- a/drivers/net/sfc/sfc_ethdev.c
+++ b/drivers/net/sfc/sfc_ethdev.c
@@ -415,7 +415,7 @@ sfc_rx_queue_setup(struct rte_eth_dev *dev, uint16_t rx_queue_id,
 	if (rc != 0)
 		goto fail_rx_qinit;
 
-	dev->data->rx_queues[rx_queue_id] = sa->rxq_info[rx_queue_id].rxq->dp;
+	dev->data->rx_queues[rx_queue_id] = sa->rxq_info[rx_queue_id].dp;
 
 	sfc_adapter_unlock(sa);
 
@@ -1123,16 +1123,14 @@ sfc_rx_queue_count(struct rte_eth_dev *dev, uint16_t rx_queue_id)
 	const struct sfc_adapter_priv *sap = sfc_adapter_priv_by_eth_dev(dev);
 	struct sfc_adapter *sa = dev->data->dev_private;
 	struct sfc_rxq_info *rxq_info;
-	struct sfc_rxq *rxq;
 
 	SFC_ASSERT(rx_queue_id < sa->rxq_count);
 	rxq_info = &sa->rxq_info[rx_queue_id];
-	rxq = rxq_info->rxq;
 
-	if (rxq == NULL || (rxq_info->state & SFC_RXQ_STARTED) == 0)
+	if ((rxq_info->state & SFC_RXQ_STARTED) == 0)
 		return 0;
 
-	return sap->dp_rx->qdesc_npending(rxq->dp);
+	return sap->dp_rx->qdesc_npending(rxq_info->dp);
 }
 
 static int
diff --git a/drivers/net/sfc/sfc_rx.c b/drivers/net/sfc/sfc_rx.c
index 130270dba..886a7a2fd 100644
--- a/drivers/net/sfc/sfc_rx.c
+++ b/drivers/net/sfc/sfc_rx.c
@@ -590,7 +590,7 @@ sfc_rx_qflush(struct sfc_adapter *sa, unsigned int sw_index)
 			sfc_notice(sa, "RxQ %u flushed", sw_index);
 	}
 
-	sa->priv.dp_rx->qpurge(rxq->dp);
+	sa->priv.dp_rx->qpurge(rxq_info->dp);
 }
 
 static int
@@ -704,7 +704,7 @@ sfc_rx_qstart(struct sfc_adapter *sa, unsigned int sw_index)
 
 	efx_rx_qenable(rxq->common);
 
-	rc = sa->priv.dp_rx->qstart(rxq->dp, evq->read_ptr);
+	rc = sa->priv.dp_rx->qstart(rxq_info->dp, evq->read_ptr);
 	if (rc != 0)
 		goto fail_dp_qstart;
 
@@ -723,7 +723,7 @@ sfc_rx_qstart(struct sfc_adapter *sa, unsigned int sw_index)
 	return 0;
 
 fail_mac_filter_default_rxq_set:
-	sa->priv.dp_rx->qstop(rxq->dp, &rxq->evq->read_ptr);
+	sa->priv.dp_rx->qstop(rxq_info->dp, &rxq->evq->read_ptr);
 
 fail_dp_qstart:
 	sfc_rx_qflush(sa, sw_index);
@@ -758,7 +758,7 @@ sfc_rx_qstop(struct sfc_adapter *sa, unsigned int sw_index)
 	sa->eth_dev->data->rx_queue_state[sw_index] =
 		RTE_ETH_QUEUE_STATE_STOPPED;
 
-	sa->priv.dp_rx->qstop(rxq->dp, &rxq->evq->read_ptr);
+	sa->priv.dp_rx->qstop(rxq_info->dp, &rxq->evq->read_ptr);
 
 	if (sw_index == 0)
 		efx_mac_filter_default_rxq_clear(sa->nic);
@@ -1051,11 +1051,11 @@ sfc_rx_qinit(struct sfc_adapter *sa, unsigned int sw_index,
 
 	rc = sa->priv.dp_rx->qcreate(sa->eth_dev->data->port_id, sw_index,
 				     &RTE_ETH_DEV_TO_PCI(sa->eth_dev)->addr,
-				     socket_id, &info, &rxq->dp);
+				     socket_id, &info, &rxq_info->dp);
 	if (rc != 0)
 		goto fail_dp_rx_qcreate;
 
-	evq->dp_rxq = rxq->dp;
+	evq->dp_rxq = rxq_info->dp;
 
 	rxq_info->state = SFC_RXQ_INITIALIZED;
 
@@ -1096,8 +1096,8 @@ sfc_rx_qfini(struct sfc_adapter *sa, unsigned int sw_index)
 	rxq = rxq_info->rxq;
 	SFC_ASSERT(rxq_info->state == SFC_RXQ_INITIALIZED);
 
-	sa->priv.dp_rx->qdestroy(rxq->dp);
-	rxq->dp = NULL;
+	sa->priv.dp_rx->qdestroy(rxq_info->dp);
+	rxq_info->dp = NULL;
 
 	rxq_info->rxq = NULL;
 	rxq_info->entries = 0;
diff --git a/drivers/net/sfc/sfc_rx.h b/drivers/net/sfc/sfc_rx.h
index be64004d0..9c946d7cb 100644
--- a/drivers/net/sfc/sfc_rx.h
+++ b/drivers/net/sfc/sfc_rx.h
@@ -59,7 +59,6 @@ struct sfc_rxq {
 	efsys_mem_t		mem;
 	unsigned int		hw_index;
 	uint16_t		buf_size;
-	struct sfc_dp_rxq	*dp;
 };
 
 static inline unsigned int
@@ -124,6 +123,7 @@ struct sfc_rxq_info {
 	efx_rxq_type_t		type;
 	unsigned int		type_flags;
 	struct sfc_rxq		*rxq;
+	struct sfc_dp_rxq	*dp;
 	boolean_t		deferred_start;
 	boolean_t		deferred_started;
 	unsigned int		refill_threshold;
-- 
2.17.1

^ permalink raw reply	[flat|nested] 34+ messages in thread

* [dpdk-dev] [PATCH 12/30] net/sfc: support Rx descriptor status in secondary process
  2019-02-07 12:17 [dpdk-dev] [PATCH 00/30] net/sfc: improve multi-process support Andrew Rybchenko
                   ` (10 preceding siblings ...)
  2019-02-07 12:17 ` [dpdk-dev] [PATCH 11/30] net/sfc: move datapath RxQ handle to shared RxQ info Andrew Rybchenko
@ 2019-02-07 12:17 ` Andrew Rybchenko
  2019-02-07 12:17 ` [dpdk-dev] [PATCH 13/30] net/sfc: move TxQ state to multi-process shared location Andrew Rybchenko
                   ` (18 subsequent siblings)
  30 siblings, 0 replies; 34+ messages in thread
From: Andrew Rybchenko @ 2019-02-07 12:17 UTC (permalink / raw)
  To: dev

If Rx datapath supports multi-process, secondary process should be
able to use Rx descriptor status and related API.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
---
 doc/guides/rel_notes/release_19_05.rst |  7 +++++++
 drivers/net/sfc/sfc_dp_rx.h            |  3 +++
 drivers/net/sfc/sfc_ethdev.c           | 27 ++++++++++++++++++++++----
 drivers/net/sfc/sfc_rx.c               | 16 +++++++++++++++
 4 files changed, 49 insertions(+), 4 deletions(-)

diff --git a/doc/guides/rel_notes/release_19_05.rst b/doc/guides/rel_notes/release_19_05.rst
index e3a7ed22f..93f28926a 100644
--- a/doc/guides/rel_notes/release_19_05.rst
+++ b/doc/guides/rel_notes/release_19_05.rst
@@ -54,6 +54,13 @@ New Features
      Also, make sure to start the actual text at the margin.
      =========================================================
 
+* **Updated Solarflare network PMD.**
+
+  Updated the sfc_efx driver including the following changes:
+
+  * Added support for Rx descriptor status and related API in a secondary
+    process.
+
 
 Removed Items
 -------------
diff --git a/drivers/net/sfc/sfc_dp_rx.h b/drivers/net/sfc/sfc_dp_rx.h
index ce96e83f6..7e911648e 100644
--- a/drivers/net/sfc/sfc_dp_rx.h
+++ b/drivers/net/sfc/sfc_dp_rx.h
@@ -228,6 +228,9 @@ sfc_dp_find_rx_by_caps(struct sfc_dp_list *head, unsigned int avail_caps)
 	return (p == NULL) ? NULL : container_of(p, struct sfc_dp_rx, dp);
 }
 
+/** Get Rx datapath ops by the datapath RxQ handle */
+const struct sfc_dp_rx *sfc_dp_rx_by_dp_rxq(const struct sfc_dp_rxq *dp_rxq);
+
 extern struct sfc_dp_rx sfc_efx_rx;
 extern struct sfc_dp_rx sfc_ef10_rx;
 extern struct sfc_dp_rx sfc_ef10_essb_rx;
diff --git a/drivers/net/sfc/sfc_ethdev.c b/drivers/net/sfc/sfc_ethdev.c
index 71be88f3e..5bc73d512 100644
--- a/drivers/net/sfc/sfc_ethdev.c
+++ b/drivers/net/sfc/sfc_ethdev.c
@@ -1117,6 +1117,10 @@ sfc_tx_queue_info_get(struct rte_eth_dev *dev, uint16_t tx_queue_id,
 	sfc_adapter_unlock(sa);
 }
 
+/*
+ * The function is used by the secondary process as well. It must not
+ * use any process-local pointers from the adapter data.
+ */
 static uint32_t
 sfc_rx_queue_count(struct rte_eth_dev *dev, uint16_t rx_queue_id)
 {
@@ -1133,22 +1137,34 @@ sfc_rx_queue_count(struct rte_eth_dev *dev, uint16_t rx_queue_id)
 	return sap->dp_rx->qdesc_npending(rxq_info->dp);
 }
 
+/*
+ * The function is used by the secondary process as well. It must not
+ * use any process-local pointers from the adapter data.
+ */
 static int
 sfc_rx_descriptor_done(void *queue, uint16_t offset)
 {
 	struct sfc_dp_rxq *dp_rxq = queue;
-	struct sfc_rxq *rxq = sfc_rxq_by_dp_rxq(dp_rxq);
+	const struct sfc_dp_rx *dp_rx;
+
+	dp_rx = sfc_dp_rx_by_dp_rxq(dp_rxq);
 
-	return offset < rxq->evq->sa->priv.dp_rx->qdesc_npending(dp_rxq);
+	return offset < dp_rx->qdesc_npending(dp_rxq);
 }
 
+/*
+ * The function is used by the secondary process as well. It must not
+ * use any process-local pointers from the adapter data.
+ */
 static int
 sfc_rx_descriptor_status(void *queue, uint16_t offset)
 {
 	struct sfc_dp_rxq *dp_rxq = queue;
-	struct sfc_rxq *rxq = sfc_rxq_by_dp_rxq(dp_rxq);
+	const struct sfc_dp_rx *dp_rx;
 
-	return rxq->evq->sa->priv.dp_rx->qdesc_status(dp_rxq, offset);
+	dp_rx = sfc_dp_rx_by_dp_rxq(dp_rxq);
+
+	return dp_rx->qdesc_status(dp_rxq, offset);
 }
 
 static int
@@ -1877,6 +1893,9 @@ sfc_eth_dev_clear_ops(struct rte_eth_dev *dev)
 }
 
 static const struct eth_dev_ops sfc_eth_dev_secondary_ops = {
+	.rx_queue_count			= sfc_rx_queue_count,
+	.rx_descriptor_done		= sfc_rx_descriptor_done,
+	.rx_descriptor_status		= sfc_rx_descriptor_status,
 	.rxq_info_get			= sfc_rx_queue_info_get,
 	.txq_info_get			= sfc_tx_queue_info_get,
 };
diff --git a/drivers/net/sfc/sfc_rx.c b/drivers/net/sfc/sfc_rx.c
index 886a7a2fd..3c1e77974 100644
--- a/drivers/net/sfc/sfc_rx.c
+++ b/drivers/net/sfc/sfc_rx.c
@@ -360,6 +360,22 @@ sfc_efx_rx_qdesc_status(struct sfc_dp_rxq *dp_rxq, uint16_t offset)
 	return RTE_ETH_RX_DESC_UNAVAIL;
 }
 
+/** Get Rx datapath ops by the datapath RxQ handle */
+const struct sfc_dp_rx *
+sfc_dp_rx_by_dp_rxq(const struct sfc_dp_rxq *dp_rxq)
+{
+	const struct sfc_dp_queue *dpq = &dp_rxq->dpq;
+	struct rte_eth_dev *eth_dev;
+	struct sfc_adapter_priv *sap;
+
+	SFC_ASSERT(rte_eth_dev_is_valid_port(dpq->port_id));
+	eth_dev = &rte_eth_devices[dpq->port_id];
+
+	sap = sfc_adapter_priv_by_eth_dev(eth_dev);
+
+	return sap->dp_rx;
+}
+
 struct sfc_rxq_info *
 sfc_rxq_info_by_dp_rxq(const struct sfc_dp_rxq *dp_rxq)
 {
-- 
2.17.1

^ permalink raw reply	[flat|nested] 34+ messages in thread

* [dpdk-dev] [PATCH 13/30] net/sfc: move TxQ state to multi-process shared location
  2019-02-07 12:17 [dpdk-dev] [PATCH 00/30] net/sfc: improve multi-process support Andrew Rybchenko
                   ` (11 preceding siblings ...)
  2019-02-07 12:17 ` [dpdk-dev] [PATCH 12/30] net/sfc: support Rx descriptor status in secondary process Andrew Rybchenko
@ 2019-02-07 12:17 ` Andrew Rybchenko
  2019-02-07 12:17 ` [dpdk-dev] [PATCH 14/30] net/sfc: move datapath TxQ handle to shared TxQ info Andrew Rybchenko
                   ` (17 subsequent siblings)
  30 siblings, 0 replies; 34+ messages in thread
From: Andrew Rybchenko @ 2019-02-07 12:17 UTC (permalink / raw)
  To: dev

Secondary process needs to know TxQ state.
TxQ control structure will become primary process private.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
---
 drivers/net/sfc/sfc_ev.c |  4 +++-
 drivers/net/sfc/sfc_tx.c | 51 +++++++++++++++++++++++-----------------
 drivers/net/sfc/sfc_tx.h |  6 +++--
 3 files changed, 36 insertions(+), 25 deletions(-)

diff --git a/drivers/net/sfc/sfc_ev.c b/drivers/net/sfc/sfc_ev.c
index 5965e2350..0ca502ea2 100644
--- a/drivers/net/sfc/sfc_ev.c
+++ b/drivers/net/sfc/sfc_ev.c
@@ -355,7 +355,9 @@ sfc_ev_txq_flush_done(void *arg, __rte_unused uint32_t txq_hw_index)
 	SFC_ASSERT(txq != NULL);
 	SFC_ASSERT(txq->hw_index == txq_hw_index);
 	SFC_ASSERT(txq->evq == evq);
-	sfc_tx_qflush_done(txq);
+	RTE_SET_USED(txq);
+
+	sfc_tx_qflush_done(sfc_txq_info_by_dp_txq(dp_txq));
 
 	return B_FALSE;
 }
diff --git a/drivers/net/sfc/sfc_tx.c b/drivers/net/sfc/sfc_tx.c
index 5d31fedbb..f4fbffe0a 100644
--- a/drivers/net/sfc/sfc_tx.c
+++ b/drivers/net/sfc/sfc_tx.c
@@ -110,10 +110,10 @@ sfc_tx_qcheck_conf(struct sfc_adapter *sa, unsigned int txq_max_fill_level,
 }
 
 void
-sfc_tx_qflush_done(struct sfc_txq *txq)
+sfc_tx_qflush_done(struct sfc_txq_info *txq_info)
 {
-	txq->state |= SFC_TXQ_FLUSHED;
-	txq->state &= ~SFC_TXQ_FLUSHING;
+	txq_info->state |= SFC_TXQ_FLUSHED;
+	txq_info->state &= ~SFC_TXQ_FLUSHING;
 }
 
 int
@@ -201,7 +201,7 @@ sfc_tx_qinit(struct sfc_adapter *sa, unsigned int sw_index,
 
 	evq->dp_txq = txq->dp;
 
-	txq->state = SFC_TXQ_INITIALIZED;
+	txq_info->state = SFC_TXQ_INITIALIZED;
 
 	txq_info->deferred_start = (tx_conf->tx_deferred_start != 0);
 
@@ -241,7 +241,7 @@ sfc_tx_qfini(struct sfc_adapter *sa, unsigned int sw_index)
 
 	txq = txq_info->txq;
 	SFC_ASSERT(txq != NULL);
-	SFC_ASSERT(txq->state == SFC_TXQ_INITIALIZED);
+	SFC_ASSERT(txq_info->state == SFC_TXQ_INITIALIZED);
 
 	sa->priv.dp_tx->qdestroy(txq->dp);
 	txq->dp = NULL;
@@ -426,7 +426,7 @@ sfc_tx_qstart(struct sfc_adapter *sa, unsigned int sw_index)
 	txq = txq_info->txq;
 
 	SFC_ASSERT(txq != NULL);
-	SFC_ASSERT(txq->state == SFC_TXQ_INITIALIZED);
+	SFC_ASSERT(txq_info->state == SFC_TXQ_INITIALIZED);
 
 	evq = txq->evq;
 
@@ -464,7 +464,7 @@ sfc_tx_qstart(struct sfc_adapter *sa, unsigned int sw_index)
 
 	efx_tx_qenable(txq->common);
 
-	txq->state |= SFC_TXQ_STARTED;
+	txq_info->state |= SFC_TXQ_STARTED;
 
 	rc = sa->priv.dp_tx->qstart(txq->dp, evq->read_ptr, desc_index);
 	if (rc != 0)
@@ -479,7 +479,7 @@ sfc_tx_qstart(struct sfc_adapter *sa, unsigned int sw_index)
 	return 0;
 
 fail_dp_qstart:
-	txq->state = SFC_TXQ_INITIALIZED;
+	txq_info->state = SFC_TXQ_INITIALIZED;
 	efx_tx_qdestroy(txq->common);
 
 fail_tx_qcreate:
@@ -506,10 +506,10 @@ sfc_tx_qstop(struct sfc_adapter *sa, unsigned int sw_index)
 
 	txq = txq_info->txq;
 
-	if (txq == NULL || txq->state == SFC_TXQ_INITIALIZED)
+	if (txq == NULL || txq_info->state == SFC_TXQ_INITIALIZED)
 		return;
 
-	SFC_ASSERT(txq->state & SFC_TXQ_STARTED);
+	SFC_ASSERT(txq_info->state & SFC_TXQ_STARTED);
 
 	sa->priv.dp_tx->qstop(txq->dp, &txq->evq->read_ptr);
 
@@ -518,12 +518,12 @@ sfc_tx_qstop(struct sfc_adapter *sa, unsigned int sw_index)
 	 * timeout; in the worst case it can delay for 6 seconds
 	 */
 	for (retry_count = 0;
-	     ((txq->state & SFC_TXQ_FLUSHED) == 0) &&
+	     ((txq_info->state & SFC_TXQ_FLUSHED) == 0) &&
 	     (retry_count < SFC_TX_QFLUSH_ATTEMPTS);
 	     ++retry_count) {
 		rc = efx_tx_qflush(txq->common);
 		if (rc != 0) {
-			txq->state |= (rc == EALREADY) ?
+			txq_info->state |= (rc == EALREADY) ?
 				SFC_TXQ_FLUSHED : SFC_TXQ_FLUSH_FAILED;
 			break;
 		}
@@ -538,19 +538,19 @@ sfc_tx_qstop(struct sfc_adapter *sa, unsigned int sw_index)
 		do {
 			rte_delay_ms(SFC_TX_QFLUSH_POLL_WAIT_MS);
 			sfc_ev_qpoll(txq->evq);
-		} while ((txq->state & SFC_TXQ_FLUSHING) &&
+		} while ((txq_info->state & SFC_TXQ_FLUSHING) &&
 			 wait_count++ < SFC_TX_QFLUSH_POLL_ATTEMPTS);
 
-		if (txq->state & SFC_TXQ_FLUSHING)
+		if (txq_info->state & SFC_TXQ_FLUSHING)
 			sfc_err(sa, "TxQ %u flush timed out", sw_index);
 
-		if (txq->state & SFC_TXQ_FLUSHED)
+		if (txq_info->state & SFC_TXQ_FLUSHED)
 			sfc_notice(sa, "TxQ %u flushed", sw_index);
 	}
 
 	sa->priv.dp_tx->qreap(txq->dp);
 
-	txq->state = SFC_TXQ_INITIALIZED;
+	txq_info->state = SFC_TXQ_INITIALIZED;
 
 	efx_tx_qdestroy(txq->common);
 
@@ -854,13 +854,12 @@ sfc_efx_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts, uint16_t nb_pkts)
 	return pkts_sent;
 }
 
-struct sfc_txq *
-sfc_txq_by_dp_txq(const struct sfc_dp_txq *dp_txq)
+struct sfc_txq_info *
+sfc_txq_info_by_dp_txq(const struct sfc_dp_txq *dp_txq)
 {
 	const struct sfc_dp_queue *dpq = &dp_txq->dpq;
 	struct rte_eth_dev *eth_dev;
 	struct sfc_adapter *sa;
-	struct sfc_txq *txq;
 
 	SFC_ASSERT(rte_eth_dev_is_valid_port(dpq->port_id));
 	eth_dev = &rte_eth_devices[dpq->port_id];
@@ -868,10 +867,18 @@ sfc_txq_by_dp_txq(const struct sfc_dp_txq *dp_txq)
 	sa = eth_dev->data->dev_private;
 
 	SFC_ASSERT(dpq->queue_id < sa->txq_count);
-	txq = sa->txq_info[dpq->queue_id].txq;
+	return &sa->txq_info[dpq->queue_id];
+}
 
-	SFC_ASSERT(txq != NULL);
-	return txq;
+struct sfc_txq *
+sfc_txq_by_dp_txq(const struct sfc_dp_txq *dp_txq)
+{
+	struct sfc_txq_info *txq_info;
+
+	txq_info = sfc_txq_info_by_dp_txq(dp_txq);
+
+	SFC_ASSERT(txq_info->txq != NULL);
+	return txq_info->txq;
 }
 
 static sfc_dp_tx_qsize_up_rings_t sfc_efx_tx_qsize_up_rings;
diff --git a/drivers/net/sfc/sfc_tx.h b/drivers/net/sfc/sfc_tx.h
index efb486d32..c3edd3a58 100644
--- a/drivers/net/sfc/sfc_tx.h
+++ b/drivers/net/sfc/sfc_tx.h
@@ -51,7 +51,6 @@ enum sfc_txq_state_bit {
  * Allocated on the socket specified on the queue setup.
  */
 struct sfc_txq {
-	unsigned int			state;
 	unsigned int			hw_index;
 	struct sfc_evq			*evq;
 	efsys_mem_t			mem;
@@ -107,6 +106,7 @@ sfc_efx_txq_by_dp_txq(struct sfc_dp_txq *dp_txq)
 }
 
 struct sfc_txq_info {
+	unsigned int		state;
 	unsigned int		entries;
 	struct sfc_txq		*txq;
 	boolean_t		deferred_start;
@@ -115,6 +115,8 @@ struct sfc_txq_info {
 	uint64_t		offloads;
 };
 
+struct sfc_txq_info *sfc_txq_info_by_dp_txq(const struct sfc_dp_txq *dp_txq);
+
 int sfc_tx_configure(struct sfc_adapter *sa);
 void sfc_tx_close(struct sfc_adapter *sa);
 
@@ -123,7 +125,7 @@ int sfc_tx_qinit(struct sfc_adapter *sa, unsigned int sw_index,
 		 const struct rte_eth_txconf *tx_conf);
 void sfc_tx_qfini(struct sfc_adapter *sa, unsigned int sw_index);
 
-void sfc_tx_qflush_done(struct sfc_txq *txq);
+void sfc_tx_qflush_done(struct sfc_txq_info *txq_info);
 int sfc_tx_qstart(struct sfc_adapter *sa, unsigned int sw_index);
 void sfc_tx_qstop(struct sfc_adapter *sa, unsigned int sw_index);
 int sfc_tx_start(struct sfc_adapter *sa);
-- 
2.17.1

^ permalink raw reply	[flat|nested] 34+ messages in thread

* [dpdk-dev] [PATCH 14/30] net/sfc: move datapath TxQ handle to shared TxQ info
  2019-02-07 12:17 [dpdk-dev] [PATCH 00/30] net/sfc: improve multi-process support Andrew Rybchenko
                   ` (12 preceding siblings ...)
  2019-02-07 12:17 ` [dpdk-dev] [PATCH 13/30] net/sfc: move TxQ state to multi-process shared location Andrew Rybchenko
@ 2019-02-07 12:17 ` Andrew Rybchenko
  2019-02-07 12:17 ` [dpdk-dev] [PATCH 15/30] net/sfc: support Tx descriptor status in secondary process Andrew Rybchenko
                   ` (16 subsequent siblings)
  30 siblings, 0 replies; 34+ messages in thread
From: Andrew Rybchenko @ 2019-02-07 12:17 UTC (permalink / raw)
  To: dev

If datapath supports multi-process, it should be possible to get
its TxQ structure by the queue index.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
---
 drivers/net/sfc/sfc_ethdev.c |  2 +-
 drivers/net/sfc/sfc_tx.c     | 14 +++++++-------
 drivers/net/sfc/sfc_tx.h     |  2 +-
 3 files changed, 9 insertions(+), 9 deletions(-)

diff --git a/drivers/net/sfc/sfc_ethdev.c b/drivers/net/sfc/sfc_ethdev.c
index 5bc73d512..80a1d7a3d 100644
--- a/drivers/net/sfc/sfc_ethdev.c
+++ b/drivers/net/sfc/sfc_ethdev.c
@@ -468,7 +468,7 @@ sfc_tx_queue_setup(struct rte_eth_dev *dev, uint16_t tx_queue_id,
 	if (rc != 0)
 		goto fail_tx_qinit;
 
-	dev->data->tx_queues[tx_queue_id] = sa->txq_info[tx_queue_id].txq->dp;
+	dev->data->tx_queues[tx_queue_id] = sa->txq_info[tx_queue_id].dp;
 
 	sfc_adapter_unlock(sa);
 	return 0;
diff --git a/drivers/net/sfc/sfc_tx.c b/drivers/net/sfc/sfc_tx.c
index f4fbffe0a..1ee4e78a1 100644
--- a/drivers/net/sfc/sfc_tx.c
+++ b/drivers/net/sfc/sfc_tx.c
@@ -195,11 +195,11 @@ sfc_tx_qinit(struct sfc_adapter *sa, unsigned int sw_index,
 
 	rc = sa->priv.dp_tx->qcreate(sa->eth_dev->data->port_id, sw_index,
 				     &RTE_ETH_DEV_TO_PCI(sa->eth_dev)->addr,
-				     socket_id, &info, &txq->dp);
+				     socket_id, &info, &txq_info->dp);
 	if (rc != 0)
 		goto fail_dp_tx_qinit;
 
-	evq->dp_txq = txq->dp;
+	evq->dp_txq = txq_info->dp;
 
 	txq_info->state = SFC_TXQ_INITIALIZED;
 
@@ -243,8 +243,8 @@ sfc_tx_qfini(struct sfc_adapter *sa, unsigned int sw_index)
 	SFC_ASSERT(txq != NULL);
 	SFC_ASSERT(txq_info->state == SFC_TXQ_INITIALIZED);
 
-	sa->priv.dp_tx->qdestroy(txq->dp);
-	txq->dp = NULL;
+	sa->priv.dp_tx->qdestroy(txq_info->dp);
+	txq_info->dp = NULL;
 
 	txq_info->txq = NULL;
 	txq_info->entries = 0;
@@ -466,7 +466,7 @@ sfc_tx_qstart(struct sfc_adapter *sa, unsigned int sw_index)
 
 	txq_info->state |= SFC_TXQ_STARTED;
 
-	rc = sa->priv.dp_tx->qstart(txq->dp, evq->read_ptr, desc_index);
+	rc = sa->priv.dp_tx->qstart(txq_info->dp, evq->read_ptr, desc_index);
 	if (rc != 0)
 		goto fail_dp_qstart;
 
@@ -511,7 +511,7 @@ sfc_tx_qstop(struct sfc_adapter *sa, unsigned int sw_index)
 
 	SFC_ASSERT(txq_info->state & SFC_TXQ_STARTED);
 
-	sa->priv.dp_tx->qstop(txq->dp, &txq->evq->read_ptr);
+	sa->priv.dp_tx->qstop(txq_info->dp, &txq->evq->read_ptr);
 
 	/*
 	 * Retry TX queue flushing in case of flush failed or
@@ -548,7 +548,7 @@ sfc_tx_qstop(struct sfc_adapter *sa, unsigned int sw_index)
 			sfc_notice(sa, "TxQ %u flushed", sw_index);
 	}
 
-	sa->priv.dp_tx->qreap(txq->dp);
+	sa->priv.dp_tx->qreap(txq_info->dp);
 
 	txq_info->state = SFC_TXQ_INITIALIZED;
 
diff --git a/drivers/net/sfc/sfc_tx.h b/drivers/net/sfc/sfc_tx.h
index c3edd3a58..e5ea6df75 100644
--- a/drivers/net/sfc/sfc_tx.h
+++ b/drivers/net/sfc/sfc_tx.h
@@ -54,7 +54,6 @@ struct sfc_txq {
 	unsigned int			hw_index;
 	struct sfc_evq			*evq;
 	efsys_mem_t			mem;
-	struct sfc_dp_txq		*dp;
 	efx_txq_t			*common;
 };
 
@@ -109,6 +108,7 @@ struct sfc_txq_info {
 	unsigned int		state;
 	unsigned int		entries;
 	struct sfc_txq		*txq;
+	struct sfc_dp_txq	*dp;
 	boolean_t		deferred_start;
 	boolean_t		deferred_started;
 	unsigned int		free_thresh;
-- 
2.17.1

^ permalink raw reply	[flat|nested] 34+ messages in thread

* [dpdk-dev] [PATCH 15/30] net/sfc: support Tx descriptor status in secondary process
  2019-02-07 12:17 [dpdk-dev] [PATCH 00/30] net/sfc: improve multi-process support Andrew Rybchenko
                   ` (13 preceding siblings ...)
  2019-02-07 12:17 ` [dpdk-dev] [PATCH 14/30] net/sfc: move datapath TxQ handle to shared TxQ info Andrew Rybchenko
@ 2019-02-07 12:17 ` Andrew Rybchenko
  2019-02-07 12:17 ` [dpdk-dev] [PATCH 16/30] net/sfc: support RSS RETA and hash config get in secondary Andrew Rybchenko
                   ` (15 subsequent siblings)
  30 siblings, 0 replies; 34+ messages in thread
From: Andrew Rybchenko @ 2019-02-07 12:17 UTC (permalink / raw)
  To: dev

If Tx datapath supports multi-process, secondary process should be
able to use Tx descriptor status API.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
---
 doc/guides/rel_notes/release_19_05.rst |  1 +
 drivers/net/sfc/sfc_dp_tx.h            |  3 +++
 drivers/net/sfc/sfc_ethdev.c           | 11 +++++++++--
 drivers/net/sfc/sfc_tx.c               | 15 +++++++++++++++
 4 files changed, 28 insertions(+), 2 deletions(-)

diff --git a/doc/guides/rel_notes/release_19_05.rst b/doc/guides/rel_notes/release_19_05.rst
index 93f28926a..6d65c8eae 100644
--- a/doc/guides/rel_notes/release_19_05.rst
+++ b/doc/guides/rel_notes/release_19_05.rst
@@ -60,6 +60,7 @@ New Features
 
   * Added support for Rx descriptor status and related API in a secondary
     process.
+  * Added support for Tx descriptor status API in a secondary process.
 
 
 Removed Items
diff --git a/drivers/net/sfc/sfc_dp_tx.h b/drivers/net/sfc/sfc_dp_tx.h
index c246871cd..fd492f21f 100644
--- a/drivers/net/sfc/sfc_dp_tx.h
+++ b/drivers/net/sfc/sfc_dp_tx.h
@@ -182,6 +182,9 @@ sfc_dp_find_tx_by_caps(struct sfc_dp_list *head, unsigned int avail_caps)
 	return (p == NULL) ? NULL : container_of(p, struct sfc_dp_tx, dp);
 }
 
+/** Get Tx datapath ops by the datapath TxQ handle */
+const struct sfc_dp_tx *sfc_dp_tx_by_dp_txq(const struct sfc_dp_txq *dp_txq);
+
 extern struct sfc_dp_tx sfc_efx_tx;
 extern struct sfc_dp_tx sfc_ef10_tx;
 extern struct sfc_dp_tx sfc_ef10_simple_tx;
diff --git a/drivers/net/sfc/sfc_ethdev.c b/drivers/net/sfc/sfc_ethdev.c
index 80a1d7a3d..c6e1e87ce 100644
--- a/drivers/net/sfc/sfc_ethdev.c
+++ b/drivers/net/sfc/sfc_ethdev.c
@@ -1167,13 +1167,19 @@ sfc_rx_descriptor_status(void *queue, uint16_t offset)
 	return dp_rx->qdesc_status(dp_rxq, offset);
 }
 
+/*
+ * The function is used by the secondary process as well. It must not
+ * use any process-local pointers from the adapter data.
+ */
 static int
 sfc_tx_descriptor_status(void *queue, uint16_t offset)
 {
 	struct sfc_dp_txq *dp_txq = queue;
-	struct sfc_txq *txq = sfc_txq_by_dp_txq(dp_txq);
+	const struct sfc_dp_tx *dp_tx;
+
+	dp_tx = sfc_dp_tx_by_dp_txq(dp_txq);
 
-	return txq->evq->sa->priv.dp_tx->qdesc_status(dp_txq, offset);
+	return dp_tx->qdesc_status(dp_txq, offset);
 }
 
 static int
@@ -1896,6 +1902,7 @@ static const struct eth_dev_ops sfc_eth_dev_secondary_ops = {
 	.rx_queue_count			= sfc_rx_queue_count,
 	.rx_descriptor_done		= sfc_rx_descriptor_done,
 	.rx_descriptor_status		= sfc_rx_descriptor_status,
+	.tx_descriptor_status		= sfc_tx_descriptor_status,
 	.rxq_info_get			= sfc_rx_queue_info_get,
 	.txq_info_get			= sfc_tx_queue_info_get,
 };
diff --git a/drivers/net/sfc/sfc_tx.c b/drivers/net/sfc/sfc_tx.c
index 1ee4e78a1..4357dbfd8 100644
--- a/drivers/net/sfc/sfc_tx.c
+++ b/drivers/net/sfc/sfc_tx.c
@@ -854,6 +854,21 @@ sfc_efx_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts, uint16_t nb_pkts)
 	return pkts_sent;
 }
 
+const struct sfc_dp_tx *
+sfc_dp_tx_by_dp_txq(const struct sfc_dp_txq *dp_txq)
+{
+	const struct sfc_dp_queue *dpq = &dp_txq->dpq;
+	struct rte_eth_dev *eth_dev;
+	struct sfc_adapter_priv *sap;
+
+	SFC_ASSERT(rte_eth_dev_is_valid_port(dpq->port_id));
+	eth_dev = &rte_eth_devices[dpq->port_id];
+
+	sap = sfc_adapter_priv_by_eth_dev(eth_dev);
+
+	return sap->dp_tx;
+}
+
 struct sfc_txq_info *
 sfc_txq_info_by_dp_txq(const struct sfc_dp_txq *dp_txq)
 {
-- 
2.17.1

^ permalink raw reply	[flat|nested] 34+ messages in thread

* [dpdk-dev] [PATCH 16/30] net/sfc: support RSS RETA and hash config get in secondary
  2019-02-07 12:17 [dpdk-dev] [PATCH 00/30] net/sfc: improve multi-process support Andrew Rybchenko
                   ` (14 preceding siblings ...)
  2019-02-07 12:17 ` [dpdk-dev] [PATCH 15/30] net/sfc: support Tx descriptor status in secondary process Andrew Rybchenko
@ 2019-02-07 12:17 ` Andrew Rybchenko
  2019-02-07 12:17 ` [dpdk-dev] [PATCH 17/30] net/sfc: remove unnecessary functions to get RxQ index Andrew Rybchenko
                   ` (14 subsequent siblings)
  30 siblings, 0 replies; 34+ messages in thread
From: Andrew Rybchenko @ 2019-02-07 12:17 UTC (permalink / raw)
  To: dev

RSS RETA query and hash configuration get functions use shared
adapter data only. No libefx functions are called.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
---
 doc/guides/rel_notes/release_19_05.rst |  2 ++
 drivers/net/sfc/sfc_ethdev.c           | 10 ++++++++++
 2 files changed, 12 insertions(+)

diff --git a/doc/guides/rel_notes/release_19_05.rst b/doc/guides/rel_notes/release_19_05.rst
index 6d65c8eae..1b7f14cb2 100644
--- a/doc/guides/rel_notes/release_19_05.rst
+++ b/doc/guides/rel_notes/release_19_05.rst
@@ -61,6 +61,8 @@ New Features
   * Added support for Rx descriptor status and related API in a secondary
     process.
   * Added support for Tx descriptor status API in a secondary process.
+  * Added support for RSS RETA and hash configuration get API in a secondary
+    process.
 
 
 Removed Items
diff --git a/drivers/net/sfc/sfc_ethdev.c b/drivers/net/sfc/sfc_ethdev.c
index c6e1e87ce..47450f6b2 100644
--- a/drivers/net/sfc/sfc_ethdev.c
+++ b/drivers/net/sfc/sfc_ethdev.c
@@ -1403,6 +1403,10 @@ sfc_dev_udp_tunnel_port_del(struct rte_eth_dev *dev,
 	return sfc_dev_udp_tunnel_op(dev, tunnel_udp, SFC_UDP_TUNNEL_DEL_PORT);
 }
 
+/*
+ * The function is used by the secondary process as well. It must not
+ * use any process-local pointers from the adapter data.
+ */
 static int
 sfc_dev_rss_hash_conf_get(struct rte_eth_dev *dev,
 			  struct rte_eth_rss_conf *rss_conf)
@@ -1503,6 +1507,10 @@ sfc_dev_rss_hash_update(struct rte_eth_dev *dev,
 	return -rc;
 }
 
+/*
+ * The function is used by the secondary process as well. It must not
+ * use any process-local pointers from the adapter data.
+ */
 static int
 sfc_dev_rss_reta_query(struct rte_eth_dev *dev,
 		       struct rte_eth_rss_reta_entry64 *reta_conf,
@@ -1903,6 +1911,8 @@ static const struct eth_dev_ops sfc_eth_dev_secondary_ops = {
 	.rx_descriptor_done		= sfc_rx_descriptor_done,
 	.rx_descriptor_status		= sfc_rx_descriptor_status,
 	.tx_descriptor_status		= sfc_tx_descriptor_status,
+	.reta_query			= sfc_dev_rss_reta_query,
+	.rss_hash_conf_get		= sfc_dev_rss_hash_conf_get,
 	.rxq_info_get			= sfc_rx_queue_info_get,
 	.txq_info_get			= sfc_tx_queue_info_get,
 };
-- 
2.17.1

^ permalink raw reply	[flat|nested] 34+ messages in thread

* [dpdk-dev] [PATCH 17/30] net/sfc: remove unnecessary functions to get RxQ index
  2019-02-07 12:17 [dpdk-dev] [PATCH 00/30] net/sfc: improve multi-process support Andrew Rybchenko
                   ` (15 preceding siblings ...)
  2019-02-07 12:17 ` [dpdk-dev] [PATCH 16/30] net/sfc: support RSS RETA and hash config get in secondary Andrew Rybchenko
@ 2019-02-07 12:17 ` Andrew Rybchenko
  2019-02-07 12:17 ` [dpdk-dev] [PATCH 18/30] net/sfc: remove unnecessary functions to get TxQ index Andrew Rybchenko
                   ` (13 subsequent siblings)
  30 siblings, 0 replies; 34+ messages in thread
From: Andrew Rybchenko @ 2019-02-07 12:17 UTC (permalink / raw)
  To: dev

RxQ index is stored in generic datapath queue structure.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
---
 drivers/net/sfc/sfc_ethdev.c |  2 +-
 drivers/net/sfc/sfc_rx.h     | 12 ------------
 2 files changed, 1 insertion(+), 13 deletions(-)

diff --git a/drivers/net/sfc/sfc_ethdev.c b/drivers/net/sfc/sfc_ethdev.c
index 47450f6b2..f3316e143 100644
--- a/drivers/net/sfc/sfc_ethdev.c
+++ b/drivers/net/sfc/sfc_ethdev.c
@@ -442,7 +442,7 @@ sfc_rx_queue_release(void *queue)
 	sa = rxq->evq->sa;
 	sfc_adapter_lock(sa);
 
-	sw_index = sfc_rxq_sw_index(rxq);
+	sw_index = dp_rxq->dpq.queue_id;
 
 	sfc_log_init(sa, "RxQ=%u", sw_index);
 
diff --git a/drivers/net/sfc/sfc_rx.h b/drivers/net/sfc/sfc_rx.h
index 9c946d7cb..963d487c0 100644
--- a/drivers/net/sfc/sfc_rx.h
+++ b/drivers/net/sfc/sfc_rx.h
@@ -61,18 +61,6 @@ struct sfc_rxq {
 	uint16_t		buf_size;
 };
 
-static inline unsigned int
-sfc_rxq_sw_index_by_hw_index(unsigned int hw_index)
-{
-	return hw_index;
-}
-
-static inline unsigned int
-sfc_rxq_sw_index(const struct sfc_rxq *rxq)
-{
-	return sfc_rxq_sw_index_by_hw_index(rxq->hw_index);
-}
-
 struct sfc_rxq *sfc_rxq_by_dp_rxq(const struct sfc_dp_rxq *dp_rxq);
 
 /**
-- 
2.17.1

^ permalink raw reply	[flat|nested] 34+ messages in thread

* [dpdk-dev] [PATCH 18/30] net/sfc: remove unnecessary functions to get TxQ index
  2019-02-07 12:17 [dpdk-dev] [PATCH 00/30] net/sfc: improve multi-process support Andrew Rybchenko
                   ` (16 preceding siblings ...)
  2019-02-07 12:17 ` [dpdk-dev] [PATCH 17/30] net/sfc: remove unnecessary functions to get RxQ index Andrew Rybchenko
@ 2019-02-07 12:17 ` Andrew Rybchenko
  2019-02-07 12:17 ` [dpdk-dev] [PATCH 19/30] net/sfc: remove RxQ control from shared RxQ info Andrew Rybchenko
                   ` (12 subsequent siblings)
  30 siblings, 0 replies; 34+ messages in thread
From: Andrew Rybchenko @ 2019-02-07 12:17 UTC (permalink / raw)
  To: dev

TxQ index is stored in generic datapath queue structure.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
---
 drivers/net/sfc/sfc_ethdev.c |  2 +-
 drivers/net/sfc/sfc_tx.h     | 12 ------------
 2 files changed, 1 insertion(+), 13 deletions(-)

diff --git a/drivers/net/sfc/sfc_ethdev.c b/drivers/net/sfc/sfc_ethdev.c
index f3316e143..a00ea9ce4 100644
--- a/drivers/net/sfc/sfc_ethdev.c
+++ b/drivers/net/sfc/sfc_ethdev.c
@@ -491,7 +491,7 @@ sfc_tx_queue_release(void *queue)
 		return;
 
 	txq = sfc_txq_by_dp_txq(dp_txq);
-	sw_index = sfc_txq_sw_index(txq);
+	sw_index = dp_txq->dpq.queue_id;
 
 	SFC_ASSERT(txq->evq != NULL);
 	sa = txq->evq->sa;
diff --git a/drivers/net/sfc/sfc_tx.h b/drivers/net/sfc/sfc_tx.h
index e5ea6df75..2d21e6e83 100644
--- a/drivers/net/sfc/sfc_tx.h
+++ b/drivers/net/sfc/sfc_tx.h
@@ -57,18 +57,6 @@ struct sfc_txq {
 	efx_txq_t			*common;
 };
 
-static inline unsigned int
-sfc_txq_sw_index_by_hw_index(unsigned int hw_index)
-{
-	return hw_index;
-}
-
-static inline unsigned int
-sfc_txq_sw_index(const struct sfc_txq *txq)
-{
-	return sfc_txq_sw_index_by_hw_index(txq->hw_index);
-}
-
 struct sfc_txq *sfc_txq_by_dp_txq(const struct sfc_dp_txq *dp_txq);
 
 /**
-- 
2.17.1

^ permalink raw reply	[flat|nested] 34+ messages in thread

* [dpdk-dev] [PATCH 19/30] net/sfc: remove RxQ control from shared RxQ info
  2019-02-07 12:17 [dpdk-dev] [PATCH 00/30] net/sfc: improve multi-process support Andrew Rybchenko
                   ` (17 preceding siblings ...)
  2019-02-07 12:17 ` [dpdk-dev] [PATCH 18/30] net/sfc: remove unnecessary functions to get TxQ index Andrew Rybchenko
@ 2019-02-07 12:17 ` Andrew Rybchenko
  2019-02-07 12:17 ` [dpdk-dev] [PATCH 20/30] net/sfc: remove TxQ control from shared TxQ info Andrew Rybchenko
                   ` (11 subsequent siblings)
  30 siblings, 0 replies; 34+ messages in thread
From: Andrew Rybchenko @ 2019-02-07 12:17 UTC (permalink / raw)
  To: dev

libefx is not multi-process aware and all related structures
should be moved to primary process only.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
---
 drivers/net/sfc/sfc.h        |  3 ++
 drivers/net/sfc/sfc_ethdev.c |  2 +-
 drivers/net/sfc/sfc_flow.c   |  8 ++--
 drivers/net/sfc/sfc_rx.c     | 77 ++++++++++++++++++++++--------------
 drivers/net/sfc/sfc_rx.h     |  4 +-
 5 files changed, 57 insertions(+), 37 deletions(-)

diff --git a/drivers/net/sfc/sfc.h b/drivers/net/sfc/sfc.h
index f04127bbc..f19a9dafb 100644
--- a/drivers/net/sfc/sfc.h
+++ b/drivers/net/sfc/sfc.h
@@ -110,6 +110,8 @@ struct sfc_intr {
 	boolean_t			lsc_intr;
 };
 
+struct sfc_rxq;
+
 struct sfc_rxq_info;
 struct sfc_txq_info;
 struct sfc_dp_rx;
@@ -256,6 +258,7 @@ struct sfc_adapter {
 
 	unsigned int			rxq_count;
 	struct sfc_rxq_info		*rxq_info;
+	struct sfc_rxq			*rxq_ctrl;
 
 	unsigned int			txq_count;
 	struct sfc_txq_info		*txq_info;
diff --git a/drivers/net/sfc/sfc_ethdev.c b/drivers/net/sfc/sfc_ethdev.c
index a00ea9ce4..3d38bf661 100644
--- a/drivers/net/sfc/sfc_ethdev.c
+++ b/drivers/net/sfc/sfc_ethdev.c
@@ -1196,7 +1196,7 @@ sfc_rx_queue_start(struct rte_eth_dev *dev, uint16_t rx_queue_id)
 	if (sa->state != SFC_ADAPTER_STARTED)
 		goto fail_not_started;
 
-	if (sa->rxq_info[rx_queue_id].rxq == NULL)
+	if (sa->rxq_info[rx_queue_id].state != SFC_RXQ_INITIALIZED)
 		goto fail_not_setup;
 
 	rc = sfc_rx_qstart(sa, rx_queue_id);
diff --git a/drivers/net/sfc/sfc_flow.c b/drivers/net/sfc/sfc_flow.c
index 41d388735..e20c2e612 100644
--- a/drivers/net/sfc/sfc_flow.c
+++ b/drivers/net/sfc/sfc_flow.c
@@ -1244,7 +1244,7 @@ sfc_flow_parse_queue(struct sfc_adapter *sa,
 	if (queue->index >= sa->rxq_count)
 		return -EINVAL;
 
-	rxq = sa->rxq_info[queue->index].rxq;
+	rxq = &sa->rxq_ctrl[queue->index];
 	flow->spec.template.efs_dmaq_id = (uint16_t)rxq->hw_index;
 
 	return 0;
@@ -1269,7 +1269,7 @@ sfc_flow_parse_rss(struct sfc_adapter *sa,
 		return -EINVAL;
 
 	rxq_sw_index = sa->rxq_count - 1;
-	rxq = sa->rxq_info[rxq_sw_index].rxq;
+	rxq = &sa->rxq_ctrl[rxq_sw_index];
 	rxq_hw_index_min = rxq->hw_index;
 	rxq_hw_index_max = 0;
 
@@ -1279,7 +1279,7 @@ sfc_flow_parse_rss(struct sfc_adapter *sa,
 		if (rxq_sw_index >= sa->rxq_count)
 			return -EINVAL;
 
-		rxq = sa->rxq_info[rxq_sw_index].rxq;
+		rxq = &sa->rxq_ctrl[rxq_sw_index];
 
 		if (rxq->hw_index < rxq_hw_index_min)
 			rxq_hw_index_min = rxq->hw_index;
@@ -1344,7 +1344,7 @@ sfc_flow_parse_rss(struct sfc_adapter *sa,
 	for (i = 0; i < RTE_DIM(sfc_rss_conf->rss_tbl); ++i) {
 		unsigned int nb_queues = action_rss->queue_num;
 		unsigned int rxq_sw_index = action_rss->queue[i % nb_queues];
-		struct sfc_rxq *rxq = sa->rxq_info[rxq_sw_index].rxq;
+		struct sfc_rxq *rxq = &sa->rxq_ctrl[rxq_sw_index];
 
 		sfc_rss_conf->rss_tbl[i] = rxq->hw_index - rxq_hw_index_min;
 	}
diff --git a/drivers/net/sfc/sfc_rx.c b/drivers/net/sfc/sfc_rx.c
index 3c1e77974..eb4875fec 100644
--- a/drivers/net/sfc/sfc_rx.c
+++ b/drivers/net/sfc/sfc_rx.c
@@ -395,12 +395,17 @@ sfc_rxq_info_by_dp_rxq(const struct sfc_dp_rxq *dp_rxq)
 struct sfc_rxq *
 sfc_rxq_by_dp_rxq(const struct sfc_dp_rxq *dp_rxq)
 {
-	struct sfc_rxq_info *rxq_info;
+	const struct sfc_dp_queue *dpq = &dp_rxq->dpq;
+	struct rte_eth_dev *eth_dev;
+	struct sfc_adapter *sa;
 
-	rxq_info = sfc_rxq_info_by_dp_rxq(dp_rxq);
+	SFC_ASSERT(rte_eth_dev_is_valid_port(dpq->port_id));
+	eth_dev = &rte_eth_devices[dpq->port_id];
+
+	sa = eth_dev->data->dev_private;
 
-	SFC_ASSERT(rxq_info->rxq != NULL);
-	return rxq_info->rxq;
+	SFC_ASSERT(dpq->queue_id < sa->rxq_count);
+	return &sa->rxq_ctrl[dpq->queue_id];
 }
 
 static sfc_dp_rx_qsize_up_rings_t sfc_efx_rx_qsize_up_rings;
@@ -563,9 +568,10 @@ sfc_rx_qflush(struct sfc_adapter *sa, unsigned int sw_index)
 	int rc;
 
 	rxq_info = &sa->rxq_info[sw_index];
-	rxq = rxq_info->rxq;
 	SFC_ASSERT(rxq_info->state & SFC_RXQ_STARTED);
 
+	rxq = &sa->rxq_ctrl[sw_index];
+
 	/*
 	 * Retry Rx queue flushing in the case of flush failed or
 	 * timeout. In the worst case it can delay for 6 seconds.
@@ -674,10 +680,9 @@ sfc_rx_qstart(struct sfc_adapter *sa, unsigned int sw_index)
 	SFC_ASSERT(sw_index < sa->rxq_count);
 
 	rxq_info = &sa->rxq_info[sw_index];
-	rxq = rxq_info->rxq;
-	SFC_ASSERT(rxq != NULL);
 	SFC_ASSERT(rxq_info->state == SFC_RXQ_INITIALIZED);
 
+	rxq = &sa->rxq_ctrl[sw_index];
 	evq = rxq->evq;
 
 	rc = sfc_ev_qstart(evq, sfc_evq_index_by_rxq_sw_index(sa, sw_index));
@@ -764,9 +769,8 @@ sfc_rx_qstop(struct sfc_adapter *sa, unsigned int sw_index)
 	SFC_ASSERT(sw_index < sa->rxq_count);
 
 	rxq_info = &sa->rxq_info[sw_index];
-	rxq = rxq_info->rxq;
 
-	if (rxq == NULL || rxq_info->state == SFC_RXQ_INITIALIZED)
+	if (rxq_info->state == SFC_RXQ_INITIALIZED)
 		return;
 	SFC_ASSERT(rxq_info->state & SFC_RXQ_STARTED);
 
@@ -774,6 +778,7 @@ sfc_rx_qstop(struct sfc_adapter *sa, unsigned int sw_index)
 	sa->eth_dev->data->rx_queue_state[sw_index] =
 		RTE_ETH_QUEUE_STATE_STOPPED;
 
+	rxq = &sa->rxq_ctrl[sw_index];
 	sa->priv.dp_rx->qstop(rxq_info->dp, &rxq->evq->read_ptr);
 
 	if (sw_index == 0)
@@ -1026,14 +1031,7 @@ sfc_rx_qinit(struct sfc_adapter *sa, unsigned int sw_index,
 	if (rc != 0)
 		goto fail_ev_qinit;
 
-	rc = ENOMEM;
-	rxq = rte_zmalloc_socket("sfc-rxq", sizeof(*rxq), RTE_CACHE_LINE_SIZE,
-				 socket_id);
-	if (rxq == NULL)
-		goto fail_rxq_alloc;
-
-	rxq_info->rxq = rxq;
-
+	rxq = &sa->rxq_ctrl[sw_index];
 	rxq->evq = evq;
 	rxq->hw_index = sw_index;
 	rxq_info->refill_threshold =
@@ -1083,10 +1081,6 @@ sfc_rx_qinit(struct sfc_adapter *sa, unsigned int sw_index,
 	sfc_dma_free(sa, &rxq->mem);
 
 fail_dma_alloc:
-	rxq_info->rxq = NULL;
-	rte_free(rxq);
-
-fail_rxq_alloc:
 	sfc_ev_qfini(evq);
 
 fail_ev_qinit:
@@ -1109,21 +1103,20 @@ sfc_rx_qfini(struct sfc_adapter *sa, unsigned int sw_index)
 
 	rxq_info = &sa->rxq_info[sw_index];
 
-	rxq = rxq_info->rxq;
 	SFC_ASSERT(rxq_info->state == SFC_RXQ_INITIALIZED);
 
 	sa->priv.dp_rx->qdestroy(rxq_info->dp);
 	rxq_info->dp = NULL;
 
-	rxq_info->rxq = NULL;
+	rxq_info->state &= ~SFC_RXQ_INITIALIZED;
 	rxq_info->entries = 0;
 
+	rxq = &sa->rxq_ctrl[sw_index];
+
 	sfc_dma_free(sa, &rxq->mem);
 
 	sfc_ev_qfini(rxq->evq);
 	rxq->evq = NULL;
-
-	rte_free(rxq);
 }
 
 /*
@@ -1366,7 +1359,7 @@ sfc_rx_start(struct sfc_adapter *sa)
 		goto fail_rss_config;
 
 	for (sw_index = 0; sw_index < sa->rxq_count; ++sw_index) {
-		if (sa->rxq_info[sw_index].rxq != NULL &&
+		if (sa->rxq_info[sw_index].state == SFC_RXQ_INITIALIZED &&
 		    (!sa->rxq_info[sw_index].deferred_start ||
 		     sa->rxq_info[sw_index].deferred_started)) {
 			rc = sfc_rx_qstart(sa, sw_index);
@@ -1398,7 +1391,7 @@ sfc_rx_stop(struct sfc_adapter *sa)
 
 	sw_index = sa->rxq_count;
 	while (sw_index-- > 0) {
-		if (sa->rxq_info[sw_index].rxq != NULL)
+		if (sa->rxq_info[sw_index].state & SFC_RXQ_STARTED)
 			sfc_rx_qstop(sa, sw_index);
 	}
 
@@ -1476,7 +1469,7 @@ sfc_rx_fini_queues(struct sfc_adapter *sa, unsigned int nb_rx_queues)
 
 	sw_index = sa->rxq_count;
 	while (--sw_index >= (int)nb_rx_queues) {
-		if (sa->rxq_info[sw_index].rxq != NULL)
+		if (sa->rxq_info[sw_index].state & SFC_RXQ_INITIALIZED)
 			sfc_rx_qfini(sa, sw_index);
 	}
 
@@ -1516,8 +1509,18 @@ sfc_rx_configure(struct sfc_adapter *sa)
 						 sa->socket_id);
 		if (sa->rxq_info == NULL)
 			goto fail_rxqs_alloc;
+
+		/*
+		 * Allocate primary process only RxQ control from heap
+		 * since it should not be shared.
+		 */
+		rc = ENOMEM;
+		sa->rxq_ctrl = calloc(nb_rx_queues, sizeof(sa->rxq_ctrl[0]));
+		if (sa->rxq_ctrl == NULL)
+			goto fail_rxqs_ctrl_alloc;
 	} else {
 		struct sfc_rxq_info *new_rxq_info;
+		struct sfc_rxq *new_rxq_ctrl;
 
 		if (nb_rx_queues < sa->rxq_count)
 			sfc_rx_fini_queues(sa, nb_rx_queues);
@@ -1529,11 +1532,22 @@ sfc_rx_configure(struct sfc_adapter *sa)
 		if (new_rxq_info == NULL && nb_rx_queues > 0)
 			goto fail_rxqs_realloc;
 
+		rc = ENOMEM;
+		new_rxq_ctrl = realloc(sa->rxq_ctrl,
+				       nb_rx_queues * sizeof(sa->rxq_ctrl[0]));
+		if (new_rxq_ctrl == NULL && nb_rx_queues > 0)
+			goto fail_rxqs_ctrl_realloc;
+
 		sa->rxq_info = new_rxq_info;
-		if (nb_rx_queues > sa->rxq_count)
+		sa->rxq_ctrl = new_rxq_ctrl;
+		if (nb_rx_queues > sa->rxq_count) {
 			memset(&sa->rxq_info[sa->rxq_count], 0,
 			       (nb_rx_queues - sa->rxq_count) *
 			       sizeof(sa->rxq_info[0]));
+			memset(&sa->rxq_ctrl[sa->rxq_count], 0,
+			       (nb_rx_queues - sa->rxq_count) *
+			       sizeof(sa->rxq_ctrl[0]));
+		}
 	}
 
 	while (sa->rxq_count < nb_rx_queues) {
@@ -1565,7 +1579,9 @@ sfc_rx_configure(struct sfc_adapter *sa)
 
 fail_rx_process_adv_conf_rss:
 fail_rx_qinit_info:
+fail_rxqs_ctrl_realloc:
 fail_rxqs_realloc:
+fail_rxqs_ctrl_alloc:
 fail_rxqs_alloc:
 	sfc_rx_close(sa);
 
@@ -1588,6 +1604,9 @@ sfc_rx_close(struct sfc_adapter *sa)
 
 	rss->channels = 0;
 
+	free(sa->rxq_ctrl);
+	sa->rxq_ctrl = NULL;
+
 	rte_free(sa->rxq_info);
 	sa->rxq_info = NULL;
 }
diff --git a/drivers/net/sfc/sfc_rx.h b/drivers/net/sfc/sfc_rx.h
index 963d487c0..73b70249c 100644
--- a/drivers/net/sfc/sfc_rx.h
+++ b/drivers/net/sfc/sfc_rx.h
@@ -50,8 +50,7 @@ enum sfc_rxq_state_bit {
 };
 
 /**
- * Receive queue control information.
- * Allocated on the socket specified on the queue setup.
+ * Receive queue control primary process-only information.
  */
 struct sfc_rxq {
 	struct sfc_evq		*evq;
@@ -110,7 +109,6 @@ struct sfc_rxq_info {
 	unsigned int		entries;
 	efx_rxq_type_t		type;
 	unsigned int		type_flags;
-	struct sfc_rxq		*rxq;
 	struct sfc_dp_rxq	*dp;
 	boolean_t		deferred_start;
 	boolean_t		deferred_started;
-- 
2.17.1

^ permalink raw reply	[flat|nested] 34+ messages in thread

* [dpdk-dev] [PATCH 20/30] net/sfc: remove TxQ control from shared TxQ info
  2019-02-07 12:17 [dpdk-dev] [PATCH 00/30] net/sfc: improve multi-process support Andrew Rybchenko
                   ` (18 preceding siblings ...)
  2019-02-07 12:17 ` [dpdk-dev] [PATCH 19/30] net/sfc: remove RxQ control from shared RxQ info Andrew Rybchenko
@ 2019-02-07 12:17 ` Andrew Rybchenko
  2019-02-07 12:17 ` [dpdk-dev] [PATCH 21/30] net/sfc: start to factor out multi-process shared data Andrew Rybchenko
                   ` (10 subsequent siblings)
  30 siblings, 0 replies; 34+ messages in thread
From: Andrew Rybchenko @ 2019-02-07 12:17 UTC (permalink / raw)
  To: dev

libefx is not multi-process aware and all related structures
should be moved to primary process only.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
---
 drivers/net/sfc/sfc.c        |  2 +-
 drivers/net/sfc/sfc.h        |  2 +
 drivers/net/sfc/sfc_ethdev.c |  2 +-
 drivers/net/sfc/sfc_tx.c     | 75 +++++++++++++++++++++---------------
 drivers/net/sfc/sfc_tx.h     |  5 +--
 5 files changed, 51 insertions(+), 35 deletions(-)

diff --git a/drivers/net/sfc/sfc.c b/drivers/net/sfc/sfc.c
index 63bc0a568..dd662df0d 100644
--- a/drivers/net/sfc/sfc.c
+++ b/drivers/net/sfc/sfc.c
@@ -280,7 +280,7 @@ sfc_set_fw_subvariant(struct sfc_adapter *sa)
 	for (txq_index = 0; txq_index < sa->txq_count; ++txq_index) {
 		struct sfc_txq_info *txq_info = &sa->txq_info[txq_index];
 
-		if (txq_info->txq != NULL)
+		if (txq_info->state & SFC_TXQ_INITIALIZED)
 			tx_offloads |= txq_info->offloads;
 	}
 
diff --git a/drivers/net/sfc/sfc.h b/drivers/net/sfc/sfc.h
index f19a9dafb..7e95170bc 100644
--- a/drivers/net/sfc/sfc.h
+++ b/drivers/net/sfc/sfc.h
@@ -111,6 +111,7 @@ struct sfc_intr {
 };
 
 struct sfc_rxq;
+struct sfc_txq;
 
 struct sfc_rxq_info;
 struct sfc_txq_info;
@@ -262,6 +263,7 @@ struct sfc_adapter {
 
 	unsigned int			txq_count;
 	struct sfc_txq_info		*txq_info;
+	struct sfc_txq			*txq_ctrl;
 
 	boolean_t			tso;
 
diff --git a/drivers/net/sfc/sfc_ethdev.c b/drivers/net/sfc/sfc_ethdev.c
index 3d38bf661..aa857ec74 100644
--- a/drivers/net/sfc/sfc_ethdev.c
+++ b/drivers/net/sfc/sfc_ethdev.c
@@ -1248,7 +1248,7 @@ sfc_tx_queue_start(struct rte_eth_dev *dev, uint16_t tx_queue_id)
 	if (sa->state != SFC_ADAPTER_STARTED)
 		goto fail_not_started;
 
-	if (sa->txq_info[tx_queue_id].txq == NULL)
+	if (sa->txq_info[tx_queue_id].state != SFC_TXQ_INITIALIZED)
 		goto fail_not_setup;
 
 	rc = sfc_tx_qstart(sa, tx_queue_id);
diff --git a/drivers/net/sfc/sfc_tx.c b/drivers/net/sfc/sfc_tx.c
index 4357dbfd8..94baf4530 100644
--- a/drivers/net/sfc/sfc_tx.c
+++ b/drivers/net/sfc/sfc_tx.c
@@ -159,13 +159,7 @@ sfc_tx_qinit(struct sfc_adapter *sa, unsigned int sw_index,
 	if (rc != 0)
 		goto fail_ev_qinit;
 
-	rc = ENOMEM;
-	txq = rte_zmalloc_socket("sfc-txq", sizeof(*txq), 0, socket_id);
-	if (txq == NULL)
-		goto fail_txq_alloc;
-
-	txq_info->txq = txq;
-
+	txq = &sa->txq_ctrl[sw_index];
 	txq->hw_index = sw_index;
 	txq->evq = evq;
 	txq_info->free_thresh =
@@ -211,10 +205,6 @@ sfc_tx_qinit(struct sfc_adapter *sa, unsigned int sw_index,
 	sfc_dma_free(sa, &txq->mem);
 
 fail_dma_alloc:
-	txq_info->txq = NULL;
-	rte_free(txq);
-
-fail_txq_alloc:
 	sfc_ev_qfini(evq);
 
 fail_ev_qinit:
@@ -239,22 +229,20 @@ sfc_tx_qfini(struct sfc_adapter *sa, unsigned int sw_index)
 
 	txq_info = &sa->txq_info[sw_index];
 
-	txq = txq_info->txq;
-	SFC_ASSERT(txq != NULL);
 	SFC_ASSERT(txq_info->state == SFC_TXQ_INITIALIZED);
 
 	sa->priv.dp_tx->qdestroy(txq_info->dp);
 	txq_info->dp = NULL;
 
-	txq_info->txq = NULL;
+	txq_info->state &= ~SFC_TXQ_INITIALIZED;
 	txq_info->entries = 0;
 
+	txq = &sa->txq_ctrl[sw_index];
+
 	sfc_dma_free(sa, &txq->mem);
 
 	sfc_ev_qfini(txq->evq);
 	txq->evq = NULL;
-
-	rte_free(txq);
 }
 
 static int
@@ -314,7 +302,7 @@ sfc_tx_fini_queues(struct sfc_adapter *sa, unsigned int nb_tx_queues)
 
 	sw_index = sa->txq_count;
 	while (--sw_index >= (int)nb_tx_queues) {
-		if (sa->txq_info[sw_index].txq != NULL)
+		if (sa->txq_info[sw_index].state & SFC_TXQ_INITIALIZED)
 			sfc_tx_qfini(sa, sw_index);
 	}
 
@@ -355,8 +343,18 @@ sfc_tx_configure(struct sfc_adapter *sa)
 						 sa->socket_id);
 		if (sa->txq_info == NULL)
 			goto fail_txqs_alloc;
+
+		/*
+		 * Allocate primary process only TxQ control from heap
+		 * since it should not be shared.
+		 */
+		rc = ENOMEM;
+		sa->txq_ctrl = calloc(nb_tx_queues, sizeof(sa->txq_ctrl[0]));
+		if (sa->txq_ctrl == NULL)
+			goto fail_txqs_ctrl_alloc;
 	} else {
 		struct sfc_txq_info *new_txq_info;
+		struct sfc_txq *new_txq_ctrl;
 
 		if (nb_tx_queues < sa->txq_count)
 			sfc_tx_fini_queues(sa, nb_tx_queues);
@@ -367,11 +365,21 @@ sfc_tx_configure(struct sfc_adapter *sa)
 		if (new_txq_info == NULL && nb_tx_queues > 0)
 			goto fail_txqs_realloc;
 
+		new_txq_ctrl = realloc(sa->txq_ctrl,
+				       nb_tx_queues * sizeof(sa->txq_ctrl[0]));
+		if (new_txq_ctrl == NULL && nb_tx_queues > 0)
+			goto fail_txqs_ctrl_realloc;
+
 		sa->txq_info = new_txq_info;
-		if (nb_tx_queues > sa->txq_count)
+		sa->txq_ctrl = new_txq_ctrl;
+		if (nb_tx_queues > sa->txq_count) {
 			memset(&sa->txq_info[sa->txq_count], 0,
 			       (nb_tx_queues - sa->txq_count) *
 			       sizeof(sa->txq_info[0]));
+			memset(&sa->txq_ctrl[sa->txq_count], 0,
+			       (nb_tx_queues - sa->txq_count) *
+			       sizeof(sa->txq_ctrl[0]));
+		}
 	}
 
 	while (sa->txq_count < nb_tx_queues) {
@@ -386,7 +394,9 @@ sfc_tx_configure(struct sfc_adapter *sa)
 	return 0;
 
 fail_tx_qinit_info:
+fail_txqs_ctrl_realloc:
 fail_txqs_realloc:
+fail_txqs_ctrl_alloc:
 fail_txqs_alloc:
 	sfc_tx_close(sa);
 
@@ -401,6 +411,9 @@ sfc_tx_close(struct sfc_adapter *sa)
 {
 	sfc_tx_fini_queues(sa, 0);
 
+	free(sa->txq_ctrl);
+	sa->txq_ctrl = NULL;
+
 	rte_free(sa->txq_info);
 	sa->txq_info = NULL;
 }
@@ -423,11 +436,9 @@ sfc_tx_qstart(struct sfc_adapter *sa, unsigned int sw_index)
 	SFC_ASSERT(sw_index < sa->txq_count);
 	txq_info = &sa->txq_info[sw_index];
 
-	txq = txq_info->txq;
-
-	SFC_ASSERT(txq != NULL);
 	SFC_ASSERT(txq_info->state == SFC_TXQ_INITIALIZED);
 
+	txq = &sa->txq_ctrl[sw_index];
 	evq = txq->evq;
 
 	rc = sfc_ev_qstart(evq, sfc_evq_index_by_txq_sw_index(sa, sw_index));
@@ -504,13 +515,12 @@ sfc_tx_qstop(struct sfc_adapter *sa, unsigned int sw_index)
 	SFC_ASSERT(sw_index < sa->txq_count);
 	txq_info = &sa->txq_info[sw_index];
 
-	txq = txq_info->txq;
-
-	if (txq == NULL || txq_info->state == SFC_TXQ_INITIALIZED)
+	if (txq_info->state == SFC_TXQ_INITIALIZED)
 		return;
 
 	SFC_ASSERT(txq_info->state & SFC_TXQ_STARTED);
 
+	txq = &sa->txq_ctrl[sw_index];
 	sa->priv.dp_tx->qstop(txq_info->dp, &txq->evq->read_ptr);
 
 	/*
@@ -583,7 +593,7 @@ sfc_tx_start(struct sfc_adapter *sa)
 		goto fail_efx_tx_init;
 
 	for (sw_index = 0; sw_index < sa->txq_count; ++sw_index) {
-		if (sa->txq_info[sw_index].txq != NULL &&
+		if (sa->txq_info[sw_index].state == SFC_TXQ_INITIALIZED &&
 		    (!(sa->txq_info[sw_index].deferred_start) ||
 		     sa->txq_info[sw_index].deferred_started)) {
 			rc = sfc_tx_qstart(sa, sw_index);
@@ -614,7 +624,7 @@ sfc_tx_stop(struct sfc_adapter *sa)
 
 	sw_index = sa->txq_count;
 	while (sw_index-- > 0) {
-		if (sa->txq_info[sw_index].txq != NULL)
+		if (sa->txq_info[sw_index].state & SFC_TXQ_STARTED)
 			sfc_tx_qstop(sa, sw_index);
 	}
 
@@ -888,12 +898,17 @@ sfc_txq_info_by_dp_txq(const struct sfc_dp_txq *dp_txq)
 struct sfc_txq *
 sfc_txq_by_dp_txq(const struct sfc_dp_txq *dp_txq)
 {
-	struct sfc_txq_info *txq_info;
+	const struct sfc_dp_queue *dpq = &dp_txq->dpq;
+	struct rte_eth_dev *eth_dev;
+	struct sfc_adapter *sa;
 
-	txq_info = sfc_txq_info_by_dp_txq(dp_txq);
+	SFC_ASSERT(rte_eth_dev_is_valid_port(dpq->port_id));
+	eth_dev = &rte_eth_devices[dpq->port_id];
 
-	SFC_ASSERT(txq_info->txq != NULL);
-	return txq_info->txq;
+	sa = eth_dev->data->dev_private;
+
+	SFC_ASSERT(dpq->queue_id < sa->txq_count);
+	return &sa->txq_ctrl[dpq->queue_id];
 }
 
 static sfc_dp_tx_qsize_up_rings_t sfc_efx_tx_qsize_up_rings;
diff --git a/drivers/net/sfc/sfc_tx.h b/drivers/net/sfc/sfc_tx.h
index 2d21e6e83..d0e751a26 100644
--- a/drivers/net/sfc/sfc_tx.h
+++ b/drivers/net/sfc/sfc_tx.h
@@ -47,8 +47,8 @@ enum sfc_txq_state_bit {
 };
 
 /**
- * Transmit queue control information. Not used on datapath.
- * Allocated on the socket specified on the queue setup.
+ * Transmit queue control primary process-only information.
+ * Not used on datapath.
  */
 struct sfc_txq {
 	unsigned int			hw_index;
@@ -95,7 +95,6 @@ sfc_efx_txq_by_dp_txq(struct sfc_dp_txq *dp_txq)
 struct sfc_txq_info {
 	unsigned int		state;
 	unsigned int		entries;
-	struct sfc_txq		*txq;
 	struct sfc_dp_txq	*dp;
 	boolean_t		deferred_start;
 	boolean_t		deferred_started;
-- 
2.17.1

^ permalink raw reply	[flat|nested] 34+ messages in thread

* [dpdk-dev] [PATCH 21/30] net/sfc: start to factor out multi-process shared data
  2019-02-07 12:17 [dpdk-dev] [PATCH 00/30] net/sfc: improve multi-process support Andrew Rybchenko
                   ` (19 preceding siblings ...)
  2019-02-07 12:17 ` [dpdk-dev] [PATCH 20/30] net/sfc: remove TxQ control from shared TxQ info Andrew Rybchenko
@ 2019-02-07 12:17 ` Andrew Rybchenko
  2019-02-07 12:17 ` [dpdk-dev] [PATCH 22/30] net/sfc: move Rx/Tx datapath names to shared state Andrew Rybchenko
                   ` (9 subsequent siblings)
  30 siblings, 0 replies; 34+ messages in thread
From: Andrew Rybchenko @ 2019-02-07 12:17 UTC (permalink / raw)
  To: dev

sfc_adapter structure will become primary process only private data.
Start to factor out shared data into dedicated structure which will
become separate structure finally.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
---
 drivers/net/sfc/sfc.h        | 15 +++++++++++++--
 drivers/net/sfc/sfc_debug.h  |  9 +++++----
 drivers/net/sfc/sfc_ethdev.c |  8 ++++++--
 drivers/net/sfc/sfc_log.h    | 13 +++++++------
 drivers/net/sfc/sfc_mcdi.c   |  2 +-
 5 files changed, 32 insertions(+), 15 deletions(-)

diff --git a/drivers/net/sfc/sfc.h b/drivers/net/sfc/sfc.h
index 7e95170bc..766336f8c 100644
--- a/drivers/net/sfc/sfc.h
+++ b/drivers/net/sfc/sfc.h
@@ -174,8 +174,15 @@ struct sfc_rss {
 	uint8_t				key[EFX_RSS_KEY_SIZE];
 };
 
+/* Adapter private data shared by primary and secondary processes */
+struct sfc_adapter_shared {
+	struct rte_pci_addr		pci_addr;
+	uint16_t			port_id;
+};
+
 /* Adapter process private data */
 struct sfc_adapter_priv {
+	struct sfc_adapter_shared	*shared;
 	const struct sfc_dp_rx		*dp_rx;
 	const struct sfc_dp_tx		*dp_tx;
 	uint32_t			logtype_main;
@@ -199,6 +206,12 @@ struct sfc_adapter {
 	 */
 	struct sfc_adapter_priv		priv;
 
+	/*
+	 * Temporary placeholder for multi-process shared data for
+	 * transition.
+	 */
+	struct sfc_adapter_shared	_shared;
+
 	/*
 	 * PMD setup and configuration is not thread safe. Since it is not
 	 * performance sensitive, it is better to guarantee thread-safety
@@ -207,8 +220,6 @@ struct sfc_adapter {
 	 */
 	rte_spinlock_t			lock;
 	enum sfc_adapter_state		state;
-	struct rte_pci_addr		pci_addr;
-	uint16_t			port_id;
 	struct rte_eth_dev		*eth_dev;
 	struct rte_kvargs		*kvargs;
 	int				socket_id;
diff --git a/drivers/net/sfc/sfc_debug.h b/drivers/net/sfc/sfc_debug.h
index 62f3937e8..ea1b43295 100644
--- a/drivers/net/sfc/sfc_debug.h
+++ b/drivers/net/sfc/sfc_debug.h
@@ -25,13 +25,14 @@
 /* Log PMD message, automatically add prefix and \n */
 #define sfc_panic(sa, fmt, args...) \
 	do {								\
-		const struct sfc_adapter *_sa = (sa);			\
+		const struct sfc_adapter_shared *_sas;			\
 									\
+		_sas = (sa)->priv.shared;				\
 		rte_panic("sfc " PCI_PRI_FMT				\
 			  " #%" PRIu16 ": " fmt "\n",			\
-			  _sa->pci_addr.domain, _sa->pci_addr.bus,	\
-			  _sa->pci_addr.devid, _sa->pci_addr.function,	\
-			  _sa->port_id, ##args);			\
+			  _sas->pci_addr.domain, _sas->pci_addr.bus,	\
+			  _sas->pci_addr.devid, _sas->pci_addr.function,\
+			  _sas->port_id, ##args);			\
 	} while (0)
 
 #endif /* _SFC_DEBUG_H_ */
diff --git a/drivers/net/sfc/sfc_ethdev.c b/drivers/net/sfc/sfc_ethdev.c
index aa857ec74..88dbecd46 100644
--- a/drivers/net/sfc/sfc_ethdev.c
+++ b/drivers/net/sfc/sfc_ethdev.c
@@ -2023,6 +2023,7 @@ static int
 sfc_eth_dev_init(struct rte_eth_dev *dev)
 {
 	struct sfc_adapter *sa = dev->data->dev_private;
+	struct sfc_adapter_shared *sas;
 	struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(dev);
 	uint32_t logtype_main;
 	int rc;
@@ -2035,6 +2036,9 @@ sfc_eth_dev_init(struct rte_eth_dev *dev)
 					    SFC_LOGTYPE_MAIN_STR,
 					    RTE_LOG_NOTICE);
 
+	sa->priv.shared = &sa->_shared;
+	sas = sa->priv.shared;
+
 	if (rte_eal_process_type() != RTE_PROC_PRIMARY)
 		return -sfc_eth_dev_secondary_init(dev, logtype_main);
 
@@ -2047,8 +2051,8 @@ sfc_eth_dev_init(struct rte_eth_dev *dev)
 	dev->process_private = sa;
 
 	/* Required for logging */
-	sa->pci_addr = pci_dev->addr;
-	sa->port_id = dev->data->port_id;
+	sas->pci_addr = pci_dev->addr;
+	sas->port_id = dev->data->port_id;
 	sa->priv.logtype_main = logtype_main;
 
 	sa->eth_dev = dev;
diff --git a/drivers/net/sfc/sfc_log.h b/drivers/net/sfc/sfc_log.h
index 405cc2a26..97de9ae53 100644
--- a/drivers/net/sfc/sfc_log.h
+++ b/drivers/net/sfc/sfc_log.h
@@ -34,17 +34,18 @@ extern uint32_t sfc_logtype_driver;
 /* Log PMD message, automatically add prefix and \n */
 #define SFC_LOG(sa, level, type, ...) \
 	do {								\
-		const struct sfc_adapter *__sa = (sa);			\
+		const struct sfc_adapter_shared *_sas;			\
 									\
+		_sas = (sa)->priv.shared;				\
 		rte_log(level, type,					\
 			RTE_FMT("PMD: sfc_efx "				\
 				PCI_PRI_FMT " #%" PRIu16		\
 				": " RTE_FMT_HEAD(__VA_ARGS__ ,) "\n",	\
-				__sa->pci_addr.domain,			\
-				__sa->pci_addr.bus,			\
-				__sa->pci_addr.devid,			\
-				__sa->pci_addr.function,		\
-				__sa->port_id,				\
+				_sas->pci_addr.domain,			\
+				_sas->pci_addr.bus,			\
+				_sas->pci_addr.devid,			\
+				_sas->pci_addr.function,		\
+				_sas->port_id,				\
 				RTE_FMT_TAIL(__VA_ARGS__,)));		\
 	} while (0)
 
diff --git a/drivers/net/sfc/sfc_mcdi.c b/drivers/net/sfc/sfc_mcdi.c
index e485e07d6..dede33688 100644
--- a/drivers/net/sfc/sfc_mcdi.c
+++ b/drivers/net/sfc/sfc_mcdi.c
@@ -256,7 +256,7 @@ sfc_mcdi_init(struct sfc_adapter *sa)
 	if (rc != 0)
 		goto fail_dma_alloc;
 
-	mcdi->logtype = sfc_register_logtype(&sa->pci_addr,
+	mcdi->logtype = sfc_register_logtype(&sa->priv.shared->pci_addr,
 					     SFC_LOGTYPE_MCDI_STR,
 					     RTE_LOG_NOTICE);
 
-- 
2.17.1

^ permalink raw reply	[flat|nested] 34+ messages in thread

* [dpdk-dev] [PATCH 22/30] net/sfc: move Rx/Tx datapath names to shared state
  2019-02-07 12:17 [dpdk-dev] [PATCH 00/30] net/sfc: improve multi-process support Andrew Rybchenko
                   ` (20 preceding siblings ...)
  2019-02-07 12:17 ` [dpdk-dev] [PATCH 21/30] net/sfc: start to factor out multi-process shared data Andrew Rybchenko
@ 2019-02-07 12:17 ` Andrew Rybchenko
  2019-02-07 12:17 ` [dpdk-dev] [PATCH 23/30] net/sfc: make main logging macro reusable in secondary Andrew Rybchenko
                   ` (8 subsequent siblings)
  30 siblings, 0 replies; 34+ messages in thread
From: Andrew Rybchenko @ 2019-02-07 12:17 UTC (permalink / raw)
  To: dev

Prepare to make sfc_adapter primary process private data.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
---
 drivers/net/sfc/sfc.h        | 21 +++++++++----------
 drivers/net/sfc/sfc_ethdev.c | 39 +++++++++++++++++++-----------------
 2 files changed, 31 insertions(+), 29 deletions(-)

diff --git a/drivers/net/sfc/sfc.h b/drivers/net/sfc/sfc.h
index 766336f8c..890a04d0e 100644
--- a/drivers/net/sfc/sfc.h
+++ b/drivers/net/sfc/sfc.h
@@ -178,6 +178,9 @@ struct sfc_rss {
 struct sfc_adapter_shared {
 	struct rte_pci_addr		pci_addr;
 	uint16_t			port_id;
+
+	char				*dp_rx_name;
+	char				*dp_tx_name;
 };
 
 /* Adapter process private data */
@@ -281,19 +284,15 @@ struct sfc_adapter {
 	uint32_t			rxd_wait_timeout_ns;
 
 	struct sfc_rss			rss;
+};
 
-	/*
-	 * Shared memory copy of the Rx datapath name to be used by
-	 * the secondary process to find Rx datapath to be used.
-	 */
-	char				*dp_rx_name;
+static inline struct sfc_adapter_shared *
+sfc_adapter_shared_by_eth_dev(struct rte_eth_dev *eth_dev)
+{
+	struct sfc_adapter *sa = eth_dev->data->dev_private;
 
-	/*
-	 * Shared memory copy of the Tx datapath name to be used by
-	 * the secondary process to find Tx datapath to be used.
-	 */
-	char				*dp_tx_name;
-};
+	return sa->priv.shared;
+}
 
 /*
  * Add wrapper functions to acquire/release lock to be able to remove or
diff --git a/drivers/net/sfc/sfc_ethdev.c b/drivers/net/sfc/sfc_ethdev.c
index 88dbecd46..9f0036375 100644
--- a/drivers/net/sfc/sfc_ethdev.c
+++ b/drivers/net/sfc/sfc_ethdev.c
@@ -1768,6 +1768,7 @@ static int
 sfc_eth_dev_set_ops(struct rte_eth_dev *dev)
 {
 	struct sfc_adapter *sa = dev->data->dev_private;
+	struct sfc_adapter_shared *sas = sfc_adapter_shared_by_eth_dev(dev);
 	const struct sfc_dp_rx *dp_rx;
 	const struct sfc_dp_tx *dp_tx;
 	const efx_nic_cfg_t *encp;
@@ -1819,13 +1820,13 @@ sfc_eth_dev_set_ops(struct rte_eth_dev *dev)
 		}
 	}
 
-	sa->dp_rx_name = sfc_strdup(dp_rx->dp.name);
-	if (sa->dp_rx_name == NULL) {
+	sas->dp_rx_name = sfc_strdup(dp_rx->dp.name);
+	if (sas->dp_rx_name == NULL) {
 		rc = ENOMEM;
 		goto fail_dp_rx_name;
 	}
 
-	sfc_notice(sa, "use %s Rx datapath", sa->dp_rx_name);
+	sfc_notice(sa, "use %s Rx datapath", sas->dp_rx_name);
 
 	rc = sfc_kvargs_process(sa, SFC_KVARG_TX_DATAPATH,
 				sfc_kvarg_string_handler, &tx_name);
@@ -1856,13 +1857,13 @@ sfc_eth_dev_set_ops(struct rte_eth_dev *dev)
 		}
 	}
 
-	sa->dp_tx_name = sfc_strdup(dp_tx->dp.name);
-	if (sa->dp_tx_name == NULL) {
+	sas->dp_tx_name = sfc_strdup(dp_tx->dp.name);
+	if (sas->dp_tx_name == NULL) {
 		rc = ENOMEM;
 		goto fail_dp_tx_name;
 	}
 
-	sfc_notice(sa, "use %s Tx datapath", sa->dp_tx_name);
+	sfc_notice(sa, "use %s Tx datapath", sas->dp_tx_name);
 
 	sa->priv.dp_rx = dp_rx;
 	sa->priv.dp_tx = dp_tx;
@@ -1878,8 +1879,8 @@ sfc_eth_dev_set_ops(struct rte_eth_dev *dev)
 fail_dp_tx_caps:
 fail_dp_tx:
 fail_kvarg_tx_datapath:
-	rte_free(sa->dp_rx_name);
-	sa->dp_rx_name = NULL;
+	rte_free(sas->dp_rx_name);
+	sas->dp_rx_name = NULL;
 
 fail_dp_rx_name:
 fail_dp_rx_caps:
@@ -1892,17 +1893,18 @@ static void
 sfc_eth_dev_clear_ops(struct rte_eth_dev *dev)
 {
 	struct sfc_adapter *sa = dev->data->dev_private;
+	struct sfc_adapter_shared *sas = sfc_adapter_shared_by_eth_dev(dev);
 
 	dev->dev_ops = NULL;
 	dev->rx_pkt_burst = NULL;
 	dev->tx_pkt_burst = NULL;
 
-	rte_free(sa->dp_tx_name);
-	sa->dp_tx_name = NULL;
+	rte_free(sas->dp_tx_name);
+	sas->dp_tx_name = NULL;
 	sa->priv.dp_tx = NULL;
 
-	rte_free(sa->dp_rx_name);
-	sa->dp_rx_name = NULL;
+	rte_free(sas->dp_rx_name);
+	sas->dp_rx_name = NULL;
 	sa->priv.dp_rx = NULL;
 }
 
@@ -1926,6 +1928,7 @@ sfc_eth_dev_secondary_init(struct rte_eth_dev *dev, uint32_t logtype_main)
 	 * in shared memory only.
 	 */
 	struct sfc_adapter *sa = dev->data->dev_private;
+	struct sfc_adapter_shared *sas = sfc_adapter_shared_by_eth_dev(dev);
 	struct sfc_adapter_priv *sap;
 	const struct sfc_dp_rx *dp_rx;
 	const struct sfc_dp_tx *dp_tx;
@@ -1943,32 +1946,32 @@ sfc_eth_dev_secondary_init(struct rte_eth_dev *dev, uint32_t logtype_main)
 
 	sap->logtype_main = logtype_main;
 
-	dp_rx = sfc_dp_find_rx_by_name(&sfc_dp_head, sa->dp_rx_name);
+	dp_rx = sfc_dp_find_rx_by_name(&sfc_dp_head, sas->dp_rx_name);
 	if (dp_rx == NULL) {
 		SFC_LOG(sa, RTE_LOG_ERR, logtype_main,
-			"cannot find %s Rx datapath", sa->dp_rx_name);
+			"cannot find %s Rx datapath", sas->dp_rx_name);
 		rc = ENOENT;
 		goto fail_dp_rx;
 	}
 	if (~dp_rx->features & SFC_DP_RX_FEAT_MULTI_PROCESS) {
 		SFC_LOG(sa, RTE_LOG_ERR, logtype_main,
 			"%s Rx datapath does not support multi-process",
-			sa->dp_rx_name);
+			sas->dp_rx_name);
 		rc = EINVAL;
 		goto fail_dp_rx_multi_process;
 	}
 
-	dp_tx = sfc_dp_find_tx_by_name(&sfc_dp_head, sa->dp_tx_name);
+	dp_tx = sfc_dp_find_tx_by_name(&sfc_dp_head, sas->dp_tx_name);
 	if (dp_tx == NULL) {
 		SFC_LOG(sa, RTE_LOG_ERR, logtype_main,
-			"cannot find %s Tx datapath", sa->dp_tx_name);
+			"cannot find %s Tx datapath", sas->dp_tx_name);
 		rc = ENOENT;
 		goto fail_dp_tx;
 	}
 	if (~dp_tx->features & SFC_DP_TX_FEAT_MULTI_PROCESS) {
 		SFC_LOG(sa, RTE_LOG_ERR, logtype_main,
 			"%s Tx datapath does not support multi-process",
-			sa->dp_tx_name);
+			sas->dp_tx_name);
 		rc = EINVAL;
 		goto fail_dp_tx_multi_process;
 	}
-- 
2.17.1

^ permalink raw reply	[flat|nested] 34+ messages in thread

* [dpdk-dev] [PATCH 23/30] net/sfc: make main logging macro reusable in secondary
  2019-02-07 12:17 [dpdk-dev] [PATCH 00/30] net/sfc: improve multi-process support Andrew Rybchenko
                   ` (21 preceding siblings ...)
  2019-02-07 12:17 ` [dpdk-dev] [PATCH 22/30] net/sfc: move Rx/Tx datapath names to shared state Andrew Rybchenko
@ 2019-02-07 12:17 ` Andrew Rybchenko
  2019-02-07 12:17 ` [dpdk-dev] [PATCH 24/30] net/sfc: move RxQ shared information to adapter shared Andrew Rybchenko
                   ` (7 subsequent siblings)
  30 siblings, 0 replies; 34+ messages in thread
From: Andrew Rybchenko @ 2019-02-07 12:17 UTC (permalink / raw)
  To: dev

Logging should be supported in secondary process and now we have
everything required to share at least main logging macro.
sfc_adapter is going to become primary process only.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
---
 drivers/net/sfc/sfc_ethdev.c | 14 ++++----------
 drivers/net/sfc/sfc_log.h    | 28 ++++++++++++++--------------
 2 files changed, 18 insertions(+), 24 deletions(-)

diff --git a/drivers/net/sfc/sfc_ethdev.c b/drivers/net/sfc/sfc_ethdev.c
index 9f0036375..e30217cf1 100644
--- a/drivers/net/sfc/sfc_ethdev.c
+++ b/drivers/net/sfc/sfc_ethdev.c
@@ -1922,12 +1922,6 @@ static const struct eth_dev_ops sfc_eth_dev_secondary_ops = {
 static int
 sfc_eth_dev_secondary_init(struct rte_eth_dev *dev, uint32_t logtype_main)
 {
-	/*
-	 * Device private data has really many process-local pointers.
-	 * Below code should be extremely careful to use data located
-	 * in shared memory only.
-	 */
-	struct sfc_adapter *sa = dev->data->dev_private;
 	struct sfc_adapter_shared *sas = sfc_adapter_shared_by_eth_dev(dev);
 	struct sfc_adapter_priv *sap;
 	const struct sfc_dp_rx *dp_rx;
@@ -1948,13 +1942,13 @@ sfc_eth_dev_secondary_init(struct rte_eth_dev *dev, uint32_t logtype_main)
 
 	dp_rx = sfc_dp_find_rx_by_name(&sfc_dp_head, sas->dp_rx_name);
 	if (dp_rx == NULL) {
-		SFC_LOG(sa, RTE_LOG_ERR, logtype_main,
+		SFC_LOG(sas, RTE_LOG_ERR, logtype_main,
 			"cannot find %s Rx datapath", sas->dp_rx_name);
 		rc = ENOENT;
 		goto fail_dp_rx;
 	}
 	if (~dp_rx->features & SFC_DP_RX_FEAT_MULTI_PROCESS) {
-		SFC_LOG(sa, RTE_LOG_ERR, logtype_main,
+		SFC_LOG(sas, RTE_LOG_ERR, logtype_main,
 			"%s Rx datapath does not support multi-process",
 			sas->dp_rx_name);
 		rc = EINVAL;
@@ -1963,13 +1957,13 @@ sfc_eth_dev_secondary_init(struct rte_eth_dev *dev, uint32_t logtype_main)
 
 	dp_tx = sfc_dp_find_tx_by_name(&sfc_dp_head, sas->dp_tx_name);
 	if (dp_tx == NULL) {
-		SFC_LOG(sa, RTE_LOG_ERR, logtype_main,
+		SFC_LOG(sas, RTE_LOG_ERR, logtype_main,
 			"cannot find %s Tx datapath", sas->dp_tx_name);
 		rc = ENOENT;
 		goto fail_dp_tx;
 	}
 	if (~dp_tx->features & SFC_DP_TX_FEAT_MULTI_PROCESS) {
-		SFC_LOG(sa, RTE_LOG_ERR, logtype_main,
+		SFC_LOG(sas, RTE_LOG_ERR, logtype_main,
 			"%s Tx datapath does not support multi-process",
 			sas->dp_tx_name);
 		rc = EINVAL;
diff --git a/drivers/net/sfc/sfc_log.h b/drivers/net/sfc/sfc_log.h
index 97de9ae53..62c4f4dd1 100644
--- a/drivers/net/sfc/sfc_log.h
+++ b/drivers/net/sfc/sfc_log.h
@@ -32,11 +32,10 @@ extern uint32_t sfc_logtype_driver;
 #define SFC_LOG_LEVEL_MCDI	RTE_LOG_INFO
 
 /* Log PMD message, automatically add prefix and \n */
-#define SFC_LOG(sa, level, type, ...) \
+#define SFC_LOG(sas, level, type, ...) \
 	do {								\
-		const struct sfc_adapter_shared *_sas;			\
+		const struct sfc_adapter_shared *_sas = (sas);		\
 									\
-		_sas = (sa)->priv.shared;				\
 		rte_log(level, type,					\
 			RTE_FMT("PMD: sfc_efx "				\
 				PCI_PRI_FMT " #%" PRIu16		\
@@ -53,39 +52,40 @@ extern uint32_t sfc_logtype_driver;
 	do {								\
 		const struct sfc_adapter *_sa = (sa);			\
 									\
-		SFC_LOG(_sa, RTE_LOG_ERR, _sa->priv.logtype_main,	\
-			__VA_ARGS__);					\
+		SFC_LOG(_sa->priv.shared, RTE_LOG_ERR,			\
+			_sa->priv.logtype_main, __VA_ARGS__);		\
 	} while (0)
 
 #define sfc_warn(sa, ...) \
 	do {								\
 		const struct sfc_adapter *_sa = (sa);			\
 									\
-		SFC_LOG(_sa, RTE_LOG_WARNING, _sa->priv.logtype_main,	\
-			__VA_ARGS__);					\
+		SFC_LOG(_sa->priv.shared, RTE_LOG_WARNING,		\
+			_sa->priv.logtype_main, __VA_ARGS__);		\
 	} while (0)
 
 #define sfc_notice(sa, ...) \
 	do {								\
 		const struct sfc_adapter *_sa = (sa);			\
 									\
-		SFC_LOG(_sa, RTE_LOG_NOTICE, _sa->priv.logtype_main,	\
-			__VA_ARGS__);					\
+		SFC_LOG(_sa->priv.shared, RTE_LOG_NOTICE,		\
+			_sa->priv.logtype_main, __VA_ARGS__);		\
 	} while (0)
 
 #define sfc_info(sa, ...) \
 	do {								\
 		const struct sfc_adapter *_sa = (sa);			\
 									\
-		SFC_LOG(_sa, RTE_LOG_INFO, _sa->priv.logtype_main,	\
-			__VA_ARGS__);					\
+		SFC_LOG(_sa->priv.shared, RTE_LOG_INFO,			\
+			_sa->priv.logtype_main, __VA_ARGS__);		\
 	} while (0)
 
 #define sfc_log_init(sa, ...) \
 	do {								\
 		const struct sfc_adapter *_sa = (sa);			\
 									\
-		SFC_LOG(_sa, RTE_LOG_INFO, _sa->priv.logtype_main,	\
+		SFC_LOG(_sa->priv.shared, RTE_LOG_INFO,			\
+			_sa->priv.logtype_main,				\
 			RTE_FMT("%s(): "				\
 				RTE_FMT_HEAD(__VA_ARGS__ ,),		\
 				__func__,				\
@@ -96,8 +96,8 @@ extern uint32_t sfc_logtype_driver;
 	do {								\
 		const struct sfc_adapter *_sa = (sa);			\
 									\
-		SFC_LOG(_sa, SFC_LOG_LEVEL_MCDI, _sa->mcdi.logtype,	\
-			__VA_ARGS__);					\
+		SFC_LOG(_sa->priv.shared, SFC_LOG_LEVEL_MCDI,		\
+			_sa->mcdi.logtype, __VA_ARGS__);		\
 	} while (0)
 
 
-- 
2.17.1

^ permalink raw reply	[flat|nested] 34+ messages in thread

* [dpdk-dev] [PATCH 24/30] net/sfc: move RxQ shared information to adapter shared
  2019-02-07 12:17 [dpdk-dev] [PATCH 00/30] net/sfc: improve multi-process support Andrew Rybchenko
                   ` (22 preceding siblings ...)
  2019-02-07 12:17 ` [dpdk-dev] [PATCH 23/30] net/sfc: make main logging macro reusable in secondary Andrew Rybchenko
@ 2019-02-07 12:17 ` Andrew Rybchenko
  2019-02-07 12:17 ` [dpdk-dev] [PATCH 25/30] net/sfc: move TxQ " Andrew Rybchenko
                   ` (6 subsequent siblings)
  30 siblings, 0 replies; 34+ messages in thread
From: Andrew Rybchenko @ 2019-02-07 12:17 UTC (permalink / raw)
  To: dev

Prepare to make sfc_adapter primary process private data.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
---
 drivers/net/sfc/sfc.h        |  11 +++-
 drivers/net/sfc/sfc_ethdev.c |  22 +++++---
 drivers/net/sfc/sfc_flow.c   |   6 +-
 drivers/net/sfc/sfc_rx.c     | 105 ++++++++++++++++++-----------------
 4 files changed, 80 insertions(+), 64 deletions(-)

diff --git a/drivers/net/sfc/sfc.h b/drivers/net/sfc/sfc.h
index 890a04d0e..21568f959 100644
--- a/drivers/net/sfc/sfc.h
+++ b/drivers/net/sfc/sfc.h
@@ -176,6 +176,9 @@ struct sfc_rss {
 
 /* Adapter private data shared by primary and secondary processes */
 struct sfc_adapter_shared {
+	unsigned int			rxq_count;
+	struct sfc_rxq_info		*rxq_info;
+
 	struct rte_pci_addr		pci_addr;
 	uint16_t			port_id;
 
@@ -271,8 +274,6 @@ struct sfc_adapter {
 	bool				mgmt_evq_running;
 	struct sfc_evq			*mgmt_evq;
 
-	unsigned int			rxq_count;
-	struct sfc_rxq_info		*rxq_info;
 	struct sfc_rxq			*rxq_ctrl;
 
 	unsigned int			txq_count;
@@ -294,6 +295,12 @@ sfc_adapter_shared_by_eth_dev(struct rte_eth_dev *eth_dev)
 	return sa->priv.shared;
 }
 
+static inline struct sfc_adapter_shared *
+sfc_sa2shared(struct sfc_adapter *sa)
+{
+	return sa->priv.shared;
+}
+
 /*
  * Add wrapper functions to acquire/release lock to be able to remove or
  * change the lock in one place.
diff --git a/drivers/net/sfc/sfc_ethdev.c b/drivers/net/sfc/sfc_ethdev.c
index e30217cf1..a84690bb0 100644
--- a/drivers/net/sfc/sfc_ethdev.c
+++ b/drivers/net/sfc/sfc_ethdev.c
@@ -402,6 +402,7 @@ sfc_rx_queue_setup(struct rte_eth_dev *dev, uint16_t rx_queue_id,
 		   const struct rte_eth_rxconf *rx_conf,
 		   struct rte_mempool *mb_pool)
 {
+	struct sfc_adapter_shared *sas = sfc_adapter_shared_by_eth_dev(dev);
 	struct sfc_adapter *sa = dev->data->dev_private;
 	int rc;
 
@@ -415,7 +416,7 @@ sfc_rx_queue_setup(struct rte_eth_dev *dev, uint16_t rx_queue_id,
 	if (rc != 0)
 		goto fail_rx_qinit;
 
-	dev->data->rx_queues[rx_queue_id] = sa->rxq_info[rx_queue_id].dp;
+	dev->data->rx_queues[rx_queue_id] = sas->rxq_info[rx_queue_id].dp;
 
 	sfc_adapter_unlock(sa);
 
@@ -1067,14 +1068,15 @@ static void
 sfc_rx_queue_info_get(struct rte_eth_dev *dev, uint16_t rx_queue_id,
 		      struct rte_eth_rxq_info *qinfo)
 {
+	struct sfc_adapter_shared *sas = sfc_adapter_shared_by_eth_dev(dev);
 	struct sfc_adapter *sa = dev->data->dev_private;
 	struct sfc_rxq_info *rxq_info;
 
 	sfc_adapter_lock(sa);
 
-	SFC_ASSERT(rx_queue_id < sa->rxq_count);
+	SFC_ASSERT(rx_queue_id < sas->rxq_count);
 
-	rxq_info = &sa->rxq_info[rx_queue_id];
+	rxq_info = &sas->rxq_info[rx_queue_id];
 
 	qinfo->mp = rxq_info->refill_mb_pool;
 	qinfo->conf.rx_free_thresh = rxq_info->refill_threshold;
@@ -1125,11 +1127,11 @@ static uint32_t
 sfc_rx_queue_count(struct rte_eth_dev *dev, uint16_t rx_queue_id)
 {
 	const struct sfc_adapter_priv *sap = sfc_adapter_priv_by_eth_dev(dev);
-	struct sfc_adapter *sa = dev->data->dev_private;
+	struct sfc_adapter_shared *sas = sfc_adapter_shared_by_eth_dev(dev);
 	struct sfc_rxq_info *rxq_info;
 
-	SFC_ASSERT(rx_queue_id < sa->rxq_count);
-	rxq_info = &sa->rxq_info[rx_queue_id];
+	SFC_ASSERT(rx_queue_id < sas->rxq_count);
+	rxq_info = &sas->rxq_info[rx_queue_id];
 
 	if ((rxq_info->state & SFC_RXQ_STARTED) == 0)
 		return 0;
@@ -1185,6 +1187,7 @@ sfc_tx_descriptor_status(void *queue, uint16_t offset)
 static int
 sfc_rx_queue_start(struct rte_eth_dev *dev, uint16_t rx_queue_id)
 {
+	struct sfc_adapter_shared *sas = sfc_adapter_shared_by_eth_dev(dev);
 	struct sfc_adapter *sa = dev->data->dev_private;
 	int rc;
 
@@ -1196,14 +1199,14 @@ sfc_rx_queue_start(struct rte_eth_dev *dev, uint16_t rx_queue_id)
 	if (sa->state != SFC_ADAPTER_STARTED)
 		goto fail_not_started;
 
-	if (sa->rxq_info[rx_queue_id].state != SFC_RXQ_INITIALIZED)
+	if (sas->rxq_info[rx_queue_id].state != SFC_RXQ_INITIALIZED)
 		goto fail_not_setup;
 
 	rc = sfc_rx_qstart(sa, rx_queue_id);
 	if (rc != 0)
 		goto fail_rx_qstart;
 
-	sa->rxq_info[rx_queue_id].deferred_started = B_TRUE;
+	sas->rxq_info[rx_queue_id].deferred_started = B_TRUE;
 
 	sfc_adapter_unlock(sa);
 
@@ -1220,6 +1223,7 @@ sfc_rx_queue_start(struct rte_eth_dev *dev, uint16_t rx_queue_id)
 static int
 sfc_rx_queue_stop(struct rte_eth_dev *dev, uint16_t rx_queue_id)
 {
+	struct sfc_adapter_shared *sas = sfc_adapter_shared_by_eth_dev(dev);
 	struct sfc_adapter *sa = dev->data->dev_private;
 
 	sfc_log_init(sa, "RxQ=%u", rx_queue_id);
@@ -1227,7 +1231,7 @@ sfc_rx_queue_stop(struct rte_eth_dev *dev, uint16_t rx_queue_id)
 	sfc_adapter_lock(sa);
 	sfc_rx_qstop(sa, rx_queue_id);
 
-	sa->rxq_info[rx_queue_id].deferred_started = B_FALSE;
+	sas->rxq_info[rx_queue_id].deferred_started = B_FALSE;
 
 	sfc_adapter_unlock(sa);
 
diff --git a/drivers/net/sfc/sfc_flow.c b/drivers/net/sfc/sfc_flow.c
index e20c2e612..ab5f24f51 100644
--- a/drivers/net/sfc/sfc_flow.c
+++ b/drivers/net/sfc/sfc_flow.c
@@ -1241,7 +1241,7 @@ sfc_flow_parse_queue(struct sfc_adapter *sa,
 {
 	struct sfc_rxq *rxq;
 
-	if (queue->index >= sa->rxq_count)
+	if (queue->index >= sfc_sa2shared(sa)->rxq_count)
 		return -EINVAL;
 
 	rxq = &sa->rxq_ctrl[queue->index];
@@ -1268,7 +1268,7 @@ sfc_flow_parse_rss(struct sfc_adapter *sa,
 	if (action_rss->queue_num == 0)
 		return -EINVAL;
 
-	rxq_sw_index = sa->rxq_count - 1;
+	rxq_sw_index = sfc_sa2shared(sa)->rxq_count - 1;
 	rxq = &sa->rxq_ctrl[rxq_sw_index];
 	rxq_hw_index_min = rxq->hw_index;
 	rxq_hw_index_max = 0;
@@ -1276,7 +1276,7 @@ sfc_flow_parse_rss(struct sfc_adapter *sa,
 	for (i = 0; i < action_rss->queue_num; ++i) {
 		rxq_sw_index = action_rss->queue[i];
 
-		if (rxq_sw_index >= sa->rxq_count)
+		if (rxq_sw_index >= sfc_sa2shared(sa)->rxq_count)
 			return -EINVAL;
 
 		rxq = &sa->rxq_ctrl[rxq_sw_index];
diff --git a/drivers/net/sfc/sfc_rx.c b/drivers/net/sfc/sfc_rx.c
index eb4875fec..8af9d2148 100644
--- a/drivers/net/sfc/sfc_rx.c
+++ b/drivers/net/sfc/sfc_rx.c
@@ -381,15 +381,15 @@ sfc_rxq_info_by_dp_rxq(const struct sfc_dp_rxq *dp_rxq)
 {
 	const struct sfc_dp_queue *dpq = &dp_rxq->dpq;
 	struct rte_eth_dev *eth_dev;
-	struct sfc_adapter *sa;
+	struct sfc_adapter_shared *sas;
 
 	SFC_ASSERT(rte_eth_dev_is_valid_port(dpq->port_id));
 	eth_dev = &rte_eth_devices[dpq->port_id];
 
-	sa = eth_dev->data->dev_private;
+	sas = sfc_adapter_shared_by_eth_dev(eth_dev);
 
-	SFC_ASSERT(dpq->queue_id < sa->rxq_count);
-	return &sa->rxq_info[dpq->queue_id];
+	SFC_ASSERT(dpq->queue_id < sas->rxq_count);
+	return &sas->rxq_info[dpq->queue_id];
 }
 
 struct sfc_rxq *
@@ -404,7 +404,7 @@ sfc_rxq_by_dp_rxq(const struct sfc_dp_rxq *dp_rxq)
 
 	sa = eth_dev->data->dev_private;
 
-	SFC_ASSERT(dpq->queue_id < sa->rxq_count);
+	SFC_ASSERT(dpq->queue_id < sfc_sa2shared(sa)->rxq_count);
 	return &sa->rxq_ctrl[dpq->queue_id];
 }
 
@@ -567,7 +567,7 @@ sfc_rx_qflush(struct sfc_adapter *sa, unsigned int sw_index)
 	unsigned int wait_count;
 	int rc;
 
-	rxq_info = &sa->rxq_info[sw_index];
+	rxq_info = &sfc_sa2shared(sa)->rxq_info[sw_index];
 	SFC_ASSERT(rxq_info->state & SFC_RXQ_STARTED);
 
 	rxq = &sa->rxq_ctrl[sw_index];
@@ -677,9 +677,9 @@ sfc_rx_qstart(struct sfc_adapter *sa, unsigned int sw_index)
 
 	sfc_log_init(sa, "sw_index=%u", sw_index);
 
-	SFC_ASSERT(sw_index < sa->rxq_count);
+	SFC_ASSERT(sw_index < sfc_sa2shared(sa)->rxq_count);
 
-	rxq_info = &sa->rxq_info[sw_index];
+	rxq_info = &sfc_sa2shared(sa)->rxq_info[sw_index];
 	SFC_ASSERT(rxq_info->state == SFC_RXQ_INITIALIZED);
 
 	rxq = &sa->rxq_ctrl[sw_index];
@@ -766,9 +766,9 @@ sfc_rx_qstop(struct sfc_adapter *sa, unsigned int sw_index)
 
 	sfc_log_init(sa, "sw_index=%u", sw_index);
 
-	SFC_ASSERT(sw_index < sa->rxq_count);
+	SFC_ASSERT(sw_index < sfc_sa2shared(sa)->rxq_count);
 
-	rxq_info = &sa->rxq_info[sw_index];
+	rxq_info = &sfc_sa2shared(sa)->rxq_info[sw_index];
 
 	if (rxq_info->state == SFC_RXQ_INITIALIZED)
 		return;
@@ -1007,8 +1007,8 @@ sfc_rx_qinit(struct sfc_adapter *sa, unsigned int sw_index,
 		goto fail_bad_conf;
 	}
 
-	SFC_ASSERT(sw_index < sa->rxq_count);
-	rxq_info = &sa->rxq_info[sw_index];
+	SFC_ASSERT(sw_index < sfc_sa2shared(sa)->rxq_count);
+	rxq_info = &sfc_sa2shared(sa)->rxq_info[sw_index];
 
 	SFC_ASSERT(rxq_entries <= rxq_info->max_entries);
 	rxq_info->entries = rxq_entries;
@@ -1098,10 +1098,10 @@ sfc_rx_qfini(struct sfc_adapter *sa, unsigned int sw_index)
 	struct sfc_rxq_info *rxq_info;
 	struct sfc_rxq *rxq;
 
-	SFC_ASSERT(sw_index < sa->rxq_count);
+	SFC_ASSERT(sw_index < sfc_sa2shared(sa)->rxq_count);
 	sa->eth_dev->data->rx_queues[sw_index] = NULL;
 
-	rxq_info = &sa->rxq_info[sw_index];
+	rxq_info = &sfc_sa2shared(sa)->rxq_info[sw_index];
 
 	SFC_ASSERT(rxq_info->state == SFC_RXQ_INITIALIZED);
 
@@ -1345,10 +1345,11 @@ sfc_rx_rss_config(struct sfc_adapter *sa)
 int
 sfc_rx_start(struct sfc_adapter *sa)
 {
+	struct sfc_adapter_shared * const sas = sfc_sa2shared(sa);
 	unsigned int sw_index;
 	int rc;
 
-	sfc_log_init(sa, "rxq_count=%u", sa->rxq_count);
+	sfc_log_init(sa, "rxq_count=%u", sas->rxq_count);
 
 	rc = efx_rx_init(sa->nic);
 	if (rc != 0)
@@ -1358,10 +1359,10 @@ sfc_rx_start(struct sfc_adapter *sa)
 	if (rc != 0)
 		goto fail_rss_config;
 
-	for (sw_index = 0; sw_index < sa->rxq_count; ++sw_index) {
-		if (sa->rxq_info[sw_index].state == SFC_RXQ_INITIALIZED &&
-		    (!sa->rxq_info[sw_index].deferred_start ||
-		     sa->rxq_info[sw_index].deferred_started)) {
+	for (sw_index = 0; sw_index < sas->rxq_count; ++sw_index) {
+		if (sas->rxq_info[sw_index].state == SFC_RXQ_INITIALIZED &&
+		    (!sas->rxq_info[sw_index].deferred_start ||
+		     sas->rxq_info[sw_index].deferred_started)) {
 			rc = sfc_rx_qstart(sa, sw_index);
 			if (rc != 0)
 				goto fail_rx_qstart;
@@ -1385,13 +1386,14 @@ sfc_rx_start(struct sfc_adapter *sa)
 void
 sfc_rx_stop(struct sfc_adapter *sa)
 {
+	struct sfc_adapter_shared * const sas = sfc_sa2shared(sa);
 	unsigned int sw_index;
 
-	sfc_log_init(sa, "rxq_count=%u", sa->rxq_count);
+	sfc_log_init(sa, "rxq_count=%u", sas->rxq_count);
 
-	sw_index = sa->rxq_count;
+	sw_index = sas->rxq_count;
 	while (sw_index-- > 0) {
-		if (sa->rxq_info[sw_index].state & SFC_RXQ_STARTED)
+		if (sas->rxq_info[sw_index].state & SFC_RXQ_STARTED)
 			sfc_rx_qstop(sa, sw_index);
 	}
 
@@ -1401,7 +1403,8 @@ sfc_rx_stop(struct sfc_adapter *sa)
 static int
 sfc_rx_qinit_info(struct sfc_adapter *sa, unsigned int sw_index)
 {
-	struct sfc_rxq_info *rxq_info = &sa->rxq_info[sw_index];
+	struct sfc_adapter_shared * const sas = sfc_sa2shared(sa);
+	struct sfc_rxq_info *rxq_info = &sas->rxq_info[sw_index];
 	unsigned int max_entries;
 
 	max_entries = EFX_RXQ_MAXNDESCS;
@@ -1463,17 +1466,18 @@ sfc_rx_check_mode(struct sfc_adapter *sa, struct rte_eth_rxmode *rxmode)
 static void
 sfc_rx_fini_queues(struct sfc_adapter *sa, unsigned int nb_rx_queues)
 {
+	struct sfc_adapter_shared * const sas = sfc_sa2shared(sa);
 	int sw_index;
 
-	SFC_ASSERT(nb_rx_queues <= sa->rxq_count);
+	SFC_ASSERT(nb_rx_queues <= sas->rxq_count);
 
-	sw_index = sa->rxq_count;
+	sw_index = sas->rxq_count;
 	while (--sw_index >= (int)nb_rx_queues) {
-		if (sa->rxq_info[sw_index].state & SFC_RXQ_INITIALIZED)
+		if (sas->rxq_info[sw_index].state & SFC_RXQ_INITIALIZED)
 			sfc_rx_qfini(sa, sw_index);
 	}
 
-	sa->rxq_count = nb_rx_queues;
+	sas->rxq_count = nb_rx_queues;
 }
 
 /**
@@ -1487,27 +1491,28 @@ sfc_rx_fini_queues(struct sfc_adapter *sa, unsigned int nb_rx_queues)
 int
 sfc_rx_configure(struct sfc_adapter *sa)
 {
+	struct sfc_adapter_shared * const sas = sfc_sa2shared(sa);
 	struct sfc_rss *rss = &sa->rss;
 	struct rte_eth_conf *dev_conf = &sa->eth_dev->data->dev_conf;
 	const unsigned int nb_rx_queues = sa->eth_dev->data->nb_rx_queues;
 	int rc;
 
 	sfc_log_init(sa, "nb_rx_queues=%u (old %u)",
-		     nb_rx_queues, sa->rxq_count);
+		     nb_rx_queues, sas->rxq_count);
 
 	rc = sfc_rx_check_mode(sa, &dev_conf->rxmode);
 	if (rc != 0)
 		goto fail_check_mode;
 
-	if (nb_rx_queues == sa->rxq_count)
+	if (nb_rx_queues == sas->rxq_count)
 		goto configure_rss;
 
-	if (sa->rxq_info == NULL) {
+	if (sas->rxq_info == NULL) {
 		rc = ENOMEM;
-		sa->rxq_info = rte_calloc_socket("sfc-rxqs", nb_rx_queues,
-						 sizeof(sa->rxq_info[0]), 0,
-						 sa->socket_id);
-		if (sa->rxq_info == NULL)
+		sas->rxq_info = rte_calloc_socket("sfc-rxqs", nb_rx_queues,
+						  sizeof(sas->rxq_info[0]), 0,
+						  sa->socket_id);
+		if (sas->rxq_info == NULL)
 			goto fail_rxqs_alloc;
 
 		/*
@@ -1522,13 +1527,13 @@ sfc_rx_configure(struct sfc_adapter *sa)
 		struct sfc_rxq_info *new_rxq_info;
 		struct sfc_rxq *new_rxq_ctrl;
 
-		if (nb_rx_queues < sa->rxq_count)
+		if (nb_rx_queues < sas->rxq_count)
 			sfc_rx_fini_queues(sa, nb_rx_queues);
 
 		rc = ENOMEM;
 		new_rxq_info =
-			rte_realloc(sa->rxq_info,
-				    nb_rx_queues * sizeof(sa->rxq_info[0]), 0);
+			rte_realloc(sas->rxq_info,
+				    nb_rx_queues * sizeof(sas->rxq_info[0]), 0);
 		if (new_rxq_info == NULL && nb_rx_queues > 0)
 			goto fail_rxqs_realloc;
 
@@ -1538,29 +1543,29 @@ sfc_rx_configure(struct sfc_adapter *sa)
 		if (new_rxq_ctrl == NULL && nb_rx_queues > 0)
 			goto fail_rxqs_ctrl_realloc;
 
-		sa->rxq_info = new_rxq_info;
+		sas->rxq_info = new_rxq_info;
 		sa->rxq_ctrl = new_rxq_ctrl;
-		if (nb_rx_queues > sa->rxq_count) {
-			memset(&sa->rxq_info[sa->rxq_count], 0,
-			       (nb_rx_queues - sa->rxq_count) *
-			       sizeof(sa->rxq_info[0]));
-			memset(&sa->rxq_ctrl[sa->rxq_count], 0,
-			       (nb_rx_queues - sa->rxq_count) *
+		if (nb_rx_queues > sas->rxq_count) {
+			memset(&sas->rxq_info[sas->rxq_count], 0,
+			       (nb_rx_queues - sas->rxq_count) *
+			       sizeof(sas->rxq_info[0]));
+			memset(&sa->rxq_ctrl[sas->rxq_count], 0,
+			       (nb_rx_queues - sas->rxq_count) *
 			       sizeof(sa->rxq_ctrl[0]));
 		}
 	}
 
-	while (sa->rxq_count < nb_rx_queues) {
-		rc = sfc_rx_qinit_info(sa, sa->rxq_count);
+	while (sas->rxq_count < nb_rx_queues) {
+		rc = sfc_rx_qinit_info(sa, sas->rxq_count);
 		if (rc != 0)
 			goto fail_rx_qinit_info;
 
-		sa->rxq_count++;
+		sas->rxq_count++;
 	}
 
 configure_rss:
 	rss->channels = (dev_conf->rxmode.mq_mode == ETH_MQ_RX_RSS) ?
-			 MIN(sa->rxq_count, EFX_MAXRSS) : 0;
+			 MIN(sas->rxq_count, EFX_MAXRSS) : 0;
 
 	if (rss->channels > 0) {
 		struct rte_eth_rss_conf *adv_conf_rss;
@@ -1607,6 +1612,6 @@ sfc_rx_close(struct sfc_adapter *sa)
 	free(sa->rxq_ctrl);
 	sa->rxq_ctrl = NULL;
 
-	rte_free(sa->rxq_info);
-	sa->rxq_info = NULL;
+	rte_free(sfc_sa2shared(sa)->rxq_info);
+	sfc_sa2shared(sa)->rxq_info = NULL;
 }
-- 
2.17.1

^ permalink raw reply	[flat|nested] 34+ messages in thread

* [dpdk-dev] [PATCH 25/30] net/sfc: move TxQ shared information to adapter shared
  2019-02-07 12:17 [dpdk-dev] [PATCH 00/30] net/sfc: improve multi-process support Andrew Rybchenko
                   ` (23 preceding siblings ...)
  2019-02-07 12:17 ` [dpdk-dev] [PATCH 24/30] net/sfc: move RxQ shared information to adapter shared Andrew Rybchenko
@ 2019-02-07 12:17 ` Andrew Rybchenko
  2019-02-07 12:17 ` [dpdk-dev] [PATCH 26/30] net/sfc: move RSS config " Andrew Rybchenko
                   ` (5 subsequent siblings)
  30 siblings, 0 replies; 34+ messages in thread
From: Andrew Rybchenko @ 2019-02-07 12:17 UTC (permalink / raw)
  To: dev

Prepare to make sfc_adapter primary process private data.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
---
 drivers/net/sfc/sfc.c        |   5 +-
 drivers/net/sfc/sfc.h        |   6 +--
 drivers/net/sfc/sfc_ethdev.c |  16 +++---
 drivers/net/sfc/sfc_tx.c     | 100 +++++++++++++++++++----------------
 4 files changed, 69 insertions(+), 58 deletions(-)

diff --git a/drivers/net/sfc/sfc.c b/drivers/net/sfc/sfc.c
index dd662df0d..4e4c4e445 100644
--- a/drivers/net/sfc/sfc.c
+++ b/drivers/net/sfc/sfc.c
@@ -265,6 +265,7 @@ sfc_set_drv_limits(struct sfc_adapter *sa)
 static int
 sfc_set_fw_subvariant(struct sfc_adapter *sa)
 {
+	struct sfc_adapter_shared *sas = sfc_sa2shared(sa);
 	const efx_nic_cfg_t *encp = efx_nic_cfg_get(sa->nic);
 	uint64_t tx_offloads = sa->eth_dev->data->dev_conf.txmode.offloads;
 	unsigned int txq_index;
@@ -277,8 +278,8 @@ sfc_set_fw_subvariant(struct sfc_adapter *sa)
 		return 0;
 	}
 
-	for (txq_index = 0; txq_index < sa->txq_count; ++txq_index) {
-		struct sfc_txq_info *txq_info = &sa->txq_info[txq_index];
+	for (txq_index = 0; txq_index < sas->txq_count; ++txq_index) {
+		struct sfc_txq_info *txq_info = &sas->txq_info[txq_index];
 
 		if (txq_info->state & SFC_TXQ_INITIALIZED)
 			tx_offloads |= txq_info->offloads;
diff --git a/drivers/net/sfc/sfc.h b/drivers/net/sfc/sfc.h
index 21568f959..2c6715027 100644
--- a/drivers/net/sfc/sfc.h
+++ b/drivers/net/sfc/sfc.h
@@ -179,6 +179,9 @@ struct sfc_adapter_shared {
 	unsigned int			rxq_count;
 	struct sfc_rxq_info		*rxq_info;
 
+	unsigned int			txq_count;
+	struct sfc_txq_info		*txq_info;
+
 	struct rte_pci_addr		pci_addr;
 	uint16_t			port_id;
 
@@ -275,9 +278,6 @@ struct sfc_adapter {
 	struct sfc_evq			*mgmt_evq;
 
 	struct sfc_rxq			*rxq_ctrl;
-
-	unsigned int			txq_count;
-	struct sfc_txq_info		*txq_info;
 	struct sfc_txq			*txq_ctrl;
 
 	boolean_t			tso;
diff --git a/drivers/net/sfc/sfc_ethdev.c b/drivers/net/sfc/sfc_ethdev.c
index a84690bb0..6572aa1a0 100644
--- a/drivers/net/sfc/sfc_ethdev.c
+++ b/drivers/net/sfc/sfc_ethdev.c
@@ -457,6 +457,7 @@ sfc_tx_queue_setup(struct rte_eth_dev *dev, uint16_t tx_queue_id,
 		   uint16_t nb_tx_desc, unsigned int socket_id,
 		   const struct rte_eth_txconf *tx_conf)
 {
+	struct sfc_adapter_shared *sas = sfc_adapter_shared_by_eth_dev(dev);
 	struct sfc_adapter *sa = dev->data->dev_private;
 	int rc;
 
@@ -469,7 +470,7 @@ sfc_tx_queue_setup(struct rte_eth_dev *dev, uint16_t tx_queue_id,
 	if (rc != 0)
 		goto fail_tx_qinit;
 
-	dev->data->tx_queues[tx_queue_id] = sa->txq_info[tx_queue_id].dp;
+	dev->data->tx_queues[tx_queue_id] = sas->txq_info[tx_queue_id].dp;
 
 	sfc_adapter_unlock(sa);
 	return 0;
@@ -1100,14 +1101,15 @@ static void
 sfc_tx_queue_info_get(struct rte_eth_dev *dev, uint16_t tx_queue_id,
 		      struct rte_eth_txq_info *qinfo)
 {
+	struct sfc_adapter_shared *sas = sfc_adapter_shared_by_eth_dev(dev);
 	struct sfc_adapter *sa = dev->data->dev_private;
 	struct sfc_txq_info *txq_info;
 
 	sfc_adapter_lock(sa);
 
-	SFC_ASSERT(tx_queue_id < sa->txq_count);
+	SFC_ASSERT(tx_queue_id < sas->txq_count);
 
-	txq_info = &sa->txq_info[tx_queue_id];
+	txq_info = &sas->txq_info[tx_queue_id];
 
 	memset(qinfo, 0, sizeof(*qinfo));
 
@@ -1241,6 +1243,7 @@ sfc_rx_queue_stop(struct rte_eth_dev *dev, uint16_t rx_queue_id)
 static int
 sfc_tx_queue_start(struct rte_eth_dev *dev, uint16_t tx_queue_id)
 {
+	struct sfc_adapter_shared *sas = sfc_adapter_shared_by_eth_dev(dev);
 	struct sfc_adapter *sa = dev->data->dev_private;
 	int rc;
 
@@ -1252,14 +1255,14 @@ sfc_tx_queue_start(struct rte_eth_dev *dev, uint16_t tx_queue_id)
 	if (sa->state != SFC_ADAPTER_STARTED)
 		goto fail_not_started;
 
-	if (sa->txq_info[tx_queue_id].state != SFC_TXQ_INITIALIZED)
+	if (sas->txq_info[tx_queue_id].state != SFC_TXQ_INITIALIZED)
 		goto fail_not_setup;
 
 	rc = sfc_tx_qstart(sa, tx_queue_id);
 	if (rc != 0)
 		goto fail_tx_qstart;
 
-	sa->txq_info[tx_queue_id].deferred_started = B_TRUE;
+	sas->txq_info[tx_queue_id].deferred_started = B_TRUE;
 
 	sfc_adapter_unlock(sa);
 	return 0;
@@ -1276,6 +1279,7 @@ sfc_tx_queue_start(struct rte_eth_dev *dev, uint16_t tx_queue_id)
 static int
 sfc_tx_queue_stop(struct rte_eth_dev *dev, uint16_t tx_queue_id)
 {
+	struct sfc_adapter_shared *sas = sfc_adapter_shared_by_eth_dev(dev);
 	struct sfc_adapter *sa = dev->data->dev_private;
 
 	sfc_log_init(sa, "TxQ = %u", tx_queue_id);
@@ -1284,7 +1288,7 @@ sfc_tx_queue_stop(struct rte_eth_dev *dev, uint16_t tx_queue_id)
 
 	sfc_tx_qstop(sa, tx_queue_id);
 
-	sa->txq_info[tx_queue_id].deferred_started = B_FALSE;
+	sas->txq_info[tx_queue_id].deferred_started = B_FALSE;
 
 	sfc_adapter_unlock(sa);
 	return 0;
diff --git a/drivers/net/sfc/sfc_tx.c b/drivers/net/sfc/sfc_tx.c
index 94baf4530..515f4afdc 100644
--- a/drivers/net/sfc/sfc_tx.c
+++ b/drivers/net/sfc/sfc_tx.c
@@ -149,8 +149,8 @@ sfc_tx_qinit(struct sfc_adapter *sa, unsigned int sw_index,
 	if (rc != 0)
 		goto fail_bad_conf;
 
-	SFC_ASSERT(sw_index < sa->txq_count);
-	txq_info = &sa->txq_info[sw_index];
+	SFC_ASSERT(sw_index < sfc_sa2shared(sa)->txq_count);
+	txq_info = &sfc_sa2shared(sa)->txq_info[sw_index];
 
 	txq_info->entries = txq_entries;
 
@@ -224,10 +224,10 @@ sfc_tx_qfini(struct sfc_adapter *sa, unsigned int sw_index)
 
 	sfc_log_init(sa, "TxQ = %u", sw_index);
 
-	SFC_ASSERT(sw_index < sa->txq_count);
+	SFC_ASSERT(sw_index < sfc_sa2shared(sa)->txq_count);
 	sa->eth_dev->data->tx_queues[sw_index] = NULL;
 
-	txq_info = &sa->txq_info[sw_index];
+	txq_info = &sfc_sa2shared(sa)->txq_info[sw_index];
 
 	SFC_ASSERT(txq_info->state == SFC_TXQ_INITIALIZED);
 
@@ -296,29 +296,31 @@ sfc_tx_check_mode(struct sfc_adapter *sa, const struct rte_eth_txmode *txmode)
 static void
 sfc_tx_fini_queues(struct sfc_adapter *sa, unsigned int nb_tx_queues)
 {
+	struct sfc_adapter_shared * const sas = sfc_sa2shared(sa);
 	int sw_index;
 
-	SFC_ASSERT(nb_tx_queues <= sa->txq_count);
+	SFC_ASSERT(nb_tx_queues <= sas->txq_count);
 
-	sw_index = sa->txq_count;
+	sw_index = sas->txq_count;
 	while (--sw_index >= (int)nb_tx_queues) {
-		if (sa->txq_info[sw_index].state & SFC_TXQ_INITIALIZED)
+		if (sas->txq_info[sw_index].state & SFC_TXQ_INITIALIZED)
 			sfc_tx_qfini(sa, sw_index);
 	}
 
-	sa->txq_count = nb_tx_queues;
+	sas->txq_count = nb_tx_queues;
 }
 
 int
 sfc_tx_configure(struct sfc_adapter *sa)
 {
+	struct sfc_adapter_shared * const sas = sfc_sa2shared(sa);
 	const efx_nic_cfg_t *encp = efx_nic_cfg_get(sa->nic);
 	const struct rte_eth_conf *dev_conf = &sa->eth_dev->data->dev_conf;
 	const unsigned int nb_tx_queues = sa->eth_dev->data->nb_tx_queues;
 	int rc = 0;
 
 	sfc_log_init(sa, "nb_tx_queues=%u (old %u)",
-		     nb_tx_queues, sa->txq_count);
+		     nb_tx_queues, sas->txq_count);
 
 	/*
 	 * The datapath implementation assumes absence of boundary
@@ -334,14 +336,14 @@ sfc_tx_configure(struct sfc_adapter *sa)
 	if (rc != 0)
 		goto fail_check_mode;
 
-	if (nb_tx_queues == sa->txq_count)
+	if (nb_tx_queues == sas->txq_count)
 		goto done;
 
-	if (sa->txq_info == NULL) {
-		sa->txq_info = rte_calloc_socket("sfc-txqs", nb_tx_queues,
-						 sizeof(sa->txq_info[0]), 0,
-						 sa->socket_id);
-		if (sa->txq_info == NULL)
+	if (sas->txq_info == NULL) {
+		sas->txq_info = rte_calloc_socket("sfc-txqs", nb_tx_queues,
+						  sizeof(sas->txq_info[0]), 0,
+						  sa->socket_id);
+		if (sas->txq_info == NULL)
 			goto fail_txqs_alloc;
 
 		/*
@@ -356,12 +358,12 @@ sfc_tx_configure(struct sfc_adapter *sa)
 		struct sfc_txq_info *new_txq_info;
 		struct sfc_txq *new_txq_ctrl;
 
-		if (nb_tx_queues < sa->txq_count)
+		if (nb_tx_queues < sas->txq_count)
 			sfc_tx_fini_queues(sa, nb_tx_queues);
 
 		new_txq_info =
-			rte_realloc(sa->txq_info,
-				    nb_tx_queues * sizeof(sa->txq_info[0]), 0);
+			rte_realloc(sas->txq_info,
+				    nb_tx_queues * sizeof(sas->txq_info[0]), 0);
 		if (new_txq_info == NULL && nb_tx_queues > 0)
 			goto fail_txqs_realloc;
 
@@ -370,24 +372,24 @@ sfc_tx_configure(struct sfc_adapter *sa)
 		if (new_txq_ctrl == NULL && nb_tx_queues > 0)
 			goto fail_txqs_ctrl_realloc;
 
-		sa->txq_info = new_txq_info;
+		sas->txq_info = new_txq_info;
 		sa->txq_ctrl = new_txq_ctrl;
-		if (nb_tx_queues > sa->txq_count) {
-			memset(&sa->txq_info[sa->txq_count], 0,
-			       (nb_tx_queues - sa->txq_count) *
-			       sizeof(sa->txq_info[0]));
-			memset(&sa->txq_ctrl[sa->txq_count], 0,
-			       (nb_tx_queues - sa->txq_count) *
+		if (nb_tx_queues > sas->txq_count) {
+			memset(&sas->txq_info[sas->txq_count], 0,
+			       (nb_tx_queues - sas->txq_count) *
+			       sizeof(sas->txq_info[0]));
+			memset(&sa->txq_ctrl[sas->txq_count], 0,
+			       (nb_tx_queues - sas->txq_count) *
 			       sizeof(sa->txq_ctrl[0]));
 		}
 	}
 
-	while (sa->txq_count < nb_tx_queues) {
-		rc = sfc_tx_qinit_info(sa, sa->txq_count);
+	while (sas->txq_count < nb_tx_queues) {
+		rc = sfc_tx_qinit_info(sa, sas->txq_count);
 		if (rc != 0)
 			goto fail_tx_qinit_info;
 
-		sa->txq_count++;
+		sas->txq_count++;
 	}
 
 done:
@@ -414,13 +416,14 @@ sfc_tx_close(struct sfc_adapter *sa)
 	free(sa->txq_ctrl);
 	sa->txq_ctrl = NULL;
 
-	rte_free(sa->txq_info);
-	sa->txq_info = NULL;
+	rte_free(sfc_sa2shared(sa)->txq_info);
+	sfc_sa2shared(sa)->txq_info = NULL;
 }
 
 int
 sfc_tx_qstart(struct sfc_adapter *sa, unsigned int sw_index)
 {
+	struct sfc_adapter_shared * const sas = sfc_sa2shared(sa);
 	uint64_t offloads_supported = sfc_tx_get_dev_offload_caps(sa) |
 				      sfc_tx_get_queue_offload_caps(sa);
 	struct rte_eth_dev_data *dev_data;
@@ -433,8 +436,8 @@ sfc_tx_qstart(struct sfc_adapter *sa, unsigned int sw_index)
 
 	sfc_log_init(sa, "TxQ = %u", sw_index);
 
-	SFC_ASSERT(sw_index < sa->txq_count);
-	txq_info = &sa->txq_info[sw_index];
+	SFC_ASSERT(sw_index < sas->txq_count);
+	txq_info = &sas->txq_info[sw_index];
 
 	SFC_ASSERT(txq_info->state == SFC_TXQ_INITIALIZED);
 
@@ -503,6 +506,7 @@ sfc_tx_qstart(struct sfc_adapter *sa, unsigned int sw_index)
 void
 sfc_tx_qstop(struct sfc_adapter *sa, unsigned int sw_index)
 {
+	struct sfc_adapter_shared * const sas = sfc_sa2shared(sa);
 	struct rte_eth_dev_data *dev_data;
 	struct sfc_txq_info *txq_info;
 	struct sfc_txq *txq;
@@ -512,8 +516,8 @@ sfc_tx_qstop(struct sfc_adapter *sa, unsigned int sw_index)
 
 	sfc_log_init(sa, "TxQ = %u", sw_index);
 
-	SFC_ASSERT(sw_index < sa->txq_count);
-	txq_info = &sa->txq_info[sw_index];
+	SFC_ASSERT(sw_index < sas->txq_count);
+	txq_info = &sas->txq_info[sw_index];
 
 	if (txq_info->state == SFC_TXQ_INITIALIZED)
 		return;
@@ -576,10 +580,11 @@ sfc_tx_qstop(struct sfc_adapter *sa, unsigned int sw_index)
 int
 sfc_tx_start(struct sfc_adapter *sa)
 {
+	struct sfc_adapter_shared * const sas = sfc_sa2shared(sa);
 	unsigned int sw_index;
 	int rc = 0;
 
-	sfc_log_init(sa, "txq_count = %u", sa->txq_count);
+	sfc_log_init(sa, "txq_count = %u", sas->txq_count);
 
 	if (sa->tso) {
 		if (!efx_nic_cfg_get(sa->nic)->enc_fw_assisted_tso_v2_enabled) {
@@ -592,10 +597,10 @@ sfc_tx_start(struct sfc_adapter *sa)
 	if (rc != 0)
 		goto fail_efx_tx_init;
 
-	for (sw_index = 0; sw_index < sa->txq_count; ++sw_index) {
-		if (sa->txq_info[sw_index].state == SFC_TXQ_INITIALIZED &&
-		    (!(sa->txq_info[sw_index].deferred_start) ||
-		     sa->txq_info[sw_index].deferred_started)) {
+	for (sw_index = 0; sw_index < sas->txq_count; ++sw_index) {
+		if (sas->txq_info[sw_index].state == SFC_TXQ_INITIALIZED &&
+		    (!(sas->txq_info[sw_index].deferred_start) ||
+		     sas->txq_info[sw_index].deferred_started)) {
 			rc = sfc_tx_qstart(sa, sw_index);
 			if (rc != 0)
 				goto fail_tx_qstart;
@@ -618,13 +623,14 @@ sfc_tx_start(struct sfc_adapter *sa)
 void
 sfc_tx_stop(struct sfc_adapter *sa)
 {
+	struct sfc_adapter_shared * const sas = sfc_sa2shared(sa);
 	unsigned int sw_index;
 
-	sfc_log_init(sa, "txq_count = %u", sa->txq_count);
+	sfc_log_init(sa, "txq_count = %u", sas->txq_count);
 
-	sw_index = sa->txq_count;
+	sw_index = sas->txq_count;
 	while (sw_index-- > 0) {
-		if (sa->txq_info[sw_index].state & SFC_TXQ_STARTED)
+		if (sas->txq_info[sw_index].state & SFC_TXQ_STARTED)
 			sfc_tx_qstop(sa, sw_index);
 	}
 
@@ -884,15 +890,15 @@ sfc_txq_info_by_dp_txq(const struct sfc_dp_txq *dp_txq)
 {
 	const struct sfc_dp_queue *dpq = &dp_txq->dpq;
 	struct rte_eth_dev *eth_dev;
-	struct sfc_adapter *sa;
+	struct sfc_adapter_shared *sas;
 
 	SFC_ASSERT(rte_eth_dev_is_valid_port(dpq->port_id));
 	eth_dev = &rte_eth_devices[dpq->port_id];
 
-	sa = eth_dev->data->dev_private;
+	sas = sfc_adapter_shared_by_eth_dev(eth_dev);
 
-	SFC_ASSERT(dpq->queue_id < sa->txq_count);
-	return &sa->txq_info[dpq->queue_id];
+	SFC_ASSERT(dpq->queue_id < sas->txq_count);
+	return &sas->txq_info[dpq->queue_id];
 }
 
 struct sfc_txq *
@@ -907,7 +913,7 @@ sfc_txq_by_dp_txq(const struct sfc_dp_txq *dp_txq)
 
 	sa = eth_dev->data->dev_private;
 
-	SFC_ASSERT(dpq->queue_id < sa->txq_count);
+	SFC_ASSERT(dpq->queue_id < sfc_sa2shared(sa)->txq_count);
 	return &sa->txq_ctrl[dpq->queue_id];
 }
 
-- 
2.17.1

^ permalink raw reply	[flat|nested] 34+ messages in thread

* [dpdk-dev] [PATCH 26/30] net/sfc: move RSS config to adapter shared
  2019-02-07 12:17 [dpdk-dev] [PATCH 00/30] net/sfc: improve multi-process support Andrew Rybchenko
                   ` (24 preceding siblings ...)
  2019-02-07 12:17 ` [dpdk-dev] [PATCH 25/30] net/sfc: move TxQ " Andrew Rybchenko
@ 2019-02-07 12:17 ` Andrew Rybchenko
  2019-02-07 12:17 ` [dpdk-dev] [PATCH 27/30] net/sfc: move isolated flag in " Andrew Rybchenko
                   ` (4 subsequent siblings)
  30 siblings, 0 replies; 34+ messages in thread
From: Andrew Rybchenko @ 2019-02-07 12:17 UTC (permalink / raw)
  To: dev

RSS get requests are supported in secondary process.

Prepare to make sfc_adapter primary process private data.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
---
 drivers/net/sfc/sfc.c        |  2 +-
 drivers/net/sfc/sfc.h        |  4 ++--
 drivers/net/sfc/sfc_ethdev.c | 15 +++++++++------
 drivers/net/sfc/sfc_flow.c   |  6 ++++--
 drivers/net/sfc/sfc_rx.c     | 26 +++++++++++++-------------
 drivers/net/sfc/sfc_rx.h     |  3 +--
 6 files changed, 30 insertions(+), 26 deletions(-)

diff --git a/drivers/net/sfc/sfc.c b/drivers/net/sfc/sfc.c
index 4e4c4e445..8526a84b5 100644
--- a/drivers/net/sfc/sfc.c
+++ b/drivers/net/sfc/sfc.c
@@ -642,7 +642,7 @@ static const uint8_t default_rss_key[EFX_RSS_KEY_SIZE] = {
 static int
 sfc_rss_attach(struct sfc_adapter *sa)
 {
-	struct sfc_rss *rss = &sa->rss;
+	struct sfc_rss *rss = &sfc_sa2shared(sa)->rss;
 	int rc;
 
 	rc = efx_intr_init(sa->nic, sa->intr.type, NULL);
diff --git a/drivers/net/sfc/sfc.h b/drivers/net/sfc/sfc.h
index 2c6715027..72992d68b 100644
--- a/drivers/net/sfc/sfc.h
+++ b/drivers/net/sfc/sfc.h
@@ -182,6 +182,8 @@ struct sfc_adapter_shared {
 	unsigned int			txq_count;
 	struct sfc_txq_info		*txq_info;
 
+	struct sfc_rss			rss;
+
 	struct rte_pci_addr		pci_addr;
 	uint16_t			port_id;
 
@@ -283,8 +285,6 @@ struct sfc_adapter {
 	boolean_t			tso;
 
 	uint32_t			rxd_wait_timeout_ns;
-
-	struct sfc_rss			rss;
 };
 
 static inline struct sfc_adapter_shared *
diff --git a/drivers/net/sfc/sfc_ethdev.c b/drivers/net/sfc/sfc_ethdev.c
index 6572aa1a0..034229f37 100644
--- a/drivers/net/sfc/sfc_ethdev.c
+++ b/drivers/net/sfc/sfc_ethdev.c
@@ -85,8 +85,9 @@ static void
 sfc_dev_infos_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
 {
 	const struct sfc_adapter_priv *sap = sfc_adapter_priv_by_eth_dev(dev);
+	struct sfc_adapter_shared *sas = sfc_adapter_shared_by_eth_dev(dev);
 	struct sfc_adapter *sa = dev->data->dev_private;
-	struct sfc_rss *rss = &sa->rss;
+	struct sfc_rss *rss = &sas->rss;
 	uint64_t txq_offloads_def = 0;
 
 	sfc_log_init(sa, "entry");
@@ -1419,8 +1420,9 @@ static int
 sfc_dev_rss_hash_conf_get(struct rte_eth_dev *dev,
 			  struct rte_eth_rss_conf *rss_conf)
 {
+	struct sfc_adapter_shared *sas = sfc_adapter_shared_by_eth_dev(dev);
 	struct sfc_adapter *sa = dev->data->dev_private;
-	struct sfc_rss *rss = &sa->rss;
+	struct sfc_rss *rss = &sas->rss;
 
 	if (rss->context_type != EFX_RX_SCALE_EXCLUSIVE)
 		return -ENOTSUP;
@@ -1433,7 +1435,7 @@ sfc_dev_rss_hash_conf_get(struct rte_eth_dev *dev,
 	 * flags which corresponds to the active EFX configuration stored
 	 * locally in 'sfc_adapter' and kept up-to-date
 	 */
-	rss_conf->rss_hf = sfc_rx_hf_efx_to_rte(sa, rss->hash_types);
+	rss_conf->rss_hf = sfc_rx_hf_efx_to_rte(rss, rss->hash_types);
 	rss_conf->rss_key_len = EFX_RSS_KEY_SIZE;
 	if (rss_conf->rss_key != NULL)
 		rte_memcpy(rss_conf->rss_key, rss->key, EFX_RSS_KEY_SIZE);
@@ -1448,7 +1450,7 @@ sfc_dev_rss_hash_update(struct rte_eth_dev *dev,
 			struct rte_eth_rss_conf *rss_conf)
 {
 	struct sfc_adapter *sa = dev->data->dev_private;
-	struct sfc_rss *rss = &sa->rss;
+	struct sfc_rss *rss = &sfc_sa2shared(sa)->rss;
 	struct sfc_port *port = &sa->port;
 	unsigned int efx_hash_types;
 	int rc = 0;
@@ -1524,8 +1526,9 @@ sfc_dev_rss_reta_query(struct rte_eth_dev *dev,
 		       struct rte_eth_rss_reta_entry64 *reta_conf,
 		       uint16_t reta_size)
 {
+	struct sfc_adapter_shared *sas = sfc_adapter_shared_by_eth_dev(dev);
 	struct sfc_adapter *sa = dev->data->dev_private;
-	struct sfc_rss *rss = &sa->rss;
+	struct sfc_rss *rss = &sas->rss;
 	struct sfc_port *port = &sa->port;
 	int entry;
 
@@ -1559,7 +1562,7 @@ sfc_dev_rss_reta_update(struct rte_eth_dev *dev,
 			uint16_t reta_size)
 {
 	struct sfc_adapter *sa = dev->data->dev_private;
-	struct sfc_rss *rss = &sa->rss;
+	struct sfc_rss *rss = &sfc_sa2shared(sa)->rss;
 	struct sfc_port *port = &sa->port;
 	unsigned int *rss_tbl_new;
 	uint16_t entry;
diff --git a/drivers/net/sfc/sfc_flow.c b/drivers/net/sfc/sfc_flow.c
index ab5f24f51..201c6cd06 100644
--- a/drivers/net/sfc/sfc_flow.c
+++ b/drivers/net/sfc/sfc_flow.c
@@ -1255,7 +1255,8 @@ sfc_flow_parse_rss(struct sfc_adapter *sa,
 		   const struct rte_flow_action_rss *action_rss,
 		   struct rte_flow *flow)
 {
-	struct sfc_rss *rss = &sa->rss;
+	struct sfc_adapter_shared * const sas = sfc_sa2shared(sa);
+	struct sfc_rss *rss = &sas->rss;
 	unsigned int rxq_sw_index;
 	struct sfc_rxq *rxq;
 	unsigned int rxq_hw_index_min;
@@ -1400,7 +1401,8 @@ static int
 sfc_flow_filter_insert(struct sfc_adapter *sa,
 		       struct rte_flow *flow)
 {
-	struct sfc_rss *rss = &sa->rss;
+	struct sfc_adapter_shared * const sas = sfc_sa2shared(sa);
+	struct sfc_rss *rss = &sas->rss;
 	struct sfc_flow_rss *flow_rss = &flow->rss_conf;
 	uint32_t efs_rss_context = EFX_RSS_CONTEXT_DEFAULT;
 	unsigned int i;
diff --git a/drivers/net/sfc/sfc_rx.c b/drivers/net/sfc/sfc_rx.c
index 8af9d2148..3b4b65f6e 100644
--- a/drivers/net/sfc/sfc_rx.c
+++ b/drivers/net/sfc/sfc_rx.c
@@ -618,7 +618,7 @@ sfc_rx_qflush(struct sfc_adapter *sa, unsigned int sw_index)
 static int
 sfc_rx_default_rxq_set_filter(struct sfc_adapter *sa, struct sfc_rxq *rxq)
 {
-	struct sfc_rss *rss = &sa->rss;
+	struct sfc_rss *rss = &sfc_sa2shared(sa)->rss;
 	boolean_t need_rss = (rss->channels > 0) ? B_TRUE : B_FALSE;
 	struct sfc_port *port = &sa->port;
 	int rc;
@@ -961,7 +961,7 @@ sfc_rx_qinit(struct sfc_adapter *sa, unsigned int sw_index,
 	     struct rte_mempool *mb_pool)
 {
 	const efx_nic_cfg_t *encp = efx_nic_cfg_get(sa->nic);
-	struct sfc_rss *rss = &sa->rss;
+	struct sfc_rss *rss = &sfc_sa2shared(sa)->rss;
 	int rc;
 	unsigned int rxq_entries;
 	unsigned int evq_entries;
@@ -1176,7 +1176,7 @@ sfc_rx_hash_types_mask_supp(efx_rx_hash_type_t hash_type,
 int
 sfc_rx_hash_init(struct sfc_adapter *sa)
 {
-	struct sfc_rss *rss = &sa->rss;
+	struct sfc_rss *rss = &sfc_sa2shared(sa)->rss;
 	const efx_nic_cfg_t *encp = efx_nic_cfg_get(sa->nic);
 	uint32_t alg_mask = encp->enc_rx_scale_hash_alg_mask;
 	efx_rx_hash_alg_t alg;
@@ -1232,7 +1232,7 @@ sfc_rx_hash_init(struct sfc_adapter *sa)
 void
 sfc_rx_hash_fini(struct sfc_adapter *sa)
 {
-	struct sfc_rss *rss = &sa->rss;
+	struct sfc_rss *rss = &sfc_sa2shared(sa)->rss;
 
 	rte_free(rss->hf_map);
 }
@@ -1241,7 +1241,7 @@ int
 sfc_rx_hf_rte_to_efx(struct sfc_adapter *sa, uint64_t rte,
 		     efx_rx_hash_type_t *efx)
 {
-	struct sfc_rss *rss = &sa->rss;
+	struct sfc_rss *rss = &sfc_sa2shared(sa)->rss;
 	efx_rx_hash_type_t hash_types = 0;
 	unsigned int i;
 
@@ -1265,9 +1265,8 @@ sfc_rx_hf_rte_to_efx(struct sfc_adapter *sa, uint64_t rte,
 }
 
 uint64_t
-sfc_rx_hf_efx_to_rte(struct sfc_adapter *sa, efx_rx_hash_type_t efx)
+sfc_rx_hf_efx_to_rte(struct sfc_rss *rss, efx_rx_hash_type_t efx)
 {
-	struct sfc_rss *rss = &sa->rss;
 	uint64_t rte = 0;
 	unsigned int i;
 
@@ -1285,9 +1284,9 @@ static int
 sfc_rx_process_adv_conf_rss(struct sfc_adapter *sa,
 			    struct rte_eth_rss_conf *conf)
 {
-	struct sfc_rss *rss = &sa->rss;
+	struct sfc_rss *rss = &sfc_sa2shared(sa)->rss;
 	efx_rx_hash_type_t efx_hash_types = rss->hash_types;
-	uint64_t rss_hf = sfc_rx_hf_efx_to_rte(sa, efx_hash_types);
+	uint64_t rss_hf = sfc_rx_hf_efx_to_rte(rss, efx_hash_types);
 	int rc;
 
 	if (rss->context_type != EFX_RX_SCALE_EXCLUSIVE) {
@@ -1319,7 +1318,7 @@ sfc_rx_process_adv_conf_rss(struct sfc_adapter *sa,
 static int
 sfc_rx_rss_config(struct sfc_adapter *sa)
 {
-	struct sfc_rss *rss = &sa->rss;
+	struct sfc_rss *rss = &sfc_sa2shared(sa)->rss;
 	int rc = 0;
 
 	if (rss->channels > 0) {
@@ -1418,9 +1417,10 @@ sfc_rx_qinit_info(struct sfc_adapter *sa, unsigned int sw_index)
 static int
 sfc_rx_check_mode(struct sfc_adapter *sa, struct rte_eth_rxmode *rxmode)
 {
+	struct sfc_adapter_shared * const sas = sfc_sa2shared(sa);
 	uint64_t offloads_supported = sfc_rx_get_dev_offload_caps(sa) |
 				      sfc_rx_get_queue_offload_caps(sa);
-	struct sfc_rss *rss = &sa->rss;
+	struct sfc_rss *rss = &sas->rss;
 	int rc = 0;
 
 	switch (rxmode->mq_mode) {
@@ -1492,7 +1492,7 @@ int
 sfc_rx_configure(struct sfc_adapter *sa)
 {
 	struct sfc_adapter_shared * const sas = sfc_sa2shared(sa);
-	struct sfc_rss *rss = &sa->rss;
+	struct sfc_rss *rss = &sas->rss;
 	struct rte_eth_conf *dev_conf = &sa->eth_dev->data->dev_conf;
 	const unsigned int nb_rx_queues = sa->eth_dev->data->nb_rx_queues;
 	int rc;
@@ -1603,7 +1603,7 @@ sfc_rx_configure(struct sfc_adapter *sa)
 void
 sfc_rx_close(struct sfc_adapter *sa)
 {
-	struct sfc_rss *rss = &sa->rss;
+	struct sfc_rss *rss = &sfc_sa2shared(sa)->rss;
 
 	sfc_rx_fini_queues(sa, 0);
 
diff --git a/drivers/net/sfc/sfc_rx.h b/drivers/net/sfc/sfc_rx.h
index 73b70249c..ee1402022 100644
--- a/drivers/net/sfc/sfc_rx.h
+++ b/drivers/net/sfc/sfc_rx.h
@@ -141,8 +141,7 @@ int sfc_rx_hash_init(struct sfc_adapter *sa);
 void sfc_rx_hash_fini(struct sfc_adapter *sa);
 int sfc_rx_hf_rte_to_efx(struct sfc_adapter *sa, uint64_t rte,
 			 efx_rx_hash_type_t *efx);
-uint64_t sfc_rx_hf_efx_to_rte(struct sfc_adapter *sa,
-			      efx_rx_hash_type_t efx);
+uint64_t sfc_rx_hf_efx_to_rte(struct sfc_rss *rss, efx_rx_hash_type_t efx);
 
 #ifdef __cplusplus
 }
-- 
2.17.1

^ permalink raw reply	[flat|nested] 34+ messages in thread

* [dpdk-dev] [PATCH 27/30] net/sfc: move isolated flag in adapter shared
  2019-02-07 12:17 [dpdk-dev] [PATCH 00/30] net/sfc: improve multi-process support Andrew Rybchenko
                   ` (25 preceding siblings ...)
  2019-02-07 12:17 ` [dpdk-dev] [PATCH 26/30] net/sfc: move RSS config " Andrew Rybchenko
@ 2019-02-07 12:17 ` Andrew Rybchenko
  2019-02-07 12:17 ` [dpdk-dev] [PATCH 28/30] net/sfc: remove adapter locks from secondary process ops Andrew Rybchenko
                   ` (3 subsequent siblings)
  30 siblings, 0 replies; 34+ messages in thread
From: Andrew Rybchenko @ 2019-02-07 12:17 UTC (permalink / raw)
  To: dev

The flag is required in default RSS RETA get which does not make sense
in isolated mode.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
---
 drivers/net/sfc/sfc.h        |  3 ++-
 drivers/net/sfc/sfc_ethdev.c | 15 ++++++---------
 drivers/net/sfc/sfc_flow.c   |  3 +--
 drivers/net/sfc/sfc_port.c   |  2 +-
 drivers/net/sfc/sfc_rx.c     |  3 +--
 5 files changed, 11 insertions(+), 15 deletions(-)

diff --git a/drivers/net/sfc/sfc.h b/drivers/net/sfc/sfc.h
index 72992d68b..e8569bbbc 100644
--- a/drivers/net/sfc/sfc.h
+++ b/drivers/net/sfc/sfc.h
@@ -131,7 +131,6 @@ struct sfc_port {
 	 * Flow API isolated mode overrides promisc and allmulti settings;
 	 * they won't be applied if isolated mode is active
 	 */
-	boolean_t			isolated;
 	boolean_t			promisc;
 	boolean_t			allmulti;
 
@@ -184,6 +183,8 @@ struct sfc_adapter_shared {
 
 	struct sfc_rss			rss;
 
+	boolean_t			isolated;
+
 	struct rte_pci_addr		pci_addr;
 	uint16_t			port_id;
 
diff --git a/drivers/net/sfc/sfc_ethdev.c b/drivers/net/sfc/sfc_ethdev.c
index 034229f37..c6bee09ee 100644
--- a/drivers/net/sfc/sfc_ethdev.c
+++ b/drivers/net/sfc/sfc_ethdev.c
@@ -357,7 +357,7 @@ sfc_dev_filter_set(struct rte_eth_dev *dev, enum sfc_dev_filter_mode mode,
 	if (*toggle != enabled) {
 		*toggle = enabled;
 
-		if (port->isolated) {
+		if (sfc_sa2shared(sa)->isolated) {
 			sfc_warn(sa, "isolated mode is active on the port");
 			sfc_warn(sa, "the change is to be applied on the next "
 				     "start provided that isolated mode is "
@@ -957,7 +957,7 @@ sfc_mac_addr_set(struct rte_eth_dev *dev, struct ether_addr *mac_addr)
 	 * on the next port start if the user prevents
 	 * isolated mode from being enabled.
 	 */
-	if (port->isolated) {
+	if (sfc_sa2shared(sa)->isolated) {
 		sfc_warn(sa, "isolated mode is active on the port");
 		sfc_warn(sa, "will not set MAC address");
 		goto unlock;
@@ -1027,7 +1027,7 @@ sfc_set_mc_addr_list(struct rte_eth_dev *dev, struct ether_addr *mc_addr_set,
 	int rc;
 	unsigned int i;
 
-	if (port->isolated) {
+	if (sfc_sa2shared(sa)->isolated) {
 		sfc_err(sa, "isolated mode is active on the port");
 		sfc_err(sa, "will not set multicast address list");
 		return -ENOTSUP;
@@ -1451,11 +1451,10 @@ sfc_dev_rss_hash_update(struct rte_eth_dev *dev,
 {
 	struct sfc_adapter *sa = dev->data->dev_private;
 	struct sfc_rss *rss = &sfc_sa2shared(sa)->rss;
-	struct sfc_port *port = &sa->port;
 	unsigned int efx_hash_types;
 	int rc = 0;
 
-	if (port->isolated)
+	if (sfc_sa2shared(sa)->isolated)
 		return -ENOTSUP;
 
 	if (rss->context_type != EFX_RX_SCALE_EXCLUSIVE) {
@@ -1529,10 +1528,9 @@ sfc_dev_rss_reta_query(struct rte_eth_dev *dev,
 	struct sfc_adapter_shared *sas = sfc_adapter_shared_by_eth_dev(dev);
 	struct sfc_adapter *sa = dev->data->dev_private;
 	struct sfc_rss *rss = &sas->rss;
-	struct sfc_port *port = &sa->port;
 	int entry;
 
-	if (rss->context_type != EFX_RX_SCALE_EXCLUSIVE || port->isolated)
+	if (rss->context_type != EFX_RX_SCALE_EXCLUSIVE || sas->isolated)
 		return -ENOTSUP;
 
 	if (rss->channels == 0)
@@ -1563,13 +1561,12 @@ sfc_dev_rss_reta_update(struct rte_eth_dev *dev,
 {
 	struct sfc_adapter *sa = dev->data->dev_private;
 	struct sfc_rss *rss = &sfc_sa2shared(sa)->rss;
-	struct sfc_port *port = &sa->port;
 	unsigned int *rss_tbl_new;
 	uint16_t entry;
 	int rc = 0;
 
 
-	if (port->isolated)
+	if (sfc_sa2shared(sa)->isolated)
 		return -ENOTSUP;
 
 	if (rss->context_type != EFX_RX_SCALE_EXCLUSIVE) {
diff --git a/drivers/net/sfc/sfc_flow.c b/drivers/net/sfc/sfc_flow.c
index 201c6cd06..01a81eab8 100644
--- a/drivers/net/sfc/sfc_flow.c
+++ b/drivers/net/sfc/sfc_flow.c
@@ -2425,7 +2425,6 @@ sfc_flow_isolate(struct rte_eth_dev *dev, int enable,
 		 struct rte_flow_error *error)
 {
 	struct sfc_adapter *sa = dev->data->dev_private;
-	struct sfc_port *port = &sa->port;
 	int ret = 0;
 
 	sfc_adapter_lock(sa);
@@ -2435,7 +2434,7 @@ sfc_flow_isolate(struct rte_eth_dev *dev, int enable,
 				   NULL, "please close the port first");
 		ret = -rte_errno;
 	} else {
-		port->isolated = (enable) ? B_TRUE : B_FALSE;
+		sfc_sa2shared(sa)->isolated = (enable) ? B_TRUE : B_FALSE;
 	}
 	sfc_adapter_unlock(sa);
 
diff --git a/drivers/net/sfc/sfc_port.c b/drivers/net/sfc/sfc_port.c
index 5eb4b3aca..1709dba4e 100644
--- a/drivers/net/sfc/sfc_port.c
+++ b/drivers/net/sfc/sfc_port.c
@@ -226,7 +226,7 @@ sfc_port_start(struct sfc_adapter *sa)
 	if (rc != 0)
 		goto fail_mac_pdu_set;
 
-	if (!port->isolated) {
+	if (!sfc_sa2shared(sa)->isolated) {
 		struct ether_addr *addr = &port->default_mac_addr;
 
 		sfc_log_init(sa, "set MAC address");
diff --git a/drivers/net/sfc/sfc_rx.c b/drivers/net/sfc/sfc_rx.c
index 3b4b65f6e..cd8abc8ea 100644
--- a/drivers/net/sfc/sfc_rx.c
+++ b/drivers/net/sfc/sfc_rx.c
@@ -669,7 +669,6 @@ sfc_rx_default_rxq_set_filter(struct sfc_adapter *sa, struct sfc_rxq *rxq)
 int
 sfc_rx_qstart(struct sfc_adapter *sa, unsigned int sw_index)
 {
-	struct sfc_port *port = &sa->port;
 	struct sfc_rxq_info *rxq_info;
 	struct sfc_rxq *rxq;
 	struct sfc_evq *evq;
@@ -731,7 +730,7 @@ sfc_rx_qstart(struct sfc_adapter *sa, unsigned int sw_index)
 
 	rxq_info->state |= SFC_RXQ_STARTED;
 
-	if ((sw_index == 0) && !port->isolated) {
+	if (sw_index == 0 && !sfc_sa2shared(sa)->isolated) {
 		rc = sfc_rx_default_rxq_set_filter(sa, rxq);
 		if (rc != 0)
 			goto fail_mac_filter_default_rxq_set;
-- 
2.17.1

^ permalink raw reply	[flat|nested] 34+ messages in thread

* [dpdk-dev] [PATCH 28/30] net/sfc: remove adapter locks from secondary process ops
  2019-02-07 12:17 [dpdk-dev] [PATCH 00/30] net/sfc: improve multi-process support Andrew Rybchenko
                   ` (26 preceding siblings ...)
  2019-02-07 12:17 ` [dpdk-dev] [PATCH 27/30] net/sfc: move isolated flag in " Andrew Rybchenko
@ 2019-02-07 12:17 ` Andrew Rybchenko
  2019-02-07 12:17 ` [dpdk-dev] [PATCH 29/30] net/sfc: separate adapter primary process and shared data Andrew Rybchenko
                   ` (2 subsequent siblings)
  30 siblings, 0 replies; 34+ messages in thread
From: Andrew Rybchenko @ 2019-02-07 12:17 UTC (permalink / raw)
  To: dev

Adapter lock will become primary process only.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
---
 drivers/net/sfc/sfc_ethdev.c | 20 --------------------
 1 file changed, 20 deletions(-)

diff --git a/drivers/net/sfc/sfc_ethdev.c b/drivers/net/sfc/sfc_ethdev.c
index c6bee09ee..6b00601fc 100644
--- a/drivers/net/sfc/sfc_ethdev.c
+++ b/drivers/net/sfc/sfc_ethdev.c
@@ -1071,11 +1071,8 @@ sfc_rx_queue_info_get(struct rte_eth_dev *dev, uint16_t rx_queue_id,
 		      struct rte_eth_rxq_info *qinfo)
 {
 	struct sfc_adapter_shared *sas = sfc_adapter_shared_by_eth_dev(dev);
-	struct sfc_adapter *sa = dev->data->dev_private;
 	struct sfc_rxq_info *rxq_info;
 
-	sfc_adapter_lock(sa);
-
 	SFC_ASSERT(rx_queue_id < sas->rxq_count);
 
 	rxq_info = &sas->rxq_info[rx_queue_id];
@@ -1090,8 +1087,6 @@ sfc_rx_queue_info_get(struct rte_eth_dev *dev, uint16_t rx_queue_id,
 		qinfo->scattered_rx = 1;
 	}
 	qinfo->nb_desc = rxq_info->entries;
-
-	sfc_adapter_unlock(sa);
 }
 
 /*
@@ -1103,11 +1098,8 @@ sfc_tx_queue_info_get(struct rte_eth_dev *dev, uint16_t tx_queue_id,
 		      struct rte_eth_txq_info *qinfo)
 {
 	struct sfc_adapter_shared *sas = sfc_adapter_shared_by_eth_dev(dev);
-	struct sfc_adapter *sa = dev->data->dev_private;
 	struct sfc_txq_info *txq_info;
 
-	sfc_adapter_lock(sa);
-
 	SFC_ASSERT(tx_queue_id < sas->txq_count);
 
 	txq_info = &sas->txq_info[tx_queue_id];
@@ -1118,8 +1110,6 @@ sfc_tx_queue_info_get(struct rte_eth_dev *dev, uint16_t tx_queue_id,
 	qinfo->conf.tx_free_thresh = txq_info->free_thresh;
 	qinfo->conf.tx_deferred_start = txq_info->deferred_start;
 	qinfo->nb_desc = txq_info->entries;
-
-	sfc_adapter_unlock(sa);
 }
 
 /*
@@ -1421,14 +1411,11 @@ sfc_dev_rss_hash_conf_get(struct rte_eth_dev *dev,
 			  struct rte_eth_rss_conf *rss_conf)
 {
 	struct sfc_adapter_shared *sas = sfc_adapter_shared_by_eth_dev(dev);
-	struct sfc_adapter *sa = dev->data->dev_private;
 	struct sfc_rss *rss = &sas->rss;
 
 	if (rss->context_type != EFX_RX_SCALE_EXCLUSIVE)
 		return -ENOTSUP;
 
-	sfc_adapter_lock(sa);
-
 	/*
 	 * Mapping of hash configuration between RTE and EFX is not one-to-one,
 	 * hence, conversion is done here to derive a correct set of ETH_RSS
@@ -1440,8 +1427,6 @@ sfc_dev_rss_hash_conf_get(struct rte_eth_dev *dev,
 	if (rss_conf->rss_key != NULL)
 		rte_memcpy(rss_conf->rss_key, rss->key, EFX_RSS_KEY_SIZE);
 
-	sfc_adapter_unlock(sa);
-
 	return 0;
 }
 
@@ -1526,7 +1511,6 @@ sfc_dev_rss_reta_query(struct rte_eth_dev *dev,
 		       uint16_t reta_size)
 {
 	struct sfc_adapter_shared *sas = sfc_adapter_shared_by_eth_dev(dev);
-	struct sfc_adapter *sa = dev->data->dev_private;
 	struct sfc_rss *rss = &sas->rss;
 	int entry;
 
@@ -1539,8 +1523,6 @@ sfc_dev_rss_reta_query(struct rte_eth_dev *dev,
 	if (reta_size != EFX_RSS_TBL_SIZE)
 		return -EINVAL;
 
-	sfc_adapter_lock(sa);
-
 	for (entry = 0; entry < reta_size; entry++) {
 		int grp = entry / RTE_RETA_GROUP_SIZE;
 		int grp_idx = entry % RTE_RETA_GROUP_SIZE;
@@ -1549,8 +1531,6 @@ sfc_dev_rss_reta_query(struct rte_eth_dev *dev,
 			reta_conf[grp].reta[grp_idx] = rss->tbl[entry];
 	}
 
-	sfc_adapter_unlock(sa);
-
 	return 0;
 }
 
-- 
2.17.1

^ permalink raw reply	[flat|nested] 34+ messages in thread

* [dpdk-dev] [PATCH 29/30] net/sfc: separate adapter primary process and shared data
  2019-02-07 12:17 [dpdk-dev] [PATCH 00/30] net/sfc: improve multi-process support Andrew Rybchenko
                   ` (27 preceding siblings ...)
  2019-02-07 12:17 ` [dpdk-dev] [PATCH 28/30] net/sfc: remove adapter locks from secondary process ops Andrew Rybchenko
@ 2019-02-07 12:17 ` Andrew Rybchenko
  2019-02-07 12:17 ` [dpdk-dev] [PATCH 30/30] net/sfc: support Rx packet types get in secondary process Andrew Rybchenko
  2019-02-07 15:08 ` [dpdk-dev] [PATCH 00/30] net/sfc: improve multi-process support Ferruh Yigit
  30 siblings, 0 replies; 34+ messages in thread
From: Andrew Rybchenko @ 2019-02-07 12:17 UTC (permalink / raw)
  To: dev

Make sfc_adapter primary process only.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
---
 drivers/net/sfc/sfc.h        |  20 ++++---
 drivers/net/sfc/sfc_ethdev.c | 105 +++++++++++++++++++----------------
 drivers/net/sfc/sfc_flow.c   |  10 ++--
 drivers/net/sfc/sfc_rx.c     |   2 +-
 drivers/net/sfc/sfc_tx.c     |   2 +-
 5 files changed, 77 insertions(+), 62 deletions(-)

diff --git a/drivers/net/sfc/sfc.h b/drivers/net/sfc/sfc.h
index e8569bbbc..39b4ba52c 100644
--- a/drivers/net/sfc/sfc.h
+++ b/drivers/net/sfc/sfc.h
@@ -218,12 +218,6 @@ struct sfc_adapter {
 	 */
 	struct sfc_adapter_priv		priv;
 
-	/*
-	 * Temporary placeholder for multi-process shared data for
-	 * transition.
-	 */
-	struct sfc_adapter_shared	_shared;
-
 	/*
 	 * PMD setup and configuration is not thread safe. Since it is not
 	 * performance sensitive, it is better to guarantee thread-safety
@@ -291,9 +285,19 @@ struct sfc_adapter {
 static inline struct sfc_adapter_shared *
 sfc_adapter_shared_by_eth_dev(struct rte_eth_dev *eth_dev)
 {
-	struct sfc_adapter *sa = eth_dev->data->dev_private;
+	struct sfc_adapter_shared *sas = eth_dev->data->dev_private;
 
-	return sa->priv.shared;
+	return sas;
+}
+
+static inline struct sfc_adapter *
+sfc_adapter_by_eth_dev(struct rte_eth_dev *eth_dev)
+{
+	struct sfc_adapter_priv *sap = sfc_adapter_priv_by_eth_dev(eth_dev);
+
+	SFC_ASSERT(rte_eal_process_type() == RTE_PROC_PRIMARY);
+
+	return container_of(sap, struct sfc_adapter, priv);
 }
 
 static inline struct sfc_adapter_shared *
diff --git a/drivers/net/sfc/sfc_ethdev.c b/drivers/net/sfc/sfc_ethdev.c
index 6b00601fc..a54a9e66b 100644
--- a/drivers/net/sfc/sfc_ethdev.c
+++ b/drivers/net/sfc/sfc_ethdev.c
@@ -36,7 +36,7 @@ static struct sfc_dp_list sfc_dp_head =
 static int
 sfc_fw_version_get(struct rte_eth_dev *dev, char *fw_version, size_t fw_size)
 {
-	struct sfc_adapter *sa = dev->data->dev_private;
+	struct sfc_adapter *sa = sfc_adapter_by_eth_dev(dev);
 	efx_nic_fw_info_t enfi;
 	int ret;
 	int rc;
@@ -86,7 +86,7 @@ sfc_dev_infos_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
 {
 	const struct sfc_adapter_priv *sap = sfc_adapter_priv_by_eth_dev(dev);
 	struct sfc_adapter_shared *sas = sfc_adapter_shared_by_eth_dev(dev);
-	struct sfc_adapter *sa = dev->data->dev_private;
+	struct sfc_adapter *sa = sfc_adapter_by_eth_dev(dev);
 	struct sfc_rss *rss = &sas->rss;
 	uint64_t txq_offloads_def = 0;
 
@@ -182,7 +182,7 @@ static const uint32_t *
 sfc_dev_supported_ptypes_get(struct rte_eth_dev *dev)
 {
 	const struct sfc_adapter_priv *sap = sfc_adapter_priv_by_eth_dev(dev);
-	struct sfc_adapter *sa = dev->data->dev_private;
+	struct sfc_adapter *sa = sfc_adapter_by_eth_dev(dev);
 	const efx_nic_cfg_t *encp = efx_nic_cfg_get(sa->nic);
 	uint32_t tunnel_encaps = encp->enc_tunnel_encapsulations_supported;
 
@@ -193,7 +193,7 @@ static int
 sfc_dev_configure(struct rte_eth_dev *dev)
 {
 	struct rte_eth_dev_data *dev_data = dev->data;
-	struct sfc_adapter *sa = dev_data->dev_private;
+	struct sfc_adapter *sa = sfc_adapter_by_eth_dev(dev);
 	int rc;
 
 	sfc_log_init(sa, "entry n_rxq=%u n_txq=%u",
@@ -222,7 +222,7 @@ sfc_dev_configure(struct rte_eth_dev *dev)
 static int
 sfc_dev_start(struct rte_eth_dev *dev)
 {
-	struct sfc_adapter *sa = dev->data->dev_private;
+	struct sfc_adapter *sa = sfc_adapter_by_eth_dev(dev);
 	int rc;
 
 	sfc_log_init(sa, "entry");
@@ -239,7 +239,7 @@ sfc_dev_start(struct rte_eth_dev *dev)
 static int
 sfc_dev_link_update(struct rte_eth_dev *dev, int wait_to_complete)
 {
-	struct sfc_adapter *sa = dev->data->dev_private;
+	struct sfc_adapter *sa = sfc_adapter_by_eth_dev(dev);
 	struct rte_eth_link current_link;
 	int ret;
 
@@ -270,7 +270,7 @@ sfc_dev_link_update(struct rte_eth_dev *dev, int wait_to_complete)
 static void
 sfc_dev_stop(struct rte_eth_dev *dev)
 {
-	struct sfc_adapter *sa = dev->data->dev_private;
+	struct sfc_adapter *sa = sfc_adapter_by_eth_dev(dev);
 
 	sfc_log_init(sa, "entry");
 
@@ -284,7 +284,7 @@ sfc_dev_stop(struct rte_eth_dev *dev)
 static int
 sfc_dev_set_link_up(struct rte_eth_dev *dev)
 {
-	struct sfc_adapter *sa = dev->data->dev_private;
+	struct sfc_adapter *sa = sfc_adapter_by_eth_dev(dev);
 	int rc;
 
 	sfc_log_init(sa, "entry");
@@ -300,7 +300,7 @@ sfc_dev_set_link_up(struct rte_eth_dev *dev)
 static int
 sfc_dev_set_link_down(struct rte_eth_dev *dev)
 {
-	struct sfc_adapter *sa = dev->data->dev_private;
+	struct sfc_adapter *sa = sfc_adapter_by_eth_dev(dev);
 
 	sfc_log_init(sa, "entry");
 
@@ -314,7 +314,7 @@ sfc_dev_set_link_down(struct rte_eth_dev *dev)
 static void
 sfc_dev_close(struct rte_eth_dev *dev)
 {
-	struct sfc_adapter *sa = dev->data->dev_private;
+	struct sfc_adapter *sa = sfc_adapter_by_eth_dev(dev);
 
 	sfc_log_init(sa, "entry");
 
@@ -345,7 +345,7 @@ sfc_dev_filter_set(struct rte_eth_dev *dev, enum sfc_dev_filter_mode mode,
 {
 	struct sfc_port *port;
 	boolean_t *toggle;
-	struct sfc_adapter *sa = dev->data->dev_private;
+	struct sfc_adapter *sa = sfc_adapter_by_eth_dev(dev);
 	boolean_t allmulti = (mode == SFC_DEV_FILTER_MODE_ALLMULTI);
 	const char *desc = (allmulti) ? "all-multi" : "promiscuous";
 
@@ -404,7 +404,7 @@ sfc_rx_queue_setup(struct rte_eth_dev *dev, uint16_t rx_queue_id,
 		   struct rte_mempool *mb_pool)
 {
 	struct sfc_adapter_shared *sas = sfc_adapter_shared_by_eth_dev(dev);
-	struct sfc_adapter *sa = dev->data->dev_private;
+	struct sfc_adapter *sa = sfc_adapter_by_eth_dev(dev);
 	int rc;
 
 	sfc_log_init(sa, "RxQ=%u nb_rx_desc=%u socket_id=%u",
@@ -459,7 +459,7 @@ sfc_tx_queue_setup(struct rte_eth_dev *dev, uint16_t tx_queue_id,
 		   const struct rte_eth_txconf *tx_conf)
 {
 	struct sfc_adapter_shared *sas = sfc_adapter_shared_by_eth_dev(dev);
-	struct sfc_adapter *sa = dev->data->dev_private;
+	struct sfc_adapter *sa = sfc_adapter_by_eth_dev(dev);
 	int rc;
 
 	sfc_log_init(sa, "TxQ = %u, nb_tx_desc = %u, socket_id = %u",
@@ -534,7 +534,7 @@ sfc_update_diff_stat(uint64_t *stat, uint64_t newval)
 static int
 sfc_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)
 {
-	struct sfc_adapter *sa = dev->data->dev_private;
+	struct sfc_adapter *sa = sfc_adapter_by_eth_dev(dev);
 	struct sfc_port *port = &sa->port;
 	uint64_t *mac_stats;
 	int ret;
@@ -611,7 +611,7 @@ sfc_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)
 static void
 sfc_stats_reset(struct rte_eth_dev *dev)
 {
-	struct sfc_adapter *sa = dev->data->dev_private;
+	struct sfc_adapter *sa = sfc_adapter_by_eth_dev(dev);
 	struct sfc_port *port = &sa->port;
 	int rc;
 
@@ -633,7 +633,7 @@ static int
 sfc_xstats_get(struct rte_eth_dev *dev, struct rte_eth_xstat *xstats,
 	       unsigned int xstats_count)
 {
-	struct sfc_adapter *sa = dev->data->dev_private;
+	struct sfc_adapter *sa = sfc_adapter_by_eth_dev(dev);
 	struct sfc_port *port = &sa->port;
 	uint64_t *mac_stats;
 	int rc;
@@ -672,7 +672,7 @@ sfc_xstats_get_names(struct rte_eth_dev *dev,
 		     struct rte_eth_xstat_name *xstats_names,
 		     unsigned int xstats_count)
 {
-	struct sfc_adapter *sa = dev->data->dev_private;
+	struct sfc_adapter *sa = sfc_adapter_by_eth_dev(dev);
 	struct sfc_port *port = &sa->port;
 	unsigned int i;
 	unsigned int nstats = 0;
@@ -694,7 +694,7 @@ static int
 sfc_xstats_get_by_id(struct rte_eth_dev *dev, const uint64_t *ids,
 		     uint64_t *values, unsigned int n)
 {
-	struct sfc_adapter *sa = dev->data->dev_private;
+	struct sfc_adapter *sa = sfc_adapter_by_eth_dev(dev);
 	struct sfc_port *port = &sa->port;
 	uint64_t *mac_stats;
 	unsigned int nb_supported = 0;
@@ -741,7 +741,7 @@ sfc_xstats_get_names_by_id(struct rte_eth_dev *dev,
 			   struct rte_eth_xstat_name *xstats_names,
 			   const uint64_t *ids, unsigned int size)
 {
-	struct sfc_adapter *sa = dev->data->dev_private;
+	struct sfc_adapter *sa = sfc_adapter_by_eth_dev(dev);
 	struct sfc_port *port = &sa->port;
 	unsigned int nb_supported = 0;
 	unsigned int nb_written = 0;
@@ -771,7 +771,7 @@ sfc_xstats_get_names_by_id(struct rte_eth_dev *dev,
 static int
 sfc_flow_ctrl_get(struct rte_eth_dev *dev, struct rte_eth_fc_conf *fc_conf)
 {
-	struct sfc_adapter *sa = dev->data->dev_private;
+	struct sfc_adapter *sa = sfc_adapter_by_eth_dev(dev);
 	unsigned int wanted_fc, link_fc;
 
 	memset(fc_conf, 0, sizeof(*fc_conf));
@@ -811,7 +811,7 @@ sfc_flow_ctrl_get(struct rte_eth_dev *dev, struct rte_eth_fc_conf *fc_conf)
 static int
 sfc_flow_ctrl_set(struct rte_eth_dev *dev, struct rte_eth_fc_conf *fc_conf)
 {
-	struct sfc_adapter *sa = dev->data->dev_private;
+	struct sfc_adapter *sa = sfc_adapter_by_eth_dev(dev);
 	struct sfc_port *port = &sa->port;
 	unsigned int fcntl;
 	int rc;
@@ -867,7 +867,7 @@ sfc_flow_ctrl_set(struct rte_eth_dev *dev, struct rte_eth_fc_conf *fc_conf)
 static int
 sfc_dev_set_mtu(struct rte_eth_dev *dev, uint16_t mtu)
 {
-	struct sfc_adapter *sa = dev->data->dev_private;
+	struct sfc_adapter *sa = sfc_adapter_by_eth_dev(dev);
 	size_t pdu = EFX_MAC_PDU(mtu);
 	size_t old_pdu;
 	int rc;
@@ -936,7 +936,7 @@ sfc_dev_set_mtu(struct rte_eth_dev *dev, uint16_t mtu)
 static int
 sfc_mac_addr_set(struct rte_eth_dev *dev, struct ether_addr *mac_addr)
 {
-	struct sfc_adapter *sa = dev->data->dev_private;
+	struct sfc_adapter *sa = sfc_adapter_by_eth_dev(dev);
 	const efx_nic_cfg_t *encp = efx_nic_cfg_get(sa->nic);
 	struct sfc_port *port = &sa->port;
 	struct ether_addr *old_addr = &dev->data->mac_addrs[0];
@@ -1021,7 +1021,7 @@ static int
 sfc_set_mc_addr_list(struct rte_eth_dev *dev, struct ether_addr *mc_addr_set,
 		     uint32_t nb_mc_addr)
 {
-	struct sfc_adapter *sa = dev->data->dev_private;
+	struct sfc_adapter *sa = sfc_adapter_by_eth_dev(dev);
 	struct sfc_port *port = &sa->port;
 	uint8_t *mc_addrs = port->mcast_addrs;
 	int rc;
@@ -1181,7 +1181,7 @@ static int
 sfc_rx_queue_start(struct rte_eth_dev *dev, uint16_t rx_queue_id)
 {
 	struct sfc_adapter_shared *sas = sfc_adapter_shared_by_eth_dev(dev);
-	struct sfc_adapter *sa = dev->data->dev_private;
+	struct sfc_adapter *sa = sfc_adapter_by_eth_dev(dev);
 	int rc;
 
 	sfc_log_init(sa, "RxQ=%u", rx_queue_id);
@@ -1217,7 +1217,7 @@ static int
 sfc_rx_queue_stop(struct rte_eth_dev *dev, uint16_t rx_queue_id)
 {
 	struct sfc_adapter_shared *sas = sfc_adapter_shared_by_eth_dev(dev);
-	struct sfc_adapter *sa = dev->data->dev_private;
+	struct sfc_adapter *sa = sfc_adapter_by_eth_dev(dev);
 
 	sfc_log_init(sa, "RxQ=%u", rx_queue_id);
 
@@ -1235,7 +1235,7 @@ static int
 sfc_tx_queue_start(struct rte_eth_dev *dev, uint16_t tx_queue_id)
 {
 	struct sfc_adapter_shared *sas = sfc_adapter_shared_by_eth_dev(dev);
-	struct sfc_adapter *sa = dev->data->dev_private;
+	struct sfc_adapter *sa = sfc_adapter_by_eth_dev(dev);
 	int rc;
 
 	sfc_log_init(sa, "TxQ = %u", tx_queue_id);
@@ -1271,7 +1271,7 @@ static int
 sfc_tx_queue_stop(struct rte_eth_dev *dev, uint16_t tx_queue_id)
 {
 	struct sfc_adapter_shared *sas = sfc_adapter_shared_by_eth_dev(dev);
-	struct sfc_adapter *sa = dev->data->dev_private;
+	struct sfc_adapter *sa = sfc_adapter_by_eth_dev(dev);
 
 	sfc_log_init(sa, "TxQ = %u", tx_queue_id);
 
@@ -1308,7 +1308,7 @@ sfc_dev_udp_tunnel_op(struct rte_eth_dev *dev,
 		      struct rte_eth_udp_tunnel *tunnel_udp,
 		      enum sfc_udp_tunnel_op_e op)
 {
-	struct sfc_adapter *sa = dev->data->dev_private;
+	struct sfc_adapter *sa = sfc_adapter_by_eth_dev(dev);
 	efx_tunnel_protocol_t tunnel_proto;
 	int rc;
 
@@ -1434,7 +1434,7 @@ static int
 sfc_dev_rss_hash_update(struct rte_eth_dev *dev,
 			struct rte_eth_rss_conf *rss_conf)
 {
-	struct sfc_adapter *sa = dev->data->dev_private;
+	struct sfc_adapter *sa = sfc_adapter_by_eth_dev(dev);
 	struct sfc_rss *rss = &sfc_sa2shared(sa)->rss;
 	unsigned int efx_hash_types;
 	int rc = 0;
@@ -1539,7 +1539,7 @@ sfc_dev_rss_reta_update(struct rte_eth_dev *dev,
 			struct rte_eth_rss_reta_entry64 *reta_conf,
 			uint16_t reta_size)
 {
-	struct sfc_adapter *sa = dev->data->dev_private;
+	struct sfc_adapter *sa = sfc_adapter_by_eth_dev(dev);
 	struct sfc_rss *rss = &sfc_sa2shared(sa)->rss;
 	unsigned int *rss_tbl_new;
 	uint16_t entry;
@@ -1612,7 +1612,7 @@ sfc_dev_filter_ctrl(struct rte_eth_dev *dev, enum rte_filter_type filter_type,
 		    enum rte_filter_op filter_op,
 		    void *arg)
 {
-	struct sfc_adapter *sa = dev->data->dev_private;
+	struct sfc_adapter *sa = sfc_adapter_by_eth_dev(dev);
 	int rc = ENOTSUP;
 
 	sfc_log_init(sa, "entry");
@@ -1755,7 +1755,7 @@ sfc_strdup(const char *str)
 static int
 sfc_eth_dev_set_ops(struct rte_eth_dev *dev)
 {
-	struct sfc_adapter *sa = dev->data->dev_private;
+	struct sfc_adapter *sa = sfc_adapter_by_eth_dev(dev);
 	struct sfc_adapter_shared *sas = sfc_adapter_shared_by_eth_dev(dev);
 	const struct sfc_dp_rx *dp_rx;
 	const struct sfc_dp_tx *dp_tx;
@@ -1880,7 +1880,7 @@ sfc_eth_dev_set_ops(struct rte_eth_dev *dev)
 static void
 sfc_eth_dev_clear_ops(struct rte_eth_dev *dev)
 {
-	struct sfc_adapter *sa = dev->data->dev_private;
+	struct sfc_adapter *sa = sfc_adapter_by_eth_dev(dev);
 	struct sfc_adapter_shared *sas = sfc_adapter_shared_by_eth_dev(dev);
 
 	dev->dev_ops = NULL;
@@ -2007,10 +2007,10 @@ sfc_register_dp(void)
 static int
 sfc_eth_dev_init(struct rte_eth_dev *dev)
 {
-	struct sfc_adapter *sa = dev->data->dev_private;
-	struct sfc_adapter_shared *sas;
+	struct sfc_adapter_shared *sas = sfc_adapter_shared_by_eth_dev(dev);
 	struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(dev);
 	uint32_t logtype_main;
+	struct sfc_adapter *sa;
 	int rc;
 	const efx_nic_cfg_t *encp;
 	const struct ether_addr *from;
@@ -2021,23 +2021,27 @@ sfc_eth_dev_init(struct rte_eth_dev *dev)
 					    SFC_LOGTYPE_MAIN_STR,
 					    RTE_LOG_NOTICE);
 
-	sa->priv.shared = &sa->_shared;
-	sas = sa->priv.shared;
-
 	if (rte_eal_process_type() != RTE_PROC_PRIMARY)
 		return -sfc_eth_dev_secondary_init(dev, logtype_main);
 
+	/* Required for logging */
+	sas->pci_addr = pci_dev->addr;
+	sas->port_id = dev->data->port_id;
+
 	/*
-	 * sfc_adapter is a mixture of shared and process private data.
-	 * During transition period use it in both kinds. When the
-	 * driver becomes ready to separate it, sfc_adapter will become
-	 * primary process private only.
+	 * Allocate process private data from heap, since it should not
+	 * be located in shared memory allocated using rte_malloc() API.
 	 */
+	sa = calloc(1, sizeof(*sa));
+	if (sa == NULL) {
+		rc = ENOMEM;
+		goto fail_alloc_sa;
+	}
+
 	dev->process_private = sa;
 
 	/* Required for logging */
-	sas->pci_addr = pci_dev->addr;
-	sas->port_id = dev->data->port_id;
+	sa->priv.shared = sas;
 	sa->priv.logtype_main = logtype_main;
 
 	sa->eth_dev = dev;
@@ -2107,6 +2111,9 @@ sfc_eth_dev_init(struct rte_eth_dev *dev)
 fail_kvargs_parse:
 	sfc_log_init(sa, "failed %d", rc);
 	dev->process_private = NULL;
+	free(sa);
+
+fail_alloc_sa:
 	SFC_ASSERT(rc > 0);
 	return -rc;
 }
@@ -2121,7 +2128,7 @@ sfc_eth_dev_uninit(struct rte_eth_dev *dev)
 		return 0;
 	}
 
-	sa = dev->data->dev_private;
+	sa = sfc_adapter_by_eth_dev(dev);
 	sfc_log_init(sa, "entry");
 
 	sfc_adapter_lock(sa);
@@ -2140,6 +2147,10 @@ sfc_eth_dev_uninit(struct rte_eth_dev *dev)
 
 	/* Required for logging, so cleanup last */
 	sa->eth_dev = NULL;
+
+	dev->process_private = NULL;
+	free(sa);
+
 	return 0;
 }
 
@@ -2159,7 +2170,7 @@ static int sfc_eth_dev_pci_probe(struct rte_pci_driver *pci_drv __rte_unused,
 	struct rte_pci_device *pci_dev)
 {
 	return rte_eth_dev_pci_generic_probe(pci_dev,
-		sizeof(struct sfc_adapter), sfc_eth_dev_init);
+		sizeof(struct sfc_adapter_shared), sfc_eth_dev_init);
 }
 
 static int sfc_eth_dev_pci_remove(struct rte_pci_device *pci_dev)
diff --git a/drivers/net/sfc/sfc_flow.c b/drivers/net/sfc/sfc_flow.c
index 01a81eab8..cffcd9a4c 100644
--- a/drivers/net/sfc/sfc_flow.c
+++ b/drivers/net/sfc/sfc_flow.c
@@ -2254,7 +2254,7 @@ sfc_flow_parse(struct rte_eth_dev *dev,
 	       struct rte_flow *flow,
 	       struct rte_flow_error *error)
 {
-	struct sfc_adapter *sa = dev->data->dev_private;
+	struct sfc_adapter *sa = sfc_adapter_by_eth_dev(dev);
 	int rc;
 
 	rc = sfc_flow_parse_attr(attr, flow, error);
@@ -2300,7 +2300,7 @@ sfc_flow_create(struct rte_eth_dev *dev,
 		const struct rte_flow_action actions[],
 		struct rte_flow_error *error)
 {
-	struct sfc_adapter *sa = dev->data->dev_private;
+	struct sfc_adapter *sa = sfc_adapter_by_eth_dev(dev);
 	struct rte_flow *flow = NULL;
 	int rc;
 
@@ -2373,7 +2373,7 @@ sfc_flow_destroy(struct rte_eth_dev *dev,
 		 struct rte_flow *flow,
 		 struct rte_flow_error *error)
 {
-	struct sfc_adapter *sa = dev->data->dev_private;
+	struct sfc_adapter *sa = sfc_adapter_by_eth_dev(dev);
 	struct rte_flow *flow_ptr;
 	int rc = EINVAL;
 
@@ -2402,7 +2402,7 @@ static int
 sfc_flow_flush(struct rte_eth_dev *dev,
 	       struct rte_flow_error *error)
 {
-	struct sfc_adapter *sa = dev->data->dev_private;
+	struct sfc_adapter *sa = sfc_adapter_by_eth_dev(dev);
 	struct rte_flow *flow;
 	int rc = 0;
 	int ret = 0;
@@ -2424,7 +2424,7 @@ static int
 sfc_flow_isolate(struct rte_eth_dev *dev, int enable,
 		 struct rte_flow_error *error)
 {
-	struct sfc_adapter *sa = dev->data->dev_private;
+	struct sfc_adapter *sa = sfc_adapter_by_eth_dev(dev);
 	int ret = 0;
 
 	sfc_adapter_lock(sa);
diff --git a/drivers/net/sfc/sfc_rx.c b/drivers/net/sfc/sfc_rx.c
index cd8abc8ea..54d4b5872 100644
--- a/drivers/net/sfc/sfc_rx.c
+++ b/drivers/net/sfc/sfc_rx.c
@@ -402,7 +402,7 @@ sfc_rxq_by_dp_rxq(const struct sfc_dp_rxq *dp_rxq)
 	SFC_ASSERT(rte_eth_dev_is_valid_port(dpq->port_id));
 	eth_dev = &rte_eth_devices[dpq->port_id];
 
-	sa = eth_dev->data->dev_private;
+	sa = sfc_adapter_by_eth_dev(eth_dev);
 
 	SFC_ASSERT(dpq->queue_id < sfc_sa2shared(sa)->rxq_count);
 	return &sa->rxq_ctrl[dpq->queue_id];
diff --git a/drivers/net/sfc/sfc_tx.c b/drivers/net/sfc/sfc_tx.c
index 515f4afdc..acdbf1602 100644
--- a/drivers/net/sfc/sfc_tx.c
+++ b/drivers/net/sfc/sfc_tx.c
@@ -911,7 +911,7 @@ sfc_txq_by_dp_txq(const struct sfc_dp_txq *dp_txq)
 	SFC_ASSERT(rte_eth_dev_is_valid_port(dpq->port_id));
 	eth_dev = &rte_eth_devices[dpq->port_id];
 
-	sa = eth_dev->data->dev_private;
+	sa = sfc_adapter_by_eth_dev(eth_dev);
 
 	SFC_ASSERT(dpq->queue_id < sfc_sa2shared(sa)->txq_count);
 	return &sa->txq_ctrl[dpq->queue_id];
-- 
2.17.1

^ permalink raw reply	[flat|nested] 34+ messages in thread

* [dpdk-dev] [PATCH 30/30] net/sfc: support Rx packet types get in secondary process
  2019-02-07 12:17 [dpdk-dev] [PATCH 00/30] net/sfc: improve multi-process support Andrew Rybchenko
                   ` (28 preceding siblings ...)
  2019-02-07 12:17 ` [dpdk-dev] [PATCH 29/30] net/sfc: separate adapter primary process and shared data Andrew Rybchenko
@ 2019-02-07 12:17 ` Andrew Rybchenko
  2019-02-07 15:08 ` [dpdk-dev] [PATCH 00/30] net/sfc: improve multi-process support Ferruh Yigit
  30 siblings, 0 replies; 34+ messages in thread
From: Andrew Rybchenko @ 2019-02-07 12:17 UTC (permalink / raw)
  To: dev

Secondary process needs to know packet classes supported
by the NIC on Rx.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
---
 doc/guides/rel_notes/release_19_05.rst |  1 +
 drivers/net/sfc/sfc.c                  | 16 ++++++++++++++++
 drivers/net/sfc/sfc.h                  |  1 +
 drivers/net/sfc/sfc_ethdev.c           |  6 ++----
 4 files changed, 20 insertions(+), 4 deletions(-)

diff --git a/doc/guides/rel_notes/release_19_05.rst b/doc/guides/rel_notes/release_19_05.rst
index 1b7f14cb2..2b0f60d3d 100644
--- a/doc/guides/rel_notes/release_19_05.rst
+++ b/doc/guides/rel_notes/release_19_05.rst
@@ -63,6 +63,7 @@ New Features
   * Added support for Tx descriptor status API in a secondary process.
   * Added support for RSS RETA and hash configuration get API in a secondary
     process.
+  * Added support for Rx packet types list in a secondary process.
 
 
 Removed Items
diff --git a/drivers/net/sfc/sfc.c b/drivers/net/sfc/sfc.c
index 8526a84b5..83001cb68 100644
--- a/drivers/net/sfc/sfc.c
+++ b/drivers/net/sfc/sfc.c
@@ -342,6 +342,15 @@ sfc_try_start(struct sfc_adapter *sa)
 		goto fail_nic_init;
 
 	encp = efx_nic_cfg_get(sa->nic);
+
+	/*
+	 * Refresh (since it may change on NIC reset/restart) a copy of
+	 * supported tunnel encapsulations in shared memory to be used
+	 * on supported Rx packet type classes get.
+	 */
+	sa->priv.shared->tunnel_encaps =
+		encp->enc_tunnel_encapsulations_supported;
+
 	if (encp->enc_tunnel_encapsulations_supported != 0) {
 		sfc_log_init(sa, "apply tunnel config");
 		rc = efx_tunnel_reconfigure(sa->nic);
@@ -728,6 +737,13 @@ sfc_attach(struct sfc_adapter *sa)
 
 	encp = efx_nic_cfg_get(sa->nic);
 
+	/*
+	 * Make a copy of supported tunnel encapsulations in shared
+	 * memory to be used on supported Rx packet type classes get.
+	 */
+	sa->priv.shared->tunnel_encaps =
+		encp->enc_tunnel_encapsulations_supported;
+
 	if (sa->priv.dp_tx->features & SFC_DP_TX_FEAT_TSO) {
 		sa->tso = encp->enc_fw_assisted_tso_v2_enabled;
 		if (!sa->tso)
diff --git a/drivers/net/sfc/sfc.h b/drivers/net/sfc/sfc.h
index 39b4ba52c..725dd5ee6 100644
--- a/drivers/net/sfc/sfc.h
+++ b/drivers/net/sfc/sfc.h
@@ -184,6 +184,7 @@ struct sfc_adapter_shared {
 	struct sfc_rss			rss;
 
 	boolean_t			isolated;
+	uint32_t			tunnel_encaps;
 
 	struct rte_pci_addr		pci_addr;
 	uint16_t			port_id;
diff --git a/drivers/net/sfc/sfc_ethdev.c b/drivers/net/sfc/sfc_ethdev.c
index a54a9e66b..286550863 100644
--- a/drivers/net/sfc/sfc_ethdev.c
+++ b/drivers/net/sfc/sfc_ethdev.c
@@ -182,11 +182,8 @@ static const uint32_t *
 sfc_dev_supported_ptypes_get(struct rte_eth_dev *dev)
 {
 	const struct sfc_adapter_priv *sap = sfc_adapter_priv_by_eth_dev(dev);
-	struct sfc_adapter *sa = sfc_adapter_by_eth_dev(dev);
-	const efx_nic_cfg_t *encp = efx_nic_cfg_get(sa->nic);
-	uint32_t tunnel_encaps = encp->enc_tunnel_encapsulations_supported;
 
-	return sap->dp_rx->supported_ptypes_get(tunnel_encaps);
+	return sap->dp_rx->supported_ptypes_get(sap->shared->tunnel_encaps);
 }
 
 static int
@@ -1897,6 +1894,7 @@ sfc_eth_dev_clear_ops(struct rte_eth_dev *dev)
 }
 
 static const struct eth_dev_ops sfc_eth_dev_secondary_ops = {
+	.dev_supported_ptypes_get	= sfc_dev_supported_ptypes_get,
 	.rx_queue_count			= sfc_rx_queue_count,
 	.rx_descriptor_done		= sfc_rx_descriptor_done,
 	.rx_descriptor_status		= sfc_rx_descriptor_status,
-- 
2.17.1

^ permalink raw reply	[flat|nested] 34+ messages in thread

* Re: [dpdk-dev] [PATCH 00/30] net/sfc: improve multi-process support
  2019-02-07 12:17 [dpdk-dev] [PATCH 00/30] net/sfc: improve multi-process support Andrew Rybchenko
                   ` (29 preceding siblings ...)
  2019-02-07 12:17 ` [dpdk-dev] [PATCH 30/30] net/sfc: support Rx packet types get in secondary process Andrew Rybchenko
@ 2019-02-07 15:08 ` Ferruh Yigit
  30 siblings, 0 replies; 34+ messages in thread
From: Ferruh Yigit @ 2019-02-07 15:08 UTC (permalink / raw)
  To: Andrew Rybchenko, dev

On 2/7/2019 12:17 PM, Andrew Rybchenko wrote:
> The patch series improves multi-process support in net/sfc.
> It carefully distinguishes shared and process private data.
> 
> Andrew Rybchenko (29):
>   net/sfc: remove control path logging from Rx queue count
>   net/sfc: fix logging from secondary process
>   net/sfc: avoid usage of RxQ control structure in info get
>   net/sfc: avoid usage of TxQ control structure in info get
>   net/sfc: remove wrappers around Rx descriptor count and done
>   net/sfc: make it simpler to change datapath ops location
>   net/sfc: move datapath ops pointers to process private data
>   net/sfc: move main log type to process private data
>   net/sfc: move RxQ state to multi-process shared location
>   net/sfc: move datapath RxQ handle to shared RxQ info
>   net/sfc: support Rx descriptor status in secondary process
>   net/sfc: move TxQ state to multi-process shared location
>   net/sfc: move datapath TxQ handle to shared TxQ info
>   net/sfc: support Tx descriptor status in secondary process
>   net/sfc: support RSS RETA and hash config get in secondary
>   net/sfc: remove unnecessary functions to get RxQ index
>   net/sfc: remove unnecessary functions to get TxQ index
>   net/sfc: remove RxQ control from shared RxQ info
>   net/sfc: remove TxQ control from shared TxQ info
>   net/sfc: start to factor out multi-process shared data
>   net/sfc: move Rx/Tx datapath names to shared state
>   net/sfc: make main logging macro reusable in secondary
>   net/sfc: move RxQ shared information to adapter shared
>   net/sfc: move TxQ shared information to adapter shared
>   net/sfc: move RSS config to adapter shared
>   net/sfc: move isolated flag in adapter shared
>   net/sfc: remove adapter locks from secondary process ops
>   net/sfc: separate adapter primary process and shared data
>   net/sfc: support Rx packet types get in secondary process
> 
> Ivan Malov (1):
>   net/sfc: log port ID as 16-bit unsigned integer on panic

Series applied to dpdk-next-net/master, thanks.

^ permalink raw reply	[flat|nested] 34+ messages in thread

* Re: [dpdk-dev] [PATCH 01/30] net/sfc: log port ID as 16-bit unsigned integer on panic
  2019-02-07 12:17 ` [dpdk-dev] [PATCH 01/30] net/sfc: log port ID as 16-bit unsigned integer on panic Andrew Rybchenko
@ 2019-02-08 10:13   ` Ferruh Yigit
  2019-02-08 10:31     ` Andrew Rybchenko
  0 siblings, 1 reply; 34+ messages in thread
From: Ferruh Yigit @ 2019-02-08 10:13 UTC (permalink / raw)
  To: Andrew Rybchenko, dev; +Cc: Ivan Malov, stable

On 2/7/2019 12:17 PM, Andrew Rybchenko wrote:
> From: Ivan Malov <ivan.malov@oktetlabs.ru>
> 
> Fixes: f8244c6399d9 ("ethdev: increase port id range")
> Cc: stable@dpdk.org
> 
> Signed-off-by: Ivan Malov <ivan.malov@oktetlabs.ru>
> Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
> ---
>  drivers/net/sfc/sfc_debug.h | 3 ++-
>  1 file changed, 2 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/net/sfc/sfc_debug.h b/drivers/net/sfc/sfc_debug.h
> index 6b600ff4d..62f3937e8 100644
> --- a/drivers/net/sfc/sfc_debug.h
> +++ b/drivers/net/sfc/sfc_debug.h
> @@ -27,7 +27,8 @@
>  	do {								\
>  		const struct sfc_adapter *_sa = (sa);			\
>  									\
> -		rte_panic("sfc " PCI_PRI_FMT " #%" PRIu8 ": " fmt "\n",	\
> +		rte_panic("sfc " PCI_PRI_FMT				\
> +			  " #%" PRIu16 ": " fmt "\n",			\
>  			  _sa->pci_addr.domain, _sa->pci_addr.bus,	\
>  			  _sa->pci_addr.devid, _sa->pci_addr.function,	\
>  			  _sa->port_id, ##args);			\
> 

Overall it may not be good idea to call rte_panic() from driver. rte_panic()
cause the DPDK application to terminate, if a driver fails application may
prefer to handle that error and continue to run, so terminate decision should be
from application not library.

Can you please double check if rte_panic() usages in the driver can be converted
to error reporting?

^ permalink raw reply	[flat|nested] 34+ messages in thread

* Re: [dpdk-dev] [PATCH 01/30] net/sfc: log port ID as 16-bit unsigned integer on panic
  2019-02-08 10:13   ` Ferruh Yigit
@ 2019-02-08 10:31     ` Andrew Rybchenko
  0 siblings, 0 replies; 34+ messages in thread
From: Andrew Rybchenko @ 2019-02-08 10:31 UTC (permalink / raw)
  To: Ferruh Yigit, dev; +Cc: Ivan Malov, stable

Hi Ferruh,

On 2/8/19 1:13 PM, Ferruh Yigit wrote:
> On 2/7/2019 12:17 PM, Andrew Rybchenko wrote:
>> From: Ivan Malov <ivan.malov@oktetlabs.ru>
>>
>> Fixes: f8244c6399d9 ("ethdev: increase port id range")
>> Cc: stable@dpdk.org
>>
>> Signed-off-by: Ivan Malov <ivan.malov@oktetlabs.ru>
>> Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
>> ---
>>   drivers/net/sfc/sfc_debug.h | 3 ++-
>>   1 file changed, 2 insertions(+), 1 deletion(-)
>>
>> diff --git a/drivers/net/sfc/sfc_debug.h b/drivers/net/sfc/sfc_debug.h
>> index 6b600ff4d..62f3937e8 100644
>> --- a/drivers/net/sfc/sfc_debug.h
>> +++ b/drivers/net/sfc/sfc_debug.h
>> @@ -27,7 +27,8 @@
>>   	do {								\
>>   		const struct sfc_adapter *_sa = (sa);			\
>>   									\
>> -		rte_panic("sfc " PCI_PRI_FMT " #%" PRIu8 ": " fmt "\n",	\
>> +		rte_panic("sfc " PCI_PRI_FMT				\
>> +			  " #%" PRIu16 ": " fmt "\n",			\
>>   			  _sa->pci_addr.domain, _sa->pci_addr.bus,	\
>>   			  _sa->pci_addr.devid, _sa->pci_addr.function,	\
>>   			  _sa->port_id, ##args);			\
>>
> Overall it may not be good idea to call rte_panic() from driver. rte_panic()
> cause the DPDK application to terminate, if a driver fails application may
> prefer to handle that error and continue to run, so terminate decision should be
> from application not library.
>
> Can you please double check if rte_panic() usages in the driver can be converted
> to error reporting?

Thanks a lot for reminder. We use it in few places, but even those can be
improved. We'll do it.

Andrew.

^ permalink raw reply	[flat|nested] 34+ messages in thread

end of thread, other threads:[~2019-02-08 10:32 UTC | newest]

Thread overview: 34+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-02-07 12:17 [dpdk-dev] [PATCH 00/30] net/sfc: improve multi-process support Andrew Rybchenko
2019-02-07 12:17 ` [dpdk-dev] [PATCH 01/30] net/sfc: log port ID as 16-bit unsigned integer on panic Andrew Rybchenko
2019-02-08 10:13   ` Ferruh Yigit
2019-02-08 10:31     ` Andrew Rybchenko
2019-02-07 12:17 ` [dpdk-dev] [PATCH 02/30] net/sfc: remove control path logging from Rx queue count Andrew Rybchenko
2019-02-07 12:17 ` [dpdk-dev] [PATCH 03/30] net/sfc: fix logging from secondary process Andrew Rybchenko
2019-02-07 12:17 ` [dpdk-dev] [PATCH 04/30] net/sfc: avoid usage of RxQ control structure in info get Andrew Rybchenko
2019-02-07 12:17 ` [dpdk-dev] [PATCH 05/30] net/sfc: avoid usage of TxQ " Andrew Rybchenko
2019-02-07 12:17 ` [dpdk-dev] [PATCH 06/30] net/sfc: remove wrappers around Rx descriptor count and done Andrew Rybchenko
2019-02-07 12:17 ` [dpdk-dev] [PATCH 07/30] net/sfc: make it simpler to change datapath ops location Andrew Rybchenko
2019-02-07 12:17 ` [dpdk-dev] [PATCH 08/30] net/sfc: move datapath ops pointers to process private data Andrew Rybchenko
2019-02-07 12:17 ` [dpdk-dev] [PATCH 09/30] net/sfc: move main log type " Andrew Rybchenko
2019-02-07 12:17 ` [dpdk-dev] [PATCH 10/30] net/sfc: move RxQ state to multi-process shared location Andrew Rybchenko
2019-02-07 12:17 ` [dpdk-dev] [PATCH 11/30] net/sfc: move datapath RxQ handle to shared RxQ info Andrew Rybchenko
2019-02-07 12:17 ` [dpdk-dev] [PATCH 12/30] net/sfc: support Rx descriptor status in secondary process Andrew Rybchenko
2019-02-07 12:17 ` [dpdk-dev] [PATCH 13/30] net/sfc: move TxQ state to multi-process shared location Andrew Rybchenko
2019-02-07 12:17 ` [dpdk-dev] [PATCH 14/30] net/sfc: move datapath TxQ handle to shared TxQ info Andrew Rybchenko
2019-02-07 12:17 ` [dpdk-dev] [PATCH 15/30] net/sfc: support Tx descriptor status in secondary process Andrew Rybchenko
2019-02-07 12:17 ` [dpdk-dev] [PATCH 16/30] net/sfc: support RSS RETA and hash config get in secondary Andrew Rybchenko
2019-02-07 12:17 ` [dpdk-dev] [PATCH 17/30] net/sfc: remove unnecessary functions to get RxQ index Andrew Rybchenko
2019-02-07 12:17 ` [dpdk-dev] [PATCH 18/30] net/sfc: remove unnecessary functions to get TxQ index Andrew Rybchenko
2019-02-07 12:17 ` [dpdk-dev] [PATCH 19/30] net/sfc: remove RxQ control from shared RxQ info Andrew Rybchenko
2019-02-07 12:17 ` [dpdk-dev] [PATCH 20/30] net/sfc: remove TxQ control from shared TxQ info Andrew Rybchenko
2019-02-07 12:17 ` [dpdk-dev] [PATCH 21/30] net/sfc: start to factor out multi-process shared data Andrew Rybchenko
2019-02-07 12:17 ` [dpdk-dev] [PATCH 22/30] net/sfc: move Rx/Tx datapath names to shared state Andrew Rybchenko
2019-02-07 12:17 ` [dpdk-dev] [PATCH 23/30] net/sfc: make main logging macro reusable in secondary Andrew Rybchenko
2019-02-07 12:17 ` [dpdk-dev] [PATCH 24/30] net/sfc: move RxQ shared information to adapter shared Andrew Rybchenko
2019-02-07 12:17 ` [dpdk-dev] [PATCH 25/30] net/sfc: move TxQ " Andrew Rybchenko
2019-02-07 12:17 ` [dpdk-dev] [PATCH 26/30] net/sfc: move RSS config " Andrew Rybchenko
2019-02-07 12:17 ` [dpdk-dev] [PATCH 27/30] net/sfc: move isolated flag in " Andrew Rybchenko
2019-02-07 12:17 ` [dpdk-dev] [PATCH 28/30] net/sfc: remove adapter locks from secondary process ops Andrew Rybchenko
2019-02-07 12:17 ` [dpdk-dev] [PATCH 29/30] net/sfc: separate adapter primary process and shared data Andrew Rybchenko
2019-02-07 12:17 ` [dpdk-dev] [PATCH 30/30] net/sfc: support Rx packet types get in secondary process Andrew Rybchenko
2019-02-07 15:08 ` [dpdk-dev] [PATCH 00/30] net/sfc: improve multi-process support Ferruh Yigit

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).