[dpdk-stable] [PATCH 19.11] net/mlx5: fix representor interrupt handler
Christian Ehrhardt
christian.ehrhardt at canonical.com
Mon Aug 16 10:52:33 CEST 2021
On Thu, Aug 12, 2021 at 1:12 PM Gregory Etelson <getelson at nvidia.com> wrote:
>
> [ upstream commit 494d6863c2464838e8ee65b9a7d3d108145ae08d ]
>
> In mlx5 PMD the PCI device interrupt vector was used by Uplink
> representor exclusively and other VF representors did not support
> interrupt mode.
> All the VFs and Uplink representors are separate ethernet devices
> and must have dedicated interrupt vectors.
> The fix provides each representor with a dedicated interrupt
> vector.
>
> Fixes: 5882bde88da2 ("net/mlx5: fix representor interrupts handler")
Thanks, applied
> Signed-off-by: Gregory Etelson <getelson at nvidia.com>
> Acked-by: Viacheslav Ovsiienko <viacheslavo at nvidia.com>
> ---
> drivers/net/mlx5/mlx5.c | 30 ++++++++++++++++++++++++++++++
> drivers/net/mlx5/mlx5_rxq.c | 6 ------
> 2 files changed, 30 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/net/mlx5/mlx5.c b/drivers/net/mlx5/mlx5.c
> index 3208b2eda7..b070d9ba89 100644
> --- a/drivers/net/mlx5/mlx5.c
> +++ b/drivers/net/mlx5/mlx5.c
> @@ -1334,6 +1334,11 @@ mlx5_dev_close(struct rte_eth_dev *dev)
> priv->rxqs_n = 0;
> priv->rxqs = NULL;
> }
> + if (priv->representor) {
> + /* Each representor has a dedicated interrupts handler */
> + rte_free(dev->intr_handle);
> + dev->intr_handle = NULL;
> + }
> if (priv->txqs != NULL) {
> /* XXX race condition if mlx5_tx_burst() is still running. */
> usleep(1000);
> @@ -3421,6 +3426,31 @@ mlx5_pci_probe(struct rte_pci_driver *pci_drv __rte_unused,
> }
> restore = list[i].eth_dev->data->dev_flags;
> rte_eth_copy_pci_info(list[i].eth_dev, pci_dev);
> + /**
> + * Each representor has a dedicated interrupts vector.
> + * rte_eth_copy_pci_info() assigns PF interrupts handle to
> + * representor eth_dev object because representor and PF
> + * share the same PCI address.
> + * Override representor device with a dedicated
> + * interrupts handle here.
> + * Representor interrupts handle is released in
> + * mlx5_dev_stop().
> + */
> + if (list[i].info.representor) {
> + struct rte_intr_handle *intr_handle;
> + intr_handle = rte_zmalloc("representor interrupts",
> + sizeof(*intr_handle), 0);
> + if (!intr_handle) {
> + DRV_LOG(ERR,
> + "port %u failed to allocate memory for interrupt handler "
> + "Rx interrupts will not be supported",
> + i);
> + rte_errno = ENOMEM;
> + ret = -rte_errno;
> + goto exit;
> + }
> + list[i].eth_dev->intr_handle = intr_handle;
> + }
> /* Restore non-PCI flags cleared by the above call. */
> list[i].eth_dev->data->dev_flags |= restore;
> rte_eth_dev_probing_finish(list[i].eth_dev);
> diff --git a/drivers/net/mlx5/mlx5_rxq.c b/drivers/net/mlx5/mlx5_rxq.c
> index e3f41d121d..16466a4ef9 100644
> --- a/drivers/net/mlx5/mlx5_rxq.c
> +++ b/drivers/net/mlx5/mlx5_rxq.c
> @@ -723,9 +723,6 @@ mlx5_rx_intr_vec_enable(struct rte_eth_dev *dev)
> unsigned int count = 0;
> struct rte_intr_handle *intr_handle = dev->intr_handle;
>
> - /* Representor shares dev->intr_handle with PF. */
> - if (priv->representor)
> - return 0;
> if (!dev->data->dev_conf.intr_conf.rxq)
> return 0;
> mlx5_rx_intr_vec_disable(dev);
> @@ -803,9 +800,6 @@ mlx5_rx_intr_vec_disable(struct rte_eth_dev *dev)
> unsigned int rxqs_n = priv->rxqs_n;
> unsigned int n = RTE_MIN(rxqs_n, (uint32_t)RTE_MAX_RXTX_INTR_VEC_ID);
>
> - /* Representor shares dev->intr_handle with PF. */
> - if (priv->representor)
> - return;
> if (!dev->data->dev_conf.intr_conf.rxq)
> return;
> if (!intr_handle->intr_vec)
> --
> 2.32.0
>
--
Christian Ehrhardt
Staff Engineer, Ubuntu Server
Canonical Ltd
More information about the stable
mailing list