[dpdk-dev,v3,3/3] net/mlx5: fix RSS hash update

Message ID 120a5c8345cac22559f0bc95f9f256dae4664b4b.1508757360.git.nelio.laranjeiro@6wind.com (mailing list archive)
State Accepted, archived
Delegated to: Ferruh Yigit
Headers

Checks

Context Check Description
ci/checkpatch warning coding style issues
ci/Intel-compilation success Compilation OK

Commit Message

Nélio Laranjeiro Oct. 23, 2017, 11:17 a.m. UTC
  Few bugs fixes in both configuration get and hash update where inputs are
not handled as expected by the ethdev layer.

RSS structure may not be totally usable, the PMD should try to take as most
information from it has it can when it is an hash update or it should try
to fill as most as possible in the configuration get.
This means that in the RSS configuration structure, the memory space for
the RSS hash key may not be present, but the PMD should consider the hash
field valid and process/set it.

Fixes: 29c1d8bb3e79 ("net/mlx5: handle a single RSS hash key for all protocols")

Signed-off-by: Nelio Laranjeiro <nelio.laranjeiro@6wind.com>
---
 drivers/net/mlx5/mlx5_rss.c | 25 +++++++++++--------------
 1 file changed, 11 insertions(+), 14 deletions(-)
  

Comments

Yongseok Koh Oct. 23, 2017, 6:54 p.m. UTC | #1
> On Oct 23, 2017, at 4:17 AM, Nelio Laranjeiro <nelio.laranjeiro@6wind.com> wrote:
> 
> Few bugs fixes in both configuration get and hash update where inputs are
> not handled as expected by the ethdev layer.
> 
> RSS structure may not be totally usable, the PMD should try to take as most
> information from it has it can when it is an hash update or it should try
> to fill as most as possible in the configuration get.
> This means that in the RSS configuration structure, the memory space for
> the RSS hash key may not be present, but the PMD should consider the hash
> field valid and process/set it.
> 
> Fixes: 29c1d8bb3e79 ("net/mlx5: handle a single RSS hash key for all protocols")
> 
> Signed-off-by: Nelio Laranjeiro <nelio.laranjeiro@6wind.com>
> ---
Acked-by: Yongseok Koh <yskoh@mellanox.com>
 
Thanks
  

Patch

diff --git a/drivers/net/mlx5/mlx5_rss.c b/drivers/net/mlx5/mlx5_rss.c
index ad6d9ab70..f3de46de0 100644
--- a/drivers/net/mlx5/mlx5_rss.c
+++ b/drivers/net/mlx5/mlx5_rss.c
@@ -72,14 +72,14 @@  mlx5_rss_hash_update(struct rte_eth_dev *dev,
 	int ret = 0;
 
 	priv_lock(priv);
-	if (rss_conf->rss_key_len) {
+	if (rss_conf->rss_key && rss_conf->rss_key_len) {
 		priv->rss_conf.rss_key = rte_realloc(priv->rss_conf.rss_key,
 						     rss_conf->rss_key_len, 0);
 		if (!priv->rss_conf.rss_key) {
 			ret = -ENOMEM;
 			goto out;
 		}
-		memcpy(&priv->rss_conf.rss_key, rss_conf->rss_key,
+		memcpy(priv->rss_conf.rss_key, rss_conf->rss_key,
 		       rss_conf->rss_key_len);
 		priv->rss_conf.rss_key_len = rss_conf->rss_key_len;
 	}
@@ -105,22 +105,19 @@  mlx5_rss_hash_conf_get(struct rte_eth_dev *dev,
 		       struct rte_eth_rss_conf *rss_conf)
 {
 	struct priv *priv = dev->data->dev_private;
-	int ret = 0;
 
+	if (!rss_conf)
+		return -EINVAL;
 	priv_lock(priv);
-	if (!rss_conf->rss_key) {
-		ret = -ENOMEM;
-		goto out;
-	}
-	if (rss_conf->rss_key_len < priv->rss_conf.rss_key_len) {
-		ret = -EINVAL;
-		goto out;
+	if (rss_conf->rss_key &&
+	    (rss_conf->rss_key_len >= priv->rss_conf.rss_key_len)) {
+		memcpy(rss_conf->rss_key, priv->rss_conf.rss_key,
+		       priv->rss_conf.rss_key_len);
 	}
-	memcpy(rss_conf->rss_key, priv->rss_conf.rss_key,
-	       priv->rss_conf.rss_key_len);
-out:
+	rss_conf->rss_key_len = priv->rss_conf.rss_key_len;
+	rss_conf->rss_hf = priv->rss_conf.rss_hf;
 	priv_unlock(priv);
-	return ret;
+	return 0;
 }
 
 /**