From mboxrd@z Thu Jan  1 00:00:00 1970
Return-Path: <dev-bounces@dpdk.org>
Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124])
	by inbox.dpdk.org (Postfix) with ESMTP id 30E1241C25;
	Mon,  6 Feb 2023 21:26:19 +0100 (CET)
Received: from mails.dpdk.org (localhost [127.0.0.1])
	by mails.dpdk.org (Postfix) with ESMTP id 5701E42D73;
	Mon,  6 Feb 2023 21:25:54 +0100 (CET)
Received: from mx0b-0016f401.pphosted.com (mx0b-0016f401.pphosted.com
 [67.231.156.173])
 by mails.dpdk.org (Postfix) with ESMTP id 23E7C40A7D
 for <dev@dpdk.org>; Mon,  6 Feb 2023 21:25:53 +0100 (CET)
Received: from pps.filterd (m0045851.ppops.net [127.0.0.1])
 by mx0b-0016f401.pphosted.com (8.17.1.19/8.17.1.19) with ESMTP id
 316F9xix017823; Mon, 6 Feb 2023 12:25:52 -0800
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=marvell.com;
 h=from : to : cc :
 subject : date : message-id : in-reply-to : references : mime-version :
 content-transfer-encoding : content-type; s=pfpt0220;
 bh=18bGhpyUIGk67DVoP4XB++cAfukLSJ/Vu6EvbKLxRhY=;
 b=QmJQax6bdiJowwut6TXMXBmPvaO5uvH69Ov63C/MnibuxzcZ91FYpfQvaTGhB1YGqQDU
 2BMe/iY2+Mkmw7mvspgqSlfyAhqmOi174msK9oMjlZph4ltVSkQNQX556NF9Z24vuKuF
 IZjyIjZr8AsHxzGiCmVglKKFjxXesvJgB76d6+W7kPqj/STb9am2VphCcBkV8KE5ND8M
 +w979uVhWeBAr5k/sJMIOwzJPtpJtXGiMg780A+eJh9KKqTgDDp6WBCl1l8Ng8OaoVqq
 iWgzqRJFfq2VyIXgxRLMz539Z0TU0O/SG7A7zJU3KjN8iruo3KQbJ2SKtnqisxXze1TO TA== 
Received: from dc5-exch01.marvell.com ([199.233.59.181])
 by mx0b-0016f401.pphosted.com (PPS) with ESMTPS id 3nhqrte0u2-1
 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT);
 Mon, 06 Feb 2023 12:25:52 -0800
Received: from DC5-EXCH01.marvell.com (10.69.176.38) by DC5-EXCH01.marvell.com
 (10.69.176.38) with Microsoft SMTP Server (TLS) id 15.0.1497.42;
 Mon, 6 Feb 2023 12:25:50 -0800
Received: from maili.marvell.com (10.69.176.80) by DC5-EXCH01.marvell.com
 (10.69.176.38) with Microsoft SMTP Server id 15.0.1497.42 via Frontend
 Transport; Mon, 6 Feb 2023 12:25:50 -0800
Received: from jerin-lab.marvell.com (jerin-lab.marvell.com [10.28.34.14])
 by maili.marvell.com (Postfix) with ESMTP id 9A20D3F7069;
 Mon,  6 Feb 2023 12:25:47 -0800 (PST)
From: <jerinj@marvell.com>
To: <dev@dpdk.org>, Srikanth Yalavarthi <syalavarthi@marvell.com>
CC: <thomas@monjalon.net>, <ferruh.yigit@xilinx.com>,
 <stephen@networkplumber.org>, <dchickles@marvell.com>,
 <sshankarnara@marvell.com>, <pkapoor@marvell.com>, Jerin Jacob
 <jerinj@marvell.com>
Subject: [dpdk-dev] [PATCH v2 10/12] mldev: support device extended statistics
Date: Tue, 7 Feb 2023 01:54:51 +0530
Message-ID: <20230206202453.336280-11-jerinj@marvell.com>
X-Mailer: git-send-email 2.39.1
In-Reply-To: <20230206202453.336280-1-jerinj@marvell.com>
References: <20221114120238.2143832-1-jerinj@marvell.com>
 <20230206202453.336280-1-jerinj@marvell.com>
MIME-Version: 1.0
Content-Transfer-Encoding: 8bit
Content-Type: text/plain
X-Proofpoint-GUID: JGz3qnc8qngWEl7_-eazn_gMalTWfX_-
X-Proofpoint-ORIG-GUID: JGz3qnc8qngWEl7_-eazn_gMalTWfX_-
X-Proofpoint-Virus-Version: vendor=baseguard
 engine=ICAP:2.0.219,Aquarius:18.0.930,Hydra:6.0.562,FMLib:17.11.122.1
 definitions=2023-02-06_07,2023-02-06_03,2022-06-22_01
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>,
 <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>,
 <mailto:dev-request@dpdk.org?subject=subscribe>
Errors-To: dev-bounces@dpdk.org

From: Srikanth Yalavarthi <syalavarthi@marvell.com>

Added functions to handle device extended stats. xstats
supported are driver specific and can include stats specific
to ML device or ML model and I/O. Added prototypes for
functions to be called by the device drivers.

Signed-off-by: Srikanth Yalavarthi <syalavarthi@marvell.com>
Signed-off-by: Jerin Jacob <jerinj@marvell.com>
---
 lib/mldev/rte_mldev.c      | 88 ++++++++++++++++++++++++++++++++++++
 lib/mldev/rte_mldev_core.h | 93 ++++++++++++++++++++++++++++++++++++++
 lib/mldev/version.map      |  4 ++
 3 files changed, 185 insertions(+)

diff --git a/lib/mldev/rte_mldev.c b/lib/mldev/rte_mldev.c
index bd65a44be5..da4c272d57 100644
--- a/lib/mldev/rte_mldev.c
+++ b/lib/mldev/rte_mldev.c
@@ -397,6 +397,94 @@ rte_ml_dev_stats_reset(int16_t dev_id)
 	(*dev->dev_ops->dev_stats_reset)(dev);
 }
 
+int
+rte_ml_dev_xstats_names_get(int16_t dev_id, struct rte_ml_dev_xstats_map *xstats_map, uint32_t size)
+{
+	struct rte_ml_dev *dev;
+
+	if (!rte_ml_dev_is_valid_dev(dev_id)) {
+		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id);
+		return -EINVAL;
+	}
+
+	dev = rte_ml_dev_pmd_get_dev(dev_id);
+	if (*dev->dev_ops->dev_xstats_names_get == NULL)
+		return -ENOTSUP;
+
+	return (*dev->dev_ops->dev_xstats_names_get)(dev, xstats_map, size);
+}
+
+int
+rte_ml_dev_xstats_by_name_get(int16_t dev_id, const char *name, uint16_t *stat_id, uint64_t *value)
+{
+	struct rte_ml_dev *dev;
+
+	if (!rte_ml_dev_is_valid_dev(dev_id)) {
+		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id);
+		return -EINVAL;
+	}
+
+	dev = rte_ml_dev_pmd_get_dev(dev_id);
+	if (*dev->dev_ops->dev_xstats_by_name_get == NULL)
+		return -ENOTSUP;
+
+	if (name == NULL) {
+		RTE_MLDEV_LOG(ERR, "Dev %d, name cannot be NULL\n", dev_id);
+		return -EINVAL;
+	}
+
+	if (value == NULL) {
+		RTE_MLDEV_LOG(ERR, "Dev %d, value cannot be NULL\n", dev_id);
+		return -EINVAL;
+	}
+
+	return (*dev->dev_ops->dev_xstats_by_name_get)(dev, name, stat_id, value);
+}
+
+int
+rte_ml_dev_xstats_get(int16_t dev_id, const uint16_t *stat_ids, uint64_t *values, uint16_t nb_ids)
+{
+	struct rte_ml_dev *dev;
+
+	if (!rte_ml_dev_is_valid_dev(dev_id)) {
+		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id);
+		return -EINVAL;
+	}
+
+	dev = rte_ml_dev_pmd_get_dev(dev_id);
+	if (*dev->dev_ops->dev_xstats_get == NULL)
+		return -ENOTSUP;
+
+	if (stat_ids == NULL) {
+		RTE_MLDEV_LOG(ERR, "Dev %d, stat_ids cannot be NULL\n", dev_id);
+		return -EINVAL;
+	}
+
+	if (values == NULL) {
+		RTE_MLDEV_LOG(ERR, "Dev %d, values cannot be NULL\n", dev_id);
+		return -EINVAL;
+	}
+
+	return (*dev->dev_ops->dev_xstats_get)(dev, stat_ids, values, nb_ids);
+}
+
+int
+rte_ml_dev_xstats_reset(int16_t dev_id, const uint16_t *stat_ids, uint16_t nb_ids)
+{
+	struct rte_ml_dev *dev;
+
+	if (!rte_ml_dev_is_valid_dev(dev_id)) {
+		RTE_MLDEV_LOG(ERR, "Invalid dev_id = %d\n", dev_id);
+		return -EINVAL;
+	}
+
+	dev = rte_ml_dev_pmd_get_dev(dev_id);
+	if (*dev->dev_ops->dev_xstats_reset == NULL)
+		return -ENOTSUP;
+
+	return (*dev->dev_ops->dev_xstats_reset)(dev, stat_ids, nb_ids);
+}
+
 int
 rte_ml_model_load(int16_t dev_id, struct rte_ml_model_params *params, uint16_t *model_id)
 {
diff --git a/lib/mldev/rte_mldev_core.h b/lib/mldev/rte_mldev_core.h
index 73eefc48c0..b2ddf8fb5e 100644
--- a/lib/mldev/rte_mldev_core.h
+++ b/lib/mldev/rte_mldev_core.h
@@ -217,6 +217,87 @@ typedef int (*mldev_stats_get_t)(struct rte_ml_dev *dev, struct rte_ml_dev_stats
  */
 typedef void (*mldev_stats_reset_t)(struct rte_ml_dev *dev);
 
+/**
+ * @internal
+ *
+ * Function used to get names of extended stats.
+ *
+ * @param dev
+ *	ML device pointer.
+ * @param xstats_map
+ *	Array to insert id and names into.
+ * @param size
+ *	Size of xstats_map array.
+ *
+ * @return
+ *	- >= 0 and <= size on success.
+ *	- > size, error. Returns the size of xstats_map array required.
+ *	- < 0, error code on failure.
+ */
+typedef int (*mldev_xstats_names_get_t)(struct rte_ml_dev *dev,
+					struct rte_ml_dev_xstats_map *xstats_map, uint32_t size);
+
+/**
+ * @internal
+ *
+ * Function used to get a single extended stat by name.
+ *
+ * @param dev
+ *	ML device pointer.
+ * @param name
+ *	Name of the stat to retrieve.
+ * @param stat_id
+ *	ID of the stat to be returned.
+ * @param value
+ *	Value of the stat to be returned.
+ *
+ * @return
+ *	- >= 0 stat value.
+ *	- < 0, error code on failure.
+ */
+typedef int (*mldev_xstats_by_name_get_t)(struct rte_ml_dev *dev, const char *name,
+					  uint16_t *stat_id, uint64_t *value);
+
+/**
+ * @internal
+ *
+ * Function used to retrieve extended stats of a device.
+ *
+ * @param dev
+ *	ML device pointer.
+ * @param stat_ids
+ *	Array of ID numbers of the stats to be retrieved.
+ * @param values
+ *	Values of the stats requested by the ID.
+ * @param nb_ids
+ *	Number of stats requested.
+ *
+ * @return
+ *	- >= 0, number of entries filled into the values array.
+ *	- < 0, error code on failure.
+ */
+typedef int (*mldev_xstats_get_t)(struct rte_ml_dev *dev, const uint16_t *stat_ids,
+				  uint64_t *values, uint16_t nb_ids);
+
+/**
+ * @internal
+ *
+ * Function used to reset extended stats.
+ *
+ * @param dev
+ *	ML device pointer.
+ * @param stat_ids
+ *	Array of stats IDs to be reset.
+ * @param nb_ids
+ *	Number of IDs in the stat_ids array.
+ *
+ * @return
+ *	- 0 on success.
+ *	- < 0, error code on failure.
+ */
+typedef int (*mldev_xstats_reset_t)(struct rte_ml_dev *dev, const uint16_t *stat_ids,
+				    uint16_t nb_ids);
+
 /**
  * @internal
  *
@@ -448,6 +529,18 @@ struct rte_ml_dev_ops {
 	/** Reset device statistics. */
 	mldev_stats_reset_t dev_stats_reset;
 
+	/** Get names of extended stats. */
+	mldev_xstats_names_get_t dev_xstats_names_get;
+
+	/** Get value of a single extended stat. */
+	mldev_xstats_by_name_get_t dev_xstats_by_name_get;
+
+	/** Get extended stats of a device. */
+	mldev_xstats_get_t dev_xstats_get;
+
+	/** Reset extended stats of the device. */
+	mldev_xstats_reset_t dev_xstats_reset;
+
 	/** Load an ML model. */
 	mldev_model_load_t model_load;
 
diff --git a/lib/mldev/version.map b/lib/mldev/version.map
index 58803722be..ddf340ef8e 100644
--- a/lib/mldev/version.map
+++ b/lib/mldev/version.map
@@ -14,6 +14,10 @@ EXPERIMENTAL {
 	rte_ml_dev_stats_get;
 	rte_ml_dev_stats_reset;
 	rte_ml_dev_stop;
+	rte_ml_dev_xstats_by_name_get;
+	rte_ml_dev_xstats_get;
+	rte_ml_dev_xstats_names_get;
+	rte_ml_dev_xstats_reset;
 	rte_ml_enqueue_burst;
 	rte_ml_io_dequantize;
 	rte_ml_io_input_size_get;
-- 
2.39.1