get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 68474,
    "url": "http://patchwork.dpdk.org/api/patches/68474/?format=api",
    "web_url": "http://patchwork.dpdk.org/project/dpdk/patch/1586932797-99533-5-git-send-email-suanmingm@mellanox.com/",
    "project": {
        "id": 1,
        "url": "http://patchwork.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": "<1586932797-99533-5-git-send-email-suanmingm@mellanox.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/1586932797-99533-5-git-send-email-suanmingm@mellanox.com",
    "date": "2020-04-15T06:39:51",
    "name": "[04/10] net/mlx5: optimize mlx5 flow RSS struct",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "02f8355215fc94b362c02a8cf060161d3e08105f",
    "submitter": {
        "id": 1358,
        "url": "http://patchwork.dpdk.org/api/people/1358/?format=api",
        "name": "Suanming Mou",
        "email": "suanmingm@mellanox.com"
    },
    "delegate": {
        "id": 3268,
        "url": "http://patchwork.dpdk.org/api/users/3268/?format=api",
        "username": "rasland",
        "first_name": "Raslan",
        "last_name": "Darawsheh",
        "email": "rasland@nvidia.com"
    },
    "mbox": "http://patchwork.dpdk.org/project/dpdk/patch/1586932797-99533-5-git-send-email-suanmingm@mellanox.com/mbox/",
    "series": [
        {
            "id": 9383,
            "url": "http://patchwork.dpdk.org/api/series/9383/?format=api",
            "web_url": "http://patchwork.dpdk.org/project/dpdk/list/?series=9383",
            "date": "2020-04-15T06:39:47",
            "name": "net/mlx5: optimize flow structure",
            "version": 1,
            "mbox": "http://patchwork.dpdk.org/series/9383/mbox/"
        }
    ],
    "comments": "http://patchwork.dpdk.org/api/patches/68474/comments/",
    "check": "fail",
    "checks": "http://patchwork.dpdk.org/api/patches/68474/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 7179DA0577;\n\tWed, 15 Apr 2020 08:40:44 +0200 (CEST)",
            "from [92.243.14.124] (localhost [127.0.0.1])\n\tby dpdk.org (Postfix) with ESMTP id A103E1D17E;\n\tWed, 15 Apr 2020 08:40:13 +0200 (CEST)",
            "from git-send-mailer.rdmz.labs.mlnx (unknown [37.142.13.130])\n by dpdk.org (Postfix) with ESMTP id 311621D16B\n for <dev@dpdk.org>; Wed, 15 Apr 2020 08:40:11 +0200 (CEST)"
        ],
        "From": "Suanming Mou <suanmingm@mellanox.com>",
        "To": "Matan Azrad <matan@mellanox.com>, Shahaf Shuler <shahafs@mellanox.com>,\n Viacheslav Ovsiienko <viacheslavo@mellanox.com>",
        "Cc": "wentaoc@mellanox.com,\n\trasland@mellanox.com,\n\tdev@dpdk.org",
        "Date": "Wed, 15 Apr 2020 14:39:51 +0800",
        "Message-Id": "<1586932797-99533-5-git-send-email-suanmingm@mellanox.com>",
        "X-Mailer": "git-send-email 1.8.3.1",
        "In-Reply-To": "<1586932797-99533-1-git-send-email-suanmingm@mellanox.com>",
        "References": "<1586932797-99533-1-git-send-email-suanmingm@mellanox.com>",
        "Subject": "[dpdk-dev] [PATCH 04/10] net/mlx5: optimize mlx5 flow RSS struct",
        "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": "When destroy the flow with RSS, only RSS queue is needed. Currently,\neven the RSS key, types, level, are all saved to the rte flow.\n\nSaves only the mlx5 flow RSS queue information to save memory for\nrte flow.\n\nAs the maximum queue number is UINT16_MAX, the queue number type is\nchanged to uint16_t.\n\nSigned-off-by: Suanming Mou <suanmingm@mellanox.com>\n---\n drivers/net/mlx5/mlx5.h            |  1 +\n drivers/net/mlx5/mlx5_flow.c       | 26 +++++++++++-----\n drivers/net/mlx5/mlx5_flow.h       | 14 ++++++---\n drivers/net/mlx5/mlx5_flow_dv.c    | 48 +++++++++++++++++------------\n drivers/net/mlx5/mlx5_flow_verbs.c | 62 ++++++++++++++++++++------------------\n 5 files changed, 89 insertions(+), 62 deletions(-)",
    "diff": "diff --git a/drivers/net/mlx5/mlx5.h b/drivers/net/mlx5/mlx5.h\nindex 31e0da2..41c87ec 100644\n--- a/drivers/net/mlx5/mlx5.h\n+++ b/drivers/net/mlx5/mlx5.h\n@@ -556,6 +556,7 @@ struct mlx5_priv {\n \tstruct mlx5_flows flows; /* RTE Flow rules. */\n \tstruct mlx5_flows ctrl_flows; /* Control flow rules. */\n \tvoid *inter_flows; /* Intermediate resources for flow creation. */\n+\tvoid *rss_meta; /* Intermediate rss metadata resources for rss. */\n \tint flow_idx; /* Intermediate device flow index. */\n \tint flow_nested_idx; /* Intermediate device flow index, nested. */\n \tLIST_HEAD(rxq, mlx5_rxq_ctrl) rxqsctrl; /* DPDK Rx queues. */\ndiff --git a/drivers/net/mlx5/mlx5_flow.c b/drivers/net/mlx5/mlx5_flow.c\nindex 71c6bce..9f79031 100644\n--- a/drivers/net/mlx5/mlx5_flow.c\n+++ b/drivers/net/mlx5/mlx5_flow.c\n@@ -658,13 +658,12 @@ uint32_t mlx5_flow_adjust_priority(struct rte_eth_dev *dev, int32_t priority,\n  *   The hash fields that should be used.\n  */\n uint64_t\n-mlx5_flow_hashfields_adjust(struct mlx5_flow *dev_flow,\n+mlx5_flow_hashfields_adjust(struct mlx5_flow_rss_meta *rss_meta,\n \t\t\t    int tunnel __rte_unused, uint64_t layer_types,\n \t\t\t    uint64_t hash_fields)\n {\n-\tstruct rte_flow *flow = dev_flow->flow;\n #ifdef HAVE_IBV_DEVICE_TUNNEL_SUPPORT\n-\tint rss_request_inner = flow->rss.level >= 2;\n+\tint rss_request_inner = rss_meta->level >= 2;\n \n \t/* Check RSS hash level for tunnel. */\n \tif (tunnel && rss_request_inner)\n@@ -673,7 +672,7 @@ uint32_t mlx5_flow_adjust_priority(struct rte_eth_dev *dev, int32_t priority,\n \t\treturn 0;\n #endif\n \t/* Check if requested layer matches RSS hash fields. */\n-\tif (!(flow->rss.types & layer_types))\n+\tif (!(rss_meta->types & layer_types))\n \t\treturn 0;\n \treturn hash_fields;\n }\n@@ -4223,6 +4222,7 @@ uint32_t mlx5_flow_adjust_priority(struct rte_eth_dev *dev, int32_t priority,\n \t\tuint8_t buffer[2048];\n \t} items_tx;\n \tstruct rte_flow_expand_rss *buf = &expand_buffer.buf;\n+\tstruct mlx5_flow_rss_meta *rss_meta = priv->rss_meta;\n \tconst struct rte_flow_action *p_actions_rx = actions;\n \tuint32_t i;\n \tuint32_t flow_size;\n@@ -4263,14 +4263,16 @@ uint32_t mlx5_flow_adjust_priority(struct rte_eth_dev *dev, int32_t priority,\n \tMLX5_ASSERT(flow->drv_type > MLX5_FLOW_TYPE_MIN &&\n \t\t    flow->drv_type < MLX5_FLOW_TYPE_MAX);\n \tflow->rss.queue = (void *)(flow + 1);\n+\tmemset(rss_meta, 0, sizeof(*rss_meta));\n+\trss_meta->queue = flow->rss.queue;\n \tif (rss) {\n \t\t/*\n \t\t * The following information is required by\n \t\t * mlx5_flow_hashfields_adjust() in advance.\n \t\t */\n-\t\tflow->rss.level = rss->level;\n+\t\trss_meta->level = rss->level;\n \t\t/* RSS type 0 indicates default RSS type (ETH_RSS_IP). */\n-\t\tflow->rss.types = !rss->types ? ETH_RSS_IP : rss->types;\n+\t\trss_meta->types = !rss->types ? ETH_RSS_IP : rss->types;\n \t}\n \tflow->dev_handles = 0;\n \tif (rss && rss->types) {\n@@ -4623,9 +4625,17 @@ struct rte_flow *\n {\n \tstruct mlx5_priv *priv = dev->data->dev_private;\n \n-\tif (!priv->inter_flows)\n+\tif (!priv->inter_flows) {\n \t\tpriv->inter_flows = rte_calloc(__func__, MLX5_NUM_MAX_DEV_FLOWS,\n-\t\t\t\t\t       sizeof(struct mlx5_flow), 0);\n+\t\t\t\t    sizeof(struct mlx5_flow) +\n+\t\t\t\t    sizeof(struct mlx5_flow_rss_meta), 0);\n+\t\tif (!priv->inter_flows) {\n+\t\t\tDRV_LOG(ERR, \"can't allocate intermediate memory.\");\n+\t\t\treturn;\n+\t\t}\n+\t}\n+\tpriv->rss_meta = &((struct mlx5_flow *)priv->inter_flows)\n+\t\t\t [MLX5_NUM_MAX_DEV_FLOWS];\n \t/* Reset the index. */\n \tpriv->flow_idx = 0;\n \tpriv->flow_nested_idx = 0;\ndiff --git a/drivers/net/mlx5/mlx5_flow.h b/drivers/net/mlx5/mlx5_flow.h\nindex db42189..4516b51 100644\n--- a/drivers/net/mlx5/mlx5_flow.h\n+++ b/drivers/net/mlx5/mlx5_flow.h\n@@ -482,7 +482,12 @@ struct ibv_spec_header {\n \tuint16_t size;\n };\n \n-struct mlx5_flow_rss {\n+struct mlx5_flow_rss_queue {\n+\tuint16_t queue_num; /**< Number of entries in @p queue. */\n+\tuint16_t (*queue)[]; /**< Destination queues to redirect traffic to. */\n+} __rte_packed;\n+\n+struct mlx5_flow_rss_meta {\n \tuint32_t level;\n \tuint32_t queue_num; /**< Number of entries in @p queue. */\n \tuint64_t types; /**< Specific RSS hash types (see ETH_RSS_*). */\n@@ -490,6 +495,7 @@ struct mlx5_flow_rss {\n \tuint8_t key[MLX5_RSS_HASH_KEY_LEN]; /**< RSS hash key. */\n };\n \n+\n /** Device flow handle structure for DV mode only. */\n struct mlx5_flow_handle_dv {\n \t/* Flow DV api: */\n@@ -749,7 +755,7 @@ struct mlx5_flow_meter_profile {\n struct rte_flow {\n \tTAILQ_ENTRY(rte_flow) next; /**< Pointer to the next flow structure. */\n \tenum mlx5_flow_drv_type drv_type; /**< Driver type. */\n-\tstruct mlx5_flow_rss rss; /**< RSS context. */\n+\tstruct mlx5_flow_rss_queue rss; /**< RSS queue context. */\n \tuint32_t counter; /**< Holds flow counter. */\n \tstruct mlx5_flow_mreg_copy_resource *mreg_copy;\n \t/**< pointer to metadata register copy table resource. */\n@@ -842,8 +848,8 @@ uint32_t mlx5_flow_id_release(struct mlx5_flow_id_pool *pool,\n int mlx5_flow_group_to_table(const struct rte_flow_attr *attributes,\n \t\t\t     bool external, uint32_t group, bool fdb_def_rule,\n \t\t\t     uint32_t *table, struct rte_flow_error *error);\n-uint64_t mlx5_flow_hashfields_adjust(struct mlx5_flow *dev_flow, int tunnel,\n-\t\t\t\t     uint64_t layer_types,\n+uint64_t mlx5_flow_hashfields_adjust(struct mlx5_flow_rss_meta *rss_meta,\n+\t\t\t\t     int tunnel, uint64_t layer_types,\n \t\t\t\t     uint64_t hash_fields);\n uint32_t mlx5_flow_adjust_priority(struct rte_eth_dev *dev, int32_t priority,\n \t\t\t\t   uint32_t subpriority);\ndiff --git a/drivers/net/mlx5/mlx5_flow_dv.c b/drivers/net/mlx5/mlx5_flow_dv.c\nindex de27b74..26733e0 100644\n--- a/drivers/net/mlx5/mlx5_flow_dv.c\n+++ b/drivers/net/mlx5/mlx5_flow_dv.c\n@@ -7241,18 +7241,20 @@ struct field_modify_info modify_tcp[] = {\n  *\n  * @param[in] dev_flow\n  *   Pointer to the mlx5_flow.\n+ * @param[in] rss_meta\n+ *   Pointer to the mlx5_flow_rss_meta.\n  */\n static void\n-flow_dv_hashfields_set(struct mlx5_flow *dev_flow)\n+flow_dv_hashfields_set(struct mlx5_flow *dev_flow,\n+\t\t       struct mlx5_flow_rss_meta *rss_meta)\n {\n-\tstruct rte_flow *flow = dev_flow->flow;\n \tuint64_t items = dev_flow->handle->layers;\n \tint rss_inner = 0;\n-\tuint64_t rss_types = rte_eth_rss_hf_refine(flow->rss.types);\n+\tuint64_t rss_types = rte_eth_rss_hf_refine(rss_meta->types);\n \n \tdev_flow->hash_fields = 0;\n #ifdef HAVE_IBV_DEVICE_TUNNEL_SUPPORT\n-\tif (flow->rss.level >= 2) {\n+\tif (rss_meta->level >= 2) {\n \t\tdev_flow->hash_fields |= IBV_RX_HASH_INNER;\n \t\trss_inner = 1;\n \t}\n@@ -7337,6 +7339,8 @@ struct field_modify_info modify_tcp[] = {\n \tstruct mlx5_dev_config *dev_conf = &priv->config;\n \tstruct rte_flow *flow = dev_flow->flow;\n \tstruct mlx5_flow_handle *handle = dev_flow->handle;\n+\tstruct mlx5_flow_rss_meta *rss_meta = (struct mlx5_flow_rss_meta *)\n+\t\t\t\t\t      priv->rss_meta;\n \tuint64_t item_flags = 0;\n \tuint64_t last_item = 0;\n \tuint64_t action_flags = 0;\n@@ -7493,6 +7497,7 @@ struct field_modify_info modify_tcp[] = {\n \t\t\tMLX5_ASSERT(flow->rss.queue);\n \t\t\tqueue = actions->conf;\n \t\t\tflow->rss.queue_num = 1;\n+\t\t\trss_meta->queue_num = flow->rss.queue_num;\n \t\t\t(*flow->rss.queue)[0] = queue->index;\n \t\t\taction_flags |= MLX5_FLOW_ACTION_QUEUE;\n \t\t\tdev_flow->handle->fate_action = MLX5_FLOW_FATE_QUEUE;\n@@ -7504,9 +7509,10 @@ struct field_modify_info modify_tcp[] = {\n \t\t\t\tmemcpy((*flow->rss.queue), rss->queue,\n \t\t\t\t       rss->queue_num * sizeof(uint16_t));\n \t\t\tflow->rss.queue_num = rss->queue_num;\n+\t\t\trss_meta->queue_num = flow->rss.queue_num;\n \t\t\t/* NULL RSS key indicates default RSS key. */\n \t\t\trss_key = !rss->key ? rss_hash_default_key : rss->key;\n-\t\t\tmemcpy(flow->rss.key, rss_key, MLX5_RSS_HASH_KEY_LEN);\n+\t\t\tmemcpy(rss_meta->key, rss_key, MLX5_RSS_HASH_KEY_LEN);\n \t\t\t/*\n \t\t\t * rss->level and rss.types should be set in advance\n \t\t\t * when expanding items for RSS.\n@@ -7904,7 +7910,7 @@ struct field_modify_info modify_tcp[] = {\n \t\tcase RTE_FLOW_ITEM_TYPE_GRE:\n \t\t\tflow_dv_translate_item_gre(match_mask, match_value,\n \t\t\t\t\t\t   items, tunnel);\n-\t\t\tmatcher.priority = flow->rss.level >= 2 ?\n+\t\t\tmatcher.priority = rss_meta->level >= 2 ?\n \t\t\t\t    MLX5_PRIORITY_MAP_L2 : MLX5_PRIORITY_MAP_L4;\n \t\t\tlast_item = MLX5_FLOW_LAYER_GRE;\n \t\t\tbreak;\n@@ -7916,14 +7922,14 @@ struct field_modify_info modify_tcp[] = {\n \t\tcase RTE_FLOW_ITEM_TYPE_NVGRE:\n \t\t\tflow_dv_translate_item_nvgre(match_mask, match_value,\n \t\t\t\t\t\t     items, tunnel);\n-\t\t\tmatcher.priority = flow->rss.level >= 2 ?\n+\t\t\tmatcher.priority = rss_meta->level >= 2 ?\n \t\t\t\t    MLX5_PRIORITY_MAP_L2 : MLX5_PRIORITY_MAP_L4;\n \t\t\tlast_item = MLX5_FLOW_LAYER_GRE;\n \t\t\tbreak;\n \t\tcase RTE_FLOW_ITEM_TYPE_VXLAN:\n \t\t\tflow_dv_translate_item_vxlan(match_mask, match_value,\n \t\t\t\t\t\t     items, tunnel);\n-\t\t\tmatcher.priority = flow->rss.level >= 2 ?\n+\t\t\tmatcher.priority = rss_meta->level >= 2 ?\n \t\t\t\t    MLX5_PRIORITY_MAP_L2 : MLX5_PRIORITY_MAP_L4;\n \t\t\tlast_item = MLX5_FLOW_LAYER_VXLAN;\n \t\t\tbreak;\n@@ -7931,21 +7937,21 @@ struct field_modify_info modify_tcp[] = {\n \t\t\tflow_dv_translate_item_vxlan_gpe(match_mask,\n \t\t\t\t\t\t\t match_value, items,\n \t\t\t\t\t\t\t tunnel);\n-\t\t\tmatcher.priority = flow->rss.level >= 2 ?\n+\t\t\tmatcher.priority = rss_meta->level >= 2 ?\n \t\t\t\t    MLX5_PRIORITY_MAP_L2 : MLX5_PRIORITY_MAP_L4;\n \t\t\tlast_item = MLX5_FLOW_LAYER_VXLAN_GPE;\n \t\t\tbreak;\n \t\tcase RTE_FLOW_ITEM_TYPE_GENEVE:\n \t\t\tflow_dv_translate_item_geneve(match_mask, match_value,\n \t\t\t\t\t\t      items, tunnel);\n-\t\t\tmatcher.priority = flow->rss.level >= 2 ?\n+\t\t\tmatcher.priority = rss_meta->level >= 2 ?\n \t\t\t\t    MLX5_PRIORITY_MAP_L2 : MLX5_PRIORITY_MAP_L4;\n \t\t\tlast_item = MLX5_FLOW_LAYER_GENEVE;\n \t\t\tbreak;\n \t\tcase RTE_FLOW_ITEM_TYPE_MPLS:\n \t\t\tflow_dv_translate_item_mpls(match_mask, match_value,\n \t\t\t\t\t\t    items, last_item, tunnel);\n-\t\t\tmatcher.priority = flow->rss.level >= 2 ?\n+\t\t\tmatcher.priority = rss_meta->level >= 2 ?\n \t\t\t\t    MLX5_PRIORITY_MAP_L2 : MLX5_PRIORITY_MAP_L4;\n \t\t\tlast_item = MLX5_FLOW_LAYER_MPLS;\n \t\t\tbreak;\n@@ -7988,7 +7994,7 @@ struct field_modify_info modify_tcp[] = {\n \t\tcase RTE_FLOW_ITEM_TYPE_GTP:\n \t\t\tflow_dv_translate_item_gtp(match_mask, match_value,\n \t\t\t\t\t\t   items, tunnel);\n-\t\t\tmatcher.priority = flow->rss.level >= 2 ?\n+\t\t\tmatcher.priority = rss_meta->level >= 2 ?\n \t\t\t\t    MLX5_PRIORITY_MAP_L2 : MLX5_PRIORITY_MAP_L4;\n \t\t\tlast_item = MLX5_FLOW_LAYER_GTP;\n \t\t\tbreak;\n@@ -8020,7 +8026,7 @@ struct field_modify_info modify_tcp[] = {\n \t */\n \thandle->layers |= item_flags;\n \tif (action_flags & MLX5_FLOW_ACTION_RSS)\n-\t\tflow_dv_hashfields_set(dev_flow);\n+\t\tflow_dv_hashfields_set(dev_flow, rss_meta);\n \t/* Register matcher. */\n \tmatcher.crc = rte_raw_cksum((const void *)matcher.mask.buf,\n \t\t\t\t    matcher.mask.size);\n@@ -8095,20 +8101,22 @@ struct field_modify_info modify_tcp[] = {\n \t\t} else if (dh->fate_action == MLX5_FLOW_FATE_QUEUE) {\n \t\t\tstruct mlx5_hrxq *hrxq;\n \t\t\tuint32_t hrxq_idx;\n+\t\t\tstruct mlx5_flow_rss_meta *rss_meta =\n+\t\t\t\t(struct mlx5_flow_rss_meta *)priv->rss_meta;\n \n-\t\t\tMLX5_ASSERT(flow->rss.queue);\n-\t\t\thrxq_idx = mlx5_hrxq_get(dev, flow->rss.key,\n+\t\t\tMLX5_ASSERT(rss_meta->queue);\n+\t\t\thrxq_idx = mlx5_hrxq_get(dev, rss_meta->key,\n \t\t\t\t\t\t MLX5_RSS_HASH_KEY_LEN,\n \t\t\t\t\t\t dev_flow->hash_fields,\n-\t\t\t\t\t\t (*flow->rss.queue),\n-\t\t\t\t\t\t flow->rss.queue_num);\n+\t\t\t\t\t\t (*rss_meta->queue),\n+\t\t\t\t\t\t rss_meta->queue_num);\n \t\t\tif (!hrxq_idx) {\n \t\t\t\thrxq_idx = mlx5_hrxq_new\n-\t\t\t\t\t\t(dev, flow->rss.key,\n+\t\t\t\t\t\t(dev, rss_meta->key,\n \t\t\t\t\t\tMLX5_RSS_HASH_KEY_LEN,\n \t\t\t\t\t\tdev_flow->hash_fields,\n-\t\t\t\t\t\t(*flow->rss.queue),\n-\t\t\t\t\t\tflow->rss.queue_num,\n+\t\t\t\t\t\t(*rss_meta->queue),\n+\t\t\t\t\t\trss_meta->queue_num,\n \t\t\t\t\t\t!!(dh->layers &\n \t\t\t\t\t\tMLX5_FLOW_LAYER_TUNNEL));\n \t\t\t}\ndiff --git a/drivers/net/mlx5/mlx5_flow_verbs.c b/drivers/net/mlx5/mlx5_flow_verbs.c\nindex 1d56b03..403a101 100644\n--- a/drivers/net/mlx5/mlx5_flow_verbs.c\n+++ b/drivers/net/mlx5/mlx5_flow_verbs.c\n@@ -941,21 +941,20 @@\n  * the input is valid and that there is space to insert the requested action\n  * into the flow.\n  *\n- * @param[in] dev_flow\n- *   Pointer to mlx5_flow.\n+ * @param[in] rss_meta\n+ *   Pointer to mlx5_flow_rss_meta.\n  * @param[in] action\n  *   Action configuration.\n  */\n static void\n-flow_verbs_translate_action_queue(struct mlx5_flow *dev_flow,\n+flow_verbs_translate_action_queue(struct mlx5_flow_rss_meta *rss_meta,\n \t\t\t\t  const struct rte_flow_action *action)\n {\n \tconst struct rte_flow_action_queue *queue = action->conf;\n-\tstruct rte_flow *flow = dev_flow->flow;\n \n-\tif (flow->rss.queue)\n-\t\t(*flow->rss.queue)[0] = queue->index;\n-\tflow->rss.queue_num = 1;\n+\tif (rss_meta->queue)\n+\t\t(*rss_meta->queue)[0] = queue->index;\n+\trss_meta->queue_num = 1;\n }\n \n /**\n@@ -963,28 +962,25 @@\n  * the input is valid and that there is space to insert the requested action\n  * into the flow.\n  *\n+ * @param[in] rss_meta\n+ *   Pointer to mlx5_flow_rss_meta.\n  * @param[in] action\n  *   Action configuration.\n- * @param[in, out] action_flags\n- *   Pointer to the detected actions.\n- * @param[in] dev_flow\n- *   Pointer to mlx5_flow.\n  */\n static void\n-flow_verbs_translate_action_rss(struct mlx5_flow *dev_flow,\n+flow_verbs_translate_action_rss(struct mlx5_flow_rss_meta *rss_meta,\n \t\t\t\tconst struct rte_flow_action *action)\n {\n \tconst struct rte_flow_action_rss *rss = action->conf;\n \tconst uint8_t *rss_key;\n-\tstruct rte_flow *flow = dev_flow->flow;\n \n-\tif (flow->rss.queue)\n-\t\tmemcpy((*flow->rss.queue), rss->queue,\n+\tif (rss_meta->queue)\n+\t\tmemcpy((*rss_meta->queue), rss->queue,\n \t\t       rss->queue_num * sizeof(uint16_t));\n-\tflow->rss.queue_num = rss->queue_num;\n+\trss_meta->queue_num = rss->queue_num;\n \t/* NULL RSS key indicates default RSS key. */\n \trss_key = !rss->key ? rss_hash_default_key : rss->key;\n-\tmemcpy(flow->rss.key, rss_key, MLX5_RSS_HASH_KEY_LEN);\n+\tmemcpy(rss_meta->key, rss_key, MLX5_RSS_HASH_KEY_LEN);\n \t/*\n \t * rss->level and rss.types should be set in advance when expanding\n \t * items for RSS.\n@@ -1577,6 +1573,8 @@\n \tuint64_t priority = attr->priority;\n \tuint32_t subpriority = 0;\n \tstruct mlx5_priv *priv = dev->data->dev_private;\n+\tstruct mlx5_flow_rss_meta *rss_meta = (struct mlx5_flow_rss_meta *)\n+\t\t\t\t\t      priv->rss_meta;\n \n \tif (priority == MLX5_FLOW_PRIO_RSVD)\n \t\tpriority = priv->config.flow_prio - 1;\n@@ -1602,12 +1600,14 @@\n \t\t\tdev_flow->handle->fate_action = MLX5_FLOW_FATE_DROP;\n \t\t\tbreak;\n \t\tcase RTE_FLOW_ACTION_TYPE_QUEUE:\n-\t\t\tflow_verbs_translate_action_queue(dev_flow, actions);\n+\t\t\tflow_verbs_translate_action_queue(rss_meta, actions);\n \t\t\taction_flags |= MLX5_FLOW_ACTION_QUEUE;\n+\t\t\tdev_flow->flow->rss.queue_num = rss_meta->queue_num;\n \t\t\tdev_flow->handle->fate_action = MLX5_FLOW_FATE_QUEUE;\n \t\t\tbreak;\n \t\tcase RTE_FLOW_ACTION_TYPE_RSS:\n-\t\t\tflow_verbs_translate_action_rss(dev_flow, actions);\n+\t\t\tflow_verbs_translate_action_rss(rss_meta, actions);\n+\t\t\tdev_flow->flow->rss.queue_num = rss_meta->queue_num;\n \t\t\taction_flags |= MLX5_FLOW_ACTION_RSS;\n \t\t\tdev_flow->handle->fate_action = MLX5_FLOW_FATE_QUEUE;\n \t\t\tbreak;\n@@ -1655,7 +1655,7 @@\n \t\t\tsubpriority = MLX5_PRIORITY_MAP_L3;\n \t\t\tdev_flow->hash_fields |=\n \t\t\t\tmlx5_flow_hashfields_adjust\n-\t\t\t\t\t(dev_flow, tunnel,\n+\t\t\t\t\t(rss_meta, tunnel,\n \t\t\t\t\t MLX5_IPV4_LAYER_TYPES,\n \t\t\t\t\t MLX5_IPV4_IBV_RX_HASH);\n \t\t\titem_flags |= tunnel ? MLX5_FLOW_LAYER_INNER_L3_IPV4 :\n@@ -1667,7 +1667,7 @@\n \t\t\tsubpriority = MLX5_PRIORITY_MAP_L3;\n \t\t\tdev_flow->hash_fields |=\n \t\t\t\tmlx5_flow_hashfields_adjust\n-\t\t\t\t\t(dev_flow, tunnel,\n+\t\t\t\t\t(rss_meta, tunnel,\n \t\t\t\t\t MLX5_IPV6_LAYER_TYPES,\n \t\t\t\t\t MLX5_IPV6_IBV_RX_HASH);\n \t\t\titem_flags |= tunnel ? MLX5_FLOW_LAYER_INNER_L3_IPV6 :\n@@ -1679,7 +1679,7 @@\n \t\t\tsubpriority = MLX5_PRIORITY_MAP_L4;\n \t\t\tdev_flow->hash_fields |=\n \t\t\t\tmlx5_flow_hashfields_adjust\n-\t\t\t\t\t(dev_flow, tunnel, ETH_RSS_TCP,\n+\t\t\t\t\t(rss_meta, tunnel, ETH_RSS_TCP,\n \t\t\t\t\t (IBV_RX_HASH_SRC_PORT_TCP |\n \t\t\t\t\t  IBV_RX_HASH_DST_PORT_TCP));\n \t\t\titem_flags |= tunnel ? MLX5_FLOW_LAYER_INNER_L4_TCP :\n@@ -1691,7 +1691,7 @@\n \t\t\tsubpriority = MLX5_PRIORITY_MAP_L4;\n \t\t\tdev_flow->hash_fields |=\n \t\t\t\tmlx5_flow_hashfields_adjust\n-\t\t\t\t\t(dev_flow, tunnel, ETH_RSS_UDP,\n+\t\t\t\t\t(rss_meta, tunnel, ETH_RSS_UDP,\n \t\t\t\t\t (IBV_RX_HASH_SRC_PORT_UDP |\n \t\t\t\t\t  IBV_RX_HASH_DST_PORT_UDP));\n \t\t\titem_flags |= tunnel ? MLX5_FLOW_LAYER_INNER_L4_UDP :\n@@ -1848,19 +1848,21 @@\n \t\t\t}\n \t\t} else {\n \t\t\tuint32_t hrxq_idx;\n+\t\t\tstruct mlx5_flow_rss_meta *rss_meta =\n+\t\t\t\t(struct mlx5_flow_rss_meta *)priv->rss_meta;\n \n-\t\t\tMLX5_ASSERT(flow->rss.queue);\n-\t\t\thrxq_idx = mlx5_hrxq_get(dev, flow->rss.key,\n+\t\t\tMLX5_ASSERT(rss_meta->queue);\n+\t\t\thrxq_idx = mlx5_hrxq_get(dev, rss_meta->key,\n \t\t\t\t\t     MLX5_RSS_HASH_KEY_LEN,\n \t\t\t\t\t     dev_flow->hash_fields,\n-\t\t\t\t\t     (*flow->rss.queue),\n-\t\t\t\t\t     flow->rss.queue_num);\n+\t\t\t\t\t     (*rss_meta->queue),\n+\t\t\t\t\t     rss_meta->queue_num);\n \t\t\tif (!hrxq_idx)\n-\t\t\t\thrxq_idx = mlx5_hrxq_new(dev, flow->rss.key,\n+\t\t\t\thrxq_idx = mlx5_hrxq_new(dev, rss_meta->key,\n \t\t\t\t\t\tMLX5_RSS_HASH_KEY_LEN,\n \t\t\t\t\t\tdev_flow->hash_fields,\n-\t\t\t\t\t\t(*flow->rss.queue),\n-\t\t\t\t\t\tflow->rss.queue_num,\n+\t\t\t\t\t\t(*rss_meta->queue),\n+\t\t\t\t\t\trss_meta->queue_num,\n \t\t\t\t\t\t!!(handle->layers &\n \t\t\t\t\t\tMLX5_FLOW_LAYER_TUNNEL));\n \t\t\thrxq = mlx5_ipool_get(priv->sh->ipool[MLX5_IPOOL_HRXQ],\n",
    "prefixes": [
        "04/10"
    ]
}