get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 67382,
    "url": "http://patches.dpdk.org/api/patches/67382/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/20200330030210.21595-1-jiaweiw@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": "<20200330030210.21595-1-jiaweiw@mellanox.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20200330030210.21595-1-jiaweiw@mellanox.com",
    "date": "2020-03-30T03:02:10",
    "name": "net/mlx5: fix imissed counter overflow issue",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": true,
    "hash": "4cff8cec50014440a5c75b441bd92bbf8d192f34",
    "submitter": {
        "id": 1648,
        "url": "http://patches.dpdk.org/api/people/1648/?format=api",
        "name": "Jiawei Wang",
        "email": "jiaweiw@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/20200330030210.21595-1-jiaweiw@mellanox.com/mbox/",
    "series": [
        {
            "id": 9087,
            "url": "http://patches.dpdk.org/api/series/9087/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=9087",
            "date": "2020-03-30T03:02:10",
            "name": "net/mlx5: fix imissed counter overflow issue",
            "version": 1,
            "mbox": "http://patches.dpdk.org/series/9087/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/67382/comments/",
    "check": "success",
    "checks": "http://patches.dpdk.org/api/patches/67382/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 0A112A0562;\n\tMon, 30 Mar 2020 05:02:17 +0200 (CEST)",
            "from [92.243.14.124] (localhost [127.0.0.1])\n\tby dpdk.org (Postfix) with ESMTP id 417192C15;\n\tMon, 30 Mar 2020 05:02:17 +0200 (CEST)",
            "from git-send-mailer.rdmz.labs.mlnx (unknown [37.142.13.130])\n by dpdk.org (Postfix) with ESMTP id 1E159FFA;\n Mon, 30 Mar 2020 05:02:16 +0200 (CEST)"
        ],
        "From": "Jiawei Wang <jiaweiw@mellanox.com>",
        "To": "viacheslavo@mellanox.com,\n\tmatan@mellanox.com,\n\tjiaweiw@mellanox.com",
        "Cc": "rasland@mellanox.com,\n\tdev@dpdk.org,\n\tstable@dpdk.org",
        "Date": "Mon, 30 Mar 2020 06:02:10 +0300",
        "Message-Id": "<20200330030210.21595-1-jiaweiw@mellanox.com>",
        "X-Mailer": "git-send-email 2.21.0",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "Subject": "[dpdk-dev] [PATCH] net/mlx5: fix imissed counter overflow issue",
        "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": "The Hw counters is defined as 32bit unsigned value and read from\nthe sysfs. Firstly read the base value while application start,\nthen fetch the new value while do query and minus the base value.\nIf the new value is less than base value, will result in the a\nnegative value and convert to the big value as unsigned 64bit.\n\nPMD add xstats field to store the last successfully read counter,\nuse it if failed to read hw counter from sysfs.\nPMD also record the last output value to handle the wrap around case,\nif overflow happened, increase the wrap count by 1 and save into the\nhigher 32bit, and update the new value into lower 32bit, finally\nreturn the 64bit counter value.\n\nFixes: ce9494d76c4 (\"net/mlx5: report imissed statistics\")\nCc: stable@dpdk.org\n\nSigned-off-by: Jiawei Wang <jiaweiw@mellanox.com>\n---\n drivers/net/mlx5/mlx5.h       |  3 ++\n drivers/net/mlx5/mlx5_stats.c | 57 ++++++++++++++++++++++++++++++-----\n 2 files changed, 52 insertions(+), 8 deletions(-)",
    "diff": "diff --git a/drivers/net/mlx5/mlx5.h b/drivers/net/mlx5/mlx5.h\nindex d7c519bae0..c01fae8c8e 100644\n--- a/drivers/net/mlx5/mlx5.h\n+++ b/drivers/net/mlx5/mlx5.h\n@@ -112,12 +112,15 @@ struct mlx5_xstats_ctrl {\n \t/* Index in the device counters table. */\n \tuint16_t dev_table_idx[MLX5_MAX_XSTATS];\n \tuint64_t base[MLX5_MAX_XSTATS];\n+\tuint64_t xstats[MLX5_MAX_XSTATS];\n+\tuint64_t hw_stats[MLX5_MAX_XSTATS];\n \tstruct mlx5_counter_ctrl info[MLX5_MAX_XSTATS];\n };\n \n struct mlx5_stats_ctrl {\n \t/* Base for imissed counter. */\n \tuint64_t imissed_base;\n+\tuint64_t imissed;\n };\n \n /* Flow list . */\ndiff --git a/drivers/net/mlx5/mlx5_stats.c b/drivers/net/mlx5/mlx5_stats.c\nindex 7603502967..5bc6fa6aa1 100644\n--- a/drivers/net/mlx5/mlx5_stats.c\n+++ b/drivers/net/mlx5/mlx5_stats.c\n@@ -139,7 +139,7 @@ static const struct mlx5_counter_ctrl mlx5_counters_init[] = {\n \n static const unsigned int xstats_n = RTE_DIM(mlx5_counters_init);\n \n-static inline void\n+static inline int\n mlx5_read_ib_stat(struct mlx5_priv *priv, const char *ctr_name, uint64_t *stat)\n {\n \tFILE *file;\n@@ -155,10 +155,11 @@ mlx5_read_ib_stat(struct mlx5_priv *priv, const char *ctr_name, uint64_t *stat)\n \n \t\t\tfclose(file);\n \t\t\tif (n == 1)\n-\t\t\t\treturn;\n+\t\t\t\treturn 0;\n \t\t}\n \t}\n \t*stat = 0;\n+\treturn 1;\n }\n \n /**\n@@ -197,8 +198,14 @@ mlx5_read_dev_counters(struct rte_eth_dev *dev, uint64_t *stats)\n \t}\n \tfor (i = 0; i != xstats_ctrl->mlx5_stats_n; ++i) {\n \t\tif (xstats_ctrl->info[i].ib) {\n-\t\t\tmlx5_read_ib_stat(priv, xstats_ctrl->info[i].ctr_name,\n-\t\t\t\t\t  &stats[i]);\n+\t\t\tret = mlx5_read_ib_stat(priv,\n+\t\t\t\t\t\txstats_ctrl->info[i].ctr_name,\n+\t\t\t\t\t\t&stats[i]);\n+\t\t\t/* return last xstats counter if fail to read. */\n+\t\t\tif (ret == 0)\n+\t\t\t\txstats_ctrl->xstats[i] = stats[i];\n+\t\t\telse\n+\t\t\t\tstats[i] = xstats_ctrl->xstats[i];\n \t\t} else {\n \t\t\tstats[i] = (uint64_t)\n \t\t\t\tet_stats->data[xstats_ctrl->dev_table_idx[i]];\n@@ -304,6 +311,7 @@ mlx5_stats_init(struct rte_eth_dev *dev)\n \t\t\tunsigned int idx = xstats_ctrl->mlx5_stats_n++;\n \n \t\t\txstats_ctrl->info[idx] = mlx5_counters_init[i];\n+\t\t\txstats_ctrl->hw_stats[idx] = 0;\n \t\t}\n \t}\n \tMLX5_ASSERT(xstats_ctrl->mlx5_stats_n <= MLX5_MAX_XSTATS);\n@@ -314,6 +322,7 @@ mlx5_stats_init(struct rte_eth_dev *dev)\n \t\tDRV_LOG(ERR, \"port %u cannot read device counters: %s\",\n \t\t\tdev->data->port_id, strerror(rte_errno));\n \tmlx5_read_ib_stat(priv, \"out_of_buffer\", &stats_ctrl->imissed_base);\n+\tstats_ctrl->imissed = 0;\n free:\n \trte_free(strings);\n }\n@@ -356,7 +365,23 @@ mlx5_xstats_get(struct rte_eth_dev *dev, struct rte_eth_xstat *stats,\n \t\t\treturn ret;\n \t\tfor (i = 0; i != mlx5_stats_n; ++i) {\n \t\t\tstats[i].id = i;\n-\t\t\tstats[i].value = (counters[i] - xstats_ctrl->base[i]);\n+\t\t\tif (xstats_ctrl->info[i].ib) {\n+\t\t\t\tuint64_t wrap_n;\n+\t\t\t\tuint64_t hw_stat = xstats_ctrl->hw_stats[i];\n+\n+\t\t\t\tstats[i].value = (counters[i] -\n+\t\t\t\t\t\t  xstats_ctrl->base[i]) &\n+\t\t\t\t\t\t  (uint64_t)UINT32_MAX;\n+\t\t\t\twrap_n = hw_stat >> 32;\n+\t\t\t\tif (stats[i].value <\n+\t\t\t\t\t    (hw_stat & (uint64_t)UINT32_MAX))\n+\t\t\t\t\twrap_n++;\n+\t\t\t\tstats[i].value |= (wrap_n) << 32;\n+\t\t\t\txstats_ctrl->hw_stats[i] = stats[i].value;\n+\t\t\t} else {\n+\t\t\t\tstats[i].value =\n+\t\t\t\t\t(counters[i] - xstats_ctrl->base[i]);\n+\t\t\t}\n \t\t}\n \t}\n \treturn mlx5_stats_n;\n@@ -378,9 +403,12 @@ int\n mlx5_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)\n {\n \tstruct mlx5_priv *priv = dev->data->dev_private;\n+\tstruct mlx5_stats_ctrl *stats_ctrl = &priv->stats_ctrl;\n \tstruct rte_eth_stats tmp;\n \tunsigned int i;\n \tunsigned int idx;\n+\tuint64_t wrap_n;\n+\tint ret;\n \n \tmemset(&tmp, 0, sizeof(tmp));\n \t/* Add software counters. */\n@@ -423,8 +451,18 @@ mlx5_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)\n #endif\n \t\ttmp.oerrors += txq->stats.oerrors;\n \t}\n-\tmlx5_read_ib_stat(priv, \"out_of_buffer\", &tmp.imissed);\n-\ttmp.imissed -= priv->stats_ctrl.imissed_base;\n+\tret = mlx5_read_ib_stat(priv, \"out_of_buffer\", &tmp.imissed);\n+\tif (ret == 0) {\n+\t\ttmp.imissed = (tmp.imissed - stats_ctrl->imissed_base) &\n+\t\t\t\t (uint64_t)UINT32_MAX;\n+\t\twrap_n = stats_ctrl->imissed >> 32;\n+\t\tif (tmp.imissed < (stats_ctrl->imissed & (uint64_t)UINT32_MAX))\n+\t\t\twrap_n++;\n+\t\ttmp.imissed |= (wrap_n) << 32;\n+\t\tstats_ctrl->imissed = tmp.imissed;\n+\t} else {\n+\t\ttmp.imissed = stats_ctrl->imissed;\n+\t}\n #ifndef MLX5_PMD_SOFT_COUNTERS\n \t/* FIXME: retrieve and add hardware counters. */\n #endif\n@@ -461,6 +499,7 @@ mlx5_stats_reset(struct rte_eth_dev *dev)\n \t\t       sizeof(struct mlx5_txq_stats));\n \t}\n \tmlx5_read_ib_stat(priv, \"out_of_buffer\", &stats_ctrl->imissed_base);\n+\tstats_ctrl->imissed = 0;\n #ifndef MLX5_PMD_SOFT_COUNTERS\n \t/* FIXME: reset hardware counters. */\n #endif\n@@ -503,8 +542,10 @@ mlx5_xstats_reset(struct rte_eth_dev *dev)\n \t\t\tdev->data->port_id, strerror(rte_errno));\n \t\treturn ret;\n \t}\n-\tfor (i = 0; i != n; ++i)\n+\tfor (i = 0; i != n; ++i) {\n \t\txstats_ctrl->base[i] = counters[i];\n+\t\txstats_ctrl->hw_stats[i] = 0;\n+\t}\n \n \treturn 0;\n }\n",
    "prefixes": []
}