From: Nelio Laranjeiro <nelio.laranje...@6wind.com>

Normal MAC flows are not necessary when promiscuous mode is enabled.
Removing them frees up hardware resources.

Signed-off-by: Nelio Laranjeiro <nelio.laranjeiro at 6wind.com>
Signed-off-by: Adrien Mazarguil <adrien.mazarguil at 6wind.com>
---
 drivers/net/mlx5/mlx5_rxmode.c | 15 +++++++++++++--
 1 file changed, 13 insertions(+), 2 deletions(-)

diff --git a/drivers/net/mlx5/mlx5_rxmode.c b/drivers/net/mlx5/mlx5_rxmode.c
index aab38ee..578f2fb 100644
--- a/drivers/net/mlx5/mlx5_rxmode.c
+++ b/drivers/net/mlx5/mlx5_rxmode.c
@@ -123,6 +123,8 @@ priv_promiscuous_enable(struct priv *priv)
                struct hash_rxq *hash_rxq = &(*priv->hash_rxqs)[i];
                int ret;

+               /* Remove normal MAC flows first. */
+               hash_rxq_mac_addrs_del(hash_rxq);
                ret = hash_rxq_promiscuous_enable(hash_rxq);
                if (!ret)
                        continue;
@@ -130,6 +132,9 @@ priv_promiscuous_enable(struct priv *priv)
                while (i != 0) {
                        hash_rxq = &(*priv->hash_rxqs)[--i];
                        hash_rxq_promiscuous_disable(hash_rxq);
+                       /* Restore MAC flows. */
+                       if (priv->started)
+                               hash_rxq_mac_addrs_add(hash_rxq);
                }
                return ret;
        }
@@ -189,8 +194,14 @@ priv_promiscuous_disable(struct priv *priv)

        if (!priv->promisc)
                return;
-       for (i = 0; (i != priv->hash_rxqs_n); ++i)
-               hash_rxq_promiscuous_disable(&(*priv->hash_rxqs)[i]);
+       for (i = 0; (i != priv->hash_rxqs_n); ++i) {
+               struct hash_rxq *hash_rxq = &(*priv->hash_rxqs)[i];
+
+               hash_rxq_promiscuous_disable(hash_rxq);
+               /* Restore MAC flows. */
+               if (priv->started)
+                       hash_rxq_mac_addrs_add(hash_rxq);
+       }
        priv->promisc = 0;
 }

-- 
2.1.0

Reply via email to