DPDK patches and discussions
 help / color / mirror / Atom feed
* [dpdk-dev] [PATCH] eventdev: support telemetry with xstats info
@ 2020-09-09 20:54 Chen, Mike Ximing
  2020-09-17  9:04 ` Power, Ciara
  2020-09-18 17:39 ` [dpdk-dev] [PATCH v3] " Mike Ximing Chen
  0 siblings, 2 replies; 7+ messages in thread
From: Chen, Mike Ximing @ 2020-09-09 20:54 UTC (permalink / raw)
  To: Jerin Jacob
  Cc: dev, gage.eads, sundar.vedantham, ciara.power, bruce.richardson,
	Mike Ximing Chen

The telemetry library is connected with eventdev xstats and
port link info. The following new telemetry commands are added:

/eventdev/dev_list
/eventdev/port_list,DevID
/eventdev/queue_list,DevID
/eventdev/dev_xstats,DevID
/eventdev/port_xstats,DevID,PortID
/eventdev/queue_xstats,DevID,PortID
/eventdev/queue_links,DevID,PortID

queue_links command displays a list of queues linked with a specified
eventdev port and a service priority associated with each link.

Signed-off-by: Mike Ximing Chen <mike.ximing.chen@intel.com>
---
Depends-on: patch-76075 ("lib/telemetry: fix passing full params string to command")
---
 lib/librte_eventdev/meson.build    |   1 +
 lib/librte_eventdev/rte_eventdev.c | 304 +++++++++++++++++++++++++++++
 2 files changed, 305 insertions(+)

diff --git a/lib/librte_eventdev/meson.build b/lib/librte_eventdev/meson.build
index d1f25ee5c..0adc2cd2f 100644
--- a/lib/librte_eventdev/meson.build
+++ b/lib/librte_eventdev/meson.build
@@ -27,3 +27,4 @@ headers = files('rte_eventdev.h',
 		'rte_event_crypto_adapter.h',
 		'rte_event_eth_tx_adapter.h')
 deps += ['ring', 'ethdev', 'hash', 'mempool', 'mbuf', 'timer', 'cryptodev']
+deps += ['telemetry']
diff --git a/lib/librte_eventdev/rte_eventdev.c b/lib/librte_eventdev/rte_eventdev.c
index 82c177c73..6e201c475 100644
--- a/lib/librte_eventdev/rte_eventdev.c
+++ b/lib/librte_eventdev/rte_eventdev.c
@@ -32,6 +32,7 @@
 #include <rte_ethdev.h>
 #include <rte_cryptodev.h>
 #include <rte_cryptodev_pmd.h>
+#include <rte_telemetry.h>
 
 #include "rte_eventdev.h"
 #include "rte_eventdev_pmd.h"
@@ -1424,3 +1425,306 @@ rte_event_pmd_release(struct rte_eventdev *eventdev)
 	eventdev->data = NULL;
 	return 0;
 }
+
+
+static int
+handle_dev_list(const char *cmd __rte_unused,
+		const char *params __rte_unused,
+		struct rte_tel_data *d)
+{
+	uint8_t dev_id;
+	int ndev = rte_event_dev_count();
+
+	if (ndev < 1)
+		return -1;
+
+	rte_tel_data_start_array(d, RTE_TEL_INT_VAL);
+	for (dev_id = 0; dev_id < RTE_EVENT_MAX_DEVS; dev_id++) {
+		if (rte_eventdevs[dev_id].attached ==
+				RTE_EVENTDEV_ATTACHED)
+			rte_tel_data_add_array_int(d, dev_id);
+	}
+
+	return 0;
+}
+
+static int
+handle_port_list(const char *cmd __rte_unused,
+		 const char *params,
+		 struct rte_tel_data *d)
+{
+	int i;
+	uint8_t dev_id;
+	struct rte_eventdev *dev;
+	char *end_param;
+
+	if (params == NULL || strlen(params) == 0 || !isdigit(*params))
+		return -1;
+
+	dev_id = strtoul(params, &end_param, 10);
+	if (*end_param != '\0')
+		RTE_EDEV_LOG_DEBUG(
+			"Extra parameters passed to eventdev telemetry command, ignoring");
+
+	RTE_EVENTDEV_VALID_DEVID_OR_ERR_RET(dev_id, -EINVAL);
+	dev = &rte_eventdevs[dev_id];
+
+	rte_tel_data_start_array(d, RTE_TEL_INT_VAL);
+	for (i = 0; i < dev->data->nb_ports; i++)
+		rte_tel_data_add_array_int(d, i);
+
+	return 0;
+}
+
+static int
+handle_queue_list(const char *cmd __rte_unused,
+		  const char *params,
+		  struct rte_tel_data *d)
+{
+	int i;
+	uint8_t dev_id;
+	struct rte_eventdev *dev;
+	char *end_param;
+
+	if (params == NULL || strlen(params) == 0 || !isdigit(*params))
+		return -1;
+
+	dev_id = strtoul(params, &end_param, 10);
+	if (*end_param != '\0')
+		RTE_EDEV_LOG_DEBUG(
+			"Extra parameters passed to eventdev telemetry command, ignoring");
+
+	RTE_EVENTDEV_VALID_DEVID_OR_ERR_RET(dev_id, -EINVAL);
+	dev = &rte_eventdevs[dev_id];
+
+	rte_tel_data_start_array(d, RTE_TEL_INT_VAL);
+	for (i = 0; i < dev->data->nb_queues; i++)
+		rte_tel_data_add_array_int(d, i);
+
+	return 0;
+}
+
+static int
+handle_queue_links(const char *cmd __rte_unused,
+		   const char *params,
+		   struct rte_tel_data *d)
+{
+	int i, ret, port_id = 0;
+	char *end_param;
+	uint8_t dev_id;
+	uint8_t queues[RTE_EVENT_MAX_QUEUES_PER_DEV];
+	uint8_t priorities[RTE_EVENT_MAX_QUEUES_PER_DEV];
+	const char *p_param;
+
+	if (params == NULL || strlen(params) == 0 || !isdigit(*params))
+		return -1;
+
+	/* Get dev ID from parameter string */
+	dev_id = strtoul(params, &end_param, 10);
+	RTE_EVENTDEV_VALID_DEVID_OR_ERR_RET(dev_id, -EINVAL);
+
+	p_param = strtok(end_param, ",");
+	if (p_param == NULL || strlen(p_param) == 0 || !isdigit(*p_param))
+		return -1;
+
+	port_id = strtoul(p_param, &end_param, 10);
+	p_param = strtok(NULL, "\0");
+	if (*p_param != '\0')
+		RTE_EDEV_LOG_DEBUG(
+			"Extra parameters passed to eventdev telemetry command, ignoring");
+
+	ret = rte_event_port_links_get(dev_id, port_id, queues, priorities);
+	if (ret < 0)
+		return -1;
+
+	rte_tel_data_start_dict(d);
+	for (i = 0; i < ret; i++) {
+		char qid_name[32];
+
+		snprintf(qid_name, 31, "qid_%u", queues[i]);
+		rte_tel_data_add_dict_u64(d, qid_name, priorities[i]);
+	}
+
+	return 0;
+}
+
+static int
+eventdev_build_telemetry_data(int dev_id,
+			      enum rte_event_dev_xstats_mode mode,
+			      int port_queue_id,
+			      struct rte_tel_data *d)
+{
+	struct rte_event_dev_xstats_name *xstat_names;
+	unsigned int *ids;
+	uint64_t *values;
+	int i, ret, num_xstats;
+
+	num_xstats = rte_event_dev_xstats_names_get(dev_id,
+						    mode,
+						    port_queue_id,
+						    NULL,
+						    NULL,
+						    0);
+
+	if (num_xstats < 0)
+		return -1;
+
+	/* use one malloc for names */
+	xstat_names = malloc((sizeof(struct rte_event_dev_xstats_name))
+			     * num_xstats);
+	if (xstat_names == NULL)
+		return -1;
+
+	ids = malloc((sizeof(unsigned int)) * num_xstats);
+	if (ids == NULL) {
+		free(xstat_names);
+		return -1;
+	}
+
+	values = malloc((sizeof(uint64_t)) * num_xstats);
+	if (values == NULL) {
+		free(xstat_names);
+		free(ids);
+		return -1;
+	}
+
+	ret = rte_event_dev_xstats_names_get(dev_id, mode, port_queue_id,
+					     xstat_names, ids, num_xstats);
+	if (ret < 0 || ret > num_xstats) {
+		free(xstat_names);
+		free(ids);
+		free(values);
+		return -1;
+	}
+
+	ret = rte_event_dev_xstats_get(dev_id, mode, port_queue_id,
+				       ids, values, num_xstats);
+	if (ret < 0 || ret > num_xstats) {
+		free(xstat_names);
+		free(ids);
+		free(values);
+		return -1;
+	}
+
+	rte_tel_data_start_dict(d);
+	for (i = 0; i < num_xstats; i++)
+		rte_tel_data_add_dict_u64(d, xstat_names[i].name,
+					  values[i]);
+
+	free(xstat_names);
+	free(ids);
+	free(values);
+	return 0;
+}
+
+static int
+handle_dev_xstats(const char *cmd __rte_unused,
+		  const char *params,
+		  struct rte_tel_data *d)
+{
+	int dev_id;
+	enum rte_event_dev_xstats_mode mode;
+	char *end_param;
+
+	if (params == NULL || strlen(params) == 0 || !isdigit(*params))
+		return -1;
+
+	/* Get dev ID from parameter string */
+	dev_id = strtoul(params, &end_param, 10);
+	if (*end_param != '\0')
+		RTE_EDEV_LOG_DEBUG(
+			"Extra parameters passed to eventdev telemetry command, ignoring");
+
+	RTE_EVENTDEV_VALID_DEVID_OR_ERR_RET(dev_id, -EINVAL);
+
+	mode = RTE_EVENT_DEV_XSTATS_DEVICE;
+	return eventdev_build_telemetry_data(dev_id, mode, 0, d);
+}
+
+static int
+handle_port_xstats(const char *cmd __rte_unused,
+		   const char *params,
+		   struct rte_tel_data *d)
+{
+	int dev_id;
+	int port_queue_id = 0;
+	enum rte_event_dev_xstats_mode mode;
+	char *end_param;
+	const char *p_param;
+
+	if (params == NULL || strlen(params) == 0 || !isdigit(*params))
+		return -1;
+
+	/* Get dev ID from parameter string */
+	dev_id = strtoul(params, &end_param, 10);
+	RTE_EVENTDEV_VALID_DEVID_OR_ERR_RET(dev_id, -EINVAL);
+
+	p_param = strtok(end_param, ",");
+	mode = RTE_EVENT_DEV_XSTATS_PORT;
+
+	if (p_param == NULL || strlen(p_param) == 0 || !isdigit(*p_param))
+		return -1;
+
+	port_queue_id = strtoul(p_param, &end_param, 10);
+
+	p_param = strtok(NULL, "\0");
+	if (*p_param != '\0')
+		RTE_EDEV_LOG_DEBUG(
+			"Extra parameters passed to eventdev telemetry command, ignoring");
+
+	return eventdev_build_telemetry_data(dev_id, mode, port_queue_id, d);
+}
+
+static int
+handle_queue_xstats(const char *cmd __rte_unused,
+		    const char *params,
+		    struct rte_tel_data *d)
+{
+	int dev_id;
+	int port_queue_id = 0;
+	enum rte_event_dev_xstats_mode mode;
+	char *end_param;
+	const char *p_param;
+
+	if (params == NULL || strlen(params) == 0 || !isdigit(*params))
+		return -1;
+
+	/* Get dev ID from parameter string */
+	dev_id = strtoul(params, &end_param, 10);
+	RTE_EVENTDEV_VALID_DEVID_OR_ERR_RET(dev_id, -EINVAL);
+
+	p_param = strtok(end_param, ",");
+	mode = RTE_EVENT_DEV_XSTATS_QUEUE;
+
+	if (p_param == NULL || strlen(p_param) == 0 || !isdigit(*p_param))
+		return -1;
+
+	port_queue_id = strtoul(p_param, &end_param, 10);
+
+	p_param = strtok(NULL, "\0");
+	if (*p_param != '\0')
+		RTE_EDEV_LOG_DEBUG(
+			"Extra parameters passed to eventdev telemetry command, ignoring");
+
+	return eventdev_build_telemetry_data(dev_id, mode, port_queue_id, d);
+}
+
+RTE_INIT(eventdev_init_telemetry)
+{
+	rte_telemetry_register_cmd("/eventdev/dev_list", handle_dev_list,
+			"Returns list of available eventdevs. Takes no parameters");
+	rte_telemetry_register_cmd("/eventdev/port_list", handle_port_list,
+			"Returns list of available ports. Parameter: DevID");
+	rte_telemetry_register_cmd("/eventdev/queue_list", handle_queue_list,
+			"Returns list of available queues. Parameter: DevID");
+
+	rte_telemetry_register_cmd("/eventdev/dev_xstats", handle_dev_xstats,
+			"Returns stats for an eventdev. Parameter: DevID");
+	rte_telemetry_register_cmd("/eventdev/port_xstats", handle_port_xstats,
+			"Returns stats for an eventdev port. Params: DevID,PortID");
+	rte_telemetry_register_cmd("/eventdev/queue_xstats",
+			handle_queue_xstats,
+			"Returns stats for an eventdev queue. Params: DevID,QueueID");
+	rte_telemetry_register_cmd("/eventdev/queue_links", handle_queue_links,
+			"Returns links for an eventdev port. Params: DevID,QueueID");
+}
-- 
2.17.1


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [dpdk-dev] [PATCH] eventdev: support telemetry with xstats info
  2020-09-09 20:54 [dpdk-dev] [PATCH] eventdev: support telemetry with xstats info Chen, Mike Ximing
@ 2020-09-17  9:04 ` Power, Ciara
  2020-09-17 14:18   ` Chen, Mike Ximing
  2020-09-18 17:39 ` [dpdk-dev] [PATCH v3] " Mike Ximing Chen
  1 sibling, 1 reply; 7+ messages in thread
From: Power, Ciara @ 2020-09-17  9:04 UTC (permalink / raw)
  To: Chen, Mike Ximing, Jerin Jacob
  Cc: dev, Eads, Gage, Vedantham, Sundar, Richardson, Bruce

Hi Mike,

See comment inline.

Asides from that comment, overall the change looks good from a Telemetry usage point of view, in my opinion.

Thanks,
Ciara


>-----Original Message-----
>From: Chen, Mike Ximing <mike.ximing.chen@intel.com>
>Sent: Wednesday 9 September 2020 21:55
>To: Jerin Jacob <jerinj@marvell.com>
>Cc: dev@dpdk.org; Eads, Gage <gage.eads@intel.com>; Vedantham, Sundar
><sundar.vedantham@intel.com>; Power, Ciara <ciara.power@intel.com>;
>Richardson, Bruce <bruce.richardson@intel.com>; Chen, Mike Ximing
><mike.ximing.chen@intel.com>
>Subject: [PATCH] eventdev: support telemetry with xstats info
>
>The telemetry library is connected with eventdev xstats and port link info. The
>following new telemetry commands are added:
>
>/eventdev/dev_list
>/eventdev/port_list,DevID
>/eventdev/queue_list,DevID
>/eventdev/dev_xstats,DevID
>/eventdev/port_xstats,DevID,PortID
>/eventdev/queue_xstats,DevID,PortID
>/eventdev/queue_links,DevID,PortID
>
>queue_links command displays a list of queues linked with a specified
>eventdev port and a service priority associated with each link.
>
>Signed-off-by: Mike Ximing Chen <mike.ximing.chen@intel.com>
>---
>Depends-on: patch-76075 ("lib/telemetry: fix passing full params string to
>command")
>---
> lib/librte_eventdev/meson.build    |   1 +
> lib/librte_eventdev/rte_eventdev.c | 304 +++++++++++++++++++++++++++++
> 2 files changed, 305 insertions(+)

<snip>

>+
>+static int
>+handle_queue_links(const char *cmd __rte_unused,
>+		   const char *params,
>+		   struct rte_tel_data *d)
>+{
>+	int i, ret, port_id = 0;
>+	char *end_param;
>+	uint8_t dev_id;
>+	uint8_t queues[RTE_EVENT_MAX_QUEUES_PER_DEV];
>+	uint8_t priorities[RTE_EVENT_MAX_QUEUES_PER_DEV];
>+	const char *p_param;
>+
>+	if (params == NULL || strlen(params) == 0 || !isdigit(*params))
>+		return -1;
>+
>+	/* Get dev ID from parameter string */
>+	dev_id = strtoul(params, &end_param, 10);
>+	RTE_EVENTDEV_VALID_DEVID_OR_ERR_RET(dev_id, -EINVAL);
>+
>+	p_param = strtok(end_param, ",");
>+	if (p_param == NULL || strlen(p_param) == 0 || !isdigit(*p_param))
>+		return -1;
>+
>+	port_id = strtoul(p_param, &end_param, 10);
>+	p_param = strtok(NULL, "\0");
>+	if (*p_param != '\0')
>+		RTE_EDEV_LOG_DEBUG(
>+			"Extra parameters passed to eventdev telemetry
>command, ignoring");


The code above to parse the parameters doesn't look right to me - I think in the case of valid parameters being
passed (e.g. "0,2"), there would be a seg fault at this condition check on p_param. 
This applies to the other handler functions here that follow similar steps also.


>+
>+	ret = rte_event_port_links_get(dev_id, port_id, queues, priorities);
>+	if (ret < 0)
>+		return -1;
>+
>+	rte_tel_data_start_dict(d);
>+	for (i = 0; i < ret; i++) {
>+		char qid_name[32];
>+
>+		snprintf(qid_name, 31, "qid_%u", queues[i]);
>+		rte_tel_data_add_dict_u64(d, qid_name, priorities[i]);
>+	}
>+
>+	return 0;
>+}

<snip>


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [dpdk-dev] [PATCH] eventdev: support telemetry with xstats info
  2020-09-17  9:04 ` Power, Ciara
@ 2020-09-17 14:18   ` Chen, Mike Ximing
  0 siblings, 0 replies; 7+ messages in thread
From: Chen, Mike Ximing @ 2020-09-17 14:18 UTC (permalink / raw)
  To: Power, Ciara, Jerin Jacob
  Cc: dev, Eads, Gage, Vedantham, Sundar, Richardson, Bruce

Hi Ciara,

Thanks for identifying the issue. For some reasons, the problem did not show up in my previous tests with telemetry and eventdev.  I will fix the bug as we discussed and upload a v2 patch.

Best Regards,
Mike

-----Original Message-----
From: Power, Ciara <ciara.power@intel.com> 
Sent: Thursday, September 17, 2020 5:05 AM
To: Chen, Mike Ximing <mike.ximing.chen@intel.com>; Jerin Jacob <jerinj@marvell.com>
Cc: dev@dpdk.org; Eads, Gage <gage.eads@intel.com>; Vedantham, Sundar <sundar.vedantham@intel.com>; Richardson, Bruce <bruce.richardson@intel.com>
Subject: RE: [PATCH] eventdev: support telemetry with xstats info

Hi Mike,

See comment inline.

Asides from that comment, overall the change looks good from a Telemetry usage point of view, in my opinion.

Thanks,
Ciara


>-----Original Message-----
>From: Chen, Mike Ximing <mike.ximing.chen@intel.com>
>Sent: Wednesday 9 September 2020 21:55
>To: Jerin Jacob <jerinj@marvell.com>
>Cc: dev@dpdk.org; Eads, Gage <gage.eads@intel.com>; Vedantham, Sundar 
><sundar.vedantham@intel.com>; Power, Ciara <ciara.power@intel.com>; 
>Richardson, Bruce <bruce.richardson@intel.com>; Chen, Mike Ximing 
><mike.ximing.chen@intel.com>
>Subject: [PATCH] eventdev: support telemetry with xstats info
>
>The telemetry library is connected with eventdev xstats and port link 
>info. The following new telemetry commands are added:
>
>/eventdev/dev_list
>/eventdev/port_list,DevID
>/eventdev/queue_list,DevID
>/eventdev/dev_xstats,DevID
>/eventdev/port_xstats,DevID,PortID
>/eventdev/queue_xstats,DevID,PortID
>/eventdev/queue_links,DevID,PortID
>
>queue_links command displays a list of queues linked with a specified 
>eventdev port and a service priority associated with each link.
>
>Signed-off-by: Mike Ximing Chen <mike.ximing.chen@intel.com>
>---
>Depends-on: patch-76075 ("lib/telemetry: fix passing full params string 
>to
>command")
>---
> lib/librte_eventdev/meson.build    |   1 +
> lib/librte_eventdev/rte_eventdev.c | 304 +++++++++++++++++++++++++++++
> 2 files changed, 305 insertions(+)

<snip>

>+
>+static int
>+handle_queue_links(const char *cmd __rte_unused,
>+		   const char *params,
>+		   struct rte_tel_data *d)
>+{
>+	int i, ret, port_id = 0;
>+	char *end_param;
>+	uint8_t dev_id;
>+	uint8_t queues[RTE_EVENT_MAX_QUEUES_PER_DEV];
>+	uint8_t priorities[RTE_EVENT_MAX_QUEUES_PER_DEV];
>+	const char *p_param;
>+
>+	if (params == NULL || strlen(params) == 0 || !isdigit(*params))
>+		return -1;
>+
>+	/* Get dev ID from parameter string */
>+	dev_id = strtoul(params, &end_param, 10);
>+	RTE_EVENTDEV_VALID_DEVID_OR_ERR_RET(dev_id, -EINVAL);
>+
>+	p_param = strtok(end_param, ",");
>+	if (p_param == NULL || strlen(p_param) == 0 || !isdigit(*p_param))
>+		return -1;
>+
>+	port_id = strtoul(p_param, &end_param, 10);
>+	p_param = strtok(NULL, "\0");
>+	if (*p_param != '\0')
>+		RTE_EDEV_LOG_DEBUG(
>+			"Extra parameters passed to eventdev telemetry
>command, ignoring");


The code above to parse the parameters doesn't look right to me - I think in the case of valid parameters being passed (e.g. "0,2"), there would be a seg fault at this condition check on p_param. 
This applies to the other handler functions here that follow similar steps also.


>+
>+	ret = rte_event_port_links_get(dev_id, port_id, queues, priorities);
>+	if (ret < 0)
>+		return -1;
>+
>+	rte_tel_data_start_dict(d);
>+	for (i = 0; i < ret; i++) {
>+		char qid_name[32];
>+
>+		snprintf(qid_name, 31, "qid_%u", queues[i]);
>+		rte_tel_data_add_dict_u64(d, qid_name, priorities[i]);
>+	}
>+
>+	return 0;
>+}

<snip>


^ permalink raw reply	[flat|nested] 7+ messages in thread

* [dpdk-dev] [PATCH v3] eventdev: support telemetry with xstats info
  2020-09-09 20:54 [dpdk-dev] [PATCH] eventdev: support telemetry with xstats info Chen, Mike Ximing
  2020-09-17  9:04 ` Power, Ciara
@ 2020-09-18 17:39 ` Mike Ximing Chen
  2020-09-21 10:16   ` Power, Ciara
  2020-09-22 19:04   ` Eads, Gage
  1 sibling, 2 replies; 7+ messages in thread
From: Mike Ximing Chen @ 2020-09-18 17:39 UTC (permalink / raw)
  To: Jerin Jacob
  Cc: dev, gage.eads, sundar.vedantham, ciara.power, bruce.richardson

The telemetry library is connected with eventdev xstats and
port link info. The following new telemetry commands are added:

/eventdev/dev_list
/eventdev/port_list,DevID
/eventdev/queue_list,DevID
/eventdev/dev_xstats,DevID
/eventdev/port_xstats,DevID,PortID
/eventdev/queue_xstats,DevID,PortID
/eventdev/queue_links,DevID,PortID

queue_links command displays a list of queues linked with a specified
eventdev port and a service priority associated with each link.

Signed-off-by: Mike Ximing Chen <mike.ximing.chen@intel.com>
---
Depends-on: patch-76075 ("lib/telemetry: fix passing full params string to command")
---
v2:
* Fixed an issue with p_param in handles.

v3:
* No code change.
* Add --in-reply-to v1 patch.
---
 lib/librte_eventdev/meson.build    |   1 +
 lib/librte_eventdev/rte_eventdev.c | 304 +++++++++++++++++++++++++++++
 2 files changed, 305 insertions(+)

diff --git a/lib/librte_eventdev/meson.build b/lib/librte_eventdev/meson.build
index d1f25ee5c..0adc2cd2f 100644
--- a/lib/librte_eventdev/meson.build
+++ b/lib/librte_eventdev/meson.build
@@ -27,3 +27,4 @@ headers = files('rte_eventdev.h',
 		'rte_event_crypto_adapter.h',
 		'rte_event_eth_tx_adapter.h')
 deps += ['ring', 'ethdev', 'hash', 'mempool', 'mbuf', 'timer', 'cryptodev']
+deps += ['telemetry']
diff --git a/lib/librte_eventdev/rte_eventdev.c b/lib/librte_eventdev/rte_eventdev.c
index 82c177c73..557198f4a 100644
--- a/lib/librte_eventdev/rte_eventdev.c
+++ b/lib/librte_eventdev/rte_eventdev.c
@@ -32,6 +32,7 @@
 #include <rte_ethdev.h>
 #include <rte_cryptodev.h>
 #include <rte_cryptodev_pmd.h>
+#include <rte_telemetry.h>
 
 #include "rte_eventdev.h"
 #include "rte_eventdev_pmd.h"
@@ -1424,3 +1425,306 @@ rte_event_pmd_release(struct rte_eventdev *eventdev)
 	eventdev->data = NULL;
 	return 0;
 }
+
+
+static int
+handle_dev_list(const char *cmd __rte_unused,
+		const char *params __rte_unused,
+		struct rte_tel_data *d)
+{
+	uint8_t dev_id;
+	int ndev = rte_event_dev_count();
+
+	if (ndev < 1)
+		return -1;
+
+	rte_tel_data_start_array(d, RTE_TEL_INT_VAL);
+	for (dev_id = 0; dev_id < RTE_EVENT_MAX_DEVS; dev_id++) {
+		if (rte_eventdevs[dev_id].attached ==
+				RTE_EVENTDEV_ATTACHED)
+			rte_tel_data_add_array_int(d, dev_id);
+	}
+
+	return 0;
+}
+
+static int
+handle_port_list(const char *cmd __rte_unused,
+		 const char *params,
+		 struct rte_tel_data *d)
+{
+	int i;
+	uint8_t dev_id;
+	struct rte_eventdev *dev;
+	char *end_param;
+
+	if (params == NULL || strlen(params) == 0 || !isdigit(*params))
+		return -1;
+
+	dev_id = strtoul(params, &end_param, 10);
+	if (*end_param != '\0')
+		RTE_EDEV_LOG_DEBUG(
+			"Extra parameters passed to eventdev telemetry command, ignoring");
+
+	RTE_EVENTDEV_VALID_DEVID_OR_ERR_RET(dev_id, -EINVAL);
+	dev = &rte_eventdevs[dev_id];
+
+	rte_tel_data_start_array(d, RTE_TEL_INT_VAL);
+	for (i = 0; i < dev->data->nb_ports; i++)
+		rte_tel_data_add_array_int(d, i);
+
+	return 0;
+}
+
+static int
+handle_queue_list(const char *cmd __rte_unused,
+		  const char *params,
+		  struct rte_tel_data *d)
+{
+	int i;
+	uint8_t dev_id;
+	struct rte_eventdev *dev;
+	char *end_param;
+
+	if (params == NULL || strlen(params) == 0 || !isdigit(*params))
+		return -1;
+
+	dev_id = strtoul(params, &end_param, 10);
+	if (*end_param != '\0')
+		RTE_EDEV_LOG_DEBUG(
+			"Extra parameters passed to eventdev telemetry command, ignoring");
+
+	RTE_EVENTDEV_VALID_DEVID_OR_ERR_RET(dev_id, -EINVAL);
+	dev = &rte_eventdevs[dev_id];
+
+	rte_tel_data_start_array(d, RTE_TEL_INT_VAL);
+	for (i = 0; i < dev->data->nb_queues; i++)
+		rte_tel_data_add_array_int(d, i);
+
+	return 0;
+}
+
+static int
+handle_queue_links(const char *cmd __rte_unused,
+		   const char *params,
+		   struct rte_tel_data *d)
+{
+	int i, ret, port_id = 0;
+	char *end_param;
+	uint8_t dev_id;
+	uint8_t queues[RTE_EVENT_MAX_QUEUES_PER_DEV];
+	uint8_t priorities[RTE_EVENT_MAX_QUEUES_PER_DEV];
+	const char *p_param;
+
+	if (params == NULL || strlen(params) == 0 || !isdigit(*params))
+		return -1;
+
+	/* Get dev ID from parameter string */
+	dev_id = strtoul(params, &end_param, 10);
+	RTE_EVENTDEV_VALID_DEVID_OR_ERR_RET(dev_id, -EINVAL);
+
+	p_param = strtok(end_param, ",");
+	if (p_param == NULL || strlen(p_param) == 0 || !isdigit(*p_param))
+		return -1;
+
+	port_id = strtoul(p_param, &end_param, 10);
+	p_param = strtok(NULL, "\0");
+	if (p_param != NULL)
+		RTE_EDEV_LOG_DEBUG(
+			"Extra parameters passed to eventdev telemetry command, ignoring");
+
+	ret = rte_event_port_links_get(dev_id, port_id, queues, priorities);
+	if (ret < 0)
+		return -1;
+
+	rte_tel_data_start_dict(d);
+	for (i = 0; i < ret; i++) {
+		char qid_name[32];
+
+		snprintf(qid_name, 31, "qid_%u", queues[i]);
+		rte_tel_data_add_dict_u64(d, qid_name, priorities[i]);
+	}
+
+	return 0;
+}
+
+static int
+eventdev_build_telemetry_data(int dev_id,
+			      enum rte_event_dev_xstats_mode mode,
+			      int port_queue_id,
+			      struct rte_tel_data *d)
+{
+	struct rte_event_dev_xstats_name *xstat_names;
+	unsigned int *ids;
+	uint64_t *values;
+	int i, ret, num_xstats;
+
+	num_xstats = rte_event_dev_xstats_names_get(dev_id,
+						    mode,
+						    port_queue_id,
+						    NULL,
+						    NULL,
+						    0);
+
+	if (num_xstats < 0)
+		return -1;
+
+	/* use one malloc for names */
+	xstat_names = malloc((sizeof(struct rte_event_dev_xstats_name))
+			     * num_xstats);
+	if (xstat_names == NULL)
+		return -1;
+
+	ids = malloc((sizeof(unsigned int)) * num_xstats);
+	if (ids == NULL) {
+		free(xstat_names);
+		return -1;
+	}
+
+	values = malloc((sizeof(uint64_t)) * num_xstats);
+	if (values == NULL) {
+		free(xstat_names);
+		free(ids);
+		return -1;
+	}
+
+	ret = rte_event_dev_xstats_names_get(dev_id, mode, port_queue_id,
+					     xstat_names, ids, num_xstats);
+	if (ret < 0 || ret > num_xstats) {
+		free(xstat_names);
+		free(ids);
+		free(values);
+		return -1;
+	}
+
+	ret = rte_event_dev_xstats_get(dev_id, mode, port_queue_id,
+				       ids, values, num_xstats);
+	if (ret < 0 || ret > num_xstats) {
+		free(xstat_names);
+		free(ids);
+		free(values);
+		return -1;
+	}
+
+	rte_tel_data_start_dict(d);
+	for (i = 0; i < num_xstats; i++)
+		rte_tel_data_add_dict_u64(d, xstat_names[i].name,
+					  values[i]);
+
+	free(xstat_names);
+	free(ids);
+	free(values);
+	return 0;
+}
+
+static int
+handle_dev_xstats(const char *cmd __rte_unused,
+		  const char *params,
+		  struct rte_tel_data *d)
+{
+	int dev_id;
+	enum rte_event_dev_xstats_mode mode;
+	char *end_param;
+
+	if (params == NULL || strlen(params) == 0 || !isdigit(*params))
+		return -1;
+
+	/* Get dev ID from parameter string */
+	dev_id = strtoul(params, &end_param, 10);
+	if (*end_param != '\0')
+		RTE_EDEV_LOG_DEBUG(
+			"Extra parameters passed to eventdev telemetry command, ignoring");
+
+	RTE_EVENTDEV_VALID_DEVID_OR_ERR_RET(dev_id, -EINVAL);
+
+	mode = RTE_EVENT_DEV_XSTATS_DEVICE;
+	return eventdev_build_telemetry_data(dev_id, mode, 0, d);
+}
+
+static int
+handle_port_xstats(const char *cmd __rte_unused,
+		   const char *params,
+		   struct rte_tel_data *d)
+{
+	int dev_id;
+	int port_queue_id = 0;
+	enum rte_event_dev_xstats_mode mode;
+	char *end_param;
+	const char *p_param;
+
+	if (params == NULL || strlen(params) == 0 || !isdigit(*params))
+		return -1;
+
+	/* Get dev ID from parameter string */
+	dev_id = strtoul(params, &end_param, 10);
+	RTE_EVENTDEV_VALID_DEVID_OR_ERR_RET(dev_id, -EINVAL);
+
+	p_param = strtok(end_param, ",");
+	mode = RTE_EVENT_DEV_XSTATS_PORT;
+
+	if (p_param == NULL || strlen(p_param) == 0 || !isdigit(*p_param))
+		return -1;
+
+	port_queue_id = strtoul(p_param, &end_param, 10);
+
+	p_param = strtok(NULL, "\0");
+	if (p_param != NULL)
+		RTE_EDEV_LOG_DEBUG(
+			"Extra parameters passed to eventdev telemetry command, ignoring");
+
+	return eventdev_build_telemetry_data(dev_id, mode, port_queue_id, d);
+}
+
+static int
+handle_queue_xstats(const char *cmd __rte_unused,
+		    const char *params,
+		    struct rte_tel_data *d)
+{
+	int dev_id;
+	int port_queue_id = 0;
+	enum rte_event_dev_xstats_mode mode;
+	char *end_param;
+	const char *p_param;
+
+	if (params == NULL || strlen(params) == 0 || !isdigit(*params))
+		return -1;
+
+	/* Get dev ID from parameter string */
+	dev_id = strtoul(params, &end_param, 10);
+	RTE_EVENTDEV_VALID_DEVID_OR_ERR_RET(dev_id, -EINVAL);
+
+	p_param = strtok(end_param, ",");
+	mode = RTE_EVENT_DEV_XSTATS_QUEUE;
+
+	if (p_param == NULL || strlen(p_param) == 0 || !isdigit(*p_param))
+		return -1;
+
+	port_queue_id = strtoul(p_param, &end_param, 10);
+
+	p_param = strtok(NULL, "\0");
+	if (p_param != NULL)
+		RTE_EDEV_LOG_DEBUG(
+			"Extra parameters passed to eventdev telemetry command, ignoring");
+
+	return eventdev_build_telemetry_data(dev_id, mode, port_queue_id, d);
+}
+
+RTE_INIT(eventdev_init_telemetry)
+{
+	rte_telemetry_register_cmd("/eventdev/dev_list", handle_dev_list,
+			"Returns list of available eventdevs. Takes no parameters");
+	rte_telemetry_register_cmd("/eventdev/port_list", handle_port_list,
+			"Returns list of available ports. Parameter: DevID");
+	rte_telemetry_register_cmd("/eventdev/queue_list", handle_queue_list,
+			"Returns list of available queues. Parameter: DevID");
+
+	rte_telemetry_register_cmd("/eventdev/dev_xstats", handle_dev_xstats,
+			"Returns stats for an eventdev. Parameter: DevID");
+	rte_telemetry_register_cmd("/eventdev/port_xstats", handle_port_xstats,
+			"Returns stats for an eventdev port. Params: DevID,PortID");
+	rte_telemetry_register_cmd("/eventdev/queue_xstats",
+			handle_queue_xstats,
+			"Returns stats for an eventdev queue. Params: DevID,QueueID");
+	rte_telemetry_register_cmd("/eventdev/queue_links", handle_queue_links,
+			"Returns links for an eventdev port. Params: DevID,QueueID");
+}
-- 
2.17.1


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [dpdk-dev] [PATCH v3] eventdev: support telemetry with xstats info
  2020-09-18 17:39 ` [dpdk-dev] [PATCH v3] " Mike Ximing Chen
@ 2020-09-21 10:16   ` Power, Ciara
  2020-09-22 19:04   ` Eads, Gage
  1 sibling, 0 replies; 7+ messages in thread
From: Power, Ciara @ 2020-09-21 10:16 UTC (permalink / raw)
  To: Chen, Mike Ximing, Jerin Jacob
  Cc: dev, Eads, Gage, Vedantham, Sundar, Richardson, Bruce

>-----Original Message-----
>From: Chen, Mike Ximing <mike.ximing.chen@intel.com>
>Sent: Friday 18 September 2020 18:39
>To: Jerin Jacob <jerinj@marvell.com>
>Cc: dev@dpdk.org; Eads, Gage <gage.eads@intel.com>; Vedantham, Sundar
><sundar.vedantham@intel.com>; Power, Ciara <ciara.power@intel.com>;
>Richardson, Bruce <bruce.richardson@intel.com>
>Subject: [PATCH v3] eventdev: support telemetry with xstats info
>
>The telemetry library is connected with eventdev xstats and port link info. The
>following new telemetry commands are added:
>
>/eventdev/dev_list
>/eventdev/port_list,DevID
>/eventdev/queue_list,DevID
>/eventdev/dev_xstats,DevID
>/eventdev/port_xstats,DevID,PortID
>/eventdev/queue_xstats,DevID,PortID
>/eventdev/queue_links,DevID,PortID
>
>queue_links command displays a list of queues linked with a specified
>eventdev port and a service priority associated with each link.
>
>Signed-off-by: Mike Ximing Chen <mike.ximing.chen@intel.com>
>---
>Depends-on: patch-76075 ("lib/telemetry: fix passing full params string to
>command")
>---
>v2:
>* Fixed an issue with p_param in handles.
>
>v3:
>* No code change.
>* Add --in-reply-to v1 patch.
>---
> lib/librte_eventdev/meson.build    |   1 +
> lib/librte_eventdev/rte_eventdev.c | 304 +++++++++++++++++++++++++++++
> 2 files changed, 305 insertions(+)
>

<snip>

>+static int
>+handle_queue_links(const char *cmd __rte_unused,
>+		   const char *params,
>+		   struct rte_tel_data *d)
>+{
>+	int i, ret, port_id = 0;
>+	char *end_param;
>+	uint8_t dev_id;
>+	uint8_t queues[RTE_EVENT_MAX_QUEUES_PER_DEV];
>+	uint8_t priorities[RTE_EVENT_MAX_QUEUES_PER_DEV];
>+	const char *p_param;
>+
>+	if (params == NULL || strlen(params) == 0 || !isdigit(*params))
>+		return -1;
>+
>+	/* Get dev ID from parameter string */
>+	dev_id = strtoul(params, &end_param, 10);
>+	RTE_EVENTDEV_VALID_DEVID_OR_ERR_RET(dev_id, -EINVAL);
>+
>+	p_param = strtok(end_param, ",");
>+	if (p_param == NULL || strlen(p_param) == 0 || !isdigit(*p_param))
>+		return -1;
>+
>+	port_id = strtoul(p_param, &end_param, 10);
>+	p_param = strtok(NULL, "\0");
>+	if (p_param != NULL)
>+		RTE_EDEV_LOG_DEBUG(
>+			"Extra parameters passed to eventdev telemetry
>command, ignoring");
>+

<snip>

This fix avoids the seg fault I previously mentioned, looks fine to me.

Reviewed-by: Ciara Power <ciara.power@intel.com>

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [dpdk-dev] [PATCH v3] eventdev: support telemetry with xstats info
  2020-09-18 17:39 ` [dpdk-dev] [PATCH v3] " Mike Ximing Chen
  2020-09-21 10:16   ` Power, Ciara
@ 2020-09-22 19:04   ` Eads, Gage
  2020-10-04  9:32     ` Jerin Jacob
  1 sibling, 1 reply; 7+ messages in thread
From: Eads, Gage @ 2020-09-22 19:04 UTC (permalink / raw)
  To: Chen, Mike Ximing, Jerin Jacob
  Cc: dev, Vedantham, Sundar, Power, Ciara, Richardson, Bruce



> -----Original Message-----
> From: Chen, Mike Ximing <mike.ximing.chen@intel.com>
> Sent: Friday, September 18, 2020 12:39 PM
> To: Jerin Jacob <jerinj@marvell.com>
> Cc: dev@dpdk.org; Eads, Gage <gage.eads@intel.com>; Vedantham, Sundar
> <sundar.vedantham@intel.com>; Power, Ciara <ciara.power@intel.com>;
> Richardson, Bruce <bruce.richardson@intel.com>
> Subject: [PATCH v3] eventdev: support telemetry with xstats info
> 
> The telemetry library is connected with eventdev xstats and
> port link info. The following new telemetry commands are added:
> 
> /eventdev/dev_list
> /eventdev/port_list,DevID
> /eventdev/queue_list,DevID
> /eventdev/dev_xstats,DevID
> /eventdev/port_xstats,DevID,PortID
> /eventdev/queue_xstats,DevID,PortID
> /eventdev/queue_links,DevID,PortID
> 
> queue_links command displays a list of queues linked with a specified
> eventdev port and a service priority associated with each link.
> 
> Signed-off-by: Mike Ximing Chen <mike.ximing.chen@intel.com>

Reviewed-by: Gage Eads <gage.eads@intel.com>

Thanks,
Gage

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [dpdk-dev] [PATCH v3] eventdev: support telemetry with xstats info
  2020-09-22 19:04   ` Eads, Gage
@ 2020-10-04  9:32     ` Jerin Jacob
  0 siblings, 0 replies; 7+ messages in thread
From: Jerin Jacob @ 2020-10-04  9:32 UTC (permalink / raw)
  To: Eads, Gage
  Cc: Chen, Mike Ximing, Jerin Jacob, dev, Vedantham, Sundar, Power,
	Ciara, Richardson, Bruce

On Wed, Sep 23, 2020 at 12:35 AM Eads, Gage <gage.eads@intel.com> wrote:
>
>
>
> > -----Original Message-----
> > From: Chen, Mike Ximing <mike.ximing.chen@intel.com>
> > Sent: Friday, September 18, 2020 12:39 PM
> > To: Jerin Jacob <jerinj@marvell.com>
> > Cc: dev@dpdk.org; Eads, Gage <gage.eads@intel.com>; Vedantham, Sundar
> > <sundar.vedantham@intel.com>; Power, Ciara <ciara.power@intel.com>;
> > Richardson, Bruce <bruce.richardson@intel.com>
> > Subject: [PATCH v3] eventdev: support telemetry with xstats info
> >
> > The telemetry library is connected with eventdev xstats and
> > port link info. The following new telemetry commands are added:
> >
> > /eventdev/dev_list
> > /eventdev/port_list,DevID
> > /eventdev/queue_list,DevID
> > /eventdev/dev_xstats,DevID
> > /eventdev/port_xstats,DevID,PortID
> > /eventdev/queue_xstats,DevID,PortID
> > /eventdev/queue_links,DevID,PortID
> >
> > queue_links command displays a list of queues linked with a specified
> > eventdev port and a service priority associated with each link.
> >
> > Signed-off-by: Mike Ximing Chen <mike.ximing.chen@intel.com>
>
> Reviewed-by: Gage Eads <gage.eads@intel.com>

Applied to dpdk-next-eventdev/for-main. Thanks.




>
> Thanks,
> Gage

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2020-10-04  9:32 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-09-09 20:54 [dpdk-dev] [PATCH] eventdev: support telemetry with xstats info Chen, Mike Ximing
2020-09-17  9:04 ` Power, Ciara
2020-09-17 14:18   ` Chen, Mike Ximing
2020-09-18 17:39 ` [dpdk-dev] [PATCH v3] " Mike Ximing Chen
2020-09-21 10:16   ` Power, Ciara
2020-09-22 19:04   ` Eads, Gage
2020-10-04  9:32     ` Jerin Jacob

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).