patches for DPDK stable branches
 help / color / mirror / Atom feed
* [dpdk-stable] [PATCH 19.11] net/mlx5: fix representor interrupt handler
@ 2021-08-12 11:12 Gregory Etelson
  2021-08-16  8:52 ` Christian Ehrhardt
  0 siblings, 1 reply; 2+ messages in thread
From: Gregory Etelson @ 2021-08-12 11:12 UTC (permalink / raw)
  To: stable; +Cc: getelson, matan, viacheslavo

[ 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")

Signed-off-by: Gregory Etelson <getelson@nvidia.com>
Acked-by: Viacheslav Ovsiienko <viacheslavo@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


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

* Re: [dpdk-stable] [PATCH 19.11] net/mlx5: fix representor interrupt handler
  2021-08-12 11:12 [dpdk-stable] [PATCH 19.11] net/mlx5: fix representor interrupt handler Gregory Etelson
@ 2021-08-16  8:52 ` Christian Ehrhardt
  0 siblings, 0 replies; 2+ messages in thread
From: Christian Ehrhardt @ 2021-08-16  8:52 UTC (permalink / raw)
  To: Gregory Etelson; +Cc: dpdk stable, Matan Azrad, Viacheslav Ovsiienko

On Thu, Aug 12, 2021 at 1:12 PM Gregory Etelson <getelson@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@nvidia.com>
> Acked-by: Viacheslav Ovsiienko <viacheslavo@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

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

end of thread, other threads:[~2021-08-16  8:53 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-08-12 11:12 [dpdk-stable] [PATCH 19.11] net/mlx5: fix representor interrupt handler Gregory Etelson
2021-08-16  8:52 ` Christian Ehrhardt

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