get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 71752,
    "url": "http://patches.dpdk.org/api/patches/71752/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/1592506784-441548-4-git-send-email-matan@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": "<1592506784-441548-4-git-send-email-matan@mellanox.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/1592506784-441548-4-git-send-email-matan@mellanox.com",
    "date": "2020-06-18T18:59:43",
    "name": "[v4,3/4] vdpa/mlx5: support virtio queue statistics get",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": true,
    "hash": "98b4243c3d4869482b83e74fdf91998901ee7c55",
    "submitter": {
        "id": 796,
        "url": "http://patches.dpdk.org/api/people/796/?format=api",
        "name": "Matan Azrad",
        "email": "matan@mellanox.com"
    },
    "delegate": {
        "id": 2642,
        "url": "http://patches.dpdk.org/api/users/2642/?format=api",
        "username": "mcoquelin",
        "first_name": "Maxime",
        "last_name": "Coquelin",
        "email": "maxime.coquelin@redhat.com"
    },
    "mbox": "http://patches.dpdk.org/project/dpdk/patch/1592506784-441548-4-git-send-email-matan@mellanox.com/mbox/",
    "series": [
        {
            "id": 10508,
            "url": "http://patches.dpdk.org/api/series/10508/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=10508",
            "date": "2020-06-18T18:59:40",
            "name": "vhost: support vDPA virtio queue statistics",
            "version": 4,
            "mbox": "http://patches.dpdk.org/series/10508/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/71752/comments/",
    "check": "fail",
    "checks": "http://patches.dpdk.org/api/patches/71752/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 03C16A04F1;\n\tThu, 18 Jun 2020 21:00:22 +0200 (CEST)",
            "from [92.243.14.124] (localhost [127.0.0.1])\n\tby dpdk.org (Postfix) with ESMTP id 18BDB1BFF8;\n\tThu, 18 Jun 2020 21:00:08 +0200 (CEST)",
            "from mellanox.co.il (mail-il-dmz.mellanox.com [193.47.165.129])\n by dpdk.org (Postfix) with ESMTP id F16321BFE8\n for <dev@dpdk.org>; Thu, 18 Jun 2020 21:00:06 +0200 (CEST)",
            "from Internal Mail-Server by MTLPINE1 (envelope-from\n matan@mellanox.com) with SMTP; 18 Jun 2020 22:00:04 +0300",
            "from pegasus25.mtr.labs.mlnx. (pegasus25.mtr.labs.mlnx\n [10.210.16.10])\n by labmailer.mlnx (8.13.8/8.13.8) with ESMTP id 05IIxoPp016515;\n Thu, 18 Jun 2020 22:00:04 +0300"
        ],
        "From": "Matan Azrad <matan@mellanox.com>",
        "To": "Maxime Coquelin <maxime.coquelin@redhat.com>,\n Xiao Wang <xiao.w.wang@intel.com>",
        "Cc": "dev@dpdk.org",
        "Date": "Thu, 18 Jun 2020 18:59:43 +0000",
        "Message-Id": "<1592506784-441548-4-git-send-email-matan@mellanox.com>",
        "X-Mailer": "git-send-email 1.8.3.1",
        "In-Reply-To": "<1592506784-441548-1-git-send-email-matan@mellanox.com>",
        "References": "<01591112869-78828-1-git-send-email-matan@mellanox.com>\n <1592506784-441548-1-git-send-email-matan@mellanox.com>",
        "Subject": "[dpdk-dev] [PATCH v4 3/4] vdpa/mlx5: support virtio queue\n\tstatistics get",
        "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 support for statistics operations.\n\nA DevX counter object is allocated per virtq in order to manage the\nvirtq statistics.\n\nThe counter object is allocated before the virtq creation and destroyed\nafter it, so the statistics are valid only in the life time of the\nvirtq.\n\nSigned-off-by: Matan Azrad <matan@mellanox.com>\nReviewed-by: Maxime Coquelin <maxime.coquelin@redhat.com>\n---\n doc/guides/rel_notes/release_20_08.rst |  8 +++\n doc/guides/vdpadevs/features/mlx5.ini  |  1 +\n drivers/vdpa/mlx5/mlx5_vdpa.c          | 85 ++++++++++++++++++++++++++++++\n drivers/vdpa/mlx5/mlx5_vdpa.h          | 45 ++++++++++++++++\n drivers/vdpa/mlx5/mlx5_vdpa_virtq.c    | 94 ++++++++++++++++++++++++++++++++++\n 5 files changed, 233 insertions(+)",
    "diff": "diff --git a/doc/guides/rel_notes/release_20_08.rst b/doc/guides/rel_notes/release_20_08.rst\nindex 1d9bd5c..e2c93b1 100644\n--- a/doc/guides/rel_notes/release_20_08.rst\n+++ b/doc/guides/rel_notes/release_20_08.rst\n@@ -74,6 +74,14 @@ New Features\n      names and to reset them by a vDPA device.\n \n \n+   * **Updated Mellanox mlx5 vDPA driver.**\n+\n+     Updated Mellanox mlx5 vDPA driver with new features, including:\n+\n+     * Added support for virtio queue statistics.\n+\n+\n+\n Removed Items\n -------------\n \ndiff --git a/doc/guides/vdpadevs/features/mlx5.ini b/doc/guides/vdpadevs/features/mlx5.ini\nindex 1da9c1b..788d4e0 100644\n--- a/doc/guides/vdpadevs/features/mlx5.ini\n+++ b/doc/guides/vdpadevs/features/mlx5.ini\n@@ -17,6 +17,7 @@ packed               = Y\n proto mq             = Y\n proto log shmfd      = Y\n proto host notifier  = Y\n+queue statistics     = Y\n Other kdrv           = Y\n ARMv8                = Y\n Power8               = Y\ndiff --git a/drivers/vdpa/mlx5/mlx5_vdpa.c b/drivers/vdpa/mlx5/mlx5_vdpa.c\nindex 1113d6c..a80e3f4 100644\n--- a/drivers/vdpa/mlx5/mlx5_vdpa.c\n+++ b/drivers/vdpa/mlx5/mlx5_vdpa.c\n@@ -8,6 +8,7 @@\n #include <rte_errno.h>\n #include <rte_bus_pci.h>\n #include <rte_pci.h>\n+#include <rte_string_fns.h>\n \n #include <mlx5_glue.h>\n #include <mlx5_common.h>\n@@ -274,6 +275,85 @@\n \treturn 0;\n }\n \n+static int\n+mlx5_vdpa_get_stats_names(int did, struct rte_vdpa_stat_name *stats_names,\n+\t\t\t  unsigned int size)\n+{\n+\tstatic const char *mlx5_vdpa_stats_names[MLX5_VDPA_STATS_MAX] = {\n+\t\t\"received_descriptors\",\n+\t\t\"completed_descriptors\",\n+\t\t\"bad descriptor errors\",\n+\t\t\"exceed max chain\",\n+\t\t\"invalid buffer\",\n+\t\t\"completion errors\",\n+\t};\n+\tstruct mlx5_vdpa_priv *priv = mlx5_vdpa_find_priv_resource_by_did(did);\n+\tunsigned int i;\n+\n+\tif (priv == NULL) {\n+\t\tDRV_LOG(ERR, \"Invalid device id: %d.\", did);\n+\t\treturn -ENODEV;\n+\t}\n+\tif (!stats_names)\n+\t\treturn MLX5_VDPA_STATS_MAX;\n+\tsize = RTE_MIN(size, (unsigned int)MLX5_VDPA_STATS_MAX);\n+\tfor (i = 0; i < size; ++i)\n+\t\tstrlcpy(stats_names[i].name, mlx5_vdpa_stats_names[i],\n+\t\t\tRTE_VDPA_STATS_NAME_SIZE);\n+\treturn size;\n+}\n+\n+static int\n+mlx5_vdpa_get_stats(int did, int qid, struct rte_vdpa_stat *stats,\n+\t\t    unsigned int n)\n+{\n+\tstruct mlx5_vdpa_priv *priv = mlx5_vdpa_find_priv_resource_by_did(did);\n+\n+\tif (priv == NULL) {\n+\t\tDRV_LOG(ERR, \"Invalid device id: %d.\", did);\n+\t\treturn -ENODEV;\n+\t}\n+\tif (!priv->configured) {\n+\t\tDRV_LOG(ERR, \"Device %d was not configured.\", did);\n+\t\treturn -ENODATA;\n+\t}\n+\tif (qid >= (int)priv->nr_virtqs) {\n+\t\tDRV_LOG(ERR, \"Too big vring id: %d.\", qid);\n+\t\treturn -E2BIG;\n+\t}\n+\tif (!priv->caps.queue_counters_valid) {\n+\t\tDRV_LOG(ERR, \"Virtq statistics is not supported for device %d.\",\n+\t\t\tdid);\n+\t\treturn -ENOTSUP;\n+\t}\n+\treturn mlx5_vdpa_virtq_stats_get(priv, qid, stats, n);\n+}\n+\n+static int\n+mlx5_vdpa_reset_stats(int did, int qid)\n+{\n+\tstruct mlx5_vdpa_priv *priv = mlx5_vdpa_find_priv_resource_by_did(did);\n+\n+\tif (priv == NULL) {\n+\t\tDRV_LOG(ERR, \"Invalid device id: %d.\", did);\n+\t\treturn -ENODEV;\n+\t}\n+\tif (!priv->configured) {\n+\t\tDRV_LOG(ERR, \"Device %d was not configured.\", did);\n+\t\treturn -ENODATA;\n+\t}\n+\tif (qid >= (int)priv->nr_virtqs) {\n+\t\tDRV_LOG(ERR, \"Too big vring id: %d.\", qid);\n+\t\treturn -E2BIG;\n+\t}\n+\tif (!priv->caps.queue_counters_valid) {\n+\t\tDRV_LOG(ERR, \"Virtq statistics is not supported for device %d.\",\n+\t\t\tdid);\n+\t\treturn -ENOTSUP;\n+\t}\n+\treturn mlx5_vdpa_virtq_stats_reset(priv, qid);\n+}\n+\n static struct rte_vdpa_dev_ops mlx5_vdpa_ops = {\n \t.get_queue_num = mlx5_vdpa_get_queue_num,\n \t.get_features = mlx5_vdpa_get_vdpa_features,\n@@ -286,6 +366,9 @@\n \t.get_vfio_group_fd = NULL,\n \t.get_vfio_device_fd = mlx5_vdpa_get_device_fd,\n \t.get_notify_area = mlx5_vdpa_get_notify_area,\n+\t.get_stats_names = mlx5_vdpa_get_stats_names,\n+\t.get_stats = mlx5_vdpa_get_stats,\n+\t.reset_stats = mlx5_vdpa_reset_stats,\n };\n \n static struct ibv_device *\n@@ -489,6 +572,8 @@\n \t\trte_errno = ENOTSUP;\n \t\tgoto error;\n \t}\n+\tif (!attr.vdpa.queue_counters_valid)\n+\t\tDRV_LOG(DEBUG, \"No capability to support virtq statistics.\");\n \tpriv = rte_zmalloc(\"mlx5 vDPA device private\", sizeof(*priv) +\n \t\t\t   sizeof(struct mlx5_vdpa_virtq) *\n \t\t\t   attr.vdpa.max_num_virtio_queues * 2,\ndiff --git a/drivers/vdpa/mlx5/mlx5_vdpa.h b/drivers/vdpa/mlx5/mlx5_vdpa.h\nindex fcc216a..80b4c4b 100644\n--- a/drivers/vdpa/mlx5/mlx5_vdpa.h\n+++ b/drivers/vdpa/mlx5/mlx5_vdpa.h\n@@ -76,6 +76,7 @@ struct mlx5_vdpa_virtq {\n \tuint16_t vq_size;\n \tstruct mlx5_vdpa_priv *priv;\n \tstruct mlx5_devx_obj *virtq;\n+\tstruct mlx5_devx_obj *counters;\n \tstruct mlx5_vdpa_event_qp eqp;\n \tstruct {\n \t\tstruct mlx5dv_devx_umem *obj;\n@@ -83,6 +84,7 @@ struct mlx5_vdpa_virtq {\n \t\tuint32_t size;\n \t} umems[3];\n \tstruct rte_intr_handle intr_handle;\n+\tstruct mlx5_devx_virtio_q_couners_attr reset;\n };\n \n struct mlx5_vdpa_steer {\n@@ -127,6 +129,16 @@ struct mlx5_vdpa_priv {\n \tstruct mlx5_vdpa_virtq virtqs[];\n };\n \n+enum {\n+\tMLX5_VDPA_STATS_RECEIVED_DESCRIPTORS,\n+\tMLX5_VDPA_STATS_COMPLETED_DESCRIPTORS,\n+\tMLX5_VDPA_STATS_BAD_DESCRIPTOR_ERRORS,\n+\tMLX5_VDPA_STATS_EXCEED_MAX_CHAIN,\n+\tMLX5_VDPA_STATS_INVALID_BUFFER,\n+\tMLX5_VDPA_STATS_COMPLETION_ERRORS,\n+\tMLX5_VDPA_STATS_MAX\n+};\n+\n /*\n  * Check whether virtq is for traffic receive.\n  * According to VIRTIO_NET Spec the virtqueues index identity its type by:\n@@ -352,4 +364,37 @@ int mlx5_vdpa_dirty_bitmap_set(struct mlx5_vdpa_priv *priv, uint64_t log_base,\n  */\n int mlx5_vdpa_virtq_stop(struct mlx5_vdpa_priv *priv, int index);\n \n+/**\n+ * Get virtq statistics.\n+ *\n+ * @param[in] priv\n+ *   The vdpa driver private structure.\n+ * @param[in] qid\n+ *   The virtq index.\n+ * @param stats\n+ *   The virtq statistics array to fill.\n+ * @param n\n+ *   The number of elements in @p stats array.\n+ *\n+ * @return\n+ *   A negative value on error, otherwise the number of entries filled in the\n+ *   @p stats array.\n+ */\n+int\n+mlx5_vdpa_virtq_stats_get(struct mlx5_vdpa_priv *priv, int qid,\n+\t\t\t  struct rte_vdpa_stat *stats, unsigned int n);\n+\n+/**\n+ * Reset virtq statistics.\n+ *\n+ * @param[in] priv\n+ *   The vdpa driver private structure.\n+ * @param[in] qid\n+ *   The virtq index.\n+ *\n+ * @return\n+ *   A negative value on error, otherwise 0.\n+ */\n+int\n+mlx5_vdpa_virtq_stats_reset(struct mlx5_vdpa_priv *priv, int qid);\n #endif /* RTE_PMD_MLX5_VDPA_H_ */\ndiff --git a/drivers/vdpa/mlx5/mlx5_vdpa_virtq.c b/drivers/vdpa/mlx5/mlx5_vdpa_virtq.c\nindex bd48460..e99d82c 100644\n--- a/drivers/vdpa/mlx5/mlx5_vdpa_virtq.c\n+++ b/drivers/vdpa/mlx5/mlx5_vdpa_virtq.c\n@@ -72,6 +72,11 @@\n \t\t\trte_free(virtq->umems[i].buf);\n \t}\n \tmemset(&virtq->umems, 0, sizeof(virtq->umems));\n+\tif (virtq->counters) {\n+\t\tclaim_zero(mlx5_devx_cmd_destroy(virtq->counters));\n+\t\tvirtq->counters = NULL;\n+\t}\n+\tmemset(&virtq->reset, 0, sizeof(virtq->reset));\n \tif (virtq->eqp.fw_qp)\n \t\tmlx5_vdpa_event_qp_destroy(&virtq->eqp);\n \treturn 0;\n@@ -205,6 +210,16 @@\n \t\tDRV_LOG(INFO, \"Virtq %d is, for sure, working by poll mode, no\"\n \t\t\t\" need event QPs and event mechanism.\", index);\n \t}\n+\tif (priv->caps.queue_counters_valid) {\n+\t\tvirtq->counters = mlx5_devx_cmd_create_virtio_q_counters\n+\t\t\t\t\t\t\t\t    (priv->ctx);\n+\t\tif (!virtq->counters) {\n+\t\t\tDRV_LOG(ERR, \"Failed to create virtq couners for virtq\"\n+\t\t\t\t\" %d.\", index);\n+\t\t\tgoto error;\n+\t\t}\n+\t\tattr.counters_obj_id = virtq->counters->id;\n+\t}\n \t/* Setup 3 UMEMs for each virtq. */\n \tfor (i = 0; i < RTE_DIM(virtq->umems); ++i) {\n \t\tvirtq->umems[i].size = priv->caps.umems[i].a * vq.size +\n@@ -455,3 +470,82 @@\n \t}\n \treturn 0;\n }\n+\n+int\n+mlx5_vdpa_virtq_stats_get(struct mlx5_vdpa_priv *priv, int qid,\n+\t\t\t  struct rte_vdpa_stat *stats, unsigned int n)\n+{\n+\tstruct mlx5_vdpa_virtq *virtq = &priv->virtqs[qid];\n+\tstruct mlx5_devx_virtio_q_couners_attr attr = {0};\n+\tint ret;\n+\n+\tif (!virtq->virtq || !virtq->enable) {\n+\t\tDRV_LOG(ERR, \"Failed to read virtq %d statistics - virtq \"\n+\t\t\t\"is invalid.\", qid);\n+\t\treturn -EINVAL;\n+\t}\n+\tMLX5_ASSERT(virtq->counters);\n+\tret = mlx5_devx_cmd_query_virtio_q_counters(virtq->counters, &attr);\n+\tif (ret) {\n+\t\tDRV_LOG(ERR, \"Failed to read virtq %d stats from HW.\", qid);\n+\t\treturn ret;\n+\t}\n+\tret = (int)RTE_MIN(n, (unsigned int)MLX5_VDPA_STATS_MAX);\n+\tif (ret == MLX5_VDPA_STATS_RECEIVED_DESCRIPTORS)\n+\t\treturn ret;\n+\tstats[MLX5_VDPA_STATS_RECEIVED_DESCRIPTORS] = (struct rte_vdpa_stat) {\n+\t\t.id = MLX5_VDPA_STATS_RECEIVED_DESCRIPTORS,\n+\t\t.value = attr.received_desc - virtq->reset.received_desc,\n+\t};\n+\tif (ret == MLX5_VDPA_STATS_COMPLETED_DESCRIPTORS)\n+\t\treturn ret;\n+\tstats[MLX5_VDPA_STATS_COMPLETED_DESCRIPTORS] = (struct rte_vdpa_stat) {\n+\t\t.id = MLX5_VDPA_STATS_COMPLETED_DESCRIPTORS,\n+\t\t.value = attr.completed_desc - virtq->reset.completed_desc,\n+\t};\n+\tif (ret == MLX5_VDPA_STATS_BAD_DESCRIPTOR_ERRORS)\n+\t\treturn ret;\n+\tstats[MLX5_VDPA_STATS_BAD_DESCRIPTOR_ERRORS] = (struct rte_vdpa_stat) {\n+\t\t.id = MLX5_VDPA_STATS_BAD_DESCRIPTOR_ERRORS,\n+\t\t.value = attr.bad_desc_errors - virtq->reset.bad_desc_errors,\n+\t};\n+\tif (ret == MLX5_VDPA_STATS_EXCEED_MAX_CHAIN)\n+\t\treturn ret;\n+\tstats[MLX5_VDPA_STATS_EXCEED_MAX_CHAIN] = (struct rte_vdpa_stat) {\n+\t\t.id = MLX5_VDPA_STATS_EXCEED_MAX_CHAIN,\n+\t\t.value = attr.exceed_max_chain - virtq->reset.exceed_max_chain,\n+\t};\n+\tif (ret == MLX5_VDPA_STATS_INVALID_BUFFER)\n+\t\treturn ret;\n+\tstats[MLX5_VDPA_STATS_INVALID_BUFFER] = (struct rte_vdpa_stat) {\n+\t\t.id = MLX5_VDPA_STATS_INVALID_BUFFER,\n+\t\t.value = attr.invalid_buffer - virtq->reset.invalid_buffer,\n+\t};\n+\tif (ret == MLX5_VDPA_STATS_COMPLETION_ERRORS)\n+\t\treturn ret;\n+\tstats[MLX5_VDPA_STATS_COMPLETION_ERRORS] = (struct rte_vdpa_stat) {\n+\t\t.id = MLX5_VDPA_STATS_COMPLETION_ERRORS,\n+\t\t.value = attr.error_cqes - virtq->reset.error_cqes,\n+\t};\n+\treturn ret;\n+}\n+\n+int\n+mlx5_vdpa_virtq_stats_reset(struct mlx5_vdpa_priv *priv, int qid)\n+{\n+\tstruct mlx5_vdpa_virtq *virtq = &priv->virtqs[qid];\n+\tint ret;\n+\n+\tif (!virtq->virtq || !virtq->enable) {\n+\t\tDRV_LOG(ERR, \"Failed to read virtq %d statistics - virtq \"\n+\t\t\t\"is invalid.\", qid);\n+\t\treturn -EINVAL;\n+\t}\n+\tMLX5_ASSERT(virtq->counters);\n+\tret = mlx5_devx_cmd_query_virtio_q_counters(virtq->counters,\n+\t\t\t\t\t\t    &virtq->reset);\n+\tif (ret)\n+\t\tDRV_LOG(ERR, \"Failed to read virtq %d reset stats from HW.\",\n+\t\t\tqid);\n+\treturn ret;\n+}\n",
    "prefixes": [
        "v4",
        "3/4"
    ]
}