get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 92272,
    "url": "http://patches.dpdk.org/api/patches/92272/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/20210427153811.11554-8-bingz@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": "<20210427153811.11554-8-bingz@nvidia.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20210427153811.11554-8-bingz@nvidia.com",
    "date": "2021-04-27T15:38:01",
    "name": "[07/17] net/mlx5: add actions creating for CT",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "34bd8d9641528f5d8c61098b98762c4b69ed46b3",
    "submitter": {
        "id": 1976,
        "url": "http://patches.dpdk.org/api/people/1976/?format=api",
        "name": "Bing Zhao",
        "email": "bingz@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/20210427153811.11554-8-bingz@nvidia.com/mbox/",
    "series": [
        {
            "id": 16705,
            "url": "http://patches.dpdk.org/api/series/16705/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=16705",
            "date": "2021-04-27T15:37:54",
            "name": "conntrack support in mlx5 PMD",
            "version": 1,
            "mbox": "http://patches.dpdk.org/series/16705/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/92272/comments/",
    "check": "success",
    "checks": "http://patches.dpdk.org/api/patches/92272/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 mails.dpdk.org (mails.dpdk.org [217.70.189.124])\n\tby inbox.dpdk.org (Postfix) with ESMTP id 5774DA0A02;\n\tTue, 27 Apr 2021 17:39:25 +0200 (CEST)",
            "from [217.70.189.124] (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id AFACC4127F;\n\tTue, 27 Apr 2021 17:38:59 +0200 (CEST)",
            "from NAM10-MW2-obe.outbound.protection.outlook.com\n (mail-mw2nam10on2069.outbound.protection.outlook.com [40.107.94.69])\n by mails.dpdk.org (Postfix) with ESMTP id 401AD4127F\n for <dev@dpdk.org>; Tue, 27 Apr 2021 17:38:58 +0200 (CEST)",
            "from MW4PR04CA0145.namprd04.prod.outlook.com (2603:10b6:303:84::30)\n by CH2PR12MB4821.namprd12.prod.outlook.com (2603:10b6:610:c::16) with\n Microsoft SMTP Server (version=TLS1_2,\n cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4065.20; Tue, 27 Apr\n 2021 15:38:56 +0000",
            "from CO1NAM11FT025.eop-nam11.prod.protection.outlook.com\n (2603:10b6:303:84:cafe::b9) by MW4PR04CA0145.outlook.office365.com\n (2603:10b6:303:84::30) with Microsoft SMTP Server (version=TLS1_2,\n cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4087.25 via Frontend\n Transport; Tue, 27 Apr 2021 15:38:55 +0000",
            "from mail.nvidia.com (216.228.112.34) by\n CO1NAM11FT025.mail.protection.outlook.com (10.13.175.232) with Microsoft SMTP\n Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384) id\n 15.20.4065.21 via Frontend Transport; Tue, 27 Apr 2021 15:38:55 +0000",
            "from nvidia.com (172.20.145.6) by HQMAIL107.nvidia.com\n (172.20.187.13) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Tue, 27 Apr\n 2021 15:38:53 +0000"
        ],
        "ARC-Seal": "i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none;\n b=Hjw+heoBKUYJ6tbabqZTekrcBhD/k7QEPDvCVdyE4URvgphFes2K/4Ddc/dX0y1j/anuPG4B+GTgRVu6pK713Fy+HmbdBnUL2xYniHlPeGyfRt0jYKO+jMNoMalD1vfu85AaPTEpvbzSkObjdd1kt7eAVUjX0hsfK8C6vRCRAPC2FgqTxhDgMfV3d723Za6R8MlfZNjd6b+5rWcHN066LqAmGgwy1o5Sw34NSgPn+4KU2J1lH1uD/zaXQcSBjj6q7YUR/+/mhK8Zzp8HqvM6fljYhsb9Bxq97dwPYWvTwoeIbMMrnH0nTrjihirkw4fA/3tHN5l/MsUi9BLU1KePEg==",
        "ARC-Message-Signature": "i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com;\n s=arcselector9901;\n h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck;\n bh=sqv4wYvm+UZy6xvTuz91qQ+gqM0B/dFUCOWMNNHeh9E=;\n b=Ic/G3X9ZBKOLL7sj4m7z/1oaxDWBANlfcmh6RmBWlD3XEwehU/eXGvt0BPHkXRja5wTb7prwA7iR9F8AO4qKHwEGngduHXzTg0iQs/vAZMhRyDD3kXbWSBo9puC8SaP7d2uT2/2qretVHFHcGHdP4BY5uDQH+7RS9DswJswdYl69qW4XTLPDHuYHM/3YzMeO34qMoxE0fzddcIOUTM3ccVBnAbrjo+owiDeaOdIdjePK7Ohj9QCtTnb27oqhiYhbK75pXSPiNol2I9Cmry3oF3m36yMQAX63YTN+3QnKFGkWj+n3rAA5rTRYAY1uj1GE2x+0oRVSXOC/iSWxrFMRMg==",
        "ARC-Authentication-Results": "i=1; mx.microsoft.com 1; spf=pass (sender ip is\n 216.228.112.34) smtp.rcpttodomain=dpdk.org smtp.mailfrom=nvidia.com;\n dmarc=pass (p=none sp=none pct=100) action=none header.from=nvidia.com;\n dkim=none (message not signed); arc=none",
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=Nvidia.com;\n s=selector2;\n h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck;\n bh=sqv4wYvm+UZy6xvTuz91qQ+gqM0B/dFUCOWMNNHeh9E=;\n b=MuKe3jU6QksgyuMoNGbahOBx2KhOFn98kJeEpiVJ2x03g7xRwmswKtcciuNhZWlppp8j8Wz63C1Od0lPt4u0pgKlPHrTQPfF/dNx9cbKFZB2+K7xTUNZcNEnJ+iBOLs/VqiIfuQ4Tn3k3lLxku28/1dspJwKiOG2Fhf/+86G3XaNjuBDfKuLxk4/4fUAiplQYmJTO3oqNpAElpjWrvm3s5Zsv43r4COHLYJS2RjxhoxdK1F5eKH1EmFNIOyiFsyU/1jurR1am1Yubhs+gfdXwwZeM0/Rl8Cf/AbOQ5DaqEB+VWkcOKVuCvMJ/JtE7fyZnuXSp7CcEUXKK+ta+vEUXw==",
        "X-MS-Exchange-Authentication-Results": "spf=pass (sender IP is 216.228.112.34)\n smtp.mailfrom=nvidia.com; dpdk.org; dkim=none (message not signed)\n header.d=none;dpdk.org; dmarc=pass action=none header.from=nvidia.com;",
        "Received-SPF": "Pass (protection.outlook.com: domain of nvidia.com designates\n 216.228.112.34 as permitted sender) receiver=protection.outlook.com;\n client-ip=216.228.112.34; helo=mail.nvidia.com;",
        "From": "Bing Zhao <bingz@nvidia.com>",
        "To": "<viacheslavo@nvidia.com>, <matan@nvidia.com>",
        "CC": "<dev@dpdk.org>, <orika@nvidia.com>, <rasland@nvidia.com>",
        "Date": "Tue, 27 Apr 2021 18:38:01 +0300",
        "Message-ID": "<20210427153811.11554-8-bingz@nvidia.com>",
        "X-Mailer": "git-send-email 2.27.0",
        "In-Reply-To": "<20210427153811.11554-1-bingz@nvidia.com>",
        "References": "<20210427153811.11554-1-bingz@nvidia.com>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "Content-Type": "text/plain",
        "X-Originating-IP": "[172.20.145.6]",
        "X-ClientProxiedBy": "HQMAIL107.nvidia.com (172.20.187.13) To\n HQMAIL107.nvidia.com (172.20.187.13)",
        "X-EOPAttributedMessage": "0",
        "X-MS-PublicTrafficType": "Email",
        "X-MS-Office365-Filtering-Correlation-Id": "affbb57b-c0fe-4d80-a2ee-08d909929163",
        "X-MS-TrafficTypeDiagnostic": "CH2PR12MB4821:",
        "X-Microsoft-Antispam-PRVS": "\n <CH2PR12MB4821C6E0575AB81CE64E083ED0419@CH2PR12MB4821.namprd12.prod.outlook.com>",
        "X-MS-Oob-TLC-OOBClassifiers": "OLM:1923;",
        "X-MS-Exchange-SenderADCheck": "1",
        "X-Microsoft-Antispam": "BCL:0;",
        "X-Microsoft-Antispam-Message-Info": "\n cuMVAlT6TIE39LdMfrOzbB0eBAYVN0JNED9iSeWVsOcvrXXjXk/+XuDeT1rgYh+eGGXwBp5Ra/M0GA61gxc8QW4Dk5wwNv3eydpqFpY+Rr25O/7Zvzs2ljvmTYW7QgApP8s3RZF7nzwG2pITUn9T2fbNdAkQo4uBjJoj9930qViq+rJiZbj1M/mLFbO7NNbYl6ERJXz8uZ+6/YGGSbiOOV5oRLuSG2dKYuTXR1epkUbQjbD3Y8actUADgBjR3afidrIDyGkxU1mCT+plnBSt7dcKAe2KnQndJVgcSdwByEAmDy3In/tji+4OwSVUk15RxYYCVmV5nlfFe14vq3WvECiMkLidYh+Qbt7rQ76n77Fjbebpj/HWQHB9L+0BQb7HvFAJyZ9xLDcaDvnLPvjEwx8blZuThDgxATgtf26qB9VIMmFo5BIllHx9hNZLQCyx0OTyhXpzD1/kve8yIA78e1Pfdig2AaQTT7aSi46gdPQip0SisHe/nsHdoSJvqN/C4hqE3kzUaBdZfxoRL1wylx3A5flh5y+BfNn5c89Tbl0ZJbzu2fu4fPpzL8buVwcsMMCWKR/8Sqyz5od5ewcH+tzZj+rYsNg5DR/989XwwGEPovguGYhvsqNnKuIFEGa+gIrD/CxXO1zKq8OD5NRyM5SRK7F6VkVxXscl6Rm1ifk=",
        "X-Forefront-Antispam-Report": "CIP:216.228.112.34; CTRY:US; LANG:en; SCL:1;\n SRV:;\n IPV:NLI; SFV:NSPM; H:mail.nvidia.com; PTR:schybrid03.nvidia.com; CAT:NONE;\n SFS:(4636009)(136003)(346002)(396003)(39860400002)(376002)(46966006)(36840700001)(478600001)(316002)(36906005)(186003)(82310400003)(36756003)(356005)(4326008)(16526019)(54906003)(110136005)(6286002)(86362001)(7696005)(6636002)(2616005)(7636003)(47076005)(36860700001)(107886003)(6666004)(55016002)(426003)(83380400001)(1076003)(70586007)(5660300002)(70206006)(8676002)(30864003)(26005)(2906002)(336012)(82740400003)(8936002);\n DIR:OUT; SFP:1101;",
        "X-OriginatorOrg": "Nvidia.com",
        "X-MS-Exchange-CrossTenant-OriginalArrivalTime": "27 Apr 2021 15:38:55.7317 (UTC)",
        "X-MS-Exchange-CrossTenant-Network-Message-Id": "\n affbb57b-c0fe-4d80-a2ee-08d909929163",
        "X-MS-Exchange-CrossTenant-Id": "43083d15-7273-40c1-b7db-39efd9ccc17a",
        "X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp": "\n TenantId=43083d15-7273-40c1-b7db-39efd9ccc17a; Ip=[216.228.112.34];\n Helo=[mail.nvidia.com]",
        "X-MS-Exchange-CrossTenant-AuthSource": "\n CO1NAM11FT025.eop-nam11.prod.protection.outlook.com",
        "X-MS-Exchange-CrossTenant-AuthAs": "Anonymous",
        "X-MS-Exchange-CrossTenant-FromEntityHeader": "HybridOnPrem",
        "X-MS-Exchange-Transport-CrossTenantHeadersStamped": "CH2PR12MB4821",
        "Subject": "[dpdk-dev] [PATCH 07/17] net/mlx5: add actions creating for CT",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.29",
        "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": "Allocating a CT from the management pools and creating the DR actions\nfor both directions by default.\n\nIf there is no available connection tracking action, a new pool will\nbe created with a fixed size bulk allocation. Right now, all the\nresources are controlled by the linked list.\n\nThe ASO connection tracking context associated with these actions\nneed to be updated via WQE before using for steering.\n\nSigned-off-by: Bing Zhao <bingz@nvidia.com>\n---\n drivers/net/mlx5/mlx5.h         |   4 +\n drivers/net/mlx5/mlx5_flow.h    |  27 ++++-\n drivers/net/mlx5/mlx5_flow_dv.c | 261 ++++++++++++++++++++++++++++++++++++++++\n 3 files changed, 291 insertions(+), 1 deletion(-)",
    "diff": "diff --git a/drivers/net/mlx5/mlx5.h b/drivers/net/mlx5/mlx5.h\nindex 1d31813..982c0c2 100644\n--- a/drivers/net/mlx5/mlx5.h\n+++ b/drivers/net/mlx5/mlx5.h\n@@ -995,6 +995,10 @@ struct mlx5_bond_info {\n /* Number of connection tracking objects per pool: must be a power of 2. */\n #define MLX5_ASO_CT_ACTIONS_PER_POOL 64\n \n+/* Generate incremental and unique CT index from pool and offset. */\n+#define MLX5_MAKE_CT_IDX(pool, offset) \\\n+\t((pool) * MLX5_ASO_CT_ACTIONS_PER_POOL + (offset) + 1)\n+\n /* ASO Conntrack state. */\n enum mlx5_aso_ct_state {\n \tASO_CONNTRACK_FREE, /* Inactive, in the free list. */\ndiff --git a/drivers/net/mlx5/mlx5_flow.h b/drivers/net/mlx5/mlx5_flow.h\nindex c3e7bf8..988b171 100644\n--- a/drivers/net/mlx5/mlx5_flow.h\n+++ b/drivers/net/mlx5/mlx5_flow.h\n@@ -45,7 +45,7 @@ enum mlx5_rte_flow_action_type {\n enum {\n \tMLX5_INDIRECT_ACTION_TYPE_RSS,\n \tMLX5_INDIRECT_ACTION_TYPE_AGE,\n-\tMLX5_INDIRECT_ACTION_TYPE_AGE,\n+\tMLX5_INDIRECT_ACTION_TYPE_CT,\n };\n \n /* Matches on selected register. */\n@@ -1286,6 +1286,31 @@ mlx5_aso_meter_by_idx(struct mlx5_priv *priv, uint32_t idx)\n \treturn &pool->mtrs[idx % MLX5_ASO_MTRS_PER_POOL];\n }\n \n+/*\n+ * Get ASO CT action by index.\n+ *\n+ * @param[in] dev\n+ *   Pointer to the Ethernet device structure.\n+ * @param[in] idx\n+ *   Index to the ASO CT action.\n+ *\n+ * @return\n+ *   The specified ASO CT action pointer.\n+ */\n+static inline struct mlx5_aso_ct_action *\n+flow_aso_ct_get_by_idx(struct rte_eth_dev *dev, uint32_t idx)\n+{\n+\tstruct mlx5_priv *priv = dev->data->dev_private;\n+\tstruct mlx5_aso_ct_pools_mng *mng = priv->sh->ct_mng;\n+\tstruct mlx5_aso_ct_pool *pool;\n+\n+\tidx--;\n+\tMLX5_ASSERT((idx / MLX5_ASO_CT_ACTIONS_PER_POOL) < mng->n);\n+\t/* Bit operation AND could be used. */\n+\tpool = mng->pools[idx / MLX5_ASO_CT_ACTIONS_PER_POOL];\n+\treturn &pool->actions[idx % MLX5_ASO_CT_ACTIONS_PER_POOL];\n+}\n+\n int mlx5_flow_group_to_table(struct rte_eth_dev *dev,\n \t\t\t     const struct mlx5_flow_tunnel *tunnel,\n \t\t\t     uint32_t group, uint32_t *table,\ndiff --git a/drivers/net/mlx5/mlx5_flow_dv.c b/drivers/net/mlx5/mlx5_flow_dv.c\nindex d810466..51e6ff4 100644\n--- a/drivers/net/mlx5/mlx5_flow_dv.c\n+++ b/drivers/net/mlx5/mlx5_flow_dv.c\n@@ -11119,6 +11119,260 @@ flow_dv_translate_create_aso_age(struct rte_eth_dev *dev,\n \treturn age_idx;\n }\n \n+/*\n+ * Release an ASO CT action.\n+ *\n+ * @param[in] dev\n+ *   Pointer to the Ethernet device structure.\n+ * @param[in] idx\n+ *   Index of ASO CT action to release.\n+ *\n+ * @return\n+ *   0 when CT action was removed, otherwise the number of references.\n+ */\n+static inline int\n+flow_dv_aso_ct_release(struct rte_eth_dev *dev, uint32_t idx)\n+{\n+\tstruct mlx5_priv *priv = dev->data->dev_private;\n+\tstruct mlx5_aso_ct_pools_mng *mng = priv->sh->ct_mng;\n+\tstruct mlx5_aso_ct_action *ct = flow_aso_ct_get_by_idx(dev, idx);\n+\tuint32_t ret = __atomic_sub_fetch(&ct->refcnt, 1, __ATOMIC_RELAXED);\n+\n+\tif (!ret) {\n+\t\tif (ct->dr_action_orig) {\n+#ifdef HAVE_MLX5_DR_ACTION_ASO_CT\n+\t\t\tclaim_zero(mlx5_glue->destroy_flow_action\n+\t\t\t\t\t(ct->dr_action_orig));\n+#endif\n+\t\t\tct->dr_action_orig = NULL;\n+\t\t}\n+\t\tif (ct->dr_action_rply) {\n+#ifdef HAVE_MLX5_DR_ACTION_ASO_CT\n+\t\t\tclaim_zero(mlx5_glue->destroy_flow_action\n+\t\t\t\t\t(ct->dr_action_rply));\n+#endif\n+\t\t\tct->dr_action_rply = NULL;\n+\t\t}\n+\t\trte_spinlock_lock(&mng->ct_sl);\n+\t\tLIST_INSERT_HEAD(&mng->free_cts, ct, next);\n+\t\trte_spinlock_unlock(&mng->ct_sl);\n+\t}\n+\treturn ret;\n+}\n+\n+/*\n+ * Resize the ASO CT pools array by 64 pools.\n+ *\n+ * @param[in] dev\n+ *   Pointer to the Ethernet device structure.\n+ *\n+ * @return\n+ *   0 on success, otherwise negative errno value and rte_errno is set.\n+ */\n+static int\n+flow_dv_aso_ct_pools_resize(struct rte_eth_dev *dev)\n+{\n+\tstruct mlx5_priv *priv = dev->data->dev_private;\n+\tstruct mlx5_aso_ct_pools_mng *mng = priv->sh->ct_mng;\n+\tvoid *old_pools = mng->pools;\n+\t/* Magic number now, need a macro. */\n+\tuint32_t resize = mng->n + 64;\n+\tuint32_t mem_size = sizeof(struct mlx5_aso_ct_pool *) * resize;\n+\tvoid *pools = mlx5_malloc(MLX5_MEM_ZERO, mem_size, 0, SOCKET_ID_ANY);\n+\n+\tif (!pools) {\n+\t\trte_errno = ENOMEM;\n+\t\treturn -rte_errno;\n+\t}\n+\t/* ASO SQ/QP was already initialized in the startup. */\n+\tif (old_pools) {\n+\t\t/* Realloc could be an alternative choice. */\n+\t\trte_memcpy(pools, old_pools,\n+\t\t\t   mng->n * sizeof(struct mlx5_aso_ct_pool *));\n+\t\tmlx5_free(old_pools);\n+\t}\n+\tmng->n = resize;\n+\tmng->pools = pools;\n+\treturn 0;\n+}\n+\n+/*\n+ * Create and initialize a new ASO CT pool.\n+ *\n+ * @param[in] dev\n+ *   Pointer to the Ethernet device structure.\n+ * @param[out] ct_free\n+ *   Where to put the pointer of a new CT action.\n+ *\n+ * @return\n+ *   The CT actions pool pointer and @p ct_free is set on success,\n+ *   NULL otherwise and rte_errno is set.\n+ */\n+static struct mlx5_aso_ct_pool *\n+flow_dv_ct_pool_create(struct rte_eth_dev *dev,\n+\t\t       struct mlx5_aso_ct_action **ct_free)\n+{\n+\tstruct mlx5_priv *priv = dev->data->dev_private;\n+\tstruct mlx5_aso_ct_pools_mng *mng = priv->sh->ct_mng;\n+\tstruct mlx5_aso_ct_pool *pool = NULL;\n+\tstruct mlx5_devx_obj *obj = NULL;\n+\tuint32_t i;\n+\tuint32_t log_obj_size = rte_log2_u32(MLX5_ASO_CT_ACTIONS_PER_POOL);\n+\n+\tobj = mlx5_devx_cmd_create_conn_track_offload_obj(priv->sh->ctx,\n+\t\t\t\t\t\tpriv->sh->pdn, log_obj_size);\n+\tif (!obj) {\n+\t\trte_errno = ENODATA;\n+\t\tDRV_LOG(ERR, \"Failed to create conn_track_offload_obj using DevX.\");\n+\t\treturn NULL;\n+\t}\n+\tpool = mlx5_malloc(MLX5_MEM_ZERO, sizeof(*pool), 0, SOCKET_ID_ANY);\n+\tif (!pool) {\n+\t\trte_errno = ENOMEM;\n+\t\tclaim_zero(mlx5_devx_cmd_destroy(obj));\n+\t\treturn NULL;\n+\t}\n+\tpool->devx_obj = obj;\n+\tpool->index = mng->next;\n+\t/* Resize pools array if there is no room for the new pool in it. */\n+\tif (pool->index == mng->n && flow_dv_aso_ct_pools_resize(dev)) {\n+\t\tclaim_zero(mlx5_devx_cmd_destroy(obj));\n+\t\tmlx5_free(pool);\n+\t\treturn NULL;\n+\t}\n+\tmng->pools[pool->index] = pool;\n+\tmng->next++;\n+\t/* Assign the first action in the new pool, the rest go to free list. */\n+\t*ct_free = &pool->actions[0];\n+\t/* Lock outside, the list operation is safe here. */\n+\tfor (i = 1; i < MLX5_ASO_CT_ACTIONS_PER_POOL; i++) {\n+\t\t/* refcnt is 0 when allocating the memory. */\n+\t\tpool->actions[i].offset = i;\n+\t\tLIST_INSERT_HEAD(&mng->free_cts, &pool->actions[i], next);\n+\t}\n+\treturn pool;\n+}\n+\n+/*\n+ * Allocate a ASO CT action from free list.\n+ *\n+ * @param[in] dev\n+ *   Pointer to the Ethernet device structure.\n+ * @param[out] error\n+ *   Pointer to the error structure.\n+ *\n+ * @return\n+ *   Index to ASO CT action on success, 0 otherwise and rte_errno is set.\n+ */\n+static uint32_t\n+flow_dv_aso_ct_alloc(struct rte_eth_dev *dev, struct rte_flow_error *error)\n+{\n+\tstruct mlx5_priv *priv = dev->data->dev_private;\n+\tstruct mlx5_aso_ct_pools_mng *mng = priv->sh->ct_mng;\n+\tstruct mlx5_aso_ct_action *ct = NULL;\n+\tstruct mlx5_aso_ct_pool *pool;\n+\tuint8_t reg_c;\n+\tuint32_t ct_idx;\n+\n+\tMLX5_ASSERT(mng);\n+\tif (!priv->config.devx) {\n+\t\trte_errno = ENOTSUP;\n+\t\treturn 0;\n+\t}\n+\t/* Get a free CT action, if no, a new pool will be created. */\n+\trte_spinlock_lock(&mng->ct_sl);\n+\tct = LIST_FIRST(&mng->free_cts);\n+\tif (ct) {\n+\t\tLIST_REMOVE(ct, next);\n+\t} else if (!flow_dv_ct_pool_create(dev, &ct)) {\n+\t\trte_spinlock_unlock(&mng->ct_sl);\n+\t\trte_flow_error_set(error, rte_errno, RTE_FLOW_ERROR_TYPE_ACTION,\n+\t\t\t\t   NULL, \"failed to create ASO CT pool\");\n+\t\treturn 0;\n+\t}\n+\trte_spinlock_unlock(&mng->ct_sl);\n+\tpool = container_of(ct, struct mlx5_aso_ct_pool, actions[ct->offset]);\n+\tct_idx = MLX5_MAKE_CT_IDX(pool->index, ct->offset);\n+\t/* 0: inactive, 1: created, 2+: used by flows. */\n+\t__atomic_store_n(&ct->refcnt, 1, __ATOMIC_RELAXED);\n+\treg_c = mlx5_flow_get_reg_id(dev, MLX5_ASO_CONNTRACK, 0, error);\n+\tif (!ct->dr_action_orig) {\n+#ifdef HAVE_MLX5_DR_ACTION_ASO_CT\n+\t\tct->dr_action_orig = mlx5_glue->dv_create_flow_action_aso\n+\t\t\t(priv->sh->rx_domain, pool->devx_obj->obj,\n+\t\t\t ct->offset,\n+\t\t\t MLX5DV_DR_ACTION_FLAGS_ASO_CT_DIRECTION_INITIATOR,\n+\t\t\t reg_c - REG_C_0);\n+#else\n+\t\tRTE_SET_USED(reg_c);\n+#endif\n+\t\tif (!ct->dr_action_orig) {\n+\t\t\tflow_dv_aso_ct_release(dev, ct_idx);\n+\t\t\trte_flow_error_set(error, rte_errno,\n+\t\t\t\t\t   RTE_FLOW_ERROR_TYPE_ACTION, NULL,\n+\t\t\t\t\t   \"failed to create ASO CT action\");\n+\t\t\treturn 0;\n+\t\t}\n+\t}\n+\tif (!ct->dr_action_rply) {\n+#ifdef HAVE_MLX5_DR_ACTION_ASO_CT\n+\t\tct->dr_action_rply = mlx5_glue->dv_create_flow_action_aso\n+\t\t\t(priv->sh->rx_domain, pool->devx_obj->obj,\n+\t\t\t ct->offset,\n+\t\t\t MLX5DV_DR_ACTION_FLAGS_ASO_CT_DIRECTION_RESPONDER,\n+\t\t\t reg_c - REG_C_0);\n+#endif\n+\t\tif (!ct->dr_action_rply) {\n+\t\t\tflow_dv_aso_ct_release(dev, ct_idx);\n+\t\t\trte_flow_error_set(error, rte_errno,\n+\t\t\t\t\t   RTE_FLOW_ERROR_TYPE_ACTION, NULL,\n+\t\t\t\t\t   \"failed to create ASO CT action\");\n+\t\t\treturn 0;\n+\t\t}\n+\t}\n+\treturn ct_idx;\n+}\n+\n+/*\n+ * Create a conntrack object with context and actions by using ASO mechanism.\n+ *\n+ * @param[in] dev\n+ *   Pointer to rte_eth_dev structure.\n+ * @param[in] pro\n+ *   Pointer to conntrack information profile.\n+ * @param[out] error\n+ *   Pointer to the error structure.\n+ *\n+ * @return\n+ *   Index to conntrack object on success, 0 otherwise.\n+ */\n+static uint32_t\n+flow_dv_translate_create_conntrack(struct rte_eth_dev *dev,\n+\t\t\t\t   const struct rte_flow_action_conntrack *pro,\n+\t\t\t\t   struct rte_flow_error *error)\n+{\n+\tstruct mlx5_priv *priv = dev->data->dev_private;\n+\tstruct mlx5_dev_ctx_shared *sh = priv->sh;\n+\tstruct mlx5_aso_ct_action *ct;\n+\tuint32_t idx;\n+\n+\tif (!sh->ct_aso_en)\n+\t\treturn rte_flow_error_set(error, ENOTSUP,\n+\t\t\t\t\t  RTE_FLOW_ERROR_TYPE_ACTION, NULL,\n+\t\t\t\t\t  \"Connection is not supported\");\n+\tidx = flow_dv_aso_ct_alloc(dev, error);\n+\tif (!idx)\n+\t\treturn rte_flow_error_set(error, rte_errno,\n+\t\t\t\t\t  RTE_FLOW_ERROR_TYPE_ACTION, NULL,\n+\t\t\t\t\t  \"Failed to allocate CT object\");\n+\tct = flow_aso_ct_get_by_idx(dev, idx);\n+\tif (mlx5_aso_ct_update_by_wqe(sh, ct, pro))\n+\t\treturn rte_flow_error_set(error, EBUSY,\n+\t\t\t\t\t  RTE_FLOW_ERROR_TYPE_ACTION, NULL,\n+\t\t\t\t\t  \"Failed to update CT\");\n+\treturn idx;\n+}\n+\n /**\n  * Fill the flow with DV spec, lock free\n  * (mutex should be acquired by caller).\n@@ -13309,6 +13563,7 @@ flow_dv_action_create(struct rte_eth_dev *dev,\n {\n \tuint32_t idx = 0;\n \tuint32_t ret = 0;\n+\tstruct mlx5_priv *priv = dev->data->dev_private;\n \n \tswitch (action->type) {\n \tcase RTE_FLOW_ACTION_TYPE_RSS:\n@@ -13329,6 +13584,12 @@ flow_dv_action_create(struct rte_eth_dev *dev,\n \t\t\t\t\t\t\t (void *)(uintptr_t)idx;\n \t\t}\n \t\tbreak;\n+\tcase RTE_FLOW_ACTION_TYPE_CONNTRACK:\n+\t\tret = flow_dv_translate_create_conntrack(dev, action->conf,\n+\t\t\t\t\t\t\t err);\n+\t\tidx = (MLX5_INDIRECT_ACTION_TYPE_CT <<\n+\t\t       MLX5_INDIRECT_ACTION_TYPE_OFFSET) | ret;\n+\t\tbreak;\n \tdefault:\n \t\trte_flow_error_set(err, ENOTSUP, RTE_FLOW_ERROR_TYPE_ACTION,\n \t\t\t\t   NULL, \"action type not supported\");\n",
    "prefixes": [
        "07/17"
    ]
}