get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 62717,
    "url": "http://patches.dpdk.org/api/patches/62717/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/1573184965-49691-7-git-send-email-suanmingm@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": "<1573184965-49691-7-git-send-email-suanmingm@mellanox.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/1573184965-49691-7-git-send-email-suanmingm@mellanox.com",
    "date": "2019-11-08T03:49:12",
    "name": "[v2,06/19] net/mlx5: prepare meter flow tables",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": true,
    "hash": "b49febe8a628dc6e932e77d16be4cb1a6aa93a91",
    "submitter": {
        "id": 1358,
        "url": "http://patches.dpdk.org/api/people/1358/?format=api",
        "name": "Suanming Mou",
        "email": "suanmingm@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/1573184965-49691-7-git-send-email-suanmingm@mellanox.com/mbox/",
    "series": [
        {
            "id": 7343,
            "url": "http://patches.dpdk.org/api/series/7343/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=7343",
            "date": "2019-11-08T03:49:07",
            "name": "net/mlx5: support meter",
            "version": 2,
            "mbox": "http://patches.dpdk.org/series/7343/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/62717/comments/",
    "check": "fail",
    "checks": "http://patches.dpdk.org/api/patches/62717/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 75E10A04AB;\n\tFri,  8 Nov 2019 04:50:24 +0100 (CET)",
            "from [92.243.14.124] (localhost [127.0.0.1])\n\tby dpdk.org (Postfix) with ESMTP id EDF741BFAA;\n\tFri,  8 Nov 2019 04:49:46 +0100 (CET)",
            "from git-send-mailer.rdmz.labs.mlnx (unknown [37.142.13.130])\n by dpdk.org (Postfix) with ESMTP id 231451BF57\n for <dev@dpdk.org>; Fri,  8 Nov 2019 04:49:33 +0100 (CET)"
        ],
        "From": "Suanming Mou <suanmingm@mellanox.com>",
        "To": "viacheslavo@mellanox.com,\n\tmatan@mellanox.com",
        "Cc": "orika@mellanox.com,\n\trasland@mellanox.com,\n\tdev@dpdk.org",
        "Date": "Fri,  8 Nov 2019 05:49:12 +0200",
        "Message-Id": "<1573184965-49691-7-git-send-email-suanmingm@mellanox.com>",
        "X-Mailer": "git-send-email 1.8.3.1",
        "In-Reply-To": "<1573184965-49691-1-git-send-email-suanmingm@mellanox.com>",
        "References": "<1573053090-179521-1-git-send-email-suanmingm@mellanox.com>\n <1573184965-49691-1-git-send-email-suanmingm@mellanox.com>",
        "Subject": "[dpdk-dev] [PATCH v2 06/19] net/mlx5: prepare meter flow tables",
        "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": "This commit prepare the meter table and suffix table.\n\nA flow with meter will be split to three flows. The three flows are\ncreated on differnet tables. The packets transfer between the flows\non the tables as below:\n\nPrefix flow -> Meter flow -> Suffix flow\n\nPrefix flow does the user defined match and the meter action. The meter\naction colors the packet and set its destination to meter table to be\nprocessed by the meter flow.\nThe meter flow judges if the packet can be passed or not. If packet can\nbe passed, it will be transferred to the suffix table.\nThe suffix flow on the suffix table will apply the left user defined\nactions to the packet.\n\nThe ingress egress and transfer all have the independent meter and\nsuffix tables.\n\nSigned-off-by: Suanming Mou <suanmingm@mellanox.com>\n---\n drivers/net/mlx5/mlx5.h         |   8 ++\n drivers/net/mlx5/mlx5_flow.c    |  39 ++++++\n drivers/net/mlx5/mlx5_flow.h    |  50 ++++++++\n drivers/net/mlx5/mlx5_flow_dv.c | 260 ++++++++++++++++++++++++++++++++++++++++\n drivers/net/mlx5/mlx5_prm.h     |   8 ++\n 5 files changed, 365 insertions(+)",
    "diff": "diff --git a/drivers/net/mlx5/mlx5.h b/drivers/net/mlx5/mlx5.h\nindex dbeab2b..8f2c541 100644\n--- a/drivers/net/mlx5/mlx5.h\n+++ b/drivers/net/mlx5/mlx5.h\n@@ -578,6 +578,8 @@ struct mlx5_flow_tbl_resource {\n };\n \n #define MLX5_MAX_TABLES UINT16_MAX\n+#define MLX5_FLOW_TABLE_LEVEL_METER (UINT16_MAX - 3)\n+#define MLX5_FLOW_TABLE_LEVEL_SUFFIX (UINT16_MAX - 2)\n #define MLX5_HAIRPIN_TX_TABLE (UINT16_MAX - 1)\n /* Reserve the last two tables for metadata register copy. */\n #define MLX5_FLOW_MREG_ACT_TABLE_GROUP (MLX5_MAX_TABLES - 1)\n@@ -644,12 +646,18 @@ struct mlx5_ibv_shared {\n \tvoid *fdb_domain; /* FDB Direct Rules name space handle. */\n \tstruct mlx5_flow_tbl_resource fdb_tbl[MLX5_MAX_TABLES_FDB];\n \t/* FDB Direct Rules tables. */\n+\tstruct mlx5_flow_tbl_resource *fdb_mtr_sfx_tbl;\n+\t/* FDB meter suffix rules table. */\n \tvoid *rx_domain; /* RX Direct Rules name space handle. */\n \tstruct mlx5_flow_tbl_resource rx_tbl[MLX5_MAX_TABLES];\n \t/* RX Direct Rules tables. */\n+\tstruct mlx5_flow_tbl_resource *rx_mtr_sfx_tbl;\n+\t/* RX meter suffix rules table. */\n \tvoid *tx_domain; /* TX Direct Rules name space handle. */\n \tstruct mlx5_flow_tbl_resource tx_tbl[MLX5_MAX_TABLES];\n \t/* TX Direct Rules tables. */\n+\tstruct mlx5_flow_tbl_resource *tx_mtr_sfx_tbl;\n+\t/* TX meter suffix rules table. */\n \tvoid *esw_drop_action; /* Pointer to DR E-Switch drop action. */\n \tvoid *pop_vlan_action; /* Pointer to DR pop VLAN action. */\n \t/* TX Direct Rules tables/ */\ndiff --git a/drivers/net/mlx5/mlx5_flow.c b/drivers/net/mlx5/mlx5_flow.c\nindex b8abe6a..6e34c7a 100644\n--- a/drivers/net/mlx5/mlx5_flow.c\n+++ b/drivers/net/mlx5/mlx5_flow.c\n@@ -4911,6 +4911,45 @@ struct rte_flow *\n \treturn 0;\n }\n \n+/**\n+ * Create the needed meter and suffix tables.\n+ *\n+ * @param[in] dev\n+ *   Pointer to Ethernet device.\n+ *\n+ * @return\n+ *   Pointer to table set on success, NULL otherwise.\n+ */\n+struct mlx5_meter_domains_infos *\n+mlx5_flow_create_mtr_tbls(struct rte_eth_dev *dev)\n+{\n+\tconst struct mlx5_flow_driver_ops *fops;\n+\n+\tfops = flow_get_drv_ops(MLX5_FLOW_TYPE_DV);\n+\treturn fops->create_mtr_tbls(dev);\n+}\n+\n+/**\n+ * Destroy the meter table set.\n+ *\n+ * @param[in] dev\n+ *   Pointer to Ethernet device.\n+ * @param[in] tbl\n+ *   Pointer to the meter table set.\n+ *\n+ * @return\n+ *   0 on success.\n+ */\n+int\n+mlx5_flow_destroy_mtr_tbls(struct rte_eth_dev *dev,\n+\t\t\t   struct mlx5_meter_domains_infos *tbls)\n+{\n+\tconst struct mlx5_flow_driver_ops *fops;\n+\n+\tfops = flow_get_drv_ops(MLX5_FLOW_TYPE_DV);\n+\treturn fops->destroy_mtr_tbls(dev, tbls);\n+}\n+\n #define MLX5_POOL_QUERY_FREQ_US 1000000\n \n /**\ndiff --git a/drivers/net/mlx5/mlx5_flow.h b/drivers/net/mlx5/mlx5_flow.h\nindex d755d11..d8f1537 100644\n--- a/drivers/net/mlx5/mlx5_flow.h\n+++ b/drivers/net/mlx5/mlx5_flow.h\n@@ -524,6 +524,46 @@ struct mlx5_flow {\n };\n \n #define MLX5_MAN_WIDTH 8\n+/* Modify this value if enum rte_mtr_color changes. */\n+#define RTE_MTR_DROPPED RTE_COLORS\n+\n+/* Meter table structure. */\n+struct mlx5_meter_domain_info {\n+\tstruct mlx5_flow_tbl_resource *tbl;\n+\t/**< Meter table. */\n+\tvoid *any_matcher;\n+\t/**< Meter color not match default criteria. */\n+\tvoid *color_matcher;\n+\t/**< Meter color match criteria. */\n+\tvoid *jump_actn;\n+\t/**< Meter match action. */\n+\tvoid *policer_rules[RTE_MTR_DROPPED + 1];\n+\t/**< Meter policer for the match. */\n+};\n+\n+/* Meter table set for TX RX FDB. */\n+struct mlx5_meter_domains_infos {\n+\tuint32_t ref_cnt;\n+\t/**< Table user count. */\n+\tstruct mlx5_meter_domain_info egress;\n+\t/**< TX meter table. */\n+\tstruct mlx5_meter_domain_info ingress;\n+\t/**< RX meter table. */\n+\tstruct mlx5_meter_domain_info transfer;\n+\t/**< FDB meter table. */\n+\tvoid *drop_actn;\n+\t/**< Drop action as not matched. */\n+};\n+\n+/* Meter parameter structure. */\n+struct mlx5_flow_meter {\n+\tuint32_t meter_id;\n+\t/**< Meter id. */\n+\tstruct mlx5_meter_domains_infos *mfts;\n+\t/**< Flow table created for this meter. */\n+\tuint32_t ref_cnt;\n+\t/**< Use count. */\n+};\n \n /* RFC2697 parameter structure. */\n struct mlx5_flow_meter_srtcm_rfc2697_prm {\n@@ -592,6 +632,10 @@ typedef int (*mlx5_flow_query_t)(struct rte_eth_dev *dev,\n \t\t\t\t const struct rte_flow_action *actions,\n \t\t\t\t void *data,\n \t\t\t\t struct rte_flow_error *error);\n+typedef struct mlx5_meter_domains_infos *(*mlx5_flow_create_mtr_tbls_t)\n+\t\t\t\t\t    (struct rte_eth_dev *dev);\n+typedef int (*mlx5_flow_destroy_mtr_tbls_t)(struct rte_eth_dev *dev,\n+\t\t\t\t\tstruct mlx5_meter_domains_infos *tbls);\n struct mlx5_flow_driver_ops {\n \tmlx5_flow_validate_t validate;\n \tmlx5_flow_prepare_t prepare;\n@@ -600,6 +644,8 @@ struct mlx5_flow_driver_ops {\n \tmlx5_flow_remove_t remove;\n \tmlx5_flow_destroy_t destroy;\n \tmlx5_flow_query_t query;\n+\tmlx5_flow_create_mtr_tbls_t create_mtr_tbls;\n+\tmlx5_flow_destroy_mtr_tbls_t destroy_mtr_tbls;\n };\n \n \n@@ -726,4 +772,8 @@ int mlx5_flow_validate_item_geneve(const struct rte_flow_item *item,\n \t\t\t\t   uint64_t item_flags,\n \t\t\t\t   struct rte_eth_dev *dev,\n \t\t\t\t   struct rte_flow_error *error);\n+struct mlx5_meter_domains_infos *mlx5_flow_create_mtr_tbls\n+\t\t\t\t\t(struct rte_eth_dev *dev);\n+int mlx5_flow_destroy_mtr_tbls(struct rte_eth_dev *dev,\n+\t\t\t       struct mlx5_meter_domains_infos *tbl);\n #endif /* RTE_PMD_MLX5_FLOW_H_ */\ndiff --git a/drivers/net/mlx5/mlx5_flow_dv.c b/drivers/net/mlx5/mlx5_flow_dv.c\nindex 3f3dad0..c0e5470 100644\n--- a/drivers/net/mlx5/mlx5_flow_dv.c\n+++ b/drivers/net/mlx5/mlx5_flow_dv.c\n@@ -102,6 +102,31 @@\n \tattr->valid = 1;\n }\n \n+/**\n+ * Convert rte_mtr_color to mlx5 color.\n+ *\n+ * @param[in] rcol\n+ *   rte_mtr_color.\n+ *\n+ * @return\n+ *   mlx5 color.\n+ */\n+static int\n+rte_col_2_mlx5_col(enum rte_color rcol)\n+{\n+\tswitch (rcol) {\n+\tcase RTE_COLOR_GREEN:\n+\t\treturn MLX5_FLOW_COLOR_GREEN;\n+\tcase RTE_COLOR_YELLOW:\n+\t\treturn MLX5_FLOW_COLOR_YELLOW;\n+\tcase RTE_COLOR_RED:\n+\t\treturn MLX5_FLOW_COLOR_RED;\n+\tdefault:\n+\t\tbreak;\n+\t}\n+\treturn MLX5_FLOW_COLOR_UNDEFINED;\n+}\n+\n struct field_modify_info {\n \tuint32_t size; /* Size of field in protocol header, in bytes. */\n \tuint32_t offset; /* Offset of field in protocol header, in bytes. */\n@@ -7574,6 +7599,239 @@ struct field_modify_info modify_tcp[] = {\n \treturn ret;\n }\n \n+/**\n+ * Destroy the meter table set.\n+ * Lock free, (mutex should be acquired by caller).\n+ *\n+ * @param[in] dev\n+ *   Pointer to Ethernet device.\n+ * @param[in] tbl\n+ *   Pointer to the meter table set.\n+ *\n+ * @return\n+ *   Always 0.\n+ */\n+static int\n+flow_dv_destroy_mtr_tbl(struct rte_eth_dev *dev,\n+\t\t\tstruct mlx5_meter_domains_infos *tbl)\n+{\n+\tstruct mlx5_priv *priv = dev->data->dev_private;\n+\tstruct mlx5_meter_domains_infos *mtd =\n+\t\t\t\t(struct mlx5_meter_domains_infos *)tbl;\n+\n+\tif (!mtd || !priv->config.dv_flow_en)\n+\t\treturn 0;\n+\tif (mtd->ingress.policer_rules[RTE_MTR_DROPPED])\n+\t\tclaim_zero(mlx5_glue->dv_destroy_flow\n+\t\t\t  (mtd->ingress.policer_rules[RTE_MTR_DROPPED]));\n+\tif (mtd->egress.policer_rules[RTE_MTR_DROPPED])\n+\t\tclaim_zero(mlx5_glue->dv_destroy_flow\n+\t\t\t  (mtd->egress.policer_rules[RTE_MTR_DROPPED]));\n+\tif (mtd->transfer.policer_rules[RTE_MTR_DROPPED])\n+\t\tclaim_zero(mlx5_glue->dv_destroy_flow\n+\t\t\t  (mtd->transfer.policer_rules[RTE_MTR_DROPPED]));\n+\tif (mtd->egress.color_matcher)\n+\t\tclaim_zero(mlx5_glue->dv_destroy_flow_matcher\n+\t\t\t  (mtd->egress.color_matcher));\n+\tif (mtd->egress.any_matcher)\n+\t\tclaim_zero(mlx5_glue->dv_destroy_flow_matcher\n+\t\t\t  (mtd->egress.any_matcher));\n+\tif (mtd->egress.tbl)\n+\t\tclaim_zero(flow_dv_tbl_resource_release(mtd->egress.tbl));\n+\tif (mtd->ingress.color_matcher)\n+\t\tclaim_zero(mlx5_glue->dv_destroy_flow_matcher\n+\t\t\t  (mtd->ingress.color_matcher));\n+\tif (mtd->ingress.any_matcher)\n+\t\tclaim_zero(mlx5_glue->dv_destroy_flow_matcher\n+\t\t\t  (mtd->ingress.any_matcher));\n+\tif (mtd->ingress.tbl)\n+\t\tclaim_zero(flow_dv_tbl_resource_release(mtd->ingress.tbl));\n+\tif (mtd->transfer.color_matcher)\n+\t\tclaim_zero(mlx5_glue->dv_destroy_flow_matcher\n+\t\t\t  (mtd->transfer.color_matcher));\n+\tif (mtd->transfer.any_matcher)\n+\t\tclaim_zero(mlx5_glue->dv_destroy_flow_matcher\n+\t\t\t  (mtd->transfer.any_matcher));\n+\tif (mtd->transfer.tbl)\n+\t\tclaim_zero(flow_dv_tbl_resource_release(mtd->transfer.tbl));\n+\tif (mtd->drop_actn)\n+\t\tclaim_zero(mlx5_glue->destroy_flow_action(mtd->drop_actn));\n+\trte_free(mtd);\n+\treturn 0;\n+}\n+\n+/**\n+ * Create specify domain meter table and suffix table.\n+ *\n+ * @param[in] dev\n+ *   Pointer to Ethernet device.\n+ * @param[in,out] mtb\n+ *   Pointer to DV meter table set.\n+ * @param[in] egress\n+ *   Table attribute.\n+ * @param[in] transfer\n+ *   Table attribute.\n+ * @param[in] color_reg_c_idx\n+ *   Reg C index for color match.\n+ *\n+ * @return\n+ *   0 on success, -1 otherwise and rte_errno is set.\n+ */\n+static int\n+flow_dv_prepare_mtr_tables(struct rte_eth_dev *dev,\n+\t\t\t   struct mlx5_meter_domains_infos *mtb,\n+\t\t\t   uint8_t egress, uint8_t transfer,\n+\t\t\t   uint32_t color_reg_c_idx)\n+{\n+\tstruct mlx5_priv *priv = dev->data->dev_private;\n+\tstruct mlx5_ibv_shared *sh = priv->sh;\n+\tstruct mlx5_flow_dv_match_params mask = {\n+\t\t.size = sizeof(mask.buf),\n+\t};\n+\tstruct mlx5_flow_dv_match_params value = {\n+\t\t.size = sizeof(value.buf),\n+\t};\n+\tstruct mlx5dv_flow_matcher_attr dv_attr = {\n+\t\t.type = IBV_FLOW_ATTR_NORMAL,\n+\t\t.priority = 0,\n+\t\t.match_criteria_enable = 0,\n+\t\t.match_mask = (void *)&mask,\n+\t};\n+\t/*\n+\t * Need reserve two actions here. As for the meter flow, the action\n+\t * to be performed will be jump or drop. The other reserve action is\n+\t * for count.\n+\t */\n+#define METER_ACTIONS 2\n+\tvoid *actions[METER_ACTIONS];\n+\tstruct mlx5_flow_tbl_resource **sfx_tbl;\n+\tstruct mlx5_meter_domain_info *dtb;\n+\tstruct rte_flow_error error;\n+\tint i = 0;\n+\n+\tif (transfer) {\n+\t\tsfx_tbl = &sh->fdb_mtr_sfx_tbl;\n+\t\tdtb = &mtb->transfer;\n+\t} else if (egress) {\n+\t\tsfx_tbl = &sh->tx_mtr_sfx_tbl;\n+\t\tdtb = &mtb->egress;\n+\t} else {\n+\t\tsfx_tbl = &sh->rx_mtr_sfx_tbl;\n+\t\tdtb = &mtb->ingress;\n+\t}\n+\t/* If the suffix table in missing, create it. */\n+\tif (!(*sfx_tbl)) {\n+\t\t*sfx_tbl = flow_dv_tbl_resource_get(dev,\n+\t\t\t\t\t\tMLX5_FLOW_TABLE_LEVEL_SUFFIX,\n+\t\t\t\t\t\tegress, transfer, &error);\n+\t\tif (!(*sfx_tbl)) {\n+\t\t\tDRV_LOG(ERR, \"Failed to create meter suffix table.\");\n+\t\t\treturn -1;\n+\t\t}\n+\t}\n+\t/* Create the meter table with METER level. */\n+\tdtb->tbl = flow_dv_tbl_resource_get(dev, MLX5_FLOW_TABLE_LEVEL_METER,\n+\t\t\t\t\t    egress, transfer, &error);\n+\tif (!dtb->tbl) {\n+\t\tDRV_LOG(ERR, \"Failed to create meter policer table.\");\n+\t\treturn -1;\n+\t}\n+\t/* Create matchers, Any and Color. */\n+\tdv_attr.priority = 3;\n+\tdv_attr.match_criteria_enable = 0;\n+\tdtb->any_matcher = mlx5_glue->dv_create_flow_matcher(sh->ctx,\n+\t\t\t\t\t\t\t     &dv_attr,\n+\t\t\t\t\t\t\t     dtb->tbl->obj);\n+\tif (!dtb->any_matcher) {\n+\t\tDRV_LOG(ERR, \"Failed to create meter\"\n+\t\t\t     \" policer default matcher.\");\n+\t\tgoto error_exit;\n+\t}\n+\tdv_attr.priority = 0;\n+\tdv_attr.match_criteria_enable =\n+\t\t\t\t1 << MLX5_MATCH_CRITERIA_ENABLE_MISC2_BIT;\n+\tflow_dv_match_meta_reg(mask.buf, value.buf, color_reg_c_idx,\n+\t\t\t       rte_col_2_mlx5_col(RTE_COLORS), UINT32_MAX);\n+\tdtb->color_matcher = mlx5_glue->dv_create_flow_matcher(sh->ctx,\n+\t\t\t\t\t\t\t       &dv_attr,\n+\t\t\t\t\t\t\t       dtb->tbl->obj);\n+\tif (!dtb->color_matcher) {\n+\t\tDRV_LOG(ERR, \"Failed to create meter policer color matcher.\");\n+\t\tgoto error_exit;\n+\t}\n+\tactions[i++] = mtb->drop_actn;\n+\t/* Default rule: lowest priority, match any, actions: drop. */\n+\tdtb->policer_rules[RTE_MTR_DROPPED] =\n+\t\t\tmlx5_glue->dv_create_flow(dtb->any_matcher,\n+\t\t\t\t\t\t (void *)&value, i, actions);\n+\tif (!dtb->policer_rules[RTE_MTR_DROPPED]) {\n+\t\tDRV_LOG(ERR, \"Failed to create meter policer drop rule.\");\n+\t\tgoto error_exit;\n+\t}\n+\treturn 0;\n+error_exit:\n+\treturn -1;\n+}\n+\n+/**\n+ * Create the needed meter and suffix tables.\n+ * Lock free, (mutex should be acquired by caller).\n+ *\n+ * @param[in] dev\n+ *   Pointer to Ethernet device.\n+ *\n+ * @return\n+ *   Pointer to table set on success, NULL otherwise and rte_errno is set.\n+ */\n+static struct mlx5_meter_domains_infos *\n+flow_dv_create_mtr_tbl(struct rte_eth_dev *dev)\n+{\n+\tstruct mlx5_priv *priv = dev->data->dev_private;\n+\tstruct mlx5_meter_domains_infos *mtb;\n+\tint ret;\n+\n+\tif (!priv->mtr_en) {\n+\t\trte_errno = ENOTSUP;\n+\t\treturn NULL;\n+\t}\n+\tmtb = rte_calloc(__func__, 1, sizeof(*mtb), 0);\n+\tif (!mtb) {\n+\t\tDRV_LOG(ERR, \"Failed to allocate memory for meter.\");\n+\t\treturn NULL;\n+\t}\n+\t/* Create drop action. */\n+\tmtb->drop_actn = mlx5_glue->dr_create_flow_action_drop();\n+\tif (!mtb->drop_actn) {\n+\t\tDRV_LOG(ERR, \"Failed to create drop action.\");\n+\t\tgoto error_exit;\n+\t}\n+\t/* Egress meter table. */\n+\tret = flow_dv_prepare_mtr_tables(dev, mtb, 1, 0, priv->mtr_color_reg);\n+\tif (ret) {\n+\t\tDRV_LOG(ERR, \"Failed to prepare egress meter table.\");\n+\t\tgoto error_exit;\n+\t}\n+\t/* Ingress meter table. */\n+\tret = flow_dv_prepare_mtr_tables(dev, mtb, 0, 0, priv->mtr_color_reg);\n+\tif (ret) {\n+\t\tDRV_LOG(ERR, \"Failed to prepare ingress meter table.\");\n+\t\tgoto error_exit;\n+\t}\n+\t/* FDB meter table. */\n+\tif (priv->config.dv_esw_en) {\n+\t\tret = flow_dv_prepare_mtr_tables(dev, mtb, 0, 1,\n+\t\t\t\t\t\t priv->mtr_color_reg);\n+\t\tif (ret) {\n+\t\t\tDRV_LOG(ERR, \"Failed to prepare fdb meter table.\");\n+\t\t\tgoto error_exit;\n+\t\t}\n+\t}\n+\treturn mtb;\n+error_exit:\n+\tflow_dv_destroy_mtr_tbl(dev, mtb);\n+\treturn NULL;\n+}\n+\n /*\n  * Mutex-protected thunk to lock-free  __flow_dv_translate().\n  */\n@@ -7639,6 +7897,8 @@ struct field_modify_info modify_tcp[] = {\n \t.remove = flow_dv_remove,\n \t.destroy = flow_dv_destroy,\n \t.query = flow_dv_query,\n+\t.create_mtr_tbls = flow_dv_create_mtr_tbl,\n+\t.destroy_mtr_tbls = flow_dv_destroy_mtr_tbl,\n };\n \n #endif /* HAVE_IBV_FLOW_DV_SUPPORT */\ndiff --git a/drivers/net/mlx5/mlx5_prm.h b/drivers/net/mlx5/mlx5_prm.h\nindex 3ebf191..ebedc90 100644\n--- a/drivers/net/mlx5/mlx5_prm.h\n+++ b/drivers/net/mlx5/mlx5_prm.h\n@@ -1768,6 +1768,14 @@ struct mlx5_mini_cqe8 {\n \tuint32_t byte_cnt;\n };\n \n+/* srTCM PRM flow meter parameters. */\n+enum {\n+\tMLX5_FLOW_COLOR_RED = 0,\n+\tMLX5_FLOW_COLOR_YELLOW,\n+\tMLX5_FLOW_COLOR_GREEN,\n+\tMLX5_FLOW_COLOR_UNDEFINED,\n+};\n+\n /* Maximum value of srTCM metering parameters. */\n #define MLX5_SRTCM_CBS_MAX (0xFF * (1ULL << 0x1F))\n #define MLX5_SRTCM_CIR_MAX (8 * (1ULL << 30) * 0xFF)\n",
    "prefixes": [
        "v2",
        "06/19"
    ]
}