]> git.droids-corp.org - dpdk.git/commitdiff
net/mlx4: update Rx/Tx callbacks consistently
authorAdrien Mazarguil <adrien.mazarguil@6wind.com>
Thu, 12 Oct 2017 12:19:35 +0000 (14:19 +0200)
committerFerruh Yigit <ferruh.yigit@intel.com>
Fri, 13 Oct 2017 00:18:48 +0000 (01:18 +0100)
Although their "removed" version acts as a safety against unexpected bursts
while queues are being modified by the control path, these callbacks are
set per device instead of per queue. It makes sense to update them during
start/stop/close cycles instead of queue setup.

As a side effect, this commit addresses a bug left over from a prior
commit: bringing the link down causes the "removed" Tx callback to be used,
however the normal callback is not restored when bringing it back up,
preventing the application from sending traffic at all.

Updating callbacks for a link change is not necessary as bringing the
netdevice down is normally enough to prevent traffic from flowing in.

Fixes: 3f75a0271941 ("net/mlx4: drop scatter/gather support")
Signed-off-by: Adrien Mazarguil <adrien.mazarguil@6wind.com>
Acked-by: Nelio Laranjeiro <nelio.laranjeiro@6wind.com>
drivers/net/mlx4/mlx4.c
drivers/net/mlx4/mlx4_ethdev.c
drivers/net/mlx4/mlx4_rxq.c
drivers/net/mlx4/mlx4_txq.c

index f02508a3f37f4c668552b1f76445f1c43ef8af1b..52f8d5126fc45ffc0d18c37ef7ab3255b0fcab3c 100644 (file)
@@ -149,6 +149,9 @@ mlx4_dev_start(struct rte_eth_dev *dev)
                      error.message ? error.message : "(unspecified)");
                goto err;
        }
+       rte_wmb();
+       dev->tx_pkt_burst = mlx4_tx_burst;
+       dev->rx_pkt_burst = mlx4_rx_burst;
        return 0;
 err:
        /* Rollback. */
@@ -173,6 +176,9 @@ mlx4_dev_stop(struct rte_eth_dev *dev)
                return;
        DEBUG("%p: detaching flows from all RX queues", (void *)dev);
        priv->started = 0;
+       dev->tx_pkt_burst = mlx4_tx_burst_removed;
+       dev->rx_pkt_burst = mlx4_rx_burst_removed;
+       rte_wmb();
        mlx4_flow_sync(priv, NULL);
        mlx4_intr_uninstall(priv);
 }
@@ -191,14 +197,13 @@ mlx4_dev_close(struct rte_eth_dev *dev)
        struct priv *priv = dev->data->dev_private;
        unsigned int i;
 
-       if (priv == NULL)
-               return;
        DEBUG("%p: closing device \"%s\"",
              (void *)dev,
              ((priv->ctx != NULL) ? priv->ctx->device->name : ""));
-       mlx4_flow_clean(priv);
        dev->rx_pkt_burst = mlx4_rx_burst_removed;
        dev->tx_pkt_burst = mlx4_tx_burst_removed;
+       rte_wmb();
+       mlx4_flow_clean(priv);
        for (i = 0; i != dev->data->nb_rx_queues; ++i)
                mlx4_rx_queue_release(dev->data->rx_queues[i]);
        for (i = 0; i != dev->data->nb_tx_queues; ++i)
index 01fb195e5f6347282a00f11ab87d1c087cc83fed..ebf2339d4e5076f23a3b7ee36c0f30cc59e57ab3 100644 (file)
@@ -467,20 +467,16 @@ mlx4_set_flags(struct priv *priv, unsigned int keep, unsigned int flags)
 static int
 mlx4_dev_set_link(struct priv *priv, int up)
 {
-       struct rte_eth_dev *dev = priv->dev;
        int err;
 
        if (up) {
                err = mlx4_set_flags(priv, ~IFF_UP, IFF_UP);
                if (err)
                        return err;
-               dev->rx_pkt_burst = mlx4_rx_burst;
        } else {
                err = mlx4_set_flags(priv, ~IFF_UP, ~IFF_UP);
                if (err)
                        return err;
-               dev->rx_pkt_burst = mlx4_rx_burst_removed;
-               dev->tx_pkt_burst = mlx4_tx_burst_removed;
        }
        return 0;
 }
index bcb7b9490cd345c5fc58c47bbb7c3259cf7541a9..693db4f586c6e8c20e1630ade5dc2688e1dac903 100644 (file)
@@ -436,8 +436,6 @@ mlx4_rx_queue_setup(struct rte_eth_dev *dev, uint16_t idx, uint16_t desc,
                        rte_free(rxq);
                        return ret;
                }
-               /* Update receive callback. */
-               dev->rx_pkt_burst = mlx4_rx_burst;
        }
        return ret;
 }
index e0245b0de84d80fb387905184171619c3cc2a04a..c1fdbaf4cdad4f252e6f57e429143aa0d9b1d399 100644 (file)
@@ -438,8 +438,6 @@ mlx4_tx_queue_setup(struct rte_eth_dev *dev, uint16_t idx, uint16_t desc,
                DEBUG("%p: adding Tx queue %p to list",
                      (void *)dev, (void *)txq);
                dev->data->tx_queues[idx] = txq;
-               /* Update send callback. */
-               dev->tx_pkt_burst = mlx4_tx_burst;
        }
        return ret;
 }