get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 122730,
    "url": "http://patchwork.dpdk.org/api/patches/122730/?format=api",
    "web_url": "http://patchwork.dpdk.org/project/dpdk/patch/20230131093346.1261066-11-valex@nvidia.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": "<20230131093346.1261066-11-valex@nvidia.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20230131093346.1261066-11-valex@nvidia.com",
    "date": "2023-01-31T09:33:39",
    "name": "[v1,10/16] net/mlx5/hws: redesign definer create",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "d0746f49de05960021624aa01591f2b75ed198aa",
    "submitter": {
        "id": 2858,
        "url": "http://patchwork.dpdk.org/api/people/2858/?format=api",
        "name": "Alex Vesker",
        "email": "valex@nvidia.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/20230131093346.1261066-11-valex@nvidia.com/mbox/",
    "series": [
        {
            "id": 26709,
            "url": "http://patchwork.dpdk.org/api/series/26709/?format=api",
            "web_url": "http://patchwork.dpdk.org/project/dpdk/list/?series=26709",
            "date": "2023-01-31T09:33:29",
            "name": "net/mlx5/hws: support range and partial hash matching",
            "version": 1,
            "mbox": "http://patchwork.dpdk.org/series/26709/mbox/"
        }
    ],
    "comments": "http://patchwork.dpdk.org/api/patches/122730/comments/",
    "check": "warning",
    "checks": "http://patchwork.dpdk.org/api/patches/122730/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 DBBA641B8D;\n\tTue, 31 Jan 2023 10:35:45 +0100 (CET)",
            "from mails.dpdk.org (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id A798A42D9C;\n\tTue, 31 Jan 2023 10:34:47 +0100 (CET)",
            "from NAM10-BN7-obe.outbound.protection.outlook.com\n (mail-bn7nam10on2040.outbound.protection.outlook.com [40.107.92.40])\n by mails.dpdk.org (Postfix) with ESMTP id 60C4242D56\n for <dev@dpdk.org>; Tue, 31 Jan 2023 10:34:44 +0100 (CET)",
            "from MW4PR04CA0070.namprd04.prod.outlook.com (2603:10b6:303:6b::15)\n by SN7PR12MB6716.namprd12.prod.outlook.com (2603:10b6:806:270::20)\n with Microsoft SMTP Server (version=TLS1_2,\n cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6043.38; Tue, 31 Jan\n 2023 09:34:42 +0000",
            "from CO1NAM11FT016.eop-nam11.prod.protection.outlook.com\n (2603:10b6:303:6b:cafe::4) by MW4PR04CA0070.outlook.office365.com\n (2603:10b6:303:6b::15) with Microsoft SMTP Server (version=TLS1_2,\n cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6043.38 via Frontend\n Transport; Tue, 31 Jan 2023 09:34:41 +0000",
            "from mail.nvidia.com (216.228.117.160) by\n CO1NAM11FT016.mail.protection.outlook.com (10.13.175.141) with Microsoft SMTP\n Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id\n 15.20.6043.21 via Frontend Transport; Tue, 31 Jan 2023 09:34:41 +0000",
            "from rnnvmail201.nvidia.com (10.129.68.8) by mail.nvidia.com\n (10.129.200.66) with Microsoft SMTP Server (version=TLS1_2,\n cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.986.36; Tue, 31 Jan\n 2023 01:34:28 -0800",
            "from nvidia.com (10.126.231.37) by rnnvmail201.nvidia.com\n (10.129.68.8) with Microsoft SMTP Server (version=TLS1_2,\n cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.986.36; Tue, 31 Jan\n 2023 01:34:26 -0800"
        ],
        "ARC-Seal": "i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none;\n b=izL0sSmDw5YX46aTjfBADR4+cyVvDMa3scw6gz9i6eWhUCY90NgRqJejRvzL31GC+NuWIrK3UfsYH+C69rVTN++x517nNdrFW/kNUaD/98M/IFOX1OmowkXRAl9qCCA+c84o/nveEh/XQYe+rl7hA2XtT5qUUEpGllBnPVpvrpTer5aP6BRidhMFGFRDEYgoGUK0xqHpoXXIX3qKpjBnAz4n8/QZCkjFYSXKbUj2O1tvMrWGru4W6PF5M2sK8bodc/Nsg5Lr8cs8Of9HByMjWHZrrN/FrYiDkuEh+M6+PTC6G02geOdsU4SYYkQUzXbYoiLfiQacoN2fUMXD36yEZg==",
        "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-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1;\n bh=xAcrPVXjY/2pMLJBgVYxiOD38smOcHK62tZTRhypu4g=;\n b=SInHHCrNIHMnY6LIL/f/L9AWQ5goFckQmp+DMvjhk7RYxmOufLohm1mbFsoKx/tLbiSPWUXgY6qjS5O58OVO16tMUF4wg4V73x5CNGd3jiR1Q5s61wgWUq51E61x8rayN6KxRqYVMqBSelv7re5zC9HEWpxom6g6hDZMv6OwRkpkP8BovYKt2FwnStetvtacLKGUaQ5/8PveCS9UxfSOpW7fjcD2ZzDikNskTsBC7d91gwtzkd0vtZ1vmhha0sQDL3D9TpGr5vrgWIOLUY8XoksPqvE+ib4+FpMFRcSlWDOECK/z1ZXM37nb4pUXpH+BkexE8fSIVAAz7oZ4UDh9XQ==",
        "ARC-Authentication-Results": "i=1; mx.microsoft.com 1; spf=pass (sender ip is\n 216.228.117.160) smtp.rcpttodomain=monjalon.net smtp.mailfrom=nvidia.com;\n dmarc=pass (p=reject sp=reject 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=xAcrPVXjY/2pMLJBgVYxiOD38smOcHK62tZTRhypu4g=;\n b=tVTyppXnKL4ewJQjWFxONLwXyfChm+C9SYR2c8S4ISSOT7nKxd+lLBrxEToMJJPnjxwOSnK3BYze41MXTW3xy7vOxoLehvV7rcs4YiLDFQdyfylt5HFVaXqlgpyr8bGRJAjP3dPFCWK1RifOGERPOSC4dWn+ozOVjyD0TUgCFVWiHGaIKZ5uoSKA9MdDLdyT/8y8caqmO3RMITZus+G28ZAQZAk04JkCIp86fjRILZEJ4PgiE4iP76N1zisTfmJwv1jiJSKTvmZzghFos4w3eHAgHMSx03z4QUD30una4791ohV6aFbVnm2Ytiqtx2fLNX4d8LqhcO6qQlCn2IGuXw==",
        "X-MS-Exchange-Authentication-Results": "spf=pass (sender IP is 216.228.117.160)\n smtp.mailfrom=nvidia.com;\n dkim=none (message not signed)\n header.d=none;dmarc=pass action=none header.from=nvidia.com;",
        "Received-SPF": "Pass (protection.outlook.com: domain of nvidia.com designates\n 216.228.117.160 as permitted sender) receiver=protection.outlook.com;\n client-ip=216.228.117.160; helo=mail.nvidia.com; pr=C",
        "From": "Alex Vesker <valex@nvidia.com>",
        "To": "<valex@nvidia.com>, <viacheslavo@nvidia.com>, <thomas@monjalon.net>,\n \"Matan Azrad\" <matan@nvidia.com>",
        "CC": "<dev@dpdk.org>, <orika@nvidia.com>",
        "Subject": "[v1 10/16] net/mlx5/hws: redesign definer create",
        "Date": "Tue, 31 Jan 2023 11:33:39 +0200",
        "Message-ID": "<20230131093346.1261066-11-valex@nvidia.com>",
        "X-Mailer": "git-send-email 2.27.0",
        "In-Reply-To": "<20230131093346.1261066-1-valex@nvidia.com>",
        "References": "<20230131093346.1261066-1-valex@nvidia.com>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "Content-Type": "text/plain",
        "X-Originating-IP": "[10.126.231.37]",
        "X-ClientProxiedBy": "rnnvmail203.nvidia.com (10.129.68.9) To\n rnnvmail201.nvidia.com (10.129.68.8)",
        "X-EOPAttributedMessage": "0",
        "X-MS-PublicTrafficType": "Email",
        "X-MS-TrafficTypeDiagnostic": "CO1NAM11FT016:EE_|SN7PR12MB6716:EE_",
        "X-MS-Office365-Filtering-Correlation-Id": "fd8f90c3-101a-4723-a3cc-08db036e6164",
        "X-LD-Processed": "43083d15-7273-40c1-b7db-39efd9ccc17a,ExtAddr",
        "X-MS-Exchange-SenderADCheck": "1",
        "X-MS-Exchange-AntiSpam-Relay": "0",
        "X-Microsoft-Antispam": "BCL:0;",
        "X-Microsoft-Antispam-Message-Info": "\n kZgFqszNsJRDIbQ9LQLVi0qfiZDFukLFJ5SRcLDD7HqXHzWFFEEY4+0pJPeqOpZ4xQpwltmKMzDJHUSavEODDoICGKFlsJPhbiNH6zTJ8MM4OTK9dOB/viTvlhHIgrIzFMECTRRPgGWlSHkHW0RIL2P6yxI6PEDB2vFGySJ5RvPvR89IN2o4bi7StHRQnaIED44QKieoDjshL6DKrOVxfFwXmicJXQhhcAI1GyYg9YwL46rp4fFIBg+la1mayilz9Wr5XiAdNuujZnGC/qqISjxypkNm++TX5tBtVhceWRLYwqprZTdsUY0B7TxXvNjardqM7KOpt81VkvbtvnNdBWl++Xky92bLUICbeXC4opvbqp6zEieMuL+PDWZALD+sbClZnoRMFJSKb5wh/4o0Wn4jWAlsXdsQ8r8+LibSnEXTlY7fUwy46zrUf30++lIvGHWVTIGAd9x3JWTcSWdJaFPd9oBfaZTpE+fOyVWThPa/6Z99a0/jtx3LgeskhD8lNMoDYWq8sKD2eDoeYn+M0jpxvYbIRQRgzqIv7GnKg+WFF2ExbNHV5o5ywgX8M2JW0sPbP+vMN2zJEts5CYviWvtIjSX2VFjTKNr5FMhA/u0L/zn1SR0I8p6RHkh7QH85p3prujfMCjnAVpZEc2QgyaRfaOiHrunRxsh+GrjmdVLGn3pmZBPUwraOqy7/P+9GlUKhAi5ptNzOlyXUiBnOKA==",
        "X-Forefront-Antispam-Report": "CIP:216.228.117.160; CTRY:US; LANG:en; SCL:1;\n SRV:;\n IPV:NLI; SFV:NSPM; H:mail.nvidia.com; PTR:dc6edge1.nvidia.com; CAT:NONE;\n SFS:(13230025)(4636009)(346002)(39860400002)(396003)(376002)(136003)(451199018)(40470700004)(46966006)(36840700001)(36756003)(70206006)(6636002)(54906003)(316002)(110136005)(82310400005)(8676002)(4326008)(5660300002)(70586007)(41300700001)(8936002)(86362001)(356005)(7636003)(82740400003)(36860700001)(107886003)(6666004)(16526019)(186003)(26005)(1076003)(30864003)(83380400001)(336012)(426003)(40480700001)(40460700003)(55016003)(2906002)(6286002)(7696005)(47076005)(478600001)(2616005);\n DIR:OUT; SFP:1101;",
        "X-OriginatorOrg": "Nvidia.com",
        "X-MS-Exchange-CrossTenant-OriginalArrivalTime": "31 Jan 2023 09:34:41.7234 (UTC)",
        "X-MS-Exchange-CrossTenant-Network-Message-Id": "\n fd8f90c3-101a-4723-a3cc-08db036e6164",
        "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.117.160];\n Helo=[mail.nvidia.com]",
        "X-MS-Exchange-CrossTenant-AuthSource": "\n CO1NAM11FT016.eop-nam11.prod.protection.outlook.com",
        "X-MS-Exchange-CrossTenant-AuthAs": "Anonymous",
        "X-MS-Exchange-CrossTenant-FromEntityHeader": "HybridOnPrem",
        "X-MS-Exchange-Transport-CrossTenantHeadersStamped": "SN7PR12MB6716",
        "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"
    },
    "content": "Until now definer creation and deletion get and put\nfunctions were used, the get function would calculate the\ndefiner field copy (fc), header layout (hl) and definer\nlayout internally without taking into account other match\ntemplates used over the same matcher.\nThis logic had to be split to allow sharing the hl over\nmultiple definers. First calculate the shared hl than\ncreate definers based on the definer shared layout.\nOnce all definers use the same layout it is possible to\nhash over the shared fields since the location is the same\nacross all of the definers.\n\nSigned-off-by: Alex Vesker <valex@nvidia.com>\n---\n drivers/net/mlx5/hws/mlx5dr_definer.c  | 301 ++++++++++++++++---------\n drivers/net/mlx5/hws/mlx5dr_definer.h  |  11 +-\n drivers/net/mlx5/hws/mlx5dr_internal.h |   2 +-\n drivers/net/mlx5/hws/mlx5dr_matcher.c  |  61 ++---\n drivers/net/mlx5/hws/mlx5dr_matcher.h  |  16 +-\n 5 files changed, 230 insertions(+), 161 deletions(-)",
    "diff": "diff --git a/drivers/net/mlx5/hws/mlx5dr_definer.c b/drivers/net/mlx5/hws/mlx5dr_definer.c\nindex c268f94ad3..9560f8a0af 100644\n--- a/drivers/net/mlx5/hws/mlx5dr_definer.c\n+++ b/drivers/net/mlx5/hws/mlx5dr_definer.c\n@@ -104,7 +104,6 @@ struct mlx5dr_definer_conv_data {\n \tstruct mlx5dr_definer_fc *fc;\n \tuint8_t relaxed;\n \tuint8_t tunnel;\n-\tuint8_t *hl;\n };\n \n /* Xmacro used to create generic item setter from items */\n@@ -1504,6 +1503,36 @@ mlx5dr_definer_conv_item_meter_color(struct mlx5dr_definer_conv_data *cd,\n \treturn 0;\n }\n \n+static int\n+mlx5dr_definer_mt_set_fc(struct mlx5dr_match_template *mt,\n+\t\t\t struct mlx5dr_definer_fc *fc,\n+\t\t\t uint8_t *hl)\n+{\n+\tuint32_t fc_sz = 0;\n+\tint i;\n+\n+\tfor (i = 0; i < MLX5DR_DEFINER_FNAME_MAX; i++)\n+\t\tif (fc[i].tag_set)\n+\t\t\tfc_sz++;\n+\n+\tmt->fc = simple_calloc(fc_sz, sizeof(*mt->fc));\n+\tif (!mt->fc) {\n+\t\trte_errno = ENOMEM;\n+\t\treturn rte_errno;\n+\t}\n+\n+\tfor (i = 0; i < MLX5DR_DEFINER_FNAME_MAX; i++) {\n+\t\tif (!fc[i].tag_set)\n+\t\t\tcontinue;\n+\n+\t\tfc[i].fname = i;\n+\t\tmemcpy(&mt->fc[mt->fc_sz++], &fc[i], sizeof(*mt->fc));\n+\t\tDR_SET(hl, -1, fc[i].byte_off, fc[i].bit_off, fc[i].bit_mask);\n+\t}\n+\n+\treturn 0;\n+}\n+\n static int\n mlx5dr_definer_check_item_range_supp(struct rte_flow_item *item)\n {\n@@ -1535,12 +1564,9 @@ mlx5dr_definer_conv_items_to_hl(struct mlx5dr_context *ctx,\n \tstruct mlx5dr_definer_conv_data cd = {0};\n \tstruct rte_flow_item *items = mt->items;\n \tuint64_t item_flags = 0;\n-\tuint32_t total = 0;\n-\tint i, j;\n-\tint ret;\n+\tint i, ret;\n \n \tcd.fc = fc;\n-\tcd.hl = hl;\n \tcd.caps = ctx->caps;\n \tcd.relaxed = mt->flags & MLX5DR_MATCH_TEMPLATE_FLAG_RELAXED_MATCH;\n \n@@ -1660,29 +1686,11 @@ mlx5dr_definer_conv_items_to_hl(struct mlx5dr_context *ctx,\n \n \tmt->item_flags = item_flags;\n \n-\t/* Fill in headers layout and calculate total number of fields  */\n-\tfor (i = 0; i < MLX5DR_DEFINER_FNAME_MAX; i++) {\n-\t\tif (fc[i].tag_set) {\n-\t\t\ttotal++;\n-\t\t\tDR_SET(hl, -1, fc[i].byte_off, fc[i].bit_off, fc[i].bit_mask);\n-\t\t}\n-\t}\n-\n-\tmt->fc_sz = total;\n-\tmt->fc = simple_calloc(total, sizeof(*mt->fc));\n-\tif (!mt->fc) {\n-\t\tDR_LOG(ERR, \"Failed to allocate field copy array\");\n-\t\trte_errno = ENOMEM;\n-\t\treturn rte_errno;\n-\t}\n-\n-\tj = 0;\n-\tfor (i = 0; i < MLX5DR_DEFINER_FNAME_MAX; i++) {\n-\t\tif (fc[i].tag_set) {\n-\t\t\tmemcpy(&mt->fc[j], &fc[i], sizeof(*mt->fc));\n-\t\t\tmt->fc[j].fname = i;\n-\t\t\tj++;\n-\t\t}\n+\t/* Fill in headers layout and allocate fc array on mt */\n+\tret = mlx5dr_definer_mt_set_fc(mt, fc, hl);\n+\tif (ret) {\n+\t\tDR_LOG(ERR, \"Failed to set field copy to match template\");\n+\t\treturn ret;\n \t}\n \n \treturn 0;\n@@ -1837,8 +1845,8 @@ mlx5dr_definer_best_hl_fit_recu(struct mlx5dr_definer_sel_ctrl *ctrl,\n }\n \n static void\n-mlx5dr_definer_apply_sel_ctrl(struct mlx5dr_definer_sel_ctrl *ctrl,\n-\t\t\t      struct mlx5dr_definer *definer)\n+mlx5dr_definer_copy_sel_ctrl(struct mlx5dr_definer_sel_ctrl *ctrl,\n+\t\t\t     struct mlx5dr_definer *definer)\n {\n \tmemcpy(definer->byte_selector, ctrl->byte_selector, ctrl->allowed_bytes);\n \tmemcpy(definer->dw_selector, ctrl->full_dw_selector, ctrl->allowed_full_dw);\n@@ -1848,7 +1856,7 @@ mlx5dr_definer_apply_sel_ctrl(struct mlx5dr_definer_sel_ctrl *ctrl,\n \n static int\n mlx5dr_definer_find_best_hl_fit(struct mlx5dr_context *ctx,\n-\t\t\t\tstruct mlx5dr_match_template *mt,\n+\t\t\t\tstruct mlx5dr_definer *definer,\n \t\t\t\tuint8_t *hl)\n {\n \tstruct mlx5dr_definer_sel_ctrl ctrl = {0};\n@@ -1861,8 +1869,8 @@ mlx5dr_definer_find_best_hl_fit(struct mlx5dr_context *ctx,\n \n \tfound = mlx5dr_definer_best_hl_fit_recu(&ctrl, 0, (uint32_t *)hl);\n \tif (found) {\n-\t\tmlx5dr_definer_apply_sel_ctrl(&ctrl, mt->definer);\n-\t\tmt->definer->type = MLX5DR_DEFINER_TYPE_MATCH;\n+\t\tmlx5dr_definer_copy_sel_ctrl(&ctrl, definer);\n+\t\tdefiner->type = MLX5DR_DEFINER_TYPE_MATCH;\n \t\treturn 0;\n \t}\n \n@@ -1875,8 +1883,8 @@ mlx5dr_definer_find_best_hl_fit(struct mlx5dr_context *ctx,\n \n \tfound = mlx5dr_definer_best_hl_fit_recu(&ctrl, 0, (uint32_t *)hl);\n \tif (found) {\n-\t\tmlx5dr_definer_apply_sel_ctrl(&ctrl, mt->definer);\n-\t\tmt->definer->type = MLX5DR_DEFINER_TYPE_JUMBO;\n+\t\tmlx5dr_definer_copy_sel_ctrl(&ctrl, definer);\n+\t\tdefiner->type = MLX5DR_DEFINER_TYPE_JUMBO;\n \t\treturn 0;\n \t}\n \n@@ -1920,114 +1928,189 @@ int mlx5dr_definer_get_id(struct mlx5dr_definer *definer)\n \treturn definer->obj->id;\n }\n \n-int mlx5dr_definer_compare(struct mlx5dr_definer *definer_a,\n-\t\t\t   struct mlx5dr_definer *definer_b)\n+static int\n+mlx5dr_definer_calc_layout(struct mlx5dr_matcher *matcher,\n+\t\t\t   struct mlx5dr_definer *match_definer)\n {\n-\tint i;\n+\tstruct mlx5dr_context *ctx = matcher->tbl->ctx;\n+\tstruct mlx5dr_match_template *mt = matcher->mt;\n+\tuint8_t *match_hl, *hl_buff;\n+\tint i, ret;\n \n-\tif (definer_a->type != definer_b->type)\n-\t\treturn 1;\n+\t/* Union header-layout (hl) is used for creating a single definer\n+\t * field layout used with different bitmasks for hash and match.\n+\t */\n+\thl_buff = simple_calloc(1, MLX5_ST_SZ_BYTES(definer_hl));\n+\tif (!hl_buff) {\n+\t\tDR_LOG(ERR, \"Failed to allocate memory for header layout\");\n+\t\trte_errno = ENOMEM;\n+\t\treturn rte_errno;\n+\t}\n \n-\tfor (i = 0; i < BYTE_SELECTORS; i++)\n-\t\tif (definer_a->byte_selector[i] != definer_b->byte_selector[i])\n-\t\t\treturn 1;\n+\tmatch_hl = hl_buff;\n \n-\tfor (i = 0; i < DW_SELECTORS; i++)\n-\t\tif (definer_a->dw_selector[i] != definer_b->dw_selector[i])\n-\t\t\treturn 1;\n+\t/* Convert all mt items to header layout (hl)\n+\t * and allocate the match field copy array (fc).\n+\t */\n+\tfor (i = 0; i < matcher->num_of_mt; i++) {\n+\t\tret = mlx5dr_definer_conv_items_to_hl(ctx, &mt[i], match_hl);\n+\t\tif (ret) {\n+\t\t\tDR_LOG(ERR, \"Failed to convert items to header layout\");\n+\t\t\tgoto free_fc;\n+\t\t}\n+\t}\n \n-\tfor (i = 0; i < MLX5DR_JUMBO_TAG_SZ; i++)\n-\t\tif (definer_a->mask.jumbo[i] != definer_b->mask.jumbo[i])\n-\t\t\treturn 1;\n+\t/* Find the match definer layout for header layout match union */\n+\tret = mlx5dr_definer_find_best_hl_fit(ctx, match_definer, match_hl);\n+\tif (ret) {\n+\t\tDR_LOG(ERR, \"Failed to create match definer from header layout\");\n+\t\tgoto free_fc;\n+\t}\n \n+\tsimple_free(hl_buff);\n \treturn 0;\n+\n+free_fc:\n+\tfor (i = 0; i < matcher->num_of_mt; i++)\n+\t\tif (mt[i].fc)\n+\t\t\tsimple_free(mt[i].fc);\n+\n+\tsimple_free(hl_buff);\n+\treturn rte_errno;\n }\n \n-int mlx5dr_definer_get(struct mlx5dr_context *ctx,\n-\t\t       struct mlx5dr_match_template *mt)\n+static struct mlx5dr_definer *\n+mlx5dr_definer_alloc(struct ibv_context *ibv_ctx,\n+\t\t     struct mlx5dr_definer_fc *fc,\n+\t\t     int fc_sz,\n+\t\t     struct rte_flow_item *items,\n+\t\t     struct mlx5dr_definer *layout)\n {\n \tstruct mlx5dr_cmd_definer_create_attr def_attr = {0};\n-\tstruct ibv_context *ibv_ctx = ctx->ibv_ctx;\n-\tuint8_t *hl;\n+\tstruct mlx5dr_definer *definer;\n \tint ret;\n \n-\tif (mt->refcount++)\n-\t\treturn 0;\n-\n-\tmt->definer = simple_calloc(1, sizeof(*mt->definer));\n-\tif (!mt->definer) {\n+\tdefiner = simple_calloc(1, sizeof(*definer));\n+\tif (!definer) {\n \t\tDR_LOG(ERR, \"Failed to allocate memory for definer\");\n \t\trte_errno = ENOMEM;\n-\t\tgoto dec_refcount;\n-\t}\n-\n-\t/* Header layout (hl) holds full bit mask per field */\n-\thl = simple_calloc(1, MLX5_ST_SZ_BYTES(definer_hl));\n-\tif (!hl) {\n-\t\tDR_LOG(ERR, \"Failed to allocate memory for header layout\");\n-\t\trte_errno = ENOMEM;\n-\t\tgoto free_definer;\n+\t\treturn NULL;\n \t}\n \n-\t/* Convert items to hl and allocate the field copy array (fc) */\n-\tret = mlx5dr_definer_conv_items_to_hl(ctx, mt, hl);\n-\tif (ret) {\n-\t\tDR_LOG(ERR, \"Failed to convert items to hl\");\n-\t\tgoto free_hl;\n-\t}\n+\tmemcpy(definer, layout, sizeof(*definer));\n \n-\t/* Find the definer for given header layout */\n-\tret = mlx5dr_definer_find_best_hl_fit(ctx, mt, hl);\n-\tif (ret) {\n-\t\tDR_LOG(ERR, \"Failed to create definer from header layout\");\n-\t\tgoto free_field_copy;\n-\t}\n-\n-\t/* Align field copy array based on the new definer */\n-\tret = mlx5dr_definer_fc_bind(mt->definer,\n-\t\t\t\t     mt->fc,\n-\t\t\t\t     mt->fc_sz);\n+\t/* Align field copy array based on given layout */\n+\tret = mlx5dr_definer_fc_bind(definer, fc, fc_sz);\n \tif (ret) {\n \t\tDR_LOG(ERR, \"Failed to bind field copy to definer\");\n-\t\tgoto free_field_copy;\n+\t\tgoto free_definer;\n \t}\n \n \t/* Create the tag mask used for definer creation */\n-\tmlx5dr_definer_create_tag_mask(mt->items,\n-\t\t\t\t       mt->fc,\n-\t\t\t\t       mt->fc_sz,\n-\t\t\t\t       mt->definer->mask.jumbo);\n+\tmlx5dr_definer_create_tag_mask(items, fc, fc_sz, definer->mask.jumbo);\n \n \t/* Create definer based on the bitmask tag */\n-\tdef_attr.match_mask = mt->definer->mask.jumbo;\n-\tdef_attr.dw_selector = mt->definer->dw_selector;\n-\tdef_attr.byte_selector = mt->definer->byte_selector;\n-\tmt->definer->obj = mlx5dr_cmd_definer_create(ibv_ctx, &def_attr);\n-\tif (!mt->definer->obj)\n-\t\tgoto free_field_copy;\n+\tdef_attr.match_mask = definer->mask.jumbo;\n+\tdef_attr.dw_selector = layout->dw_selector;\n+\tdef_attr.byte_selector = layout->byte_selector;\n \n-\tsimple_free(hl);\n+\tdefiner->obj = mlx5dr_cmd_definer_create(ibv_ctx, &def_attr);\n+\tif (!definer->obj)\n+\t\tgoto free_definer;\n \n-\treturn 0;\n+\treturn definer;\n \n-free_field_copy:\n-\tsimple_free(mt->fc);\n-free_hl:\n-\tsimple_free(hl);\n free_definer:\n-\tsimple_free(mt->definer);\n-dec_refcount:\n-\tmt->refcount--;\n+\tsimple_free(definer);\n+\treturn NULL;\n+}\n+\n+static void\n+mlx5dr_definer_free(struct mlx5dr_definer *definer)\n+{\n+\tmlx5dr_cmd_destroy_obj(definer->obj);\n+\tsimple_free(definer);\n+}\n+\n+static int\n+mlx5dr_definer_matcher_match_init(struct mlx5dr_context *ctx,\n+\t\t\t\t  struct mlx5dr_matcher *matcher,\n+\t\t\t\t  struct mlx5dr_definer *match_layout)\n+{\n+\tstruct mlx5dr_match_template *mt = matcher->mt;\n+\tint i;\n+\n+\t/* Create mendatory match definer */\n+\tfor (i = 0; i < matcher->num_of_mt; i++) {\n+\t\tmt[i].definer = mlx5dr_definer_alloc(ctx->ibv_ctx,\n+\t\t\t\t\t\t     mt[i].fc,\n+\t\t\t\t\t\t     mt[i].fc_sz,\n+\t\t\t\t\t\t     mt[i].items,\n+\t\t\t\t\t\t     match_layout);\n+\t\tif (!mt[i].definer) {\n+\t\t\tDR_LOG(ERR, \"Failed to create match definer\");\n+\t\t\tgoto free_definers;\n+\t\t}\n+\t}\n+\treturn 0;\n+\n+free_definers:\n+\twhile (i--)\n+\t\tmlx5dr_definer_free(mt[i].definer);\n \n \treturn rte_errno;\n }\n \n-void mlx5dr_definer_put(struct mlx5dr_match_template *mt)\n+static void\n+mlx5dr_definer_matcher_match_uninit(struct mlx5dr_matcher *matcher)\n {\n-\tif (--mt->refcount)\n+\tint i;\n+\n+\tfor (i = 0; i < matcher->num_of_mt; i++)\n+\t\tmlx5dr_definer_free(matcher->mt[i].definer);\n+}\n+\n+int mlx5dr_definer_matcher_init(struct mlx5dr_context *ctx,\n+\t\t\t\tstruct mlx5dr_matcher *matcher)\n+{\n+\tstruct mlx5dr_definer match_layout = {0};\n+\tint ret, i;\n+\n+\tif (matcher->flags & MLX5DR_MATCHER_FLAGS_COLISION)\n+\t\treturn 0;\n+\n+\t/* Calculate header layout based on matcher items */\n+\tret = mlx5dr_definer_calc_layout(matcher, &match_layout);\n+\tif (ret) {\n+\t\tDR_LOG(ERR, \"Failed to calculate matcher definer layout\");\n+\t\treturn ret;\n+\t}\n+\n+\t/* Calculate definers needed for exact match */\n+\tret = mlx5dr_definer_matcher_match_init(ctx, matcher, &match_layout);\n+\tif (ret) {\n+\t\tDR_LOG(ERR, \"Failed to init match definers\");\n+\t\tgoto free_fc;\n+\t}\n+\n+\treturn 0;\n+\n+free_fc:\n+\tfor (i = 0; i < matcher->num_of_mt; i++)\n+\t\tsimple_free(matcher->mt[i].fc);\n+\n+\treturn ret;\n+}\n+\n+void mlx5dr_definer_matcher_uninit(struct mlx5dr_matcher *matcher)\n+{\n+\tint i;\n+\n+\tif (matcher->flags & MLX5DR_MATCHER_FLAGS_COLISION)\n \t\treturn;\n \n-\tsimple_free(mt->fc);\n-\tmlx5dr_cmd_destroy_obj(mt->definer->obj);\n-\tsimple_free(mt->definer);\n+\tmlx5dr_definer_matcher_match_uninit(matcher);\n+\n+\tfor (i = 0; i < matcher->num_of_mt; i++)\n+\t\tsimple_free(matcher->mt[i].fc);\n }\ndiff --git a/drivers/net/mlx5/hws/mlx5dr_definer.h b/drivers/net/mlx5/hws/mlx5dr_definer.h\nindex bab4baae4a..a14a08838a 100644\n--- a/drivers/net/mlx5/hws/mlx5dr_definer.h\n+++ b/drivers/net/mlx5/hws/mlx5dr_definer.h\n@@ -573,14 +573,11 @@ void mlx5dr_definer_create_tag(const struct rte_flow_item *items,\n \t\t\t       uint32_t fc_sz,\n \t\t\t       uint8_t *tag);\n \n-int mlx5dr_definer_compare(struct mlx5dr_definer *definer_a,\n-\t\t\t   struct mlx5dr_definer *definer_b);\n-\n int mlx5dr_definer_get_id(struct mlx5dr_definer *definer);\n \n-int mlx5dr_definer_get(struct mlx5dr_context *ctx,\n-\t\t       struct mlx5dr_match_template *mt);\n+int mlx5dr_definer_matcher_init(struct mlx5dr_context *ctx,\n+\t\t\t\tstruct mlx5dr_matcher *matcher);\n \n-void mlx5dr_definer_put(struct mlx5dr_match_template *mt);\n+void mlx5dr_definer_matcher_uninit(struct mlx5dr_matcher *matcher);\n \n-#endif /* MLX5DR_DEFINER_H_ */\n+#endif\ndiff --git a/drivers/net/mlx5/hws/mlx5dr_internal.h b/drivers/net/mlx5/hws/mlx5dr_internal.h\nindex faad2bbd0f..c3c077667d 100644\n--- a/drivers/net/mlx5/hws/mlx5dr_internal.h\n+++ b/drivers/net/mlx5/hws/mlx5dr_internal.h\n@@ -30,12 +30,12 @@\n #include \"mlx5dr_pool.h\"\n #include \"mlx5dr_context.h\"\n #include \"mlx5dr_table.h\"\n-#include \"mlx5dr_matcher.h\"\n #include \"mlx5dr_send.h\"\n #include \"mlx5dr_rule.h\"\n #include \"mlx5dr_cmd.h\"\n #include \"mlx5dr_action.h\"\n #include \"mlx5dr_definer.h\"\n+#include \"mlx5dr_matcher.h\"\n #include \"mlx5dr_debug.h\"\n #include \"mlx5dr_pat_arg.h\"\n \ndiff --git a/drivers/net/mlx5/hws/mlx5dr_matcher.c b/drivers/net/mlx5/hws/mlx5dr_matcher.c\nindex b8db0a27ae..7e332052b2 100644\n--- a/drivers/net/mlx5/hws/mlx5dr_matcher.c\n+++ b/drivers/net/mlx5/hws/mlx5dr_matcher.c\n@@ -406,6 +406,7 @@ static int mlx5dr_matcher_create_rtc(struct mlx5dr_matcher *matcher,\n {\n \tstruct mlx5dr_matcher_attr *attr = &matcher->attr;\n \tstruct mlx5dr_cmd_rtc_create_attr rtc_attr = {0};\n+\tstruct mlx5dr_match_template *mt = matcher->mt;\n \tstruct mlx5dr_context *ctx = matcher->tbl->ctx;\n \tstruct mlx5dr_action_default_stc *default_stc;\n \tstruct mlx5dr_table *tbl = matcher->tbl;\n@@ -413,8 +414,6 @@ static int mlx5dr_matcher_create_rtc(struct mlx5dr_matcher *matcher,\n \tstruct mlx5dr_pool *ste_pool, *stc_pool;\n \tstruct mlx5dr_devx_obj *devx_obj;\n \tstruct mlx5dr_pool_chunk *ste;\n-\tuint8_t first_definer_id;\n-\tbool is_jumbo;\n \tint ret;\n \n \tswitch (rtc_type) {\n@@ -424,19 +423,17 @@ static int mlx5dr_matcher_create_rtc(struct mlx5dr_matcher *matcher,\n \t\tste_pool = matcher->match_ste.pool;\n \t\tste = &matcher->match_ste.ste;\n \t\tste->order = attr->table.sz_col_log + attr->table.sz_row_log;\n+\n \t\trtc_attr.log_size = attr->table.sz_row_log;\n \t\trtc_attr.log_depth = attr->table.sz_col_log;\n+\t\trtc_attr.is_frst_jumbo = mlx5dr_matcher_mt_is_jumbo(mt);\n \t\trtc_attr.miss_ft_id = matcher->end_ft->id;\n \n-\t\tis_jumbo = mlx5dr_definer_is_jumbo(matcher->mt->definer);\n-\t\tfirst_definer_id = mlx5dr_definer_get_id(matcher->mt->definer);\n-\n \t\tif (attr->insert_mode == MLX5DR_MATCHER_INSERT_BY_HASH) {\n \t\t\t/* The usual Hash Table */\n \t\t\trtc_attr.update_index_mode = MLX5_IFC_RTC_STE_UPDATE_MODE_BY_HASH;\n \t\t\t/* The first match template is used since all share the same definer */\n-\t\t\trtc_attr.match_definer_0 = first_definer_id;\n-\t\t\trtc_attr.is_frst_jumbo = is_jumbo;\n+\t\t\trtc_attr.match_definer_0 = mlx5dr_definer_get_id(mt->definer);\n \t\t} else if (attr->insert_mode == MLX5DR_MATCHER_INSERT_BY_INDEX) {\n \t\t\trtc_attr.update_index_mode = MLX5_IFC_RTC_STE_UPDATE_MODE_BY_OFFSET;\n \t\t\trtc_attr.num_hash_definer = 1;\n@@ -444,8 +441,7 @@ static int mlx5dr_matcher_create_rtc(struct mlx5dr_matcher *matcher,\n \t\t\tif (attr->distribute_mode == MLX5DR_MATCHER_DISTRIBUTE_BY_HASH) {\n \t\t\t\t/* Hash Split Table */\n \t\t\t\trtc_attr.access_index_mode = MLX5_IFC_RTC_STE_ACCESS_MODE_BY_HASH;\n-\t\t\t\trtc_attr.match_definer_0 = first_definer_id;\n-\t\t\t\trtc_attr.is_frst_jumbo = is_jumbo;\n+\t\t\t\trtc_attr.match_definer_0 = mlx5dr_definer_get_id(mt->definer);\n \t\t\t} else if (attr->distribute_mode == MLX5DR_MATCHER_DISTRIBUTE_BY_LINEAR) {\n \t\t\t\t/* Linear Lookup Table */\n \t\t\t\trtc_attr.access_index_mode = MLX5_IFC_RTC_STE_ACCESS_MODE_LINEAR;\n@@ -608,7 +604,7 @@ static void mlx5dr_matcher_set_pool_attr(struct mlx5dr_pool_attr *attr,\n \n static int mlx5dr_matcher_bind_at(struct mlx5dr_matcher *matcher)\n {\n-\tbool is_jumbo = mlx5dr_definer_is_jumbo(matcher->mt->definer);\n+\tbool is_jumbo = mlx5dr_matcher_mt_is_jumbo(matcher->mt);\n \tstruct mlx5dr_cmd_stc_modify_attr stc_attr = {0};\n \tstruct mlx5dr_table *tbl = matcher->tbl;\n \tstruct mlx5dr_pool_attr pool_attr = {0};\n@@ -703,34 +699,19 @@ static int mlx5dr_matcher_bind_mt(struct mlx5dr_matcher *matcher)\n {\n \tstruct mlx5dr_context *ctx = matcher->tbl->ctx;\n \tstruct mlx5dr_pool_attr pool_attr = {0};\n-\tint i, created = 0;\n-\tint ret = -1;\n-\n-\tfor (i = 0; i < matcher->num_of_mt; i++) {\n-\t\t/* Get a definer for each match template */\n-\t\tret = mlx5dr_definer_get(ctx, &matcher->mt[i]);\n-\t\tif (ret)\n-\t\t\tgoto definer_put;\n-\n-\t\tcreated++;\n-\n-\t\t/* Verify all templates produce the same definer */\n-\t\tif (i == 0)\n-\t\t\tcontinue;\n+\tint ret;\n \n-\t\tret = mlx5dr_definer_compare(matcher->mt[i].definer,\n-\t\t\t\t\t     matcher->mt[i - 1].definer);\n-\t\tif (ret) {\n-\t\t\tDR_LOG(ERR, \"Match templates cannot be used on the same matcher\");\n-\t\t\trte_errno = ENOTSUP;\n-\t\t\tgoto definer_put;\n-\t\t}\n+\t/* Calculate match definers */\n+\tret = mlx5dr_definer_matcher_init(ctx, matcher);\n+\tif (ret) {\n+\t\tDR_LOG(ERR, \"Failed to set matcher templates with match definers\");\n+\t\treturn ret;\n \t}\n \n \t/* Create an STE pool per matcher*/\n+\tpool_attr.table_type = matcher->tbl->type;\n \tpool_attr.pool_type = MLX5DR_POOL_TYPE_STE;\n \tpool_attr.flags = MLX5DR_POOL_FLAGS_FOR_MATCHER_STE_POOL;\n-\tpool_attr.table_type = matcher->tbl->type;\n \tpool_attr.alloc_log_sz = matcher->attr.table.sz_col_log +\n \t\t\t\t matcher->attr.table.sz_row_log;\n \tmlx5dr_matcher_set_pool_attr(&pool_attr, matcher);\n@@ -738,26 +719,20 @@ static int mlx5dr_matcher_bind_mt(struct mlx5dr_matcher *matcher)\n \tmatcher->match_ste.pool = mlx5dr_pool_create(ctx, &pool_attr);\n \tif (!matcher->match_ste.pool) {\n \t\tDR_LOG(ERR, \"Failed to allocate matcher STE pool\");\n-\t\tgoto definer_put;\n+\t\tgoto uninit_match_definer;\n \t}\n \n \treturn 0;\n \n-definer_put:\n-\twhile (created--)\n-\t\tmlx5dr_definer_put(&matcher->mt[created]);\n-\n+uninit_match_definer:\n+\tmlx5dr_definer_matcher_uninit(matcher);\n \treturn ret;\n }\n \n static void mlx5dr_matcher_unbind_mt(struct mlx5dr_matcher *matcher)\n {\n-\tint i;\n-\n-\tfor (i = 0; i < matcher->num_of_mt; i++)\n-\t\tmlx5dr_definer_put(&matcher->mt[i]);\n-\n \tmlx5dr_pool_destroy(matcher->match_ste.pool);\n+\tmlx5dr_definer_matcher_uninit(matcher);\n }\n \n static int\n@@ -958,6 +933,8 @@ mlx5dr_matcher_create_col_matcher(struct mlx5dr_matcher *matcher)\n \tcol_matcher->num_of_at = matcher->num_of_at;\n \tcol_matcher->num_of_mt = matcher->num_of_mt;\n \tcol_matcher->attr.priority = matcher->attr.priority;\n+\tcol_matcher->flags = matcher->flags;\n+\tcol_matcher->flags |= MLX5DR_MATCHER_FLAGS_COLISION;\n \tcol_matcher->attr.mode = MLX5DR_MATCHER_RESOURCE_MODE_HTABLE;\n \tcol_matcher->attr.optimize_flow_src = matcher->attr.optimize_flow_src;\n \tcol_matcher->attr.table.sz_row_log = matcher->attr.rule.num_log;\ndiff --git a/drivers/net/mlx5/hws/mlx5dr_matcher.h b/drivers/net/mlx5/hws/mlx5dr_matcher.h\nindex b957f5ea4b..4bdb33b11f 100644\n--- a/drivers/net/mlx5/hws/mlx5dr_matcher.h\n+++ b/drivers/net/mlx5/hws/mlx5dr_matcher.h\n@@ -22,15 +22,19 @@\n /* Required depth of the main large table */\n #define MLX5DR_MATCHER_ASSURED_MAIN_TBL_DEPTH 2\n \n+enum mlx5dr_matcher_flags {\n+\tMLX5DR_MATCHER_FLAGS_COLISION\t\t= 1 << 0,\n+};\n+\n struct mlx5dr_match_template {\n \tstruct rte_flow_item *items;\n \tstruct mlx5dr_definer *definer;\n+\tstruct mlx5dr_definer *range_definer;\n \tstruct mlx5dr_definer_fc *fc;\n-\tuint32_t fc_sz;\n+\tuint16_t fc_sz;\n \tuint64_t item_flags;\n \tuint8_t vport_item_id;\n \tenum mlx5dr_match_template_flags flags;\n-\tuint32_t refcount;\n };\n \n struct mlx5dr_matcher_match_ste {\n@@ -59,6 +63,8 @@ struct mlx5dr_matcher {\n \tuint8_t num_of_mt;\n \tstruct mlx5dr_action_template *at;\n \tuint8_t num_of_at;\n+\t/* enum mlx5dr_matcher_flags */\n+\tuint8_t flags;\n \tstruct mlx5dr_devx_obj *end_ft;\n \tstruct mlx5dr_matcher *col_matcher;\n \tstruct mlx5dr_matcher_match_ste match_ste;\n@@ -66,6 +72,12 @@ struct mlx5dr_matcher {\n \tLIST_ENTRY(mlx5dr_matcher) next;\n };\n \n+static inline bool\n+mlx5dr_matcher_mt_is_jumbo(struct mlx5dr_match_template *mt)\n+{\n+\treturn mlx5dr_definer_is_jumbo(mt->definer);\n+}\n+\n int mlx5dr_matcher_conv_items_to_prm(uint64_t *match_buf,\n \t\t\t\t     struct rte_flow_item *items,\n \t\t\t\t     uint8_t *match_criteria,\n",
    "prefixes": [
        "v1",
        "10/16"
    ]
}