patches for DPDK stable branches
 help / color / mirror / Atom feed
* [dpdk-stable] [PATCH] net/mlx5: fix handling link status event
@ 2018-02-12 18:20 Yongseok Koh
  2018-02-12 18:31 ` Luca Boccassi
  2018-02-13 11:53 ` Yuanhan Liu
  0 siblings, 2 replies; 5+ messages in thread
From: Yongseok Koh @ 2018-02-12 18:20 UTC (permalink / raw)
  To: stable; +Cc: Yongseok Koh

[ backported from upstream commit c7bf62255edf ]

Even though link of a port gets down, device still can receive traffic.
That is the reason why mlx5_set_link_up/down() switches rx/tx_pkt_burst().
However, if link gets down by an external command (e.g. ifconfig), it isn't
effective. It is better to change burst functions when link status change
is detected.

Fixes: 62072098b54e ("mlx5: support setting link up or down")
Cc: stable@dpdk.org

Signed-off-by: Yongseok Koh <yskoh@mellanox.com>
Acked-by: Nelio Laranjeiro <nelio.laranjeiro@6wind.com>
---
 drivers/net/mlx5/mlx5.c         |   1 -
 drivers/net/mlx5/mlx5.h         |   1 +
 drivers/net/mlx5/mlx5_ethdev.c  | 118 ++++++++++++++++++++++++++++++----------
 drivers/net/mlx5/mlx5_trigger.c |  23 ++------
 4 files changed, 95 insertions(+), 48 deletions(-)

diff --git a/drivers/net/mlx5/mlx5.c b/drivers/net/mlx5/mlx5.c
index eba674269..40804b3e6 100644
--- a/drivers/net/mlx5/mlx5.c
+++ b/drivers/net/mlx5/mlx5.c
@@ -932,7 +932,6 @@ mlx5_pci_probe(struct rte_pci_driver *pci_drv, struct rte_pci_device *pci_dev)
 		/* Bring Ethernet device up. */
 		DEBUG("forcing Ethernet interface up");
 		priv_set_flags(priv, ~IFF_UP, IFF_UP);
-		mlx5_link_update(priv->dev, 1);
 		continue;
 
 port_error:
diff --git a/drivers/net/mlx5/mlx5.h b/drivers/net/mlx5/mlx5.h
index 1a4f444c7..de9071f5d 100644
--- a/drivers/net/mlx5/mlx5.h
+++ b/drivers/net/mlx5/mlx5.h
@@ -210,6 +210,7 @@ int priv_set_flags(struct priv *, unsigned int, unsigned int);
 int mlx5_dev_configure(struct rte_eth_dev *);
 void mlx5_dev_infos_get(struct rte_eth_dev *, struct rte_eth_dev_info *);
 const uint32_t *mlx5_dev_supported_ptypes_get(struct rte_eth_dev *dev);
+int priv_link_update(struct priv *, int);
 int mlx5_link_update(struct rte_eth_dev *, int);
 int mlx5_dev_set_mtu(struct rte_eth_dev *, uint16_t);
 int mlx5_dev_get_flow_ctrl(struct rte_eth_dev *, struct rte_eth_fc_conf *);
diff --git a/drivers/net/mlx5/mlx5_ethdev.c b/drivers/net/mlx5/mlx5_ethdev.c
index e91c0f633..25f84e9bc 100644
--- a/drivers/net/mlx5/mlx5_ethdev.c
+++ b/drivers/net/mlx5/mlx5_ethdev.c
@@ -914,25 +914,104 @@ mlx5_link_update_unlocked_gs(struct rte_eth_dev *dev, int wait_to_complete)
 }
 
 /**
- * DPDK callback to retrieve physical link information.
+ * Enable receiving and transmitting traffic.
  *
- * @param dev
- *   Pointer to Ethernet device structure.
+ * @param priv
+ *   Pointer to private structure.
+ */
+static void
+priv_link_start(struct priv *priv)
+{
+	struct rte_eth_dev *dev = priv->dev;
+	int err;
+
+	priv_dev_select_tx_function(priv, dev);
+	priv_dev_select_rx_function(priv, dev);
+	err = priv_dev_traffic_enable(priv, dev);
+	if (err)
+		ERROR("%p: error occurred while configuring control flows: %s",
+		      (void *)priv, strerror(err));
+	err = priv_flow_start(priv, &priv->flows);
+	if (err)
+		ERROR("%p: error occurred while configuring flows: %s",
+		      (void *)priv, strerror(err));
+}
+
+/**
+ * Disable receiving and transmitting traffic.
+ *
+ * @param priv
+ *   Pointer to private structure.
+ */
+static void
+priv_link_stop(struct priv *priv)
+{
+	struct rte_eth_dev *dev = priv->dev;
+
+	priv_flow_stop(priv, &priv->flows);
+	priv_dev_traffic_disable(priv, dev);
+	dev->rx_pkt_burst = removed_rx_burst;
+	dev->tx_pkt_burst = removed_tx_burst;
+}
+
+/**
+ * Retrieve physical link information and update rx/tx_pkt_burst callbacks
+ * accordingly.
+ *
+ * @param priv
+ *   Pointer to private structure.
  * @param wait_to_complete
  *   Wait for request completion (ignored).
  */
 int
-mlx5_link_update(struct rte_eth_dev *dev, int wait_to_complete)
+priv_link_update(struct priv *priv, int wait_to_complete)
 {
+	struct rte_eth_dev *dev = priv->dev;
 	struct utsname utsname;
 	int ver[3];
+	int ret;
+	struct rte_eth_link dev_link = dev->data->dev_link;
 
 	if (uname(&utsname) == -1 ||
 	    sscanf(utsname.release, "%d.%d.%d",
 		   &ver[0], &ver[1], &ver[2]) != 3 ||
 	    KERNEL_VERSION(ver[0], ver[1], ver[2]) < KERNEL_VERSION(4, 9, 0))
-		return mlx5_link_update_unlocked_gset(dev, wait_to_complete);
-	return mlx5_link_update_unlocked_gs(dev, wait_to_complete);
+		ret = mlx5_link_update_unlocked_gset(dev, wait_to_complete);
+	else
+		ret = mlx5_link_update_unlocked_gs(dev, wait_to_complete);
+	/* If lsc interrupt is disabled, should always be ready for traffic. */
+	if (!dev->data->dev_conf.intr_conf.lsc) {
+		priv_link_start(priv);
+		return ret;
+	}
+	/* Re-select burst callbacks only if link status has been changed. */
+	if (!ret && dev_link.link_status != dev->data->dev_link.link_status) {
+		if (dev->data->dev_link.link_status == ETH_LINK_UP)
+			priv_link_start(priv);
+		else
+			priv_link_stop(priv);
+	}
+	return ret;
+}
+
+/**
+ * DPDK callback to retrieve physical link information.
+ *
+ * @param dev
+ *   Pointer to Ethernet device structure.
+ * @param wait_to_complete
+ *   Wait for request completion (ignored).
+ */
+int
+mlx5_link_update(struct rte_eth_dev *dev, int wait_to_complete)
+{
+	struct priv *priv = dev->data->dev_private;
+	int ret;
+
+	priv_lock(priv);
+	ret = priv_link_update(priv, wait_to_complete);
+	priv_unlock(priv);
+	return ret;
 }
 
 /**
@@ -1151,7 +1230,7 @@ priv_link_status_update(struct priv *priv)
 {
 	struct rte_eth_link *link = &priv->dev->data->dev_link;
 
-	mlx5_link_update(priv->dev, 0);
+	priv_link_update(priv, 0);
 	if (((link->link_speed == 0) && link->link_status) ||
 		((link->link_speed != 0) && !link->link_status)) {
 		/*
@@ -1354,8 +1433,6 @@ priv_dev_interrupt_handler_install(struct priv *priv, struct rte_eth_dev *dev)
  *
  * @param priv
  *   Pointer to private data structure.
- * @param dev
- *   Pointer to rte_eth_dev structure.
  * @param up
  *   Nonzero for link up, otherwise link down.
  *
@@ -1363,24 +1440,9 @@ priv_dev_interrupt_handler_install(struct priv *priv, struct rte_eth_dev *dev)
  *   0 on success, errno value on failure.
  */
 static int
-priv_dev_set_link(struct priv *priv, struct rte_eth_dev *dev, int up)
+priv_dev_set_link(struct priv *priv, int up)
 {
-	int err;
-
-	if (up) {
-		err = priv_set_flags(priv, ~IFF_UP, IFF_UP);
-		if (err)
-			return err;
-		priv_dev_select_tx_function(priv, dev);
-		priv_dev_select_rx_function(priv, dev);
-	} else {
-		err = priv_set_flags(priv, ~IFF_UP, ~IFF_UP);
-		if (err)
-			return err;
-		dev->rx_pkt_burst = removed_rx_burst;
-		dev->tx_pkt_burst = removed_tx_burst;
-	}
-	return 0;
+	return priv_set_flags(priv, ~IFF_UP, up ? IFF_UP : ~IFF_UP);
 }
 
 /**
@@ -1399,7 +1461,7 @@ mlx5_set_link_down(struct rte_eth_dev *dev)
 	int err;
 
 	priv_lock(priv);
-	err = priv_dev_set_link(priv, dev, 0);
+	err = priv_dev_set_link(priv, 0);
 	priv_unlock(priv);
 	return err;
 }
@@ -1420,7 +1482,7 @@ mlx5_set_link_up(struct rte_eth_dev *dev)
 	int err;
 
 	priv_lock(priv);
-	err = priv_dev_set_link(priv, dev, 1);
+	err = priv_dev_set_link(priv, 1);
 	priv_unlock(priv);
 	return err;
 }
diff --git a/drivers/net/mlx5/mlx5_trigger.c b/drivers/net/mlx5/mlx5_trigger.c
index 39c5ec5d2..01780ef18 100644
--- a/drivers/net/mlx5/mlx5_trigger.c
+++ b/drivers/net/mlx5/mlx5_trigger.c
@@ -154,38 +154,23 @@ mlx5_dev_start(struct rte_eth_dev *dev)
 		      (void *)dev, strerror(err));
 		goto error;
 	}
-	/* Update send callback. */
-	priv_dev_select_tx_function(priv, dev);
 	err = priv_rxq_start(priv);
 	if (err) {
 		ERROR("%p: RXQ allocation failed: %s",
 		      (void *)dev, strerror(err));
 		goto error;
 	}
-	/* Update receive callback. */
-	priv_dev_select_rx_function(priv, dev);
-	err = priv_dev_traffic_enable(priv, dev);
-	if (err) {
-		ERROR("%p: an error occurred while configuring control flows:"
-		      " %s",
-		      (void *)priv, strerror(err));
-		goto error;
-	}
-	err = priv_flow_start(priv, &priv->flows);
-	if (err) {
-		ERROR("%p: an error occurred while configuring flows:"
-		      " %s",
-		      (void *)priv, strerror(err));
-		goto error;
-	}
 	err = priv_rx_intr_vec_enable(priv);
 	if (err) {
 		ERROR("%p: RX interrupt vector creation failed",
 		      (void *)priv);
 		goto error;
 	}
-	priv_dev_interrupt_handler_install(priv, dev);
 	priv_xstats_init(priv);
+	/* Update link status and Tx/Rx callbacks for the first time. */
+	memset(&dev->data->dev_link, 0, sizeof(struct rte_eth_link));
+	priv_link_update(priv, 1);
+	priv_dev_interrupt_handler_install(priv, dev);
 	priv_unlock(priv);
 	return 0;
 error:
-- 
2.11.0

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

* Re: [dpdk-stable] [PATCH] net/mlx5: fix handling link status event
  2018-02-12 18:20 [dpdk-stable] [PATCH] net/mlx5: fix handling link status event Yongseok Koh
@ 2018-02-12 18:31 ` Luca Boccassi
  2018-02-12 23:39   ` Yongseok Koh
  2018-02-13 11:53 ` Yuanhan Liu
  1 sibling, 1 reply; 5+ messages in thread
From: Luca Boccassi @ 2018-02-12 18:31 UTC (permalink / raw)
  To: Yongseok Koh, stable

On Mon, 2018-02-12 at 10:20 -0800, Yongseok Koh wrote:
> [ backported from upstream commit c7bf62255edf ]
> 
> Even though link of a port gets down, device still can receive
> traffic.
> That is the reason why mlx5_set_link_up/down() switches
> rx/tx_pkt_burst().
> However, if link gets down by an external command (e.g. ifconfig), it
> isn't
> effective. It is better to change burst functions when link status
> change
> is detected.
> 
> Fixes: 62072098b54e ("mlx5: support setting link up or down")
> Cc: stable@dpdk.org
> 
> Signed-off-by: Yongseok Koh <yskoh@mellanox.com>
> Acked-by: Nelio Laranjeiro <nelio.laranjeiro@6wind.com>
> ---
>  drivers/net/mlx5/mlx5.c         |   1 -
>  drivers/net/mlx5/mlx5.h         |   1 +
>  drivers/net/mlx5/mlx5_ethdev.c  | 118
> ++++++++++++++++++++++++++++++----------
>  drivers/net/mlx5/mlx5_trigger.c |  23 ++------
>  4 files changed, 95 insertions(+), 48 deletions(-)

Hi,

62072098b54e ("mlx5: support setting link up or down") is in 16.11, but
this patch does not apply cleanly. Should it be backported to 16.11? If
so, could you please take care of it?

-- 
Kind regards,
Luca Boccassi

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

* Re: [dpdk-stable] [PATCH] net/mlx5: fix handling link status event
  2018-02-12 18:31 ` Luca Boccassi
@ 2018-02-12 23:39   ` Yongseok Koh
  2018-02-12 23:49     ` Luca Boccassi
  0 siblings, 1 reply; 5+ messages in thread
From: Yongseok Koh @ 2018-02-12 23:39 UTC (permalink / raw)
  To: Luca Boccassi; +Cc: stable

> On Feb 12, 2018, at 10:31 AM, Luca Boccassi <bluca@debian.org> wrote:
> 
> On Mon, 2018-02-12 at 10:20 -0800, Yongseok Koh wrote:
>> [ backported from upstream commit c7bf62255edf ]
>> 
>> Even though link of a port gets down, device still can receive
>> traffic.
>> That is the reason why mlx5_set_link_up/down() switches
>> rx/tx_pkt_burst().
>> However, if link gets down by an external command (e.g. ifconfig), it
>> isn't
>> effective. It is better to change burst functions when link status
>> change
>> is detected.
>> 
>> Fixes: 62072098b54e ("mlx5: support setting link up or down")
>> Cc: stable@dpdk.org
>> 
>> Signed-off-by: Yongseok Koh <yskoh@mellanox.com>
>> Acked-by: Nelio Laranjeiro <nelio.laranjeiro@6wind.com>
>> ---
>>  drivers/net/mlx5/mlx5.c         |   1 -
>>  drivers/net/mlx5/mlx5.h         |   1 +
>>  drivers/net/mlx5/mlx5_ethdev.c  | 118
>> ++++++++++++++++++++++++++++++----------
>>  drivers/net/mlx5/mlx5_trigger.c |  23 ++------
>>  4 files changed, 95 insertions(+), 48 deletions(-)
> 
> Hi,
> 
> 62072098b54e ("mlx5: support setting link up or down") is in 16.11, but
> this patch does not apply cleanly. Should it be backported to 16.11? If
> so, could you please take care of it?

Thank you for the email.
But, like I answered in the other email to you, you can drop this patch
because there're some missing APIs in 16.11. And it isn't a critical bug.

Yongseok

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

* Re: [dpdk-stable] [PATCH] net/mlx5: fix handling link status event
  2018-02-12 23:39   ` Yongseok Koh
@ 2018-02-12 23:49     ` Luca Boccassi
  0 siblings, 0 replies; 5+ messages in thread
From: Luca Boccassi @ 2018-02-12 23:49 UTC (permalink / raw)
  To: Yongseok Koh; +Cc: stable

On Mon, 2018-02-12 at 23:39 +0000, Yongseok Koh wrote:
> > On Feb 12, 2018, at 10:31 AM, Luca Boccassi <bluca@debian.org>
> > wrote:
> > 
> > On Mon, 2018-02-12 at 10:20 -0800, Yongseok Koh wrote:
> > > [ backported from upstream commit c7bf62255edf ]
> > > 
> > > Even though link of a port gets down, device still can receive
> > > traffic.
> > > That is the reason why mlx5_set_link_up/down() switches
> > > rx/tx_pkt_burst().
> > > However, if link gets down by an external command (e.g.
> > > ifconfig), it
> > > isn't
> > > effective. It is better to change burst functions when link
> > > status
> > > change
> > > is detected.
> > > 
> > > Fixes: 62072098b54e ("mlx5: support setting link up or down")
> > > Cc: stable@dpdk.org
> > > 
> > > Signed-off-by: Yongseok Koh <yskoh@mellanox.com>
> > > Acked-by: Nelio Laranjeiro <nelio.laranjeiro@6wind.com>
> > > ---
> > >  drivers/net/mlx5/mlx5.c         |   1 -
> > >  drivers/net/mlx5/mlx5.h         |   1 +
> > >  drivers/net/mlx5/mlx5_ethdev.c  | 118
> > > ++++++++++++++++++++++++++++++----------
> > >  drivers/net/mlx5/mlx5_trigger.c |  23 ++------
> > >  4 files changed, 95 insertions(+), 48 deletions(-)
> > 
> > Hi,
> > 
> > 62072098b54e ("mlx5: support setting link up or down") is in 16.11,
> > but
> > this patch does not apply cleanly. Should it be backported to
> > 16.11? If
> > so, could you please take care of it?
> 
> Thank you for the email.
> But, like I answered in the other email to you, you can drop this
> patch
> because there're some missing APIs in 16.11. And it isn't a critical
> bug.
> 
> Yongseok

Gah sorry - too many patches to remember, I should have checked the
list before asking :-)

-- 
Kind regards,
Luca Boccassi

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

* Re: [dpdk-stable] [PATCH] net/mlx5: fix handling link status event
  2018-02-12 18:20 [dpdk-stable] [PATCH] net/mlx5: fix handling link status event Yongseok Koh
  2018-02-12 18:31 ` Luca Boccassi
@ 2018-02-13 11:53 ` Yuanhan Liu
  1 sibling, 0 replies; 5+ messages in thread
From: Yuanhan Liu @ 2018-02-13 11:53 UTC (permalink / raw)
  To: Yongseok Koh; +Cc: stable

On Mon, Feb 12, 2018 at 10:20:22AM -0800, Yongseok Koh wrote:
> [ backported from upstream commit c7bf62255edf ]
> 
> Even though link of a port gets down, device still can receive traffic.
> That is the reason why mlx5_set_link_up/down() switches rx/tx_pkt_burst().
> However, if link gets down by an external command (e.g. ifconfig), it isn't
> effective. It is better to change burst functions when link status change
> is detected.
> 
> Fixes: 62072098b54e ("mlx5: support setting link up or down")
> Cc: stable@dpdk.org
> 
> Signed-off-by: Yongseok Koh <yskoh@mellanox.com>
> Acked-by: Nelio Laranjeiro <nelio.laranjeiro@6wind.com>

Applied to dpdk-stable/17.11.

Thanks!

	--yliu
> ---
>  drivers/net/mlx5/mlx5.c         |   1 -
>  drivers/net/mlx5/mlx5.h         |   1 +
>  drivers/net/mlx5/mlx5_ethdev.c  | 118 ++++++++++++++++++++++++++++++----------
>  drivers/net/mlx5/mlx5_trigger.c |  23 ++------
>  4 files changed, 95 insertions(+), 48 deletions(-)
> 
> diff --git a/drivers/net/mlx5/mlx5.c b/drivers/net/mlx5/mlx5.c
> index eba674269..40804b3e6 100644
> --- a/drivers/net/mlx5/mlx5.c
> +++ b/drivers/net/mlx5/mlx5.c
> @@ -932,7 +932,6 @@ mlx5_pci_probe(struct rte_pci_driver *pci_drv, struct rte_pci_device *pci_dev)
>  		/* Bring Ethernet device up. */
>  		DEBUG("forcing Ethernet interface up");
>  		priv_set_flags(priv, ~IFF_UP, IFF_UP);
> -		mlx5_link_update(priv->dev, 1);
>  		continue;
>  
>  port_error:
> diff --git a/drivers/net/mlx5/mlx5.h b/drivers/net/mlx5/mlx5.h
> index 1a4f444c7..de9071f5d 100644
> --- a/drivers/net/mlx5/mlx5.h
> +++ b/drivers/net/mlx5/mlx5.h
> @@ -210,6 +210,7 @@ int priv_set_flags(struct priv *, unsigned int, unsigned int);
>  int mlx5_dev_configure(struct rte_eth_dev *);
>  void mlx5_dev_infos_get(struct rte_eth_dev *, struct rte_eth_dev_info *);
>  const uint32_t *mlx5_dev_supported_ptypes_get(struct rte_eth_dev *dev);
> +int priv_link_update(struct priv *, int);
>  int mlx5_link_update(struct rte_eth_dev *, int);
>  int mlx5_dev_set_mtu(struct rte_eth_dev *, uint16_t);
>  int mlx5_dev_get_flow_ctrl(struct rte_eth_dev *, struct rte_eth_fc_conf *);
> diff --git a/drivers/net/mlx5/mlx5_ethdev.c b/drivers/net/mlx5/mlx5_ethdev.c
> index e91c0f633..25f84e9bc 100644
> --- a/drivers/net/mlx5/mlx5_ethdev.c
> +++ b/drivers/net/mlx5/mlx5_ethdev.c
> @@ -914,25 +914,104 @@ mlx5_link_update_unlocked_gs(struct rte_eth_dev *dev, int wait_to_complete)
>  }
>  
>  /**
> - * DPDK callback to retrieve physical link information.
> + * Enable receiving and transmitting traffic.
>   *
> - * @param dev
> - *   Pointer to Ethernet device structure.
> + * @param priv
> + *   Pointer to private structure.
> + */
> +static void
> +priv_link_start(struct priv *priv)
> +{
> +	struct rte_eth_dev *dev = priv->dev;
> +	int err;
> +
> +	priv_dev_select_tx_function(priv, dev);
> +	priv_dev_select_rx_function(priv, dev);
> +	err = priv_dev_traffic_enable(priv, dev);
> +	if (err)
> +		ERROR("%p: error occurred while configuring control flows: %s",
> +		      (void *)priv, strerror(err));
> +	err = priv_flow_start(priv, &priv->flows);
> +	if (err)
> +		ERROR("%p: error occurred while configuring flows: %s",
> +		      (void *)priv, strerror(err));
> +}
> +
> +/**
> + * Disable receiving and transmitting traffic.
> + *
> + * @param priv
> + *   Pointer to private structure.
> + */
> +static void
> +priv_link_stop(struct priv *priv)
> +{
> +	struct rte_eth_dev *dev = priv->dev;
> +
> +	priv_flow_stop(priv, &priv->flows);
> +	priv_dev_traffic_disable(priv, dev);
> +	dev->rx_pkt_burst = removed_rx_burst;
> +	dev->tx_pkt_burst = removed_tx_burst;
> +}
> +
> +/**
> + * Retrieve physical link information and update rx/tx_pkt_burst callbacks
> + * accordingly.
> + *
> + * @param priv
> + *   Pointer to private structure.
>   * @param wait_to_complete
>   *   Wait for request completion (ignored).
>   */
>  int
> -mlx5_link_update(struct rte_eth_dev *dev, int wait_to_complete)
> +priv_link_update(struct priv *priv, int wait_to_complete)
>  {
> +	struct rte_eth_dev *dev = priv->dev;
>  	struct utsname utsname;
>  	int ver[3];
> +	int ret;
> +	struct rte_eth_link dev_link = dev->data->dev_link;
>  
>  	if (uname(&utsname) == -1 ||
>  	    sscanf(utsname.release, "%d.%d.%d",
>  		   &ver[0], &ver[1], &ver[2]) != 3 ||
>  	    KERNEL_VERSION(ver[0], ver[1], ver[2]) < KERNEL_VERSION(4, 9, 0))
> -		return mlx5_link_update_unlocked_gset(dev, wait_to_complete);
> -	return mlx5_link_update_unlocked_gs(dev, wait_to_complete);
> +		ret = mlx5_link_update_unlocked_gset(dev, wait_to_complete);
> +	else
> +		ret = mlx5_link_update_unlocked_gs(dev, wait_to_complete);
> +	/* If lsc interrupt is disabled, should always be ready for traffic. */
> +	if (!dev->data->dev_conf.intr_conf.lsc) {
> +		priv_link_start(priv);
> +		return ret;
> +	}
> +	/* Re-select burst callbacks only if link status has been changed. */
> +	if (!ret && dev_link.link_status != dev->data->dev_link.link_status) {
> +		if (dev->data->dev_link.link_status == ETH_LINK_UP)
> +			priv_link_start(priv);
> +		else
> +			priv_link_stop(priv);
> +	}
> +	return ret;
> +}
> +
> +/**
> + * DPDK callback to retrieve physical link information.
> + *
> + * @param dev
> + *   Pointer to Ethernet device structure.
> + * @param wait_to_complete
> + *   Wait for request completion (ignored).
> + */
> +int
> +mlx5_link_update(struct rte_eth_dev *dev, int wait_to_complete)
> +{
> +	struct priv *priv = dev->data->dev_private;
> +	int ret;
> +
> +	priv_lock(priv);
> +	ret = priv_link_update(priv, wait_to_complete);
> +	priv_unlock(priv);
> +	return ret;
>  }
>  
>  /**
> @@ -1151,7 +1230,7 @@ priv_link_status_update(struct priv *priv)
>  {
>  	struct rte_eth_link *link = &priv->dev->data->dev_link;
>  
> -	mlx5_link_update(priv->dev, 0);
> +	priv_link_update(priv, 0);
>  	if (((link->link_speed == 0) && link->link_status) ||
>  		((link->link_speed != 0) && !link->link_status)) {
>  		/*
> @@ -1354,8 +1433,6 @@ priv_dev_interrupt_handler_install(struct priv *priv, struct rte_eth_dev *dev)
>   *
>   * @param priv
>   *   Pointer to private data structure.
> - * @param dev
> - *   Pointer to rte_eth_dev structure.
>   * @param up
>   *   Nonzero for link up, otherwise link down.
>   *
> @@ -1363,24 +1440,9 @@ priv_dev_interrupt_handler_install(struct priv *priv, struct rte_eth_dev *dev)
>   *   0 on success, errno value on failure.
>   */
>  static int
> -priv_dev_set_link(struct priv *priv, struct rte_eth_dev *dev, int up)
> +priv_dev_set_link(struct priv *priv, int up)
>  {
> -	int err;
> -
> -	if (up) {
> -		err = priv_set_flags(priv, ~IFF_UP, IFF_UP);
> -		if (err)
> -			return err;
> -		priv_dev_select_tx_function(priv, dev);
> -		priv_dev_select_rx_function(priv, dev);
> -	} else {
> -		err = priv_set_flags(priv, ~IFF_UP, ~IFF_UP);
> -		if (err)
> -			return err;
> -		dev->rx_pkt_burst = removed_rx_burst;
> -		dev->tx_pkt_burst = removed_tx_burst;
> -	}
> -	return 0;
> +	return priv_set_flags(priv, ~IFF_UP, up ? IFF_UP : ~IFF_UP);
>  }
>  
>  /**
> @@ -1399,7 +1461,7 @@ mlx5_set_link_down(struct rte_eth_dev *dev)
>  	int err;
>  
>  	priv_lock(priv);
> -	err = priv_dev_set_link(priv, dev, 0);
> +	err = priv_dev_set_link(priv, 0);
>  	priv_unlock(priv);
>  	return err;
>  }
> @@ -1420,7 +1482,7 @@ mlx5_set_link_up(struct rte_eth_dev *dev)
>  	int err;
>  
>  	priv_lock(priv);
> -	err = priv_dev_set_link(priv, dev, 1);
> +	err = priv_dev_set_link(priv, 1);
>  	priv_unlock(priv);
>  	return err;
>  }
> diff --git a/drivers/net/mlx5/mlx5_trigger.c b/drivers/net/mlx5/mlx5_trigger.c
> index 39c5ec5d2..01780ef18 100644
> --- a/drivers/net/mlx5/mlx5_trigger.c
> +++ b/drivers/net/mlx5/mlx5_trigger.c
> @@ -154,38 +154,23 @@ mlx5_dev_start(struct rte_eth_dev *dev)
>  		      (void *)dev, strerror(err));
>  		goto error;
>  	}
> -	/* Update send callback. */
> -	priv_dev_select_tx_function(priv, dev);
>  	err = priv_rxq_start(priv);
>  	if (err) {
>  		ERROR("%p: RXQ allocation failed: %s",
>  		      (void *)dev, strerror(err));
>  		goto error;
>  	}
> -	/* Update receive callback. */
> -	priv_dev_select_rx_function(priv, dev);
> -	err = priv_dev_traffic_enable(priv, dev);
> -	if (err) {
> -		ERROR("%p: an error occurred while configuring control flows:"
> -		      " %s",
> -		      (void *)priv, strerror(err));
> -		goto error;
> -	}
> -	err = priv_flow_start(priv, &priv->flows);
> -	if (err) {
> -		ERROR("%p: an error occurred while configuring flows:"
> -		      " %s",
> -		      (void *)priv, strerror(err));
> -		goto error;
> -	}
>  	err = priv_rx_intr_vec_enable(priv);
>  	if (err) {
>  		ERROR("%p: RX interrupt vector creation failed",
>  		      (void *)priv);
>  		goto error;
>  	}
> -	priv_dev_interrupt_handler_install(priv, dev);
>  	priv_xstats_init(priv);
> +	/* Update link status and Tx/Rx callbacks for the first time. */
> +	memset(&dev->data->dev_link, 0, sizeof(struct rte_eth_link));
> +	priv_link_update(priv, 1);
> +	priv_dev_interrupt_handler_install(priv, dev);
>  	priv_unlock(priv);
>  	return 0;
>  error:
> -- 
> 2.11.0

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

end of thread, other threads:[~2018-02-13 11:53 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-02-12 18:20 [dpdk-stable] [PATCH] net/mlx5: fix handling link status event Yongseok Koh
2018-02-12 18:31 ` Luca Boccassi
2018-02-12 23:39   ` Yongseok Koh
2018-02-12 23:49     ` Luca Boccassi
2018-02-13 11:53 ` Yuanhan Liu

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).