get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/patches/7449/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 7449,
    "url": "https://patches.dpdk.org/api/patches/7449/?format=api",
    "web_url": "https://patches.dpdk.org/project/dpdk/patch/1444067692-29645-10-git-send-email-adrien.mazarguil@6wind.com/",
    "project": {
        "id": 1,
        "url": "https://patches.dpdk.org/api/projects/1/?format=api",
        "name": "DPDK",
        "link_name": "dpdk",
        "list_id": "dev.dpdk.org",
        "list_email": "dev@dpdk.org",
        "web_url": "http://core.dpdk.org",
        "scm_url": "git://dpdk.org/dpdk",
        "webscm_url": "http://git.dpdk.org/dpdk",
        "list_archive_url": "https://inbox.dpdk.org/dev",
        "list_archive_url_format": "https://inbox.dpdk.org/dev/{}",
        "commit_url_format": ""
    },
    "msgid": "<1444067692-29645-10-git-send-email-adrien.mazarguil@6wind.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/1444067692-29645-10-git-send-email-adrien.mazarguil@6wind.com",
    "date": "2015-10-05T17:54:44",
    "name": "[dpdk-dev,09/17] mlx5: add RSS hash update/get",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "0982c9d452f2b712d84237cb0f3cdef30dafd9e3",
    "submitter": {
        "id": 165,
        "url": "https://patches.dpdk.org/api/people/165/?format=api",
        "name": "Adrien Mazarguil",
        "email": "adrien.mazarguil@6wind.com"
    },
    "delegate": null,
    "mbox": "https://patches.dpdk.org/project/dpdk/patch/1444067692-29645-10-git-send-email-adrien.mazarguil@6wind.com/mbox/",
    "series": [],
    "comments": "https://patches.dpdk.org/api/patches/7449/comments/",
    "check": "pending",
    "checks": "https://patches.dpdk.org/api/patches/7449/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dev-bounces@dpdk.org>",
        "X-Original-To": "patchwork@dpdk.org",
        "Delivered-To": "patchwork@dpdk.org",
        "Received": [
            "from [92.243.14.124] (localhost [IPv6:::1])\n\tby dpdk.org (Postfix) with ESMTP id F2CB093E0;\n\tMon,  5 Oct 2015 19:55:34 +0200 (CEST)",
            "from mail-wi0-f174.google.com (mail-wi0-f174.google.com\n\t[209.85.212.174]) by dpdk.org (Postfix) with ESMTP id 20F2C93DC\n\tfor <dev@dpdk.org>; Mon,  5 Oct 2015 19:55:33 +0200 (CEST)",
            "by wicgb1 with SMTP id gb1so130863310wic.1\n\tfor <dev@dpdk.org>; Mon, 05 Oct 2015 10:55:33 -0700 (PDT)",
            "from 6wind.com (guy78-3-82-239-227-177.fbx.proxad.net.\n\t[82.239.227.177]) by smtp.gmail.com with ESMTPSA id\n\tfv13sm15814995wic.7.2015.10.05.10.55.32\n\t(version=TLSv1.2 cipher=RC4-SHA bits=128/128);\n\tMon, 05 Oct 2015 10:55:32 -0700 (PDT)"
        ],
        "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20130820;\n\th=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to\n\t:references;\n\tbh=tv0XoQ9ngE/Jq/j1XItL+Vom2OW22hAy7YlcfE5cAA4=;\n\tb=jKU75CeTWApIAv0lr0WE323b0jD4kK9Kce65Otn/IGhRR99FUgXtucQBE0T1RT2SDQ\n\tydRnICP0kG+bVDW5A/IHSm2Ardlfwz24v6gW4bdflmBmKjC0LLYPaUyi7s0Ydt4vKBF6\n\tjVqVEaZ8CGpHkq/m9+SvWTsvVOaJhUUlvTHT4fHSxjHO6YICn6fWMld1SAbDC4mu4ZPG\n\t0ZVoTGnTKAhuESjwcMolt3QgzvaIOPUW6576YRF16y9WZYmeDcgBa8KUP0Z3sEhxHa1+\n\tP1rG37/uUbh+n6iIp9woodKiRRopzd98MNiw7GDrRYcaMz1a5DhbJFbJN/HqIxyxjghY\n\tNrnQ==",
        "X-Gm-Message-State": "ALoCoQkVP5pPynOGVDouVwHJY8UYY3HjBaV1pLQIAMoMlmYqVgxBVHOM54f5YJ/MOOUzaSeka4ZJ",
        "X-Received": "by 10.194.238.228 with SMTP id vn4mr31582152wjc.13.1444067733005;\n\tMon, 05 Oct 2015 10:55:33 -0700 (PDT)",
        "From": "Adrien Mazarguil <adrien.mazarguil@6wind.com>",
        "To": "dev@dpdk.org",
        "Date": "Mon,  5 Oct 2015 19:54:44 +0200",
        "Message-Id": "<1444067692-29645-10-git-send-email-adrien.mazarguil@6wind.com>",
        "X-Mailer": "git-send-email 2.1.0",
        "In-Reply-To": "<1444067692-29645-1-git-send-email-adrien.mazarguil@6wind.com>",
        "References": "<1444067692-29645-1-git-send-email-adrien.mazarguil@6wind.com>",
        "Subject": "[dpdk-dev] [PATCH 09/17] mlx5: add RSS hash update/get",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.15",
        "Precedence": "list",
        "List-Id": "patches and discussions about DPDK <dev.dpdk.org>",
        "List-Unsubscribe": "<http://dpdk.org/ml/options/dev>,\n\t<mailto:dev-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://dpdk.org/ml/archives/dev/>",
        "List-Post": "<mailto:dev@dpdk.org>",
        "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
        "List-Subscribe": "<http://dpdk.org/ml/listinfo/dev>,\n\t<mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>"
    },
    "content": "From: Nelio Laranjeiro <nelio.laranjeiro@6wind.com>\n\nFirst implementation of rss_hash_update and rss_hash_conf_get, those\nfunctions still lack in functionality but are usable to change the RSS\nhash key.  For now, the PMD does not handle an indirection table for\neach kind of flow (IPv4, IPv6, etc.), the same RSS hash key is used\nfor all protocols.  This situation explains why the rss_hash_conf_get\nreturns the RSS hash key for all DPDK supported protocols and why the\nhash key is set for all of them too.\n\nSigned-off-by: Nelio Laranjeiro <nelio.laranjeiro@6wind.com>\nSigned-off-by: Adrien Mazarguil <adrien.mazarguil@6wind.com>\n---\n drivers/net/mlx5/Makefile    |   1 +\n drivers/net/mlx5/mlx5.c      |  10 +++\n drivers/net/mlx5/mlx5.h      |   7 ++\n drivers/net/mlx5/mlx5_rss.c  | 168 +++++++++++++++++++++++++++++++++++++++++++\n drivers/net/mlx5/mlx5_rxq.c  |  10 ++-\n drivers/net/mlx5/mlx5_rxtx.h |   3 +\n 6 files changed, 196 insertions(+), 3 deletions(-)\n create mode 100644 drivers/net/mlx5/mlx5_rss.c",
    "diff": "diff --git a/drivers/net/mlx5/Makefile b/drivers/net/mlx5/Makefile\nindex 938f924..54f1e89 100644\n--- a/drivers/net/mlx5/Makefile\n+++ b/drivers/net/mlx5/Makefile\n@@ -51,6 +51,7 @@ SRCS-$(CONFIG_RTE_LIBRTE_MLX5_PMD) += mlx5_mac.c\n SRCS-$(CONFIG_RTE_LIBRTE_MLX5_PMD) += mlx5_rxmode.c\n SRCS-$(CONFIG_RTE_LIBRTE_MLX5_PMD) += mlx5_vlan.c\n SRCS-$(CONFIG_RTE_LIBRTE_MLX5_PMD) += mlx5_stats.c\n+SRCS-$(CONFIG_RTE_LIBRTE_MLX5_PMD) += mlx5_rss.c\n \n # Dependencies.\n DEPDIRS-$(CONFIG_RTE_LIBRTE_MLX5_PMD) += lib/librte_ether\ndiff --git a/drivers/net/mlx5/mlx5.c b/drivers/net/mlx5/mlx5.c\nindex 167e14b..bc2a19b 100644\n--- a/drivers/net/mlx5/mlx5.c\n+++ b/drivers/net/mlx5/mlx5.c\n@@ -129,6 +129,7 @@ mlx5_dev_close(struct rte_eth_dev *dev)\n \t\tclaim_zero(ibv_close_device(priv->ctx));\n \t} else\n \t\tassert(priv->ctx == NULL);\n+\trte_free(priv->rss_conf);\n \tpriv_unlock(priv);\n \tmemset(priv, 0, sizeof(*priv));\n }\n@@ -156,6 +157,8 @@ static const struct eth_dev_ops mlx5_dev_ops = {\n \t.mac_addr_remove = mlx5_mac_addr_remove,\n \t.mac_addr_add = mlx5_mac_addr_add,\n \t.mtu_set = mlx5_dev_set_mtu,\n+\t.rss_hash_update = mlx5_rss_hash_update,\n+\t.rss_hash_conf_get = mlx5_rss_hash_conf_get,\n };\n \n static struct {\n@@ -376,6 +379,12 @@ mlx5_pci_devinit(struct rte_pci_driver *pci_drv, struct rte_pci_device *pci_dev)\n #endif /* HAVE_EXP_QUERY_DEVICE */\n \n \t\tpriv->vf = vf;\n+\t\t/* Register default RSS hash key. */\n+\t\terr = rss_hash_rss_conf_new_key(priv,\n+\t\t\t\t\t\trss_hash_default_key,\n+\t\t\t\t\t\trss_hash_default_key_len);\n+\t\tif (err)\n+\t\t\tgoto port_error;\n \t\t/* Configure the first MAC address by default. */\n \t\tif (priv_get_mac(priv, &mac.addr_bytes)) {\n \t\t\tERROR(\"cannot get MAC address, is mlx5_en loaded?\"\n@@ -439,6 +448,7 @@ mlx5_pci_devinit(struct rte_pci_driver *pci_drv, struct rte_pci_device *pci_dev)\n \t\tcontinue;\n \n port_error:\n+\t\trte_free(priv->rss_conf);\n \t\trte_free(priv);\n \t\tif (pd)\n \t\t\tclaim_zero(ibv_dealloc_pd(pd));\ndiff --git a/drivers/net/mlx5/mlx5.h b/drivers/net/mlx5/mlx5.h\nindex b099dac..fc042e8 100644\n--- a/drivers/net/mlx5/mlx5.h\n+++ b/drivers/net/mlx5/mlx5.h\n@@ -118,6 +118,7 @@ struct priv {\n \t/* Hash RX QPs feeding the indirection table. */\n \tstruct hash_rxq (*hash_rxqs)[];\n \tunsigned int hash_rxqs_n; /* Hash RX QPs array size. */\n+\tstruct rte_eth_rss_conf *rss_conf; /* RSS configuration. */\n \trte_spinlock_t lock; /* Lock for control functions. */\n };\n \n@@ -174,6 +175,12 @@ int priv_mac_addrs_enable(struct priv *);\n void mlx5_mac_addr_add(struct rte_eth_dev *, struct ether_addr *, uint32_t,\n \t\t       uint32_t);\n \n+/* mlx5_rss.c */\n+\n+int rss_hash_rss_conf_new_key(struct priv *, const uint8_t *, unsigned int);\n+int mlx5_rss_hash_update(struct rte_eth_dev *, struct rte_eth_rss_conf *);\n+int mlx5_rss_hash_conf_get(struct rte_eth_dev *, struct rte_eth_rss_conf *);\n+\n /* mlx5_rxmode.c */\n \n int priv_promiscuous_enable(struct priv *);\ndiff --git a/drivers/net/mlx5/mlx5_rss.c b/drivers/net/mlx5/mlx5_rss.c\nnew file mode 100644\nindex 0000000..2dc58e5\n--- /dev/null\n+++ b/drivers/net/mlx5/mlx5_rss.c\n@@ -0,0 +1,168 @@\n+/*-\n+ *   BSD LICENSE\n+ *\n+ *   Copyright 2015 6WIND S.A.\n+ *   Copyright 2015 Mellanox.\n+ *\n+ *   Redistribution and use in source and binary forms, with or without\n+ *   modification, are permitted provided that the following conditions\n+ *   are met:\n+ *\n+ *     * Redistributions of source code must retain the above copyright\n+ *       notice, this list of conditions and the following disclaimer.\n+ *     * Redistributions in binary form must reproduce the above copyright\n+ *       notice, this list of conditions and the following disclaimer in\n+ *       the documentation and/or other materials provided with the\n+ *       distribution.\n+ *     * Neither the name of 6WIND S.A. nor the names of its\n+ *       contributors may be used to endorse or promote products derived\n+ *       from this software without specific prior written permission.\n+ *\n+ *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n+ *   \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n+ *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n+ *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n+ *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n+ *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n+ *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n+ *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n+ *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n+ *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n+ *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n+ */\n+\n+#include <stddef.h>\n+#include <stdint.h>\n+#include <errno.h>\n+#include <string.h>\n+#include <assert.h>\n+\n+/* Verbs header. */\n+/* ISO C doesn't support unnamed structs/unions, disabling -pedantic. */\n+#ifdef PEDANTIC\n+#pragma GCC diagnostic ignored \"-pedantic\"\n+#endif\n+#include <infiniband/verbs.h>\n+#ifdef PEDANTIC\n+#pragma GCC diagnostic error \"-pedantic\"\n+#endif\n+\n+/* DPDK headers don't like -pedantic. */\n+#ifdef PEDANTIC\n+#pragma GCC diagnostic ignored \"-pedantic\"\n+#endif\n+#include <rte_malloc.h>\n+#include <rte_ethdev.h>\n+#ifdef PEDANTIC\n+#pragma GCC diagnostic error \"-pedantic\"\n+#endif\n+\n+#include \"mlx5.h\"\n+#include \"mlx5_rxtx.h\"\n+\n+/**\n+ * Register a RSS key.\n+ *\n+ * @param priv\n+ *   Pointer to private structure.\n+ * @param key\n+ *   Hash key to register.\n+ * @param key_len\n+ *   Hash key length in bytes.\n+ *\n+ * @return\n+ *   0 on success, errno value on failure.\n+ */\n+int\n+rss_hash_rss_conf_new_key(struct priv *priv, const uint8_t *key,\n+\t\t\t  unsigned int key_len)\n+{\n+\tstruct rte_eth_rss_conf *rss_conf;\n+\n+\trss_conf = rte_realloc(priv->rss_conf,\n+\t\t\t       (sizeof(*rss_conf) + key_len),\n+\t\t\t       0);\n+\tif (!rss_conf)\n+\t\treturn ENOMEM;\n+\trss_conf->rss_key = (void *)(rss_conf + 1);\n+\trss_conf->rss_key_len = key_len;\n+\tmemcpy(rss_conf->rss_key, key, key_len);\n+\tpriv->rss_conf = rss_conf;\n+\treturn 0;\n+}\n+\n+/**\n+ * DPDK callback to update the RSS hash configuration.\n+ *\n+ * @param dev\n+ *   Pointer to Ethernet device structure.\n+ * @param[in] rss_conf\n+ *   RSS configuration data.\n+ *\n+ * @return\n+ *   0 on success, negative errno value on failure.\n+ */\n+int\n+mlx5_rss_hash_update(struct rte_eth_dev *dev,\n+\t\t     struct rte_eth_rss_conf *rss_conf)\n+{\n+\tstruct priv *priv = dev->data->dev_private;\n+\tint err = 0;\n+\n+\tpriv_lock(priv);\n+\n+\tassert(priv->rss_conf != NULL);\n+\n+\t/* Apply configuration. */\n+\tif (rss_conf->rss_key)\n+\t\terr = rss_hash_rss_conf_new_key(priv,\n+\t\t\t\t\t\trss_conf->rss_key,\n+\t\t\t\t\t\trss_conf->rss_key_len);\n+\telse\n+\t\terr = rss_hash_rss_conf_new_key(priv,\n+\t\t\t\t\t\trss_hash_default_key,\n+\t\t\t\t\t\trss_hash_default_key_len);\n+\n+\t/* Store the configuration set into port configure.\n+\t * This will enable/disable hash RX queues associated to the protocols\n+\t * enabled/disabled by this update. */\n+\tpriv->dev->data->dev_conf.rx_adv_conf.rss_conf.rss_hf =\n+\t\trss_conf->rss_hf;\n+\tpriv_unlock(priv);\n+\tassert(err >= 0);\n+\treturn -err;\n+}\n+\n+/**\n+ * DPDK callback to get the RSS hash configuration.\n+ *\n+ * @param dev\n+ *   Pointer to Ethernet device structure.\n+ * @param[in, out] rss_conf\n+ *   RSS configuration data.\n+ *\n+ * @return\n+ *   0 on success, negative errno value on failure.\n+ */\n+int\n+mlx5_rss_hash_conf_get(struct rte_eth_dev *dev,\n+\t\t       struct rte_eth_rss_conf *rss_conf)\n+{\n+\tstruct priv *priv = dev->data->dev_private;\n+\n+\tpriv_lock(priv);\n+\n+\tassert(priv->rss_conf != NULL);\n+\n+\tif (rss_conf->rss_key &&\n+\t    rss_conf->rss_key_len >= priv->rss_conf->rss_key_len)\n+\t\tmemcpy(rss_conf->rss_key,\n+\t\t       priv->rss_conf->rss_key,\n+\t\t       priv->rss_conf->rss_key_len);\n+\trss_conf->rss_key_len = priv->rss_conf->rss_key_len;\n+\t/* FIXME: rss_hf should be more specific. */\n+\trss_conf->rss_hf = ETH_RSS_PROTO_MASK;\n+\n+\tpriv_unlock(priv);\n+\treturn 0;\n+}\ndiff --git a/drivers/net/mlx5/mlx5_rxq.c b/drivers/net/mlx5/mlx5_rxq.c\nindex 7f25688..2bd1277 100644\n--- a/drivers/net/mlx5/mlx5_rxq.c\n+++ b/drivers/net/mlx5/mlx5_rxq.c\n@@ -135,7 +135,7 @@ static const struct ind_table_init ind_table_init[] = {\n #define IND_TABLE_INIT_N RTE_DIM(ind_table_init)\n \n /* Default RSS hash key also used for ConnectX-3. */\n-static uint8_t hash_rxq_default_key[] = {\n+uint8_t rss_hash_default_key[] = {\n \t0x2c, 0xc6, 0x81, 0xd1,\n \t0x5b, 0xdb, 0xf4, 0xf7,\n \t0xfc, 0xa2, 0x83, 0x19,\n@@ -148,6 +148,9 @@ static uint8_t hash_rxq_default_key[] = {\n \t0xfc, 0x1f, 0xdc, 0x2a,\n };\n \n+/* Length of the default RSS hash key. */\n+const size_t rss_hash_default_key_len = sizeof(rss_hash_default_key);\n+\n /**\n  * Populate flow steering rule for a given hash RX queue type using\n  * information from hash_rxq_init[]. Nothing is written to flow_attr when\n@@ -327,6 +330,7 @@ priv_create_hash_rxqs(struct priv *priv)\n \tassert(priv->hash_rxqs_n == 0);\n \tassert(priv->pd != NULL);\n \tassert(priv->ctx != NULL);\n+\tassert(priv->rss_conf != NULL);\n \tif (priv->rxqs_n == 0)\n \t\treturn EINVAL;\n \tassert(priv->rxqs != NULL);\n@@ -411,8 +415,8 @@ priv_create_hash_rxqs(struct priv *priv)\n \t\t\thash_rxq_type_from_n(&ind_table_init[j], k);\n \t\tstruct ibv_exp_rx_hash_conf hash_conf = {\n \t\t\t.rx_hash_function = IBV_EXP_RX_HASH_FUNC_TOEPLITZ,\n-\t\t\t.rx_hash_key_len = sizeof(hash_rxq_default_key),\n-\t\t\t.rx_hash_key = hash_rxq_default_key,\n+\t\t\t.rx_hash_key_len = priv->rss_conf->rss_key_len,\n+\t\t\t.rx_hash_key = priv->rss_conf->rss_key,\n \t\t\t.rx_hash_fields_mask = hash_rxq_init[type].hash_fields,\n \t\t\t.rwq_ind_tbl = (*ind_tables)[j],\n \t\t};\ndiff --git a/drivers/net/mlx5/mlx5_rxtx.h b/drivers/net/mlx5/mlx5_rxtx.h\nindex 00b5d6c..94e5f04 100644\n--- a/drivers/net/mlx5/mlx5_rxtx.h\n+++ b/drivers/net/mlx5/mlx5_rxtx.h\n@@ -216,6 +216,9 @@ struct txq {\n \n /* mlx5_rxq.c */\n \n+extern uint8_t rss_hash_default_key[];\n+extern const size_t rss_hash_default_key_len;\n+\n size_t priv_populate_flow_attr(const struct priv *, struct ibv_flow_attr *,\n \t\t\t       size_t, enum hash_rxq_type);\n int priv_create_hash_rxqs(struct priv *);\n",
    "prefixes": [
        "dpdk-dev",
        "09/17"
    ]
}