summaryrefslogtreecommitdiff
path: root/drivers/net/mlx5/mlx5_rss.c
diff options
context:
space:
mode:
authorNelio Laranjeiro <nelio.laranjeiro@6wind.com>2015-10-30 19:55:11 +0100
committerThomas Monjalon <thomas.monjalon@6wind.com>2015-10-31 00:21:58 +0100
commit2f97422e7759d83061fd04876c2110cf2655a604 (patch)
tree7a70f5edec2569bfb602dce31e6ad93ebb819ba6 /drivers/net/mlx5/mlx5_rss.c
parent542c21fb0f321365285a9754a1998e7673cb70fa (diff)
downloaddpdk-next-eventdev-2f97422e7759d83061fd04876c2110cf2655a604.zip
dpdk-next-eventdev-2f97422e7759d83061fd04876c2110cf2655a604.tar.gz
dpdk-next-eventdev-2f97422e7759d83061fd04876c2110cf2655a604.tar.xz
mlx5: support RSS hash update and get
First implementation of rss_hash_update and rss_hash_conf_get, those functions still lack in functionality but are usable to change the RSS hash key. For now, the PMD does not handle an indirection table for each kind of flow (IPv4, IPv6, etc.), the same RSS hash key is used for all protocols. This situation explains why the rss_hash_conf_get returns the RSS hash key for all DPDK supported protocols and why the hash key is set for all of them too. Signed-off-by: Nelio Laranjeiro <nelio.laranjeiro@6wind.com> Signed-off-by: Adrien Mazarguil <adrien.mazarguil@6wind.com>
Diffstat (limited to 'drivers/net/mlx5/mlx5_rss.c')
-rw-r--r--drivers/net/mlx5/mlx5_rss.c168
1 files changed, 168 insertions, 0 deletions
diff --git a/drivers/net/mlx5/mlx5_rss.c b/drivers/net/mlx5/mlx5_rss.c
new file mode 100644
index 0000000..2dc58e5
--- /dev/null
+++ b/drivers/net/mlx5/mlx5_rss.c
@@ -0,0 +1,168 @@
+/*-
+ * BSD LICENSE
+ *
+ * Copyright 2015 6WIND S.A.
+ * Copyright 2015 Mellanox.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ * * Neither the name of 6WIND S.A. nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <stddef.h>
+#include <stdint.h>
+#include <errno.h>
+#include <string.h>
+#include <assert.h>
+
+/* Verbs header. */
+/* ISO C doesn't support unnamed structs/unions, disabling -pedantic. */
+#ifdef PEDANTIC
+#pragma GCC diagnostic ignored "-pedantic"
+#endif
+#include <infiniband/verbs.h>
+#ifdef PEDANTIC
+#pragma GCC diagnostic error "-pedantic"
+#endif
+
+/* DPDK headers don't like -pedantic. */
+#ifdef PEDANTIC
+#pragma GCC diagnostic ignored "-pedantic"
+#endif
+#include <rte_malloc.h>
+#include <rte_ethdev.h>
+#ifdef PEDANTIC
+#pragma GCC diagnostic error "-pedantic"
+#endif
+
+#include "mlx5.h"
+#include "mlx5_rxtx.h"
+
+/**
+ * Register a RSS key.
+ *
+ * @param priv
+ * Pointer to private structure.
+ * @param key
+ * Hash key to register.
+ * @param key_len
+ * Hash key length in bytes.
+ *
+ * @return
+ * 0 on success, errno value on failure.
+ */
+int
+rss_hash_rss_conf_new_key(struct priv *priv, const uint8_t *key,
+ unsigned int key_len)
+{
+ struct rte_eth_rss_conf *rss_conf;
+
+ rss_conf = rte_realloc(priv->rss_conf,
+ (sizeof(*rss_conf) + key_len),
+ 0);
+ if (!rss_conf)
+ return ENOMEM;
+ rss_conf->rss_key = (void *)(rss_conf + 1);
+ rss_conf->rss_key_len = key_len;
+ memcpy(rss_conf->rss_key, key, key_len);
+ priv->rss_conf = rss_conf;
+ return 0;
+}
+
+/**
+ * DPDK callback to update the RSS hash configuration.
+ *
+ * @param dev
+ * Pointer to Ethernet device structure.
+ * @param[in] rss_conf
+ * RSS configuration data.
+ *
+ * @return
+ * 0 on success, negative errno value on failure.
+ */
+int
+mlx5_rss_hash_update(struct rte_eth_dev *dev,
+ struct rte_eth_rss_conf *rss_conf)
+{
+ struct priv *priv = dev->data->dev_private;
+ int err = 0;
+
+ priv_lock(priv);
+
+ assert(priv->rss_conf != NULL);
+
+ /* Apply configuration. */
+ if (rss_conf->rss_key)
+ err = rss_hash_rss_conf_new_key(priv,
+ rss_conf->rss_key,
+ rss_conf->rss_key_len);
+ else
+ err = rss_hash_rss_conf_new_key(priv,
+ rss_hash_default_key,
+ rss_hash_default_key_len);
+
+ /* Store the configuration set into port configure.
+ * This will enable/disable hash RX queues associated to the protocols
+ * enabled/disabled by this update. */
+ priv->dev->data->dev_conf.rx_adv_conf.rss_conf.rss_hf =
+ rss_conf->rss_hf;
+ priv_unlock(priv);
+ assert(err >= 0);
+ return -err;
+}
+
+/**
+ * DPDK callback to get the RSS hash configuration.
+ *
+ * @param dev
+ * Pointer to Ethernet device structure.
+ * @param[in, out] rss_conf
+ * RSS configuration data.
+ *
+ * @return
+ * 0 on success, negative errno value on failure.
+ */
+int
+mlx5_rss_hash_conf_get(struct rte_eth_dev *dev,
+ struct rte_eth_rss_conf *rss_conf)
+{
+ struct priv *priv = dev->data->dev_private;
+
+ priv_lock(priv);
+
+ assert(priv->rss_conf != NULL);
+
+ 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);
+ rss_conf->rss_key_len = priv->rss_conf->rss_key_len;
+ /* FIXME: rss_hf should be more specific. */
+ rss_conf->rss_hf = ETH_RSS_PROTO_MASK;
+
+ priv_unlock(priv);
+ return 0;
+}