From: Ivan Malov <ivan.ma...@oktetlabs.ru> The number of Tx queues requested by the user must not be overridden; instead, the limits imposed by TSO must be applied to the advertised maximum
Fixes: fec33d5bb3eb ("net/sfc: support firmware-assisted TSO") Signed-off-by: Ivan Malov <ivan.ma...@oktetlabs.ru> Signed-off-by: Andrew Rybchenko <arybche...@solarflare.com> Reviewed-by: Andrew Lee <a...@solarflare.com> Reviewed-by: Andy Moreton <amore...@solarflare.com> --- drivers/net/sfc/sfc.c | 26 +++++++++++++++++--------- drivers/net/sfc/sfc_tx.c | 5 ----- 2 files changed, 17 insertions(+), 14 deletions(-) diff --git a/drivers/net/sfc/sfc.c b/drivers/net/sfc/sfc.c index 648ad8c..d35754c 100644 --- a/drivers/net/sfc/sfc.c +++ b/drivers/net/sfc/sfc.c @@ -203,6 +203,13 @@ limits.edl_max_txq_count = MIN(encp->enc_txq_limit, limits.edl_max_evq_count - 1 - limits.edl_max_rxq_count); + + if (sa->tso) + limits.edl_max_txq_count = + MIN(limits.edl_max_txq_count, + encp->enc_fw_assisted_tso_v2_n_contexts / + encp->enc_hw_pf_count); + SFC_ASSERT(limits.edl_max_txq_count >= limits.edl_min_rxq_count); /* Configure the minimum required resources needed for the @@ -601,12 +608,21 @@ if (rc != 0) goto fail_nic_reset; + encp = efx_nic_cfg_get(sa->nic); + +#ifdef RTE_LIBRTE_SFC_EFX_TSO + sa->tso = encp->enc_fw_assisted_tso_v2_enabled; + if (!sa->tso) + sfc_warn(sa, "TSO support isn't available on this adapter"); +#else /* !RTE_LIBRTE_SFC_EFX_TSO */ + sa->tso = B_FALSE; +#endif /* RTE_LIBRTE_SFC_EFX_TSO */ + sfc_log_init(sa, "estimate resource limits"); rc = sfc_estimate_resource_limits(sa); if (rc != 0) goto fail_estimate_rsrc_limits; - encp = efx_nic_cfg_get(sa->nic); sa->txq_max_entries = encp->enc_txq_max_ndescs; SFC_ASSERT(rte_is_power_of_2(sa->txq_max_entries)); @@ -621,14 +637,6 @@ if (rc != 0) goto fail_set_rss_defaults; -#ifdef RTE_LIBRTE_SFC_EFX_TSO - sa->tso = efx_nic_cfg_get(sa->nic)->enc_fw_assisted_tso_v2_enabled; - if (!sa->tso) - sfc_warn(sa, "TSO support isn't available on this adapter"); -#else /* !RTE_LIBRTE_SFC_EFX_TSO */ - sa->tso = B_FALSE; -#endif /* RTE_LIBRTE_SFC_EFX_TSO */ - sfc_log_init(sa, "fini nic"); efx_nic_fini(enp); diff --git a/drivers/net/sfc/sfc_tx.c b/drivers/net/sfc/sfc_tx.c index 3e64c0f..1292af3 100644 --- a/drivers/net/sfc/sfc_tx.c +++ b/drivers/net/sfc/sfc_tx.c @@ -312,11 +312,6 @@ sa->txq_count = sa->eth_dev->data->nb_tx_queues; - if (sa->tso) - sa->txq_count = MIN(sa->txq_count, - efx_nic_cfg_get(sa->nic)->enc_fw_assisted_tso_v2_n_contexts / - efx_nic_cfg_get(sa->nic)->enc_hw_pf_count); - sa->txq_info = rte_calloc_socket("sfc-txqs", sa->txq_count, sizeof(sa->txq_info[0]), 0, sa->socket_id); -- 1.8.2.3