get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 62725,
    "url": "http://patches.dpdk.org/api/patches/62725/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/1573184965-49691-14-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-14-git-send-email-suanmingm@mellanox.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/1573184965-49691-14-git-send-email-suanmingm@mellanox.com",
    "date": "2019-11-08T03:49:19",
    "name": "[v2,13/19] net/mlx5: add count action to meter",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": true,
    "hash": "0b78f357ee158efebd25fb57b419fe10aeec6353",
    "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-14-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/62725/comments/",
    "check": "fail",
    "checks": "http://patches.dpdk.org/api/patches/62725/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 80AB0A04AB;\n\tFri,  8 Nov 2019 04:51:31 +0100 (CET)",
            "from [92.243.14.124] (localhost [127.0.0.1])\n\tby dpdk.org (Postfix) with ESMTP id 6D0DF1BFFD;\n\tFri,  8 Nov 2019 04:50:00 +0100 (CET)",
            "from git-send-mailer.rdmz.labs.mlnx (unknown [37.142.13.130])\n by dpdk.org (Postfix) with ESMTP id 62C391BF52\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:19 +0200",
        "Message-Id": "<1573184965-49691-14-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 13/19] net/mlx5: add count action to meter",
        "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": "Add count action to meter for metering packet statistics. All the\npackets be colored and dropped will be recorded.\n\nSigned-off-by: Suanming Mou <suanmingm@mellanox.com>\n---\n drivers/net/mlx5/mlx5_flow.c       |  7 +++++--\n drivers/net/mlx5/mlx5_flow.h       | 18 ++++++++++++++++--\n drivers/net/mlx5/mlx5_flow_dv.c    | 16 +++++++++++++++-\n drivers/net/mlx5/mlx5_flow_meter.c | 18 +++++++++++++++++-\n 4 files changed, 53 insertions(+), 6 deletions(-)",
    "diff": "diff --git a/drivers/net/mlx5/mlx5_flow.c b/drivers/net/mlx5/mlx5_flow.c\nindex 750e58e..ee964b0 100644\n--- a/drivers/net/mlx5/mlx5_flow.c\n+++ b/drivers/net/mlx5/mlx5_flow.c\n@@ -4916,17 +4916,20 @@ struct rte_flow *\n  *\n  * @param[in] dev\n  *   Pointer to Ethernet device.\n+ * @param[in] fm\n+ *   Pointer to the flow meter.\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+mlx5_flow_create_mtr_tbls(struct rte_eth_dev *dev,\n+\t\t\t  const struct mlx5_flow_meter *fm)\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+\treturn fops->create_mtr_tbls(dev, fm);\n }\n \n /**\ndiff --git a/drivers/net/mlx5/mlx5_flow.h b/drivers/net/mlx5/mlx5_flow.h\nindex 0326330..cdcca7a 100644\n--- a/drivers/net/mlx5/mlx5_flow.h\n+++ b/drivers/net/mlx5/mlx5_flow.h\n@@ -531,6 +531,14 @@ struct mlx5_flow {\n /* Modify this value if enum rte_mtr_color changes. */\n #define RTE_MTR_DROPPED RTE_COLORS\n \n+/* Meter policer statistics */\n+struct mlx5_flow_policer_stats {\n+\tstruct mlx5_flow_counter *cnt[RTE_COLORS + 1];\n+\t/**< Color counter, extra for drop. */\n+\tuint64_t stats_mask;\n+\t/**< Statistics mask for the colors. */\n+};\n+\n /* Meter table structure. */\n struct mlx5_meter_domain_info {\n \tstruct mlx5_flow_tbl_resource *tbl;\n@@ -557,6 +565,8 @@ struct mlx5_meter_domains_infos {\n \t/**< FDB meter table. */\n \tvoid *drop_actn;\n \t/**< Drop action as not matched. */\n+\tvoid *count_actns[RTE_MTR_DROPPED + 1];\n+\t/**< Counters for match and unmatched statistics. */\n \tuint32_t fmp[MLX5_ST_SZ_DW(flow_meter_parameters)];\n \t/**< Flow meter parameter. */\n \tsize_t fmp_size;\n@@ -577,6 +587,8 @@ struct mlx5_flow_meter {\n \t/**< Meter profile parameters. */\n \tstruct mlx5_meter_domains_infos *mfts;\n \t/**< Flow table created for this meter. */\n+\tstruct mlx5_flow_policer_stats policer_stats;\n+\t/**< Meter policer statistics. */\n \tuint32_t ref_cnt;\n \t/**< Use count. */\n \tuint32_t active_state:1;\n@@ -653,7 +665,8 @@ typedef int (*mlx5_flow_query_t)(struct rte_eth_dev *dev,\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+\t\t\t\t\t    (struct rte_eth_dev *dev,\n+\t\t\t\t\t     const struct mlx5_flow_meter *fm);\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 typedef int (*mlx5_flow_create_policer_rules_t)\n@@ -814,7 +827,8 @@ int mlx5_flow_validate_item_geneve(const struct rte_flow_item *item,\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+\t\t\t\t\t(struct rte_eth_dev *dev,\n+\t\t\t\t\t const struct mlx5_flow_meter *fm);\n int mlx5_flow_destroy_mtr_tbls(struct rte_eth_dev *dev,\n \t\t\t       struct mlx5_meter_domains_infos *tbl);\n int mlx5_flow_create_policer_rules(struct rte_eth_dev *dev,\ndiff --git a/drivers/net/mlx5/mlx5_flow_dv.c b/drivers/net/mlx5/mlx5_flow_dv.c\nindex b273b6c..c03950e 100644\n--- a/drivers/net/mlx5/mlx5_flow_dv.c\n+++ b/drivers/net/mlx5/mlx5_flow_dv.c\n@@ -7756,6 +7756,8 @@ struct field_modify_info modify_tcp[] = {\n \t\tDRV_LOG(ERR, \"Failed to create meter policer color matcher.\");\n \t\tgoto error_exit;\n \t}\n+\tif (mtb->count_actns[RTE_MTR_DROPPED])\n+\t\tactions[i++] = mtb->count_actns[RTE_MTR_DROPPED];\n \tactions[i++] = mtb->drop_actn;\n \t/* Default rule: lowest priority, match any, actions: drop. */\n \tdtb->policer_rules[RTE_MTR_DROPPED] =\n@@ -7776,16 +7778,20 @@ struct field_modify_info modify_tcp[] = {\n  *\n  * @param[in] dev\n  *   Pointer to Ethernet device.\n+ * @param[in] fm\n+ *   Pointer to the flow meter.\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+flow_dv_create_mtr_tbl(struct rte_eth_dev *dev,\n+\t\t       const struct mlx5_flow_meter *fm)\n {\n \tstruct mlx5_priv *priv = dev->data->dev_private;\n \tstruct mlx5_meter_domains_infos *mtb;\n \tint ret;\n+\tint i;\n \n \tif (!priv->mtr_en) {\n \t\trte_errno = ENOTSUP;\n@@ -7796,6 +7802,12 @@ struct field_modify_info modify_tcp[] = {\n \t\tDRV_LOG(ERR, \"Failed to allocate memory for meter.\");\n \t\treturn NULL;\n \t}\n+\t/* Create meter count actions */\n+\tfor (i = 0; i <= RTE_MTR_DROPPED; i++) {\n+\t\tif (!fm->policer_stats.cnt[i])\n+\t\t\tcontinue;\n+\t\tmtb->count_actns[i] = fm->policer_stats.cnt[i]->action;\n+\t}\n \t/* Create drop action. */\n \tmtb->drop_actn = mlx5_glue->dr_create_flow_action_drop();\n \tif (!mtb->drop_actn) {\n@@ -7931,6 +7943,8 @@ struct field_modify_info modify_tcp[] = {\n \n \t\tflow_dv_match_meta_reg(matcher.buf, value.buf, mtr_reg_c,\n \t\t\t\t       rte_col_2_mlx5_col(i), UINT32_MAX);\n+\t\tif (mtb->count_actns[i])\n+\t\t\tactions[j++] = mtb->count_actns[i];\n \t\tif (fm->params.action[i] == MTR_POLICER_ACTION_DROP)\n \t\t\tactions[j++] = mtb->drop_actn;\n \t\telse\ndiff --git a/drivers/net/mlx5/mlx5_flow_meter.c b/drivers/net/mlx5/mlx5_flow_meter.c\nindex 7f64924..7645d92 100644\n--- a/drivers/net/mlx5/mlx5_flow_meter.c\n+++ b/drivers/net/mlx5/mlx5_flow_meter.c\n@@ -571,6 +571,7 @@\n \t\t\t\t.transfer = priv->config.dv_esw_en ? 1 : 0,\n \t\t\t};\n \tint ret;\n+\tunsigned int i;\n \n \tif (!priv->mtr_en)\n \t\treturn -rte_mtr_error_set(error, ENOTSUP,\n@@ -597,7 +598,13 @@\n \tfm->meter_id = meter_id;\n \tfm->profile = fmp;\n \tfm->params = *params;\n-\tfm->mfts = mlx5_flow_create_mtr_tbls(dev);\n+\t/* Alloc policer counters. */\n+\tfor (i = 0; i < RTE_DIM(fm->policer_stats.cnt); i++) {\n+\t\tfm->policer_stats.cnt[i] = mlx5_counter_alloc(dev);\n+\t\tif (!fm->policer_stats.cnt[i])\n+\t\t\tgoto error;\n+\t}\n+\tfm->mfts = mlx5_flow_create_mtr_tbls(dev, fm);\n \tif (!fm->mfts)\n \t\tgoto error;\n \tret = mlx5_flow_create_policer_rules(dev, fm, &attr);\n@@ -612,6 +619,10 @@\n error:\n \tmlx5_flow_destroy_policer_rules(dev, fm, &attr);\n \tmlx5_flow_destroy_mtr_tbls(dev, fm->mfts);\n+\t/* Free policer counters. */\n+\tfor (i = 0; i < RTE_DIM(fm->policer_stats.cnt); i++)\n+\t\tif (fm->policer_stats.cnt[i])\n+\t\t\tmlx5_counter_free(dev, fm->policer_stats.cnt[i]);\n \trte_free(fm);\n \treturn -rte_mtr_error_set(error, -ret,\n \t\t\t\t  RTE_MTR_ERROR_TYPE_UNSPECIFIED,\n@@ -644,6 +655,7 @@\n \t\t\t\t.egress = 1,\n \t\t\t\t.transfer = priv->config.dv_esw_en ? 1 : 0,\n \t\t\t};\n+\tunsigned int i;\n \n \tif (!priv->mtr_en)\n \t\treturn -rte_mtr_error_set(error, ENOTSUP,\n@@ -667,6 +679,10 @@\n \tfmp->ref_cnt--;\n \t/* Remove from the flow meter list. */\n \tTAILQ_REMOVE(fms, fm, next);\n+\t/* Free policer counters. */\n+\tfor (i = 0; i < RTE_DIM(fm->policer_stats.cnt); i++)\n+\t\tif (fm->policer_stats.cnt[i])\n+\t\t\tmlx5_counter_free(dev, fm->policer_stats.cnt[i]);\n \t/* Free meter flow table */\n \tmlx5_flow_destroy_policer_rules(dev, fm, &attr);\n \tmlx5_flow_destroy_mtr_tbls(dev, fm->mfts);\n",
    "prefixes": [
        "v2",
        "13/19"
    ]
}