get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 62426,
    "url": "http://patches.dpdk.org/api/patches/62426/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/1572940915-29416-5-git-send-email-viacheslavo@mellanox.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": "<1572940915-29416-5-git-send-email-viacheslavo@mellanox.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/1572940915-29416-5-git-send-email-viacheslavo@mellanox.com",
    "date": "2019-11-05T08:01:39",
    "name": "[04/20] net/mlx5: refactor flow structure",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "d75b2a0355afb69c4e4d9340117b6b465c01b5d3",
    "submitter": {
        "id": 1102,
        "url": "http://patches.dpdk.org/api/people/1102/?format=api",
        "name": "Slava Ovsiienko",
        "email": "viacheslavo@mellanox.com"
    },
    "delegate": {
        "id": 3268,
        "url": "http://patches.dpdk.org/api/users/3268/?format=api",
        "username": "rasland",
        "first_name": "Raslan",
        "last_name": "Darawsheh",
        "email": "rasland@nvidia.com"
    },
    "mbox": "http://patches.dpdk.org/project/dpdk/patch/1572940915-29416-5-git-send-email-viacheslavo@mellanox.com/mbox/",
    "series": [
        {
            "id": 7242,
            "url": "http://patches.dpdk.org/api/series/7242/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=7242",
            "date": "2019-11-05T08:01:35",
            "name": "net/mlx5: implement extensive metadata feature",
            "version": 1,
            "mbox": "http://patches.dpdk.org/series/7242/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/62426/comments/",
    "check": "fail",
    "checks": "http://patches.dpdk.org/api/patches/62426/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 B1D10A0352;\n\tTue,  5 Nov 2019 09:03:17 +0100 (CET)",
            "from [92.243.14.124] (localhost [127.0.0.1])\n\tby dpdk.org (Postfix) with ESMTP id 5F1FA1BE95;\n\tTue,  5 Nov 2019 09:02:17 +0100 (CET)",
            "from mellanox.co.il (mail-il-dmz.mellanox.com [193.47.165.129])\n by dpdk.org (Postfix) with ESMTP id 9F61B5B3A\n for <dev@dpdk.org>; Tue,  5 Nov 2019 09:02:09 +0100 (CET)",
            "from Internal Mail-Server by MTLPINE1 (envelope-from\n viacheslavo@mellanox.com)\n with ESMTPS (AES256-SHA encrypted); 5 Nov 2019 10:02:05 +0200",
            "from pegasus11.mtr.labs.mlnx (pegasus11.mtr.labs.mlnx\n [10.210.16.104])\n by labmailer.mlnx (8.13.8/8.13.8) with ESMTP id xA582566026462;\n Tue, 5 Nov 2019 10:02:05 +0200",
            "from pegasus11.mtr.labs.mlnx (localhost [127.0.0.1])\n by pegasus11.mtr.labs.mlnx (8.14.7/8.14.7) with ESMTP id xA5825ZH030759;\n Tue, 5 Nov 2019 08:02:05 GMT",
            "(from viacheslavo@localhost)\n by pegasus11.mtr.labs.mlnx (8.14.7/8.14.7/Submit) id xA5825IM030758;\n Tue, 5 Nov 2019 08:02:05 GMT"
        ],
        "X-Authentication-Warning": "pegasus11.mtr.labs.mlnx: viacheslavo set sender to\n viacheslavo@mellanox.com using -f",
        "From": "Viacheslav Ovsiienko <viacheslavo@mellanox.com>",
        "To": "dev@dpdk.org",
        "Cc": "matan@mellanox.com, rasland@mellanox.com, thomas@monjalon.net,\n orika@mellanox.com, Yongseok Koh <yskoh@mellanox.com>",
        "Date": "Tue,  5 Nov 2019 08:01:39 +0000",
        "Message-Id": "<1572940915-29416-5-git-send-email-viacheslavo@mellanox.com>",
        "X-Mailer": "git-send-email 1.8.3.1",
        "In-Reply-To": "<1572940915-29416-1-git-send-email-viacheslavo@mellanox.com>",
        "References": "<1572940915-29416-1-git-send-email-viacheslavo@mellanox.com>",
        "Subject": "[dpdk-dev] [PATCH 04/20] net/mlx5: refactor flow structure",
        "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": "Some rte_flow fields which are local to subflows have been moved to\nmlx5_flow structure. RSS attributes are grouped by mlx5_flow_rss structure.\ntag_resource is moved to mlx5_flow_dv structure.\n\nSigned-off-by: Yongseok Koh <yskoh@mellanox.com>\nSigned-off-by: Viacheslav Ovsiienko <viacheslavo@mellanox.com>\nAcked-by: Matan Azrad <matan@mellanox.com>\n---\n drivers/net/mlx5/mlx5_flow.c       | 18 +++++---\n drivers/net/mlx5/mlx5_flow.h       | 25 ++++++-----\n drivers/net/mlx5/mlx5_flow_dv.c    | 89 ++++++++++++++++++++------------------\n drivers/net/mlx5/mlx5_flow_verbs.c | 55 ++++++++++++-----------\n 4 files changed, 105 insertions(+), 82 deletions(-)",
    "diff": "diff --git a/drivers/net/mlx5/mlx5_flow.c b/drivers/net/mlx5/mlx5_flow.c\nindex 5408797..d1661f2 100644\n--- a/drivers/net/mlx5/mlx5_flow.c\n+++ b/drivers/net/mlx5/mlx5_flow.c\n@@ -612,7 +612,7 @@ uint32_t mlx5_flow_adjust_priority(struct rte_eth_dev *dev, int32_t priority,\n \tunsigned int i;\n \n \tfor (i = 0; i != flow->rss.queue_num; ++i) {\n-\t\tint idx = (*flow->queue)[i];\n+\t\tint idx = (*flow->rss.queue)[i];\n \t\tstruct mlx5_rxq_ctrl *rxq_ctrl =\n \t\t\tcontainer_of((*priv->rxqs)[idx],\n \t\t\t\t     struct mlx5_rxq_ctrl, rxq);\n@@ -676,7 +676,7 @@ uint32_t mlx5_flow_adjust_priority(struct rte_eth_dev *dev, int32_t priority,\n \n \tassert(dev->data->dev_started);\n \tfor (i = 0; i != flow->rss.queue_num; ++i) {\n-\t\tint idx = (*flow->queue)[i];\n+\t\tint idx = (*flow->rss.queue)[i];\n \t\tstruct mlx5_rxq_ctrl *rxq_ctrl =\n \t\t\tcontainer_of((*priv->rxqs)[idx],\n \t\t\t\t     struct mlx5_rxq_ctrl, rxq);\n@@ -2815,13 +2815,20 @@ uint32_t mlx5_flow_adjust_priority(struct rte_eth_dev *dev, int32_t priority,\n \t\tgoto error_before_flow;\n \t}\n \tflow->drv_type = flow_get_drv_type(dev, attr);\n-\tflow->ingress = attr->ingress;\n-\tflow->transfer = attr->transfer;\n \tif (hairpin_id != 0)\n \t\tflow->hairpin_flow_id = hairpin_id;\n \tassert(flow->drv_type > MLX5_FLOW_TYPE_MIN &&\n \t       flow->drv_type < MLX5_FLOW_TYPE_MAX);\n-\tflow->queue = (void *)(flow + 1);\n+\tflow->rss.queue = (void *)(flow + 1);\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\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}\n \tLIST_INIT(&flow->dev_flows);\n \tif (rss && rss->types) {\n \t\tunsigned int graph_root;\n@@ -2861,6 +2868,7 @@ uint32_t mlx5_flow_adjust_priority(struct rte_eth_dev *dev, int32_t priority,\n \t\tif (!dev_flow)\n \t\t\tgoto error;\n \t\tdev_flow->flow = flow;\n+\t\tdev_flow->external = 0;\n \t\tLIST_INSERT_HEAD(&flow->dev_flows, dev_flow, next);\n \t\tret = flow_drv_translate(dev, dev_flow, &attr_tx,\n \t\t\t\t\t items_tx.items,\ndiff --git a/drivers/net/mlx5/mlx5_flow.h b/drivers/net/mlx5/mlx5_flow.h\nindex 170192d..b9a9507 100644\n--- a/drivers/net/mlx5/mlx5_flow.h\n+++ b/drivers/net/mlx5/mlx5_flow.h\n@@ -417,7 +417,6 @@ struct mlx5_flow_dv_push_vlan_action_resource {\n \n /* DV flows structure. */\n struct mlx5_flow_dv {\n-\tuint64_t hash_fields; /**< Fields that participate in the hash. */\n \tstruct mlx5_hrxq *hrxq; /**< Hash Rx queues. */\n \t/* Flow DV api: */\n \tstruct mlx5_flow_dv_matcher *matcher; /**< Cache to matcher. */\n@@ -436,6 +435,8 @@ struct mlx5_flow_dv {\n \t/**< Structure for VF VLAN workaround. */\n \tstruct mlx5_flow_dv_push_vlan_action_resource *push_vlan_res;\n \t/**< Pointer to push VLAN action resource in cache. */\n+\tstruct mlx5_flow_dv_tag_resource *tag_resource;\n+\t/**< pointer to the tag action. */\n #ifdef HAVE_IBV_FLOW_DV_SUPPORT\n \tvoid *actions[MLX5_DV_MAX_NUMBER_OF_ACTIONS];\n \t/**< Action list. */\n@@ -460,11 +461,18 @@ struct mlx5_flow_verbs {\n \t};\n \tstruct ibv_flow *flow; /**< Verbs flow pointer. */\n \tstruct mlx5_hrxq *hrxq; /**< Hash Rx queue object. */\n-\tuint64_t hash_fields; /**< Verbs hash Rx queue hash fields. */\n \tstruct mlx5_vf_vlan vf_vlan;\n \t/**< Structure for VF VLAN workaround. */\n };\n \n+struct mlx5_flow_rss {\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+\tuint16_t (*queue)[]; /**< Destination queues to redirect traffic to. */\n+\tuint8_t key[MLX5_RSS_HASH_KEY_LEN]; /**< RSS hash key. */\n+};\n+\n /** Device flow structure. */\n struct mlx5_flow {\n \tLIST_ENTRY(mlx5_flow) next;\n@@ -473,6 +481,10 @@ struct mlx5_flow {\n \t/**< Bit-fields of present layers, see MLX5_FLOW_LAYER_*. */\n \tuint64_t actions;\n \t/**< Bit-fields of detected actions, see MLX5_FLOW_ACTION_*. */\n+\tuint64_t hash_fields; /**< Verbs hash Rx queue hash fields. */\n+\tuint8_t ingress; /**< 1 if the flow is ingress. */\n+\tuint32_t group; /**< The group index. */\n+\tuint8_t transfer; /**< 1 if the flow is E-Switch flow. */\n \tunion {\n #ifdef HAVE_IBV_FLOW_DV_SUPPORT\n \t\tstruct mlx5_flow_dv dv;\n@@ -486,18 +498,11 @@ struct mlx5_flow {\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_counter *counter; /**< Holds flow counter. */\n-\tstruct mlx5_flow_dv_tag_resource *tag_resource;\n-\t/**< pointer to the tag action. */\n-\tstruct rte_flow_action_rss rss;/**< RSS context. */\n-\tuint8_t key[MLX5_RSS_HASH_KEY_LEN]; /**< RSS hash key. */\n-\tuint16_t (*queue)[]; /**< Destination queues to redirect traffic to. */\n \tLIST_HEAD(dev_flows, mlx5_flow) dev_flows;\n \t/**< Device flows that are part of the flow. */\n \tstruct mlx5_fdir *fdir; /**< Pointer to associated FDIR if any. */\n-\tuint8_t ingress; /**< 1 if the flow is ingress. */\n-\tuint32_t group; /**< The group index. */\n-\tuint8_t transfer; /**< 1 if the flow is E-Switch flow. */\n \tuint32_t hairpin_flow_id; /**< The flow id used for hairpin. */\n };\n \ndiff --git a/drivers/net/mlx5/mlx5_flow_dv.c b/drivers/net/mlx5/mlx5_flow_dv.c\nindex 930f088..019c9b3 100644\n--- a/drivers/net/mlx5/mlx5_flow_dv.c\n+++ b/drivers/net/mlx5/mlx5_flow_dv.c\n@@ -1583,10 +1583,9 @@ struct field_modify_info modify_tcp[] = {\n \tstruct mlx5_priv *priv = dev->data->dev_private;\n \tstruct mlx5_ibv_shared *sh = priv->sh;\n \tstruct mlx5_flow_dv_encap_decap_resource *cache_resource;\n-\tstruct rte_flow *flow = dev_flow->flow;\n \tstruct mlx5dv_dr_domain *domain;\n \n-\tresource->flags = flow->group ? 0 : 1;\n+\tresource->flags = dev_flow->group ? 0 : 1;\n \tif (resource->ft_type == MLX5DV_FLOW_TABLE_TYPE_FDB)\n \t\tdomain = sh->fdb_domain;\n \telse if (resource->ft_type == MLX5DV_FLOW_TABLE_TYPE_NIC_RX)\n@@ -2745,7 +2744,7 @@ struct field_modify_info modify_tcp[] = {\n \telse\n \t\tns = sh->rx_domain;\n \tresource->flags =\n-\t\tdev_flow->flow->group ? 0 : MLX5DV_DR_ACTION_FLAGS_ROOT_LEVEL;\n+\t\tdev_flow->group ? 0 : MLX5DV_DR_ACTION_FLAGS_ROOT_LEVEL;\n \t/* Lookup a matching resource from cache. */\n \tLIST_FOREACH(cache_resource, &sh->modify_cmds, next) {\n \t\tif (resource->ft_type == cache_resource->ft_type &&\n@@ -4066,18 +4065,20 @@ struct field_modify_info modify_tcp[] = {\n \t\tconst struct rte_flow_action actions[] __rte_unused,\n \t\tstruct rte_flow_error *error)\n {\n-\tuint32_t size = sizeof(struct mlx5_flow);\n-\tstruct mlx5_flow *flow;\n+\tsize_t size = sizeof(struct mlx5_flow);\n+\tstruct mlx5_flow *dev_flow;\n \n-\tflow = rte_calloc(__func__, 1, size, 0);\n-\tif (!flow) {\n+\tdev_flow = rte_calloc(__func__, 1, size, 0);\n+\tif (!dev_flow) {\n \t\trte_flow_error_set(error, ENOMEM,\n \t\t\t\t   RTE_FLOW_ERROR_TYPE_UNSPECIFIED, NULL,\n \t\t\t\t   \"not enough memory to create flow\");\n \t\treturn NULL;\n \t}\n-\tflow->dv.value.size = MLX5_ST_SZ_BYTES(fte_match_param);\n-\treturn flow;\n+\tdev_flow->dv.value.size = MLX5_ST_SZ_BYTES(fte_match_param);\n+\tdev_flow->ingress = attr->ingress;\n+\tdev_flow->transfer = attr->transfer;\n+\treturn dev_flow;\n }\n \n #ifndef NDEBUG\n@@ -5458,7 +5459,7 @@ struct field_modify_info modify_tcp[] = {\n \t\t\t\t(void *)cache_resource,\n \t\t\t\trte_atomic32_read(&cache_resource->refcnt));\n \t\t\trte_atomic32_inc(&cache_resource->refcnt);\n-\t\t\tdev_flow->flow->tag_resource = cache_resource;\n+\t\t\tdev_flow->dv.tag_resource = cache_resource;\n \t\t\treturn 0;\n \t\t}\n \t}\n@@ -5480,7 +5481,7 @@ struct field_modify_info modify_tcp[] = {\n \trte_atomic32_init(&cache_resource->refcnt);\n \trte_atomic32_inc(&cache_resource->refcnt);\n \tLIST_INSERT_HEAD(&sh->tags, cache_resource, next);\n-\tdev_flow->flow->tag_resource = cache_resource;\n+\tdev_flow->dv.tag_resource = cache_resource;\n \tDRV_LOG(DEBUG, \"new tag resource %p: refcnt %d++\",\n \t\t(void *)cache_resource,\n \t\trte_atomic32_read(&cache_resource->refcnt));\n@@ -5660,7 +5661,7 @@ struct field_modify_info modify_tcp[] = {\n \t\t\t\t       &table, error);\n \tif (ret)\n \t\treturn ret;\n-\tflow->group = table;\n+\tdev_flow->group = table;\n \tif (attr->transfer)\n \t\tres.ft_type = MLX5DV_FLOW_TABLE_TYPE_FDB;\n \tif (priority == MLX5_FLOW_PRIO_RSVD)\n@@ -5697,47 +5698,50 @@ struct field_modify_info modify_tcp[] = {\n \t\tcase RTE_FLOW_ACTION_TYPE_FLAG:\n \t\t\ttag_resource.tag =\n \t\t\t\tmlx5_flow_mark_set(MLX5_FLOW_MARK_DEFAULT);\n-\t\t\tif (!flow->tag_resource)\n+\t\t\tif (!dev_flow->dv.tag_resource)\n \t\t\t\tif (flow_dv_tag_resource_register\n \t\t\t\t    (dev, &tag_resource, dev_flow, error))\n \t\t\t\t\treturn errno;\n \t\t\tdev_flow->dv.actions[actions_n++] =\n-\t\t\t\tflow->tag_resource->action;\n+\t\t\t\tdev_flow->dv.tag_resource->action;\n \t\t\taction_flags |= MLX5_FLOW_ACTION_FLAG;\n \t\t\tbreak;\n \t\tcase RTE_FLOW_ACTION_TYPE_MARK:\n \t\t\ttag_resource.tag = mlx5_flow_mark_set\n \t\t\t      (((const struct rte_flow_action_mark *)\n \t\t\t       (actions->conf))->id);\n-\t\t\tif (!flow->tag_resource)\n+\t\t\tif (!dev_flow->dv.tag_resource)\n \t\t\t\tif (flow_dv_tag_resource_register\n \t\t\t\t    (dev, &tag_resource, dev_flow, error))\n \t\t\t\t\treturn errno;\n \t\t\tdev_flow->dv.actions[actions_n++] =\n-\t\t\t\tflow->tag_resource->action;\n+\t\t\t\tdev_flow->dv.tag_resource->action;\n \t\t\taction_flags |= MLX5_FLOW_ACTION_MARK;\n \t\t\tbreak;\n \t\tcase RTE_FLOW_ACTION_TYPE_DROP:\n \t\t\taction_flags |= MLX5_FLOW_ACTION_DROP;\n \t\t\tbreak;\n \t\tcase RTE_FLOW_ACTION_TYPE_QUEUE:\n+\t\t\tassert(flow->rss.queue);\n \t\t\tqueue = actions->conf;\n \t\t\tflow->rss.queue_num = 1;\n-\t\t\t(*flow->queue)[0] = queue->index;\n+\t\t\t(*flow->rss.queue)[0] = queue->index;\n \t\t\taction_flags |= MLX5_FLOW_ACTION_QUEUE;\n \t\t\tbreak;\n \t\tcase RTE_FLOW_ACTION_TYPE_RSS:\n+\t\t\tassert(flow->rss.queue);\n \t\t\trss = actions->conf;\n-\t\t\tif (flow->queue)\n-\t\t\t\tmemcpy((*flow->queue), rss->queue,\n+\t\t\tif (flow->rss.queue)\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\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->key, rss_key, MLX5_RSS_HASH_KEY_LEN);\n-\t\t\t/* RSS type 0 indicates default RSS type ETH_RSS_IP. */\n-\t\t\tflow->rss.types = !rss->types ? ETH_RSS_IP : rss->types;\n-\t\t\tflow->rss.level = rss->level;\n+\t\t\tmemcpy(flow->rss.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+\t\t\t */\n \t\t\taction_flags |= MLX5_FLOW_ACTION_RSS;\n \t\t\tbreak;\n \t\tcase RTE_FLOW_ACTION_TYPE_COUNT:\n@@ -5748,7 +5752,7 @@ struct field_modify_info modify_tcp[] = {\n \t\t\tflow->counter = flow_dv_counter_alloc(dev,\n \t\t\t\t\t\t\t      count->shared,\n \t\t\t\t\t\t\t      count->id,\n-\t\t\t\t\t\t\t      flow->group);\n+\t\t\t\t\t\t\t      dev_flow->group);\n \t\t\tif (flow->counter == NULL)\n \t\t\t\tgoto cnt_err;\n \t\t\tdev_flow->dv.actions[actions_n++] =\n@@ -6046,9 +6050,10 @@ struct field_modify_info modify_tcp[] = {\n \t\t\tmlx5_flow_tunnel_ip_check(items, next_protocol,\n \t\t\t\t\t\t  &item_flags, &tunnel);\n \t\t\tflow_dv_translate_item_ipv4(match_mask, match_value,\n-\t\t\t\t\t\t    items, tunnel, flow->group);\n+\t\t\t\t\t\t    items, tunnel,\n+\t\t\t\t\t\t    dev_flow->group);\n \t\t\tmatcher.priority = MLX5_PRIORITY_MAP_L3;\n-\t\t\tdev_flow->dv.hash_fields |=\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 MLX5_IPV4_LAYER_TYPES,\n@@ -6073,9 +6078,10 @@ struct field_modify_info modify_tcp[] = {\n \t\t\tmlx5_flow_tunnel_ip_check(items, next_protocol,\n \t\t\t\t\t\t  &item_flags, &tunnel);\n \t\t\tflow_dv_translate_item_ipv6(match_mask, match_value,\n-\t\t\t\t\t\t    items, tunnel, flow->group);\n+\t\t\t\t\t\t    items, tunnel,\n+\t\t\t\t\t\t    dev_flow->group);\n \t\t\tmatcher.priority = MLX5_PRIORITY_MAP_L3;\n-\t\t\tdev_flow->dv.hash_fields |=\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 MLX5_IPV6_LAYER_TYPES,\n@@ -6100,7 +6106,7 @@ struct field_modify_info modify_tcp[] = {\n \t\t\tflow_dv_translate_item_tcp(match_mask, match_value,\n \t\t\t\t\t\t   items, tunnel);\n \t\t\tmatcher.priority = MLX5_PRIORITY_MAP_L4;\n-\t\t\tdev_flow->dv.hash_fields |=\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 IBV_RX_HASH_SRC_PORT_TCP |\n@@ -6112,7 +6118,7 @@ struct field_modify_info modify_tcp[] = {\n \t\t\tflow_dv_translate_item_udp(match_mask, match_value,\n \t\t\t\t\t\t   items, tunnel);\n \t\t\tmatcher.priority = MLX5_PRIORITY_MAP_L4;\n-\t\t\tdev_flow->dv.hash_fields |=\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 IBV_RX_HASH_SRC_PORT_UDP |\n@@ -6208,7 +6214,7 @@ struct field_modify_info modify_tcp[] = {\n \tmatcher.priority = mlx5_flow_adjust_priority(dev, priority,\n \t\t\t\t\t\t     matcher.priority);\n \tmatcher.egress = attr->egress;\n-\tmatcher.group = flow->group;\n+\tmatcher.group = dev_flow->group;\n \tmatcher.transfer = attr->transfer;\n \tif (flow_dv_matcher_register(dev, &matcher, dev_flow, error))\n \t\treturn -rte_errno;\n@@ -6242,7 +6248,7 @@ struct field_modify_info modify_tcp[] = {\n \t\tdv = &dev_flow->dv;\n \t\tn = dv->actions_n;\n \t\tif (dev_flow->actions & MLX5_FLOW_ACTION_DROP) {\n-\t\t\tif (flow->transfer) {\n+\t\t\tif (dev_flow->transfer) {\n \t\t\t\tdv->actions[n++] = priv->sh->esw_drop_action;\n \t\t\t} else {\n \t\t\t\tdv->hrxq = mlx5_hrxq_drop_new(dev);\n@@ -6260,15 +6266,18 @@ struct field_modify_info modify_tcp[] = {\n \t\t\t   (MLX5_FLOW_ACTION_QUEUE | MLX5_FLOW_ACTION_RSS)) {\n \t\t\tstruct mlx5_hrxq *hrxq;\n \n-\t\t\thrxq = mlx5_hrxq_get(dev, flow->key,\n+\t\t\tassert(flow->rss.queue);\n+\t\t\thrxq = mlx5_hrxq_get(dev, flow->rss.key,\n \t\t\t\t\t     MLX5_RSS_HASH_KEY_LEN,\n-\t\t\t\t\t     dv->hash_fields,\n-\t\t\t\t\t     (*flow->queue),\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\tif (!hrxq) {\n \t\t\t\thrxq = mlx5_hrxq_new\n-\t\t\t\t\t(dev, flow->key, MLX5_RSS_HASH_KEY_LEN,\n-\t\t\t\t\t dv->hash_fields, (*flow->queue),\n+\t\t\t\t\t(dev, flow->rss.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 !!(dev_flow->layers &\n \t\t\t\t\t    MLX5_FLOW_LAYER_TUNNEL));\n@@ -6578,10 +6587,6 @@ struct field_modify_info modify_tcp[] = {\n \t\tflow_dv_counter_release(dev, flow->counter);\n \t\tflow->counter = NULL;\n \t}\n-\tif (flow->tag_resource) {\n-\t\tflow_dv_tag_release(dev, flow->tag_resource);\n-\t\tflow->tag_resource = NULL;\n-\t}\n \twhile (!LIST_EMPTY(&flow->dev_flows)) {\n \t\tdev_flow = LIST_FIRST(&flow->dev_flows);\n \t\tLIST_REMOVE(dev_flow, next);\n@@ -6597,6 +6602,8 @@ struct field_modify_info modify_tcp[] = {\n \t\t\tflow_dv_port_id_action_resource_release(dev_flow);\n \t\tif (dev_flow->dv.push_vlan_res)\n \t\t\tflow_dv_push_vlan_action_resource_release(dev_flow);\n+\t\tif (dev_flow->dv.tag_resource)\n+\t\t\tflow_dv_tag_release(dev, dev_flow->dv.tag_resource);\n \t\trte_free(dev_flow);\n \t}\n }\ndiff --git a/drivers/net/mlx5/mlx5_flow_verbs.c b/drivers/net/mlx5/mlx5_flow_verbs.c\nindex fd27f6c..3ab73c2 100644\n--- a/drivers/net/mlx5/mlx5_flow_verbs.c\n+++ b/drivers/net/mlx5/mlx5_flow_verbs.c\n@@ -864,8 +864,8 @@\n \tconst struct rte_flow_action_queue *queue = action->conf;\n \tstruct rte_flow *flow = dev_flow->flow;\n \n-\tif (flow->queue)\n-\t\t(*flow->queue)[0] = queue->index;\n+\tif (flow->rss.queue)\n+\t\t(*flow->rss.queue)[0] = queue->index;\n \tflow->rss.queue_num = 1;\n }\n \n@@ -889,16 +889,17 @@\n \tconst uint8_t *rss_key;\n \tstruct rte_flow *flow = dev_flow->flow;\n \n-\tif (flow->queue)\n-\t\tmemcpy((*flow->queue), rss->queue,\n+\tif (flow->rss.queue)\n+\t\tmemcpy((*flow->rss.queue), rss->queue,\n \t\t       rss->queue_num * sizeof(uint16_t));\n \tflow->rss.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->key, rss_key, MLX5_RSS_HASH_KEY_LEN);\n-\t/* RSS type 0 indicates default RSS type (ETH_RSS_IP). */\n-\tflow->rss.types = !rss->types ? ETH_RSS_IP : rss->types;\n-\tflow->rss.level = rss->level;\n+\tmemcpy(flow->rss.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+\t */\n }\n \n /**\n@@ -1365,22 +1366,23 @@\n \t\t   const struct rte_flow_action actions[],\n \t\t   struct rte_flow_error *error)\n {\n-\tuint32_t size = sizeof(struct mlx5_flow) + sizeof(struct ibv_flow_attr);\n-\tstruct mlx5_flow *flow;\n+\tsize_t size = sizeof(struct mlx5_flow) + sizeof(struct ibv_flow_attr);\n+\tstruct mlx5_flow *dev_flow;\n \n \tsize += flow_verbs_get_actions_size(actions);\n \tsize += flow_verbs_get_items_size(items);\n-\tflow = rte_calloc(__func__, 1, size, 0);\n-\tif (!flow) {\n+\tdev_flow = rte_calloc(__func__, 1, size, 0);\n+\tif (!dev_flow) {\n \t\trte_flow_error_set(error, ENOMEM,\n \t\t\t\t   RTE_FLOW_ERROR_TYPE_UNSPECIFIED, NULL,\n \t\t\t\t   \"not enough memory to create flow\");\n \t\treturn NULL;\n \t}\n-\tflow->verbs.attr = (void *)(flow + 1);\n-\tflow->verbs.specs =\n-\t\t(uint8_t *)(flow + 1) + sizeof(struct ibv_flow_attr);\n-\treturn flow;\n+\tdev_flow->verbs.attr = (void *)(dev_flow + 1);\n+\tdev_flow->verbs.specs = (void *)(dev_flow->verbs.attr + 1);\n+\tdev_flow->ingress = attr->ingress;\n+\tdev_flow->transfer = attr->transfer;\n+\treturn dev_flow;\n }\n \n /**\n@@ -1486,7 +1488,7 @@\n \t\t\tflow_verbs_translate_item_ipv4(dev_flow, items,\n \t\t\t\t\t\t       item_flags);\n \t\t\tsubpriority = MLX5_PRIORITY_MAP_L3;\n-\t\t\tdev_flow->verbs.hash_fields |=\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 MLX5_IPV4_LAYER_TYPES,\n@@ -1498,7 +1500,7 @@\n \t\t\tflow_verbs_translate_item_ipv6(dev_flow, items,\n \t\t\t\t\t\t       item_flags);\n \t\t\tsubpriority = MLX5_PRIORITY_MAP_L3;\n-\t\t\tdev_flow->verbs.hash_fields |=\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 MLX5_IPV6_LAYER_TYPES,\n@@ -1510,7 +1512,7 @@\n \t\t\tflow_verbs_translate_item_tcp(dev_flow, items,\n \t\t\t\t\t\t      item_flags);\n \t\t\tsubpriority = MLX5_PRIORITY_MAP_L4;\n-\t\t\tdev_flow->verbs.hash_fields |=\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 (IBV_RX_HASH_SRC_PORT_TCP |\n@@ -1522,7 +1524,7 @@\n \t\t\tflow_verbs_translate_item_udp(dev_flow, items,\n \t\t\t\t\t\t      item_flags);\n \t\t\tsubpriority = MLX5_PRIORITY_MAP_L4;\n-\t\t\tdev_flow->verbs.hash_fields |=\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 (IBV_RX_HASH_SRC_PORT_UDP |\n@@ -1667,16 +1669,17 @@\n \t\t} else {\n \t\t\tstruct mlx5_hrxq *hrxq;\n \n-\t\t\thrxq = mlx5_hrxq_get(dev, flow->key,\n+\t\t\tassert(flow->rss.queue);\n+\t\t\thrxq = mlx5_hrxq_get(dev, flow->rss.key,\n \t\t\t\t\t     MLX5_RSS_HASH_KEY_LEN,\n-\t\t\t\t\t     verbs->hash_fields,\n-\t\t\t\t\t     (*flow->queue),\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\tif (!hrxq)\n-\t\t\t\thrxq = mlx5_hrxq_new(dev, flow->key,\n+\t\t\t\thrxq = mlx5_hrxq_new(dev, flow->rss.key,\n \t\t\t\t\t\t     MLX5_RSS_HASH_KEY_LEN,\n-\t\t\t\t\t\t     verbs->hash_fields,\n-\t\t\t\t\t\t     (*flow->queue),\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     !!(dev_flow->layers &\n \t\t\t\t\t\t       MLX5_FLOW_LAYER_TUNNEL));\n",
    "prefixes": [
        "04/20"
    ]
}