get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 67278,
    "url": "http://patches.dpdk.org/api/patches/67278/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/20200327101823.12646-5-mk@semihalf.com/",
    "project": {
        "id": 1,
        "url": "http://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": "<20200327101823.12646-5-mk@semihalf.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20200327101823.12646-5-mk@semihalf.com",
    "date": "2020-03-27T10:17:58",
    "name": "[04/29] net/ena/base: set default hash key",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "0a96b778920b31955a03f9b03fe2a2f556837ed4",
    "submitter": {
        "id": 786,
        "url": "http://patches.dpdk.org/api/people/786/?format=api",
        "name": "Michal Krawczyk",
        "email": "mk@semihalf.com"
    },
    "delegate": {
        "id": 3961,
        "url": "http://patches.dpdk.org/api/users/3961/?format=api",
        "username": "arybchenko",
        "first_name": "Andrew",
        "last_name": "Rybchenko",
        "email": "andrew.rybchenko@oktetlabs.ru"
    },
    "mbox": "http://patches.dpdk.org/project/dpdk/patch/20200327101823.12646-5-mk@semihalf.com/mbox/",
    "series": [
        {
            "id": 9077,
            "url": "http://patches.dpdk.org/api/series/9077/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=9077",
            "date": "2020-03-27T10:17:54",
            "name": "Update ENA driver to v2.1.0",
            "version": 1,
            "mbox": "http://patches.dpdk.org/series/9077/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/67278/comments/",
    "check": "fail",
    "checks": "http://patches.dpdk.org/api/patches/67278/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dev-bounces@dpdk.org>",
        "X-Original-To": "patchwork@inbox.dpdk.org",
        "Delivered-To": "patchwork@inbox.dpdk.org",
        "Received": [
            "from dpdk.org (dpdk.org [92.243.14.124])\n\tby inbox.dpdk.org (Postfix) with ESMTP id 5BC03A0589;\n\tFri, 27 Mar 2020 11:29:52 +0100 (CET)",
            "from [92.243.14.124] (localhost [127.0.0.1])\n\tby dpdk.org (Postfix) with ESMTP id 316961C0C1;\n\tFri, 27 Mar 2020 11:29:21 +0100 (CET)",
            "from mail-lf1-f43.google.com (mail-lf1-f43.google.com\n [209.85.167.43]) by dpdk.org (Postfix) with ESMTP id D3F2C1C0B1\n for <dev@dpdk.org>; Fri, 27 Mar 2020 11:29:15 +0100 (CET)",
            "by mail-lf1-f43.google.com with SMTP id j17so7391615lfe.7\n for <dev@dpdk.org>; Fri, 27 Mar 2020 03:29:15 -0700 (PDT)",
            "from localhost.localdomain (193-106-246-138.noc.fibertech.net.pl.\n [193.106.246.138])\n by smtp.gmail.com with ESMTPSA id i11sm2789587lfo.84.2020.03.27.03.29.13\n (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n Fri, 27 Mar 2020 03:29:14 -0700 (PDT)"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=semihalf-com.20150623.gappssmtp.com; s=20150623;\n h=from:to:cc:subject:date:message-id:in-reply-to:references\n :mime-version:content-transfer-encoding;\n bh=f1ztb6aG0FK21tArGDR1OAiu7erDZfOojq8wbayfj4U=;\n b=mSyYYq8O476fBzyTuqBH4bEwRgvJ5lb9wEzJJ39gIDO3gSzv5PX5fTGP9g2plyUaxd\n X9vva1CyR3YKrzaNd4rDpFwQc6LgtQ0He8DBSfQ1BdiJdWyODJxhw2/Ccr/PEPBB0D9L\n U2ABkQjr1Q/ynxNFzQ58nUcmLPomXijqzcNSEyCZbOBnQJmdAze2VC2xPnl9gr+2YZrF\n Ky3a2GRnofUXrvv0dEGzk1Q/h9FR83Vd4g5+zNSbjAlK7GP9o54qBOfBhNRvfNUoVHcX\n B/Pemb7YKAeNzYspIi6TdtR2QVxoRRm1GHgNX0WVIOVV0nAWwABRaMBTuAGkIpIw/zEl\n xInw==",
        "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20161025;\n h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to\n :references:mime-version:content-transfer-encoding;\n bh=f1ztb6aG0FK21tArGDR1OAiu7erDZfOojq8wbayfj4U=;\n b=BRCdsn/bcb671Z7qxlKzvlO/aw8gQWE2IsWC8Edlvr2Xq1wV0AaJ5kfOhNpTj35ekt\n 9E6pIo7kU7Q0qUDj2Gxnje8M++JjpeOeu5jkyXcC9zN8xqYCMyyng7n3NkKXz7fLnamF\n mAlEuJVXQCDk0rJs8JOzZnhRIXJJZMgQh3uPYYl399dbkz3wdRDzYiaJrCV91FwKvcNH\n TlxJ4arLivcGXUusR8/y65y7GTApNeddreHi5YokGoCsssKJmXvY/R9Ej+GEtV3d6TsS\n 2SyEyguncCYerntJk11RiU/Bf7xvLBFq+U2rApLFt+pXWgR06IjXodvIVyGHu6q76lHd\n 4P+Q==",
        "X-Gm-Message-State": "ANhLgQ3WeRzE89uda2ouuZwyzwf6WNsh2rdhXeNR5ZvNA9G45lMswU6o\n S2H1HxzdyXlv7eacZTfKPShU4RQHV/QF8A==",
        "X-Google-Smtp-Source": "\n ADFU+vtX90blJ2aL0Oqmy4mbefQ9zhS+N+BPp0rO1dPOMxU2/GzZxvc4BZuWG0Oucp3BzCvc1je4AQ==",
        "X-Received": "by 2002:a05:6512:203c:: with SMTP id\n s28mr8401675lfs.49.1585304954952;\n Fri, 27 Mar 2020 03:29:14 -0700 (PDT)",
        "From": "Michal Krawczyk <mk@semihalf.com>",
        "To": "dev@dpdk.org",
        "Cc": "mw@semihalf.com, mba@semihalf.com, gtzalik@amazon.com, evgenys@amazon.com,\n igorch@amazon.com, Michal Krawczyk <mk@semihalf.com>",
        "Date": "Fri, 27 Mar 2020 11:17:58 +0100",
        "Message-Id": "<20200327101823.12646-5-mk@semihalf.com>",
        "X-Mailer": "git-send-email 2.20.1",
        "In-Reply-To": "<20200327101823.12646-1-mk@semihalf.com>",
        "References": "<20200327101823.12646-1-mk@semihalf.com>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "Subject": "[dpdk-dev] [PATCH 04/29] net/ena/base: set default hash key",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.15",
        "Precedence": "list",
        "List-Id": "DPDK patches and discussions <dev.dpdk.org>",
        "List-Unsubscribe": "<https://mails.dpdk.org/options/dev>,\n <mailto:dev-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://mails.dpdk.org/archives/dev/>",
        "List-Post": "<mailto:dev@dpdk.org>",
        "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
        "List-Subscribe": "<https://mails.dpdk.org/listinfo/dev>,\n <mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>"
    },
    "content": "The RSS hash key was present in the device, but it wasn't exposed to\nthe user. The other key still cannot be set, but now it can be accessed\nif one needs to do that.\n\nBy default, the random hash key is used and it is generated only once\nwhen requested for the first time.\n\nSigned-off-by: Michal Krawczyk <mk@semihalf.com>\nReviewed-by: Igor Chauskin <igorch@amazon.com>\nReviewed-by: Guy Tzalik <gtzalik@amazon.com>\n---\n drivers/net/ena/base/ena_com.c       | 103 ++++++++++++++-------------\n drivers/net/ena/base/ena_com.h       |  30 ++++++--\n drivers/net/ena/base/ena_plat_dpdk.h |   6 ++\n drivers/net/ena/ena_ethdev.c         |  16 +++++\n 4 files changed, 101 insertions(+), 54 deletions(-)",
    "diff": "diff --git a/drivers/net/ena/base/ena_com.c b/drivers/net/ena/base/ena_com.c\nindex 17b51b5a11..a5753997ed 100644\n--- a/drivers/net/ena/base/ena_com.c\n+++ b/drivers/net/ena/base/ena_com.c\n@@ -1032,6 +1032,24 @@ static int ena_com_get_feature(struct ena_com_dev *ena_dev,\n \t\t\t\t      feature_ver);\n }\n \n+int ena_com_get_current_hash_function(struct ena_com_dev *ena_dev)\n+{\n+\treturn ena_dev->rss.hash_func;\n+}\n+\n+static void ena_com_hash_key_fill_default_key(struct ena_com_dev *ena_dev)\n+{\n+\tstruct ena_admin_feature_rss_flow_hash_control *hash_key =\n+\t\t(ena_dev->rss).hash_key;\n+\n+\tENA_RSS_FILL_KEY(&hash_key->key, sizeof(hash_key->key));\n+\t/* The key is stored in the device in uint32_t array\n+\t * as well as the API requires the key to be passed in this\n+\t * format. Thus the size of our array should be divided by 4\n+\t */\n+\thash_key->keys_num = sizeof(hash_key->key) / sizeof(uint32_t);\n+}\n+\n static int ena_com_hash_key_allocate(struct ena_com_dev *ena_dev)\n {\n \tstruct ena_rss *rss = &ena_dev->rss;\n@@ -1266,30 +1284,6 @@ static int ena_com_ind_tbl_convert_to_device(struct ena_com_dev *ena_dev)\n \treturn 0;\n }\n \n-static int ena_com_ind_tbl_convert_from_device(struct ena_com_dev *ena_dev)\n-{\n-\tu16 dev_idx_to_host_tbl[ENA_TOTAL_NUM_QUEUES] = { (u16)-1 };\n-\tstruct ena_rss *rss = &ena_dev->rss;\n-\tu8 idx;\n-\tu16 i;\n-\n-\tfor (i = 0; i < ENA_TOTAL_NUM_QUEUES; i++)\n-\t\tdev_idx_to_host_tbl[ena_dev->io_sq_queues[i].idx] = i;\n-\n-\tfor (i = 0; i < 1 << rss->tbl_log_size; i++) {\n-\t\tif (rss->rss_ind_tbl[i].cq_idx > ENA_TOTAL_NUM_QUEUES)\n-\t\t\treturn ENA_COM_INVAL;\n-\t\tidx = (u8)rss->rss_ind_tbl[i].cq_idx;\n-\n-\t\tif (dev_idx_to_host_tbl[idx] > ENA_TOTAL_NUM_QUEUES)\n-\t\t\treturn ENA_COM_INVAL;\n-\n-\t\trss->host_rss_ind_tbl[i] = dev_idx_to_host_tbl[idx];\n-\t}\n-\n-\treturn 0;\n-}\n-\n static int ena_com_init_interrupt_moderation_table(struct ena_com_dev *ena_dev)\n {\n \tsize_t size;\n@@ -2381,12 +2375,14 @@ int ena_com_fill_hash_function(struct ena_com_dev *ena_dev,\n \t\t\t       enum ena_admin_hash_functions func,\n \t\t\t       const u8 *key, u16 key_len, u32 init_val)\n {\n-\tstruct ena_rss *rss = &ena_dev->rss;\n+\tstruct ena_admin_feature_rss_flow_hash_control *hash_key;\n \tstruct ena_admin_get_feat_resp get_resp;\n-\tstruct ena_admin_feature_rss_flow_hash_control *hash_key =\n-\t\trss->hash_key;\n+\tenum ena_admin_hash_functions old_func;\n+\tstruct ena_rss *rss = &ena_dev->rss;\n \tint rc;\n \n+\thash_key = rss->hash_key;\n+\n \t/* Make sure size is a mult of DWs */\n \tif (unlikely(key_len & 0x3))\n \t\treturn ENA_COM_INVAL;\n@@ -2398,22 +2394,23 @@ int ena_com_fill_hash_function(struct ena_com_dev *ena_dev,\n \tif (unlikely(rc))\n \t\treturn rc;\n \n-\tif (!((1 << func) & get_resp.u.flow_hash_func.supported_func)) {\n+\tif (!(BIT(func) & get_resp.u.flow_hash_func.supported_func)) {\n \t\tena_trc_err(\"Flow hash function %d isn't supported\\n\", func);\n \t\treturn ENA_COM_UNSUPPORTED;\n \t}\n \n \tswitch (func) {\n \tcase ENA_ADMIN_TOEPLITZ:\n-\t\tif (key_len > sizeof(hash_key->key)) {\n-\t\t\tena_trc_err(\"key len (%hu) is bigger than the max supported (%zu)\\n\",\n-\t\t\t\t    key_len, sizeof(hash_key->key));\n-\t\t\treturn ENA_COM_INVAL;\n+\t\tif (key) {\n+\t\t\tif (key_len != sizeof(hash_key->key)) {\n+\t\t\t\tena_trc_err(\"key len (%hu) doesn't equal the supported size (%zu)\\n\",\n+\t\t\t\t\t     key_len, sizeof(hash_key->key));\n+\t\t\t\treturn ENA_COM_INVAL;\n+\t\t\t}\n+\t\t\tmemcpy(hash_key->key, key, key_len);\n+\t\t\trss->hash_init_val = init_val;\n+\t\t\thash_key->keys_num = key_len >> 2;\n \t\t}\n-\n-\t\tmemcpy(hash_key->key, key, key_len);\n-\t\trss->hash_init_val = init_val;\n-\t\thash_key->keys_num = key_len >> 2;\n \t\tbreak;\n \tcase ENA_ADMIN_CRC32:\n \t\trss->hash_init_val = init_val;\n@@ -2423,26 +2420,27 @@ int ena_com_fill_hash_function(struct ena_com_dev *ena_dev,\n \t\treturn ENA_COM_INVAL;\n \t}\n \n+\told_func = rss->hash_func;\n \trss->hash_func = func;\n \trc = ena_com_set_hash_function(ena_dev);\n \n \t/* Restore the old function */\n \tif (unlikely(rc))\n-\t\tena_com_get_hash_function(ena_dev, NULL, NULL);\n+\t\trss->hash_func = old_func;\n \n \treturn rc;\n }\n \n int ena_com_get_hash_function(struct ena_com_dev *ena_dev,\n-\t\t\t      enum ena_admin_hash_functions *func,\n-\t\t\t      u8 *key)\n+\t\t\t      enum ena_admin_hash_functions *func)\n {\n \tstruct ena_rss *rss = &ena_dev->rss;\n \tstruct ena_admin_get_feat_resp get_resp;\n-\tstruct ena_admin_feature_rss_flow_hash_control *hash_key =\n-\t\trss->hash_key;\n \tint rc;\n \n+\tif (unlikely(!func))\n+\t\treturn ENA_COM_INVAL;\n+\n \trc = ena_com_get_feature_ex(ena_dev, &get_resp,\n \t\t\t\t    ENA_ADMIN_RSS_HASH_FUNCTION,\n \t\t\t\t    rss->hash_key_dma_addr,\n@@ -2450,9 +2448,20 @@ int ena_com_get_hash_function(struct ena_com_dev *ena_dev,\n \tif (unlikely(rc))\n \t\treturn rc;\n \n-\trss->hash_func = get_resp.u.flow_hash_func.selected_func;\n-\tif (func)\n-\t\t*func = rss->hash_func;\n+\t/* ENA_FFS returns 1 in case the lsb is set */\n+\trss->hash_func = ENA_FFS(get_resp.u.flow_hash_func.selected_func);\n+\tif (rss->hash_func)\n+\t\trss->hash_func--;\n+\n+\t*func = rss->hash_func;\n+\n+\treturn 0;\n+}\n+\n+int ena_com_get_hash_key(struct ena_com_dev *ena_dev, u8 *key)\n+{\n+\tstruct ena_admin_feature_rss_flow_hash_control *hash_key =\n+\t\tena_dev->rss.hash_key;\n \n \tif (key)\n \t\tmemcpy(key, hash_key->key, (size_t)(hash_key->keys_num) << 2);\n@@ -2714,10 +2723,6 @@ int ena_com_indirect_table_get(struct ena_com_dev *ena_dev, u32 *ind_tbl)\n \tif (!ind_tbl)\n \t\treturn 0;\n \n-\trc = ena_com_ind_tbl_convert_from_device(ena_dev);\n-\tif (unlikely(rc))\n-\t\treturn rc;\n-\n \tfor (i = 0; i < (1 << rss->tbl_log_size); i++)\n \t\tind_tbl[i] = rss->host_rss_ind_tbl[i];\n \n@@ -2738,6 +2743,8 @@ int ena_com_rss_init(struct ena_com_dev *ena_dev, u16 indr_tbl_log_size)\n \tif (unlikely(rc))\n \t\tgoto err_hash_key;\n \n+\tena_com_hash_key_fill_default_key(ena_dev);\n+\n \trc = ena_com_hash_ctrl_init(ena_dev);\n \tif (unlikely(rc))\n \t\tgoto err_hash_ctrl;\ndiff --git a/drivers/net/ena/base/ena_com.h b/drivers/net/ena/base/ena_com.h\nindex f2ef26c91b..dc7e0d3930 100644\n--- a/drivers/net/ena/base/ena_com.h\n+++ b/drivers/net/ena/base/ena_com.h\n@@ -53,6 +53,7 @@\n #define ENA_INTR_DELAY_NEW_VALUE_WEIGHT\t\t\t4\n #define ENA_INTR_MODER_LEVEL_STRIDE\t\t\t1\n #define ENA_INTR_BYTE_COUNT_NOT_SUPPORTED\t\t0xFFFFFF\n+#define ENA_HASH_KEY_SIZE\t\t\t\t40\n \n #define ENA_HW_HINTS_NO_TIMEOUT\t\t\t\t0xFFFF\n \n@@ -693,6 +694,14 @@ int ena_com_rss_init(struct ena_com_dev *ena_dev, u16 log_size);\n  */\n void ena_com_rss_destroy(struct ena_com_dev *ena_dev);\n \n+/* ena_com_get_current_hash_function - Get RSS hash function\n+ * @ena_dev: ENA communication layer struct\n+ *\n+ * Return the current hash function.\n+ * @return: 0 or one of the ena_admin_hash_functions values.\n+ */\n+int ena_com_get_current_hash_function(struct ena_com_dev *ena_dev);\n+\n /* ena_com_fill_hash_function - Fill RSS hash function\n  * @ena_dev: ENA communication layer struct\n  * @func: The hash function (Toeplitz or crc)\n@@ -724,13 +733,11 @@ int ena_com_fill_hash_function(struct ena_com_dev *ena_dev,\n  */\n int ena_com_set_hash_function(struct ena_com_dev *ena_dev);\n \n-/* ena_com_get_hash_function - Retrieve the hash function and the hash key\n- * from the device.\n+/* ena_com_get_hash_function - Retrieve the hash function from the device.\n  * @ena_dev: ENA communication layer struct\n  * @func: hash function\n- * @key: hash key\n  *\n- * Retrieve the hash function and the hash key from the device.\n+ * Retrieve the hash function from the device.\n  *\n  * @note: If the caller called ena_com_fill_hash_function but didn't flash\n  * it to the device, the new configuration will be lost.\n@@ -738,9 +745,20 @@ int ena_com_set_hash_function(struct ena_com_dev *ena_dev);\n  * @return: 0 on Success and negative value otherwise.\n  */\n int ena_com_get_hash_function(struct ena_com_dev *ena_dev,\n-\t\t\t      enum ena_admin_hash_functions *func,\n-\t\t\t      u8 *key);\n+\t\t\t      enum ena_admin_hash_functions *func);\n \n+/* ena_com_get_hash_key - Retrieve the hash key\n+ * @ena_dev: ENA communication layer struct\n+ * @key: hash key\n+ *\n+ * Retrieve the hash key.\n+ *\n+ * @note: If the caller called ena_com_fill_hash_key but didn't flash\n+ * it to the device, the new configuration will be lost.\n+ *\n+ * @return: 0 on Success and negative value otherwise.\n+ */\n+int ena_com_get_hash_key(struct ena_com_dev *ena_dev, u8 *key);\n /* ena_com_fill_hash_ctrl - Fill RSS hash control\n  * @ena_dev: ENA communication layer struct.\n  * @proto: The protocol to configure.\ndiff --git a/drivers/net/ena/base/ena_plat_dpdk.h b/drivers/net/ena/base/ena_plat_dpdk.h\nindex 793ba8a957..24a831f4d4 100644\n--- a/drivers/net/ena/base/ena_plat_dpdk.h\n+++ b/drivers/net/ena/base/ena_plat_dpdk.h\n@@ -301,6 +301,12 @@ extern rte_atomic32_t ena_alloc_cnt;\n \n #define DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d))\n \n+#define ENA_FFS(x) ffs(x)\n+\n+void ena_rss_key_fill(void *key, size_t size);\n+\n+#define ENA_RSS_FILL_KEY(key, size) ena_rss_key_fill(key, size)\n+\n #include \"ena_includes.h\"\n \n #endif /* DPDK_ENA_COM_ENA_PLAT_DPDK_H_ */\ndiff --git a/drivers/net/ena/ena_ethdev.c b/drivers/net/ena/ena_ethdev.c\nindex cab38152a7..4c1e4899d0 100644\n--- a/drivers/net/ena/ena_ethdev.c\n+++ b/drivers/net/ena/ena_ethdev.c\n@@ -256,6 +256,22 @@ static const struct eth_dev_ops ena_dev_ops = {\n \t.reta_query           = ena_rss_reta_query,\n };\n \n+void ena_rss_key_fill(void *key, size_t size)\n+{\n+\tstatic bool key_generated;\n+\tstatic uint8_t default_key[ENA_HASH_KEY_SIZE];\n+\n+\tRTE_ASSERT(size <= ENA_HASH_KEY_SIZE);\n+\n+\tif (unlikely(!key_generated)) {\n+\t\tfor (size_t i = 0; i < ENA_HASH_KEY_SIZE; ++i)\n+\t\t\tdefault_key[i] = rte_rand() & 0xff;\n+\t\tkey_generated = true;\n+\t}\n+\n+\trte_memcpy(key, default_key, size);\n+}\n+\n static inline void ena_rx_mbuf_prepare(struct rte_mbuf *mbuf,\n \t\t\t\t       struct ena_com_rx_ctx *ena_rx_ctx)\n {\n",
    "prefixes": [
        "04/29"
    ]
}