* [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
* 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
* [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