From: Adrien Mazarguil Date: Thu, 26 Apr 2018 16:26:15 +0000 (+0200) Subject: net/mlx4: fix default RSS hash fields X-Git-Url: http://git.droids-corp.org/?a=commitdiff_plain;h=1d173da83ef2176b7ef107b76a4c5b80d47e1d00;p=dpdk.git net/mlx4: fix default RSS hash fields 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: stable@dpdk.org Signed-off-by: Adrien Mazarguil --- diff --git a/drivers/net/mlx4/mlx4.c b/drivers/net/mlx4/mlx4.c index 3dd72dbf50..4e472fa1de 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 e3d7aa8efa..bebad074e1 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; }