get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 83872,
    "url": "http://patches.dpdk.org/api/patches/83872/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/1604978882-63177-1-git-send-email-suanmingm@nvidia.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": "<1604978882-63177-1-git-send-email-suanmingm@nvidia.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/1604978882-63177-1-git-send-email-suanmingm@nvidia.com",
    "date": "2020-11-10T03:28:02",
    "name": "[v2] net/mlx5: fix shared RSS action release",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": true,
    "hash": "1e42a34b755715309ad5dc56fc23d26bd0a9ea7e",
    "submitter": {
        "id": 1887,
        "url": "http://patches.dpdk.org/api/people/1887/?format=api",
        "name": "Suanming Mou",
        "email": "suanmingm@nvidia.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/1604978882-63177-1-git-send-email-suanmingm@nvidia.com/mbox/",
    "series": [
        {
            "id": 13762,
            "url": "http://patches.dpdk.org/api/series/13762/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=13762",
            "date": "2020-11-10T03:28:02",
            "name": "[v2] net/mlx5: fix shared RSS action release",
            "version": 2,
            "mbox": "http://patches.dpdk.org/series/13762/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/83872/comments/",
    "check": "success",
    "checks": "http://patches.dpdk.org/api/patches/83872/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 92992A052A;\n\tTue, 10 Nov 2020 04:28:15 +0100 (CET)",
            "from [92.243.14.124] (localhost [127.0.0.1])\n\tby dpdk.org (Postfix) with ESMTP id 080BCA932;\n\tTue, 10 Nov 2020 04:28:13 +0100 (CET)",
            "from mellanox.co.il (mail-il-dmz.mellanox.com [193.47.165.129])\n by dpdk.org (Postfix) with ESMTP id C7E56A8E9\n for <dev@dpdk.org>; Tue, 10 Nov 2020 04:28:10 +0100 (CET)",
            "from Internal Mail-Server by MTLPINE1 (envelope-from\n suanmingm@nvidia.com) with SMTP; 10 Nov 2020 05:28:08 +0200",
            "from nvidia.com (mtbc-r640-04.mtbc.labs.mlnx [10.75.70.9])\n by labmailer.mlnx (8.13.8/8.13.8) with ESMTP id 0AA3S7Ci008843;\n Tue, 10 Nov 2020 05:28:07 +0200"
        ],
        "From": "Suanming Mou <suanmingm@nvidia.com>",
        "To": "ferruh.yigit@intel.com, rasland@nvidia.com",
        "Cc": "viacheslavo@nvidia.com, matan@nvidia.com, dev@dpdk.org",
        "Date": "Tue, 10 Nov 2020 11:28:02 +0800",
        "Message-Id": "<1604978882-63177-1-git-send-email-suanmingm@nvidia.com>",
        "X-Mailer": "git-send-email 1.8.3.1",
        "In-Reply-To": "<1604632107-146708-1-git-send-email-suanmingm@nvidia.com>",
        "References": "<1604632107-146708-1-git-send-email-suanmingm@nvidia.com>",
        "Subject": "[dpdk-dev] [PATCH v2] net/mlx5: fix shared RSS action release",
        "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": "As shared RSS action will be shared by multiple flows, the action\nis created as global standalone action and managed only by the\nrelevant shared action management functions.\n\nCurrently, hrxqs will be created by shared RSS action or general\nqueue action. For hrxqs created by shared RSS action, they should\nalso only be released with shared RSS action. It's not correct to\nrelease the shared RSS action hrxqs as general queue actions do\nin flow destroy.\n\nThis commit adds a new fate action type for shared RSS action to\nhandle the shared RSS action hrxq release correctly.\n\nFixes: e1592b6c4dea (\"net/mlx5: make Rx queue thread safe\")\n\nSigned-off-by: Suanming Mou <suanmingm@nvidia.com>\nAcked-by: Matan Azrad <matan@nvidia.com>\n---\n\nv2:\n - commit log update.\n\n---\n drivers/net/mlx5/mlx5.h            |  3 +-\n drivers/net/mlx5/mlx5_flow.c       |  7 ++-\n drivers/net/mlx5/mlx5_flow.h       |  4 +-\n drivers/net/mlx5/mlx5_flow_dv.c    | 88 +++++++++++++++++++++++++-------------\n drivers/net/mlx5/mlx5_flow_verbs.c |  2 +-\n drivers/net/mlx5/mlx5_rxq.c        | 36 ++++++++--------\n 6 files changed, 86 insertions(+), 54 deletions(-)",
    "diff": "diff --git a/drivers/net/mlx5/mlx5.h b/drivers/net/mlx5/mlx5.h\nindex b43a8c9..80fffc3 100644\n--- a/drivers/net/mlx5/mlx5.h\n+++ b/drivers/net/mlx5/mlx5.h\n@@ -789,11 +789,11 @@ struct mlx5_flow_rss_desc {\n \tuint8_t key[MLX5_RSS_HASH_KEY_LEN]; /**< RSS hash key. */\n \tuint32_t key_len; /**< RSS hash key len. */\n \tuint32_t tunnel; /**< Queue in tunnel. */\n+\tuint32_t shared_rss; /**< Shared RSS index. */\n \tunion {\n \t\tuint16_t *queue; /**< Destination queues. */\n \t\tconst uint16_t *const_q; /**< Const pointer convert. */\n \t};\n-\tbool standalone; /**< Queue is standalone or not. */\n };\n \n #define MLX5_PROC_PRIV(port_id) \\\n@@ -836,7 +836,6 @@ struct mlx5_ind_table_obj {\n __extension__\n struct mlx5_hrxq {\n \tstruct mlx5_cache_entry entry; /* Cache entry. */\n-\tuint32_t refcnt; /* Reference counter. */\n \tuint32_t standalone:1; /* This object used in shared action. */\n \tstruct mlx5_ind_table_obj *ind_table; /* Indirection table. */\n \tRTE_STD_C11\ndiff --git a/drivers/net/mlx5/mlx5_flow.c b/drivers/net/mlx5/mlx5_flow.c\nindex e9c0ddd..f1d5f2d 100644\n--- a/drivers/net/mlx5/mlx5_flow.c\n+++ b/drivers/net/mlx5/mlx5_flow.c\n@@ -5622,7 +5622,7 @@ struct tunnel_default_miss_ctx {\n \t\tbuf->entries = 1;\n \t\tbuf->entry[0].pattern = (void *)(uintptr_t)items;\n \t}\n-\tflow->shared_rss = flow_get_shared_rss_action(dev, shared_actions,\n+\trss_desc->shared_rss = flow_get_shared_rss_action(dev, shared_actions,\n \t\t\t\t\t\t      shared_actions_n);\n \t/*\n \t * Record the start index when there is a nested call. All sub-flows\n@@ -5729,6 +5729,11 @@ struct tunnel_default_miss_ctx {\n \tret = rte_errno; /* Save rte_errno before cleanup. */\n \tflow_mreg_del_copy_action(dev, flow);\n \tflow_drv_destroy(dev, flow);\n+\tif (rss_desc->shared_rss)\n+\t\t__atomic_sub_fetch(&((struct mlx5_shared_action_rss *)\n+\t\t\tmlx5_ipool_get\n+\t\t\t(priv->sh->ipool[MLX5_IPOOL_RSS_SHARED_ACTIONS],\n+\t\t\trss_desc->shared_rss))->refcnt, 1, __ATOMIC_RELAXED);\n \tmlx5_ipool_free(priv->sh->ipool[MLX5_IPOOL_RTE_FLOW], idx);\n \trte_errno = ret; /* Restore rte_errno. */\n \tret = rte_errno;\ndiff --git a/drivers/net/mlx5/mlx5_flow.h b/drivers/net/mlx5/mlx5_flow.h\nindex 58185fb..5fab1bd 100644\n--- a/drivers/net/mlx5/mlx5_flow.h\n+++ b/drivers/net/mlx5/mlx5_flow.h\n@@ -388,6 +388,7 @@ enum mlx5_flow_fate_type {\n \tMLX5_FLOW_FATE_PORT_ID,\n \tMLX5_FLOW_FATE_DROP,\n \tMLX5_FLOW_FATE_DEFAULT_MISS,\n+\tMLX5_FLOW_FATE_SHARED_RSS,\n \tMLX5_FLOW_FATE_MAX,\n };\n \n@@ -651,6 +652,8 @@ struct mlx5_flow_handle {\n \t\t/**< Generic value indicates the fate action. */\n \t\tuint32_t rix_default_fate;\n \t\t/**< Indicates default miss fate action. */\n+\t\tuint32_t rix_srss;\n+\t\t/**< Indicates shared RSS fate action. */\n \t};\n #ifdef HAVE_IBV_FLOW_DV_SUPPORT\n \tstruct mlx5_flow_handle_dv dvh;\n@@ -1024,7 +1027,6 @@ struct tunnel_tbl_entry {\n /* Flow structure. */\n struct rte_flow {\n \tILIST_ENTRY(uint32_t)next; /**< Index to the next flow structure. */\n-\tuint32_t shared_rss; /** < Shared RSS action ID. */\n \tuint32_t dev_handles;\n \t/**< Device flow handles that are part of the flow. */\n \tuint32_t drv_type:2; /**< Driver type. */\ndiff --git a/drivers/net/mlx5/mlx5_flow_dv.c b/drivers/net/mlx5/mlx5_flow_dv.c\nindex b1928a0..576aee6 100644\n--- a/drivers/net/mlx5/mlx5_flow_dv.c\n+++ b/drivers/net/mlx5/mlx5_flow_dv.c\n@@ -81,6 +81,8 @@\n static int\n flow_dv_port_id_action_resource_release(struct rte_eth_dev *dev,\n \t\t\t\t\tuint32_t port_id);\n+static void\n+flow_dv_shared_rss_action_release(struct rte_eth_dev *dev, uint32_t srss);\n \n /**\n  * Initialize flow attributes structure according to flow items' types.\n@@ -8558,7 +8560,7 @@ struct mlx5_hlist_entry *\n \trss_desc->key_len = MLX5_RSS_HASH_KEY_LEN;\n \trss_desc->hash_fields = dev_flow->hash_fields;\n \trss_desc->tunnel = !!(dh->layers & MLX5_FLOW_LAYER_TUNNEL);\n-\trss_desc->standalone = false;\n+\trss_desc->shared_rss = 0;\n \t*hrxq_idx = mlx5_hrxq_get(dev, rss_desc);\n \tif (!*hrxq_idx)\n \t\treturn NULL;\n@@ -9779,7 +9781,9 @@ struct mlx5_cache_entry *\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\tdev_flow->handle->fate_action = MLX5_FLOW_FATE_QUEUE;\n+\t\t\tdev_flow->handle->fate_action = rss_desc->shared_rss ?\n+\t\t\t\tMLX5_FLOW_FATE_SHARED_RSS :\n+\t\t\t\tMLX5_FLOW_FATE_QUEUE;\n \t\t\tbreak;\n \t\tcase MLX5_RTE_FLOW_ACTION_TYPE_AGE:\n \t\t\tflow->age = (uint32_t)(uintptr_t)(action->conf);\n@@ -10572,10 +10576,10 @@ struct mlx5_cache_entry *\n  *\n  * @param[in] dev\n  *   Pointer to the Ethernet device structure.\n- * @param[in] flow\n- *   Shred RSS action holding hash RX queue objects.\n  * @param[in] dev_flow\n  *   Pointer to the sub flow.\n+ * @param[in] rss_desc\n+ *   Pointer to the RSS descriptor.\n  * @param[out] hrxq\n  *   Pointer to retrieved hash RX queue object.\n  *\n@@ -10583,29 +10587,23 @@ struct mlx5_cache_entry *\n  *   Valid hash RX queue index, otherwise 0 and rte_errno is set.\n  */\n static uint32_t\n-__flow_dv_rss_get_hrxq(struct rte_eth_dev *dev, struct rte_flow *flow,\n-\t\t\t   struct mlx5_flow *dev_flow,\n-\t\t\t   struct mlx5_hrxq **hrxq)\n+__flow_dv_rss_get_hrxq(struct rte_eth_dev *dev, struct mlx5_flow *dev_flow,\n+\t\t       struct mlx5_flow_rss_desc *rss_desc,\n+\t\t       struct mlx5_hrxq **hrxq)\n {\n \tstruct mlx5_priv *priv = dev->data->dev_private;\n-\tstruct mlx5_flow_workspace *wks = mlx5_flow_get_thread_workspace();\n \tuint32_t hrxq_idx;\n \n-\tif (flow->shared_rss) {\n+\tif (rss_desc->shared_rss) {\n \t\thrxq_idx = __flow_dv_action_rss_hrxq_lookup\n-\t\t\t\t(dev, flow->shared_rss, dev_flow->hash_fields,\n+\t\t\t\t(dev, rss_desc->shared_rss,\n+\t\t\t\t dev_flow->hash_fields,\n \t\t\t\t !!(dev_flow->handle->layers &\n \t\t\t\t    MLX5_FLOW_LAYER_TUNNEL));\n-\t\tif (hrxq_idx) {\n+\t\tif (hrxq_idx)\n \t\t\t*hrxq = mlx5_ipool_get(priv->sh->ipool[MLX5_IPOOL_HRXQ],\n \t\t\t\t\t       hrxq_idx);\n-\t\t\t__atomic_fetch_add(&(*hrxq)->refcnt, 1,\n-\t\t\t\t\t   __ATOMIC_RELAXED);\n-\t\t}\n \t} else {\n-\t\tstruct mlx5_flow_rss_desc *rss_desc =\n-\t\t\t\t&wks->rss_desc[!!wks->flow_nested_idx];\n-\n \t\t*hrxq = flow_dv_hrxq_prepare(dev, dev_flow, rss_desc,\n \t\t\t\t\t     &hrxq_idx);\n \t}\n@@ -10640,8 +10638,15 @@ struct mlx5_cache_entry *\n \tint err;\n \tint idx;\n \tstruct mlx5_flow_workspace *wks = mlx5_flow_get_thread_workspace();\n+\tstruct mlx5_flow_rss_desc *rss_desc =\n+\t\t\t\t&wks->rss_desc[!!wks->flow_nested_idx];\n \n \tMLX5_ASSERT(wks);\n+\tif (rss_desc->shared_rss) {\n+\t\tdh = wks->flows[wks->flow_idx - 1].handle;\n+\t\tMLX5_ASSERT(dh->fate_action == MLX5_FLOW_FATE_SHARED_RSS);\n+\t\tdh->rix_srss = rss_desc->shared_rss;\n+\t}\n \tfor (idx = wks->flow_idx - 1; idx >= wks->flow_nested_idx; idx--) {\n \t\tdev_flow = &wks->flows[idx];\n \t\tdv = &dev_flow->dv;\n@@ -10656,11 +10661,12 @@ struct mlx5_cache_entry *\n \t\t\t\tdv->actions[n++] =\n \t\t\t\t\t\tpriv->drop_queue.hrxq->action;\n \t\t\t}\n-\t\t} else if (dh->fate_action == MLX5_FLOW_FATE_QUEUE &&\n-\t\t\t   !dv_h->rix_sample && !dv_h->rix_dest_array) {\n+\t\t} else if ((dh->fate_action == MLX5_FLOW_FATE_QUEUE &&\n+\t\t\t   !dv_h->rix_sample && !dv_h->rix_dest_array) ||\n+\t\t\t    (dh->fate_action == MLX5_FLOW_FATE_SHARED_RSS)) {\n \t\t\tstruct mlx5_hrxq *hrxq = NULL;\n \t\t\tuint32_t hrxq_idx = __flow_dv_rss_get_hrxq\n-\t\t\t\t\t\t(dev, flow, dev_flow, &hrxq);\n+\t\t\t\t\t(dev, dev_flow, rss_desc, &hrxq);\n \t\t\tif (!hrxq) {\n \t\t\t\trte_flow_error_set\n \t\t\t\t\t(error, rte_errno,\n@@ -10668,7 +10674,8 @@ struct mlx5_cache_entry *\n \t\t\t\t\t \"cannot get hash queue\");\n \t\t\t\tgoto error;\n \t\t\t}\n-\t\t\tdh->rix_hrxq = hrxq_idx;\n+\t\t\tif (dh->fate_action == MLX5_FLOW_FATE_QUEUE)\n+\t\t\t\tdh->rix_hrxq = hrxq_idx;\n \t\t\tdv->actions[n++] = hrxq->action;\n \t\t} else if (dh->fate_action == MLX5_FLOW_FATE_DEFAULT_MISS) {\n \t\t\tif (!priv->sh->default_miss_action) {\n@@ -10714,6 +10721,8 @@ struct mlx5_cache_entry *\n \t\tif (dh->vf_vlan.tag && dh->vf_vlan.created)\n \t\t\tmlx5_vlan_vmwa_release(dev, &dh->vf_vlan);\n \t}\n+\tif (rss_desc->shared_rss)\n+\t\twks->flows[wks->flow_idx - 1].handle->rix_srss = 0;\n \trte_errno = err; /* Restore rte_errno. */\n \treturn -rte_errno;\n }\n@@ -10898,6 +10907,25 @@ struct mlx5_cache_entry *\n \t\t\t\t     &cache->entry);\n }\n \n+/**\n+ * Release shared RSS action resource.\n+ *\n+ * @param dev\n+ *   Pointer to Ethernet device.\n+ * @param srss\n+ *   Shared RSS action index.\n+ */\n+static void\n+flow_dv_shared_rss_action_release(struct rte_eth_dev *dev, uint32_t srss)\n+{\n+\tstruct mlx5_priv *priv = dev->data->dev_private;\n+\tstruct mlx5_shared_action_rss *shared_rss;\n+\n+\tshared_rss = mlx5_ipool_get\n+\t\t\t(priv->sh->ipool[MLX5_IPOOL_RSS_SHARED_ACTIONS], srss);\n+\t__atomic_sub_fetch(&shared_rss->refcnt, 1, __ATOMIC_RELAXED);\n+}\n+\n void\n flow_dv_push_vlan_remove_cb(struct mlx5_cache_list *list,\n \t\t\t    struct mlx5_cache_entry *entry)\n@@ -10962,6 +10990,9 @@ struct mlx5_cache_entry *\n \t\tflow_dv_port_id_action_resource_release(dev,\n \t\t\t\thandle->rix_port_id_action);\n \t\tbreak;\n+\tcase MLX5_FLOW_FATE_SHARED_RSS:\n+\t\tflow_dv_shared_rss_action_release(dev, handle->rix_srss);\n+\t\tbreak;\n \tdefault:\n \t\tDRV_LOG(DEBUG, \"Incorrect fate action:%d\", handle->fate_action);\n \t\tbreak;\n@@ -11128,13 +11159,6 @@ struct mlx5_cache_entry *\n \tif (!flow)\n \t\treturn;\n \tflow_dv_remove(dev, flow);\n-\tif (flow->shared_rss) {\n-\t\tstruct mlx5_shared_action_rss *shared_rss = mlx5_ipool_get\n-\t\t\t\t(priv->sh->ipool[MLX5_IPOOL_RSS_SHARED_ACTIONS],\n-\t\t\t\t\t\t\t      flow->shared_rss);\n-\n-\t\t__atomic_sub_fetch(&shared_rss->refcnt, 1, __ATOMIC_RELAXED);\n-\t}\n \tif (flow->counter) {\n \t\tflow_dv_counter_free(dev, flow->counter);\n \t\tflow->counter = 0;\n@@ -11239,6 +11263,8 @@ struct mlx5_cache_entry *\n  *\n  * @param[in] dev\n  *   Pointer to the Ethernet device structure.\n+ * @param[in] action_idx\n+ *   Shared RSS action ipool index.\n  * @param[in, out] action\n  *   Partially initialized shared RSS action.\n  * @param[out] error\n@@ -11250,6 +11276,7 @@ struct mlx5_cache_entry *\n  */\n static int\n __flow_dv_action_rss_setup(struct rte_eth_dev *dev,\n+\t\t\tuint32_t action_idx,\n \t\t\tstruct mlx5_shared_action_rss *action,\n \t\t\tstruct rte_flow_error *error)\n {\n@@ -11261,7 +11288,8 @@ struct mlx5_cache_entry *\n \trss_desc.key_len = MLX5_RSS_HASH_KEY_LEN;\n \trss_desc.const_q = action->origin.queue;\n \trss_desc.queue_num = action->origin.queue_num;\n-\trss_desc.standalone = true;\n+\t/* Set non-zero value to indicate a shared RSS. */\n+\trss_desc.shared_rss = action_idx;\n \tfor (i = 0; i < MLX5_RSS_HASH_FIELDS_LEN; i++) {\n \t\tuint32_t hrxq_idx;\n \t\tuint64_t hash_fields = mlx5_rss_hash_fields[i];\n@@ -11353,7 +11381,7 @@ struct mlx5_cache_entry *\n \tmemcpy(shared_action->queue, rss->queue, queue_size);\n \torigin->queue = shared_action->queue;\n \torigin->queue_num = rss->queue_num;\n-\tif (__flow_dv_action_rss_setup(dev, shared_action, error))\n+\tif (__flow_dv_action_rss_setup(dev, idx, shared_action, error))\n \t\tgoto error_rss_init;\n \t__atomic_add_fetch(&shared_action->refcnt, 1, __ATOMIC_RELAXED);\n \trte_spinlock_lock(&priv->shared_act_sl);\ndiff --git a/drivers/net/mlx5/mlx5_flow_verbs.c b/drivers/net/mlx5/mlx5_flow_verbs.c\nindex 28fd120..ac30080 100644\n--- a/drivers/net/mlx5/mlx5_flow_verbs.c\n+++ b/drivers/net/mlx5/mlx5_flow_verbs.c\n@@ -1972,7 +1972,7 @@\n \t\t\trss_desc->hash_fields = dev_flow->hash_fields;\n \t\t\trss_desc->tunnel = !!(handle->layers &\n \t\t\t\t\t      MLX5_FLOW_LAYER_TUNNEL);\n-\t\t\trss_desc->standalone = false;\n+\t\t\trss_desc->shared_rss = 0;\n \t\t\thrxq_idx = mlx5_hrxq_get(dev, rss_desc);\n \t\t\thrxq = mlx5_ipool_get(priv->sh->ipool[MLX5_IPOOL_HRXQ],\n \t\t\t\t\t      hrxq_idx);\ndiff --git a/drivers/net/mlx5/mlx5_rxq.c b/drivers/net/mlx5/mlx5_rxq.c\nindex d95a573..a0edbb9 100644\n--- a/drivers/net/mlx5/mlx5_rxq.c\n+++ b/drivers/net/mlx5/mlx5_rxq.c\n@@ -2211,8 +2211,9 @@ struct mlx5_ind_table_obj *\n \tstruct mlx5_priv *priv = dev->data->dev_private;\n \tconst uint8_t *rss_key = rss_desc->key;\n \tuint32_t rss_key_len =  rss_desc->key_len;\n+\tbool standalone = !!rss_desc->shared_rss;\n \tconst uint16_t *queues =\n-\t\trss_desc->standalone ? rss_desc->const_q : rss_desc->queue;\n+\t\tstandalone ? rss_desc->const_q : rss_desc->queue;\n \tuint32_t queues_n = rss_desc->queue_num;\n \tstruct mlx5_hrxq *hrxq = NULL;\n \tuint32_t hrxq_idx = 0;\n@@ -2220,16 +2221,17 @@ struct mlx5_ind_table_obj *\n \tint ret;\n \n \tqueues_n = rss_desc->hash_fields ? queues_n : 1;\n-\tind_tbl = mlx5_ind_table_obj_get(dev, queues, queues_n);\n+\tind_tbl = standalone ? NULL :\n+\t\t  mlx5_ind_table_obj_get(dev, queues, queues_n);\n \tif (!ind_tbl)\n \t\tind_tbl = mlx5_ind_table_obj_new(dev, queues, queues_n,\n-\t\t\t\t\t\t rss_desc->standalone);\n+\t\t\t\t\t\t standalone);\n \tif (!ind_tbl)\n \t\treturn NULL;\n \thrxq = mlx5_ipool_zmalloc(priv->sh->ipool[MLX5_IPOOL_HRXQ], &hrxq_idx);\n \tif (!hrxq)\n \t\tgoto error;\n-\thrxq->standalone = rss_desc->standalone;\n+\thrxq->standalone = standalone;\n \thrxq->idx = hrxq_idx;\n \thrxq->ind_table = ind_tbl;\n \thrxq->rss_key_len = rss_key_len;\n@@ -2240,7 +2242,7 @@ struct mlx5_ind_table_obj *\n \t\tgoto error;\n \treturn hrxq;\n error:\n-\tmlx5_ind_table_obj_release(dev, ind_tbl, rss_desc->standalone);\n+\tmlx5_ind_table_obj_release(dev, ind_tbl, standalone);\n \tif (hrxq)\n \t\tmlx5_ipool_free(priv->sh->ipool[MLX5_IPOOL_HRXQ], hrxq_idx);\n \treturn NULL;\n@@ -2294,7 +2296,7 @@ uint32_t mlx5_hrxq_get(struct rte_eth_dev *dev,\n \t\t.data = rss_desc,\n \t};\n \n-\tif (rss_desc->standalone) {\n+\tif (rss_desc->shared_rss) {\n \t\thrxq = __mlx5_hrxq_create(dev, rss_desc);\n \t} else {\n \t\tentry = mlx5_cache_register(&priv->hrxqs, &ctx);\n@@ -2344,11 +2346,8 @@ struct mlx5_hrxq *\n \tstruct mlx5_hrxq *hrxq = NULL;\n \tint ret;\n \n-\tif (priv->drop_queue.hrxq) {\n-\t\t__atomic_fetch_add(&priv->drop_queue.hrxq->refcnt, 1,\n-\t\t\t\t   __ATOMIC_RELAXED);\n+\tif (priv->drop_queue.hrxq)\n \t\treturn priv->drop_queue.hrxq;\n-\t}\n \thrxq = mlx5_malloc(MLX5_MEM_ZERO, sizeof(*hrxq), 0, SOCKET_ID_ANY);\n \tif (!hrxq) {\n \t\tDRV_LOG(WARNING,\n@@ -2367,7 +2366,6 @@ struct mlx5_hrxq *\n \tret = priv->obj_ops.drop_action_create(dev);\n \tif (ret < 0)\n \t\tgoto error;\n-\t__atomic_store_n(&hrxq->refcnt, 1, __ATOMIC_RELAXED);\n \treturn hrxq;\n error:\n \tif (hrxq) {\n@@ -2391,14 +2389,14 @@ struct mlx5_hrxq *\n \tstruct mlx5_priv *priv = dev->data->dev_private;\n \tstruct mlx5_hrxq *hrxq = priv->drop_queue.hrxq;\n \n-\tif (__atomic_sub_fetch(&hrxq->refcnt, 1, __ATOMIC_RELAXED) == 0) {\n-\t\tpriv->obj_ops.drop_action_destroy(dev);\n-\t\tmlx5_free(priv->drop_queue.rxq);\n-\t\tmlx5_free(hrxq->ind_table);\n-\t\tmlx5_free(hrxq);\n-\t\tpriv->drop_queue.rxq = NULL;\n-\t\tpriv->drop_queue.hrxq = NULL;\n-\t}\n+\tif (!priv->drop_queue.hrxq)\n+\t\treturn;\n+\tpriv->obj_ops.drop_action_destroy(dev);\n+\tmlx5_free(priv->drop_queue.rxq);\n+\tmlx5_free(hrxq->ind_table);\n+\tmlx5_free(hrxq);\n+\tpriv->drop_queue.rxq = NULL;\n+\tpriv->drop_queue.hrxq = NULL;\n }\n \n /**\n",
    "prefixes": [
        "v2"
    ]
}