Using special types value -1 with mlx4_conv_rss_types() is supposed to
return a supported set of Verbs RSS hash fields, that is, priv->hw_rss_sup
unmodified.

Due to the way this function is written and because it is also used to
initially populate priv->hw_rss_sup however, this special value works
properly only once and fails with ENOTSUP errors afterward.

This problem can be seen when re-creating default flows (e.g. by entering
and leaving isolated mode).

Fixes: 024e87bef40b ("net/mlx4: restore UDP RSS by probing capabilities")
Cc: sta...@dpdk.org

Signed-off-by: Adrien Mazarguil <adrien.mazarg...@6wind.com>
---
 drivers/net/mlx4/mlx4.c      | 15 +++++++--------
 drivers/net/mlx4/mlx4_flow.c | 13 ++++---------
 2 files changed, 11 insertions(+), 17 deletions(-)

diff --git a/drivers/net/mlx4/mlx4.c b/drivers/net/mlx4/mlx4.c
index 3dd72dbf5..4e472fa1d 100644
--- a/drivers/net/mlx4/mlx4.c
+++ b/drivers/net/mlx4/mlx4.c
@@ -569,14 +569,13 @@ mlx4_pci_probe(struct rte_pci_driver *pci_drv, struct 
rte_pci_device *pci_dev)
                if (!priv->hw_rss_sup) {
                        WARN("no RSS capabilities reported; disabling support"
                             " for UDP RSS and inner VXLAN RSS");
-                       /* Fake support for all possible RSS hash fields. */
-                       priv->hw_rss_sup = ~UINT64_C(0);
-                       priv->hw_rss_sup = mlx4_conv_rss_types(priv, -1);
-                       /* Filter out known unsupported fields. */
-                       priv->hw_rss_sup &=
-                               ~(uint64_t)(IBV_RX_HASH_SRC_PORT_UDP |
-                                           IBV_RX_HASH_DST_PORT_UDP |
-                                           IBV_RX_HASH_INNER);
+                       priv->hw_rss_sup =
+                               IBV_RX_HASH_SRC_IPV4 |
+                               IBV_RX_HASH_DST_IPV4 |
+                               IBV_RX_HASH_SRC_IPV6 |
+                               IBV_RX_HASH_DST_IPV6 |
+                               IBV_RX_HASH_SRC_PORT_TCP |
+                               IBV_RX_HASH_DST_PORT_TCP;
                }
                DEBUG("supported RSS hash fields mask: %016" PRIx64,
                      priv->hw_rss_sup);
diff --git a/drivers/net/mlx4/mlx4_flow.c b/drivers/net/mlx4/mlx4_flow.c
index e3d7aa8ef..bebad074e 100644
--- a/drivers/net/mlx4/mlx4_flow.c
+++ b/drivers/net/mlx4/mlx4_flow.c
@@ -125,20 +125,15 @@ mlx4_conv_rss_types(struct priv *priv, uint64_t types)
        uint64_t conv = 0;
        unsigned int i;
 
+       if (types == (uint64_t)-1)
+               return priv->hw_rss_sup;
        for (i = 0; i != RTE_DIM(in); ++i)
                if (types & in[i]) {
                        seen |= types & in[i];
                        conv |= out[i];
                }
-       if ((conv & priv->hw_rss_sup) == conv) {
-               if (types == (uint64_t)-1) {
-                       /* Include inner RSS by default if supported. */
-                       conv |= priv->hw_rss_sup & IBV_RX_HASH_INNER;
-                       return conv;
-               }
-               if (!(types & ~seen))
-                       return conv;
-       }
+       if ((conv & priv->hw_rss_sup) == conv && !(types & ~seen))
+               return conv;
        rte_errno = ENOTSUP;
        return (uint64_t)-1;
 }
-- 
2.11.0

Reply via email to