[dpdk-dev] [PATCH 08/11] telemetry: add vdev kvargs for selftest

Ciara Power ciara.power at intel.com
Thu Aug 23 14:08:10 CEST 2018


This patch adds functionality to run the selftest by passing
in an argument to vdev, "selftest".

To run the tests that were added in the previous patch, the
argument "selftest=1" must be added to the vdev arguments.
This will enable the user to run telemetry with or without tests,
as required.

Signed-off-by: Ciara Power <ciara.power at intel.com>
Signed-off-by: Brian Archbold <brian.archbold at intel.com>
---
 drivers/telemetry/telemetry/telemetry_driver.c | 50 ++++++++++++++++++++++----
 lib/librte_telemetry/rte_telemetry.c           | 35 +++++++++---------
 lib/librte_telemetry/rte_telemetry.h           |  8 ++++-
 lib/librte_telemetry/rte_telemetry_internal.h  |  1 +
 4 files changed, 70 insertions(+), 24 deletions(-)

diff --git a/drivers/telemetry/telemetry/telemetry_driver.c b/drivers/telemetry/telemetry/telemetry_driver.c
index 125a89c..a97c199 100644
--- a/drivers/telemetry/telemetry/telemetry_driver.c
+++ b/drivers/telemetry/telemetry/telemetry_driver.c
@@ -8,21 +8,57 @@
 #include <rte_malloc.h>
 #include <rte_bus_vdev.h>
 #include <rte_lcore.h>
+#include <rte_kvargs.h>
+
+#define SELFTEST_ARG "selftest"
+
+static int
+assign_selftest(const char *key __rte_unused, const char *value, void *opaque)
+{
+	int *selftest = opaque;
+	*selftest = atoi(value);
+	return 0;
+}
 
 static int
 telemetry_probe(struct rte_vdev_device *vdev)
 {
+	static const char *const args[] = {
+		SELFTEST_ARG
+	};
+
+	const char *params;
 	int ret;
+	struct telemetry_args telemetry_args;
+	telemetry_args.selftest = 0;
 
-	RTE_SET_USED(vdev);
-	ret = rte_telemetry_selftest();
-	if (ret < 0) {
-		printf("Error - Selftest failed\n");
-		return -1;
+	params = rte_vdev_device_args(vdev);
+	if (params != NULL && params[0] != '\0') {
+		struct rte_kvargs *kvlist = rte_kvargs_parse(params, args);
+
+		if (!kvlist) {
+			printf("Error - Could not create kvlist\n");
+		} else {
+			ret = rte_kvargs_process(kvlist, SELFTEST_ARG,
+			assign_selftest, &telemetry_args.selftest);
+			if (ret != 0) {
+				printf("Error - Processing the arguments\n");
+				rte_kvargs_free(kvlist);
+				return ret;
+			}
+		}
+		rte_kvargs_free(kvlist);
+	}
+	if (telemetry_args.selftest) {
+		ret = rte_telemetry_selftest();
+		if (ret < 0) {
+			printf("Error - Selftest failed\n");
+			return -1;
+		}
+		printf("Success - Selftest passed\n");
 	}
-	printf("Success - Selftest passed\n");
 
-	ret = rte_telemetry_init(rte_socket_id());
+	ret = rte_telemetry_init(rte_socket_id(), &telemetry_args);
 	if (ret < 0) {
 		printf("Error - Telemetry initialisation failed\n");
 		return -1;
diff --git a/lib/librte_telemetry/rte_telemetry.c b/lib/librte_telemetry/rte_telemetry.c
index ecf644b..1f7528d 100644
--- a/lib/librte_telemetry/rte_telemetry.c
+++ b/lib/librte_telemetry/rte_telemetry.c
@@ -666,18 +666,21 @@ rte_telemetry_initial_accept(struct telemetry_impl *telemetry)
 		return -1;
 	}
 	telemetry->metrics_register_done = 1;
-	ret = rte_telemetry_socket_messaging_testing(telemetry->reg_index,
-		telemetry->server_fd);
-	if (ret < 0)
-		return -1;
+	if (telemetry->selftest) {
+		ret =
+		rte_telemetry_socket_messaging_testing(telemetry->reg_index,
+			telemetry->server_fd);
+		if (ret < 0)
+			return -1;
 
-	ret = rte_telemetry_parser_test(telemetry);
-	if (ret < 0) {
-		TELEMETRY_LOG_ERR("Error - Parser Tests Failed\n");
-		return -1;
+		ret = rte_telemetry_parser_test(telemetry);
+		if (ret < 0) {
+			TELEMETRY_LOG_ERR("Error - Parser Tests Failed\n");
+			return -1;
+		}
+		TELEMETRY_LOG_INFO("Success - All Parser Tests Passed\n");
+		telemetry->selftest = 0;
 	}
-	TELEMETRY_LOG_INFO("Success - All Parser Tests Passed\n");
-
 	return 0;
 }
 
@@ -856,7 +859,7 @@ rte_telemetry_create_socket(struct telemetry_impl *telemetry)
 }
 
 int32_t
-rte_telemetry_init(uint32_t socket_id)
+rte_telemetry_init(uint32_t socket_id, struct telemetry_args *args)
 {
 	int ret;
 	pthread_attr_t attr;
@@ -873,7 +876,7 @@ rte_telemetry_init(uint32_t socket_id)
 		TELEMETRY_LOG_ERR("Error - Memory could not be allocated\n");
 		return -ENOMEM;
 	}
-
+	static_telemetry->selftest = args->selftest;
 	static_telemetry->socket_id = socket_id;
 	rte_metrics_init(static_telemetry->socket_id);
 	ret = rte_telemetry_create_socket(static_telemetry);
@@ -1167,10 +1170,10 @@ rte_telemetry_selftest(void)
 	const char *invalid_client_path = SELFTEST_INVALID_CLIENT;
 	const char *valid_client_path = SELFTEST_VALID_CLIENT;
 	int ret, sockfd;
+	struct telemetry_args args;
+	args.selftest = 0;
 
-	TELEMETRY_LOG_INFO("Selftest\n");
-
-	ret = rte_telemetry_init(rte_socket_id());
+	ret = rte_telemetry_init(rte_socket_id(), &args);
 	if (ret < 0) {
 		TELEMETRY_LOG_ERR("Error - Valid initialisation test"
 			" failed\n");
@@ -1178,7 +1181,7 @@ rte_telemetry_selftest(void)
 	}
 	TELEMETRY_LOG_INFO("Success - Valid initialisation test passed\n");
 
-	ret = rte_telemetry_init(rte_socket_id());
+	ret = rte_telemetry_init(rte_socket_id(), &args);
 	if (ret != -EALREADY) {
 		TELEMETRY_LOG_ERR("Error - Invalid initialisation test "
 			"failed\n");
diff --git a/lib/librte_telemetry/rte_telemetry.h b/lib/librte_telemetry/rte_telemetry.h
index 4f187b7..ac66595 100644
--- a/lib/librte_telemetry/rte_telemetry.h
+++ b/lib/librte_telemetry/rte_telemetry.h
@@ -7,12 +7,18 @@
 #ifndef _RTE_TELEMETRY_H_
 #define _RTE_TELEMETRY_H_
 
+typedef struct telemetry_args {
+	int selftest;
+} telemetry_args;
+
 /**
  * Get the telemetry_impl structure device pointer initialised.
  *
  * @param socket_id
  *  Unsigned integer representing the socket id to be used
  *  for the telemetry structure.
+ * @param args
+ *  Struct containing arguments from telemetry_args
  *
  * @return
  *  0 on successful initialisation.
@@ -24,7 +30,7 @@
  *  -EALREADY if Telemetry is already initialised.
  */
 int32_t
-rte_telemetry_init(uint32_t socket_id);
+rte_telemetry_init(uint32_t socket_id, struct telemetry_args *args);
 
 /**
  * Clean up and free memory.
diff --git a/lib/librte_telemetry/rte_telemetry_internal.h b/lib/librte_telemetry/rte_telemetry_internal.h
index 3e21b79..3270711 100644
--- a/lib/librte_telemetry/rte_telemetry_internal.h
+++ b/lib/librte_telemetry/rte_telemetry_internal.h
@@ -41,6 +41,7 @@ typedef struct telemetry_impl {
 	TAILQ_HEAD(, telemetry_client) client_list_head;
 	struct telemetry_client *request_client;
 	int register_fail_count;
+	int selftest;
 } telemetry_impl;
 
 int32_t
-- 
2.7.4



More information about the dev mailing list