telemetry: use log function from pointer
authorBruce Richardson <bruce.richardson@intel.com>
Thu, 25 Mar 2021 13:57:04 +0000 (13:57 +0000)
committerThomas Monjalon <thomas@monjalon.net>
Thu, 25 Mar 2021 16:35:10 +0000 (17:35 +0100)
Rather than passing back an error string to the caller, take as input the
rte_log function to use, and just use regular logging.

Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
Acked-by: Ciara Power <ciara.power@intel.com>
lib/librte_eal/freebsd/eal.c
lib/librte_eal/linux/eal.c
lib/librte_telemetry/rte_telemetry.h
lib/librte_telemetry/telemetry.c

index 62320d6..97ce997 100644 (file)
@@ -941,16 +941,12 @@ rte_eal_init(int argc, char **argv)
                return -1;
        }
        if (!internal_conf->no_telemetry) {
-               const char *error_str = NULL;
+               uint32_t tlog = rte_log_register_type_and_pick_level(
+                               "lib.telemetry", RTE_LOG_WARNING);
                if (rte_telemetry_init(rte_eal_get_runtime_dir(),
                                rte_version(),
-                               &internal_conf->ctrl_cpuset, &error_str)
-                               != 0) {
-                       rte_eal_init_alert(error_str);
+                               &internal_conf->ctrl_cpuset, rte_log, tlog) != 0)
                        return -1;
-               }
-               if (error_str != NULL)
-                       RTE_LOG(NOTICE, EAL, "%s\n", error_str);
        }
 
        eal_mcfg_complete();
index 9ffb4b3..f6dd67b 100644 (file)
@@ -1314,16 +1314,12 @@ rte_eal_init(int argc, char **argv)
                return -1;
        }
        if (!internal_conf->no_telemetry) {
-               const char *error_str = NULL;
+               uint32_t tlog = rte_log_register_type_and_pick_level(
+                               "lib.telemetry", RTE_LOG_WARNING);
                if (rte_telemetry_init(rte_eal_get_runtime_dir(),
                                rte_version(),
-                               &internal_conf->ctrl_cpuset, &error_str)
-                               != 0) {
-                       rte_eal_init_alert(error_str);
+                               &internal_conf->ctrl_cpuset, rte_log, tlog) != 0)
                        return -1;
-               }
-               if (error_str != NULL)
-                       RTE_LOG(NOTICE, EAL, "%s\n", error_str);
        }
 
        eal_mcfg_complete();
index 027b048..d38894b 100644 (file)
@@ -294,6 +294,12 @@ rte_telemetry_register_cmd(const char *cmd, telemetry_cb fn, const char *help);
 
 #ifdef RTE_HAS_CPUSET
 
+/**
+ * @internal
+ * Log function type, to allow passing as parameter if necessary
+ */
+typedef int (*rte_log_fn)(uint32_t level, uint32_t logtype, const char *format, ...);
+
 /**
  * @internal
  * Initialize Telemetry.
@@ -302,9 +308,10 @@ rte_telemetry_register_cmd(const char *cmd, telemetry_cb fn, const char *help);
  * The runtime directory of DPDK.
  * @param cpuset
  * The CPU set to be used for setting the thread affinity.
- * @param err_str
- * This err_str pointer should point to NULL on entry. In the case of an error
- * or warning, it will be non-NULL on exit.
+ * @param log_fn
+ * Function pointer to the rte_log function for logging use
+ * @param registered_logtype
+ * The registered log type to use for logging
  *
  * @return
  *  0 on success.
@@ -314,7 +321,7 @@ rte_telemetry_register_cmd(const char *cmd, telemetry_cb fn, const char *help);
 __rte_internal
 int
 rte_telemetry_init(const char *runtime_dir, const char *rte_version, rte_cpuset_t *cpuset,
-               const char **err_str);
+               rte_log_fn log_fn, uint32_t registered_logtype);
 
 #endif /* RTE_HAS_CPUSET */
 
index 14b4ff5..042136b 100644 (file)
@@ -15,6 +15,7 @@
 #include <rte_string_fns.h>
 #include <rte_common.h>
 #include <rte_spinlock.h>
+#include <rte_log.h>
 
 #include "rte_telemetry.h"
 #include "telemetry_json.h"
@@ -49,7 +50,14 @@ static struct socket v1_socket; /* socket for v1 telemetry */
 #endif /* !RTE_EXEC_ENV_WINDOWS */
 
 static const char *telemetry_version; /* save rte_version */
-static char telemetry_log_error[1024]; /* Will contain error on init failure */
+static const char *socket_dir;        /* runtime directory */
+static rte_cpuset_t *thread_cpuset;
+static rte_log_fn rte_log_ptr;
+static uint32_t logtype;
+
+#define TMTY_LOG(l, ...) \
+        rte_log_ptr(RTE_LOG_ ## l, logtype, "TELEMETRY: " __VA_ARGS__)
+
 /* list of command callbacks, with one command registered by default */
 static struct cmd_callback callbacks[TELEMETRY_MAX_CALLBACKS];
 static int num_callbacks; /* How many commands are registered */
@@ -345,9 +353,7 @@ socket_listener(void *socket)
                struct socket *s = (struct socket *)socket;
                int s_accepted = accept(s->sock, NULL, NULL);
                if (s_accepted < 0) {
-                       snprintf(telemetry_log_error,
-                               sizeof(telemetry_log_error),
-                               "Error with accept, telemetry thread quitting");
+                       TMTY_LOG(ERR, "Error with accept, telemetry thread quitting\n");
                        return NULL;
                }
                if (s->num_clients != NULL) {
@@ -389,9 +395,7 @@ create_socket(char *path)
 {
        int sock = socket(AF_UNIX, SOCK_SEQPACKET, 0);
        if (sock < 0) {
-               snprintf(telemetry_log_error, sizeof(telemetry_log_error),
-                               "Error with socket creation, %s",
-                               strerror(errno));
+               TMTY_LOG(ERR, "Error with socket creation, %s\n", strerror(errno));
                return -1;
        }
 
@@ -399,17 +403,13 @@ create_socket(char *path)
        strlcpy(sun.sun_path, path, sizeof(sun.sun_path));
        unlink(sun.sun_path);
        if (bind(sock, (void *) &sun, sizeof(sun)) < 0) {
-               snprintf(telemetry_log_error, sizeof(telemetry_log_error),
-                               "Error binding socket: %s",
-                               strerror(errno));
+               TMTY_LOG(ERR, "Error binding socket: %s\n", strerror(errno));
                sun.sun_path[0] = 0;
                goto error;
        }
 
        if (listen(sock, 1) < 0) {
-               snprintf(telemetry_log_error, sizeof(telemetry_log_error),
-                               "Error calling listen for socket: %s",
-                               strerror(errno));
+               TMTY_LOG(ERR, "Error calling listen for socket: %s\n", strerror(errno));
                goto error;
        }
 
@@ -422,35 +422,33 @@ error:
 }
 
 static int
-telemetry_legacy_init(const char *runtime_dir, rte_cpuset_t *cpuset)
+telemetry_legacy_init(void)
 {
        pthread_t t_old;
 
        if (num_legacy_callbacks == 1) {
-               snprintf(telemetry_log_error, sizeof(telemetry_log_error),
-                        "No legacy callbacks, legacy socket not created");
+               TMTY_LOG(WARNING, "No legacy callbacks, legacy socket not created\n");
                return -1;
        }
 
        v1_socket.fn = legacy_client_handler;
        if ((size_t) snprintf(v1_socket.path, sizeof(v1_socket.path),
-                       "%s/telemetry", runtime_dir)
-                       >= sizeof(v1_socket.path)) {
-               snprintf(telemetry_log_error, sizeof(telemetry_log_error),
-                               "Error with socket binding, path too long");
+                       "%s/telemetry", socket_dir) >= sizeof(v1_socket.path)) {
+               TMTY_LOG(ERR, "Error with socket binding, path too long\n");
                return -1;
        }
        v1_socket.sock = create_socket(v1_socket.path);
        if (v1_socket.sock < 0)
                return -1;
        pthread_create(&t_old, NULL, socket_listener, &v1_socket);
-       pthread_setaffinity_np(t_old, sizeof(*cpuset), cpuset);
+       pthread_setaffinity_np(t_old, sizeof(*thread_cpuset), thread_cpuset);
 
+       TMTY_LOG(DEBUG, "Legacy telemetry socket initialized ok\n");
        return 0;
 }
 
 static int
-telemetry_v2_init(const char *runtime_dir, rte_cpuset_t *cpuset)
+telemetry_v2_init(void)
 {
        pthread_t t_new;
 
@@ -462,10 +460,9 @@ telemetry_v2_init(const char *runtime_dir, rte_cpuset_t *cpuset)
        rte_telemetry_register_cmd("/help", command_help,
                        "Returns help text for a command. Parameters: string command");
        v2_socket.fn = client_handler;
-       if (strlcpy(v2_socket.path, get_socket_path(runtime_dir, 2),
+       if (strlcpy(v2_socket.path, get_socket_path(socket_dir, 2),
                        sizeof(v2_socket.path)) >= sizeof(v2_socket.path)) {
-               snprintf(telemetry_log_error, sizeof(telemetry_log_error),
-                               "Error with socket binding, path too long");
+               TMTY_LOG(ERR, "Error with socket binding, path too long\n");
                return -1;
        }
 
@@ -473,7 +470,7 @@ telemetry_v2_init(const char *runtime_dir, rte_cpuset_t *cpuset)
        if (v2_socket.sock < 0)
                return -1;
        pthread_create(&t_new, NULL, socket_listener, &v2_socket);
-       pthread_setaffinity_np(t_new, sizeof(*cpuset), cpuset);
+       pthread_setaffinity_np(t_new, sizeof(*thread_cpuset), thread_cpuset);
        atexit(unlink_sockets);
 
        return 0;
@@ -482,25 +479,20 @@ telemetry_v2_init(const char *runtime_dir, rte_cpuset_t *cpuset)
 #endif /* !RTE_EXEC_ENV_WINDOWS */
 
 int32_t
-rte_telemetry_init(const char *runtime_dir, const char *rte_version,
-               rte_cpuset_t *cpuset, const char **err_str)
+rte_telemetry_init(const char *runtime_dir, const char *rte_version, rte_cpuset_t *cpuset,
+               rte_log_fn log_fn, uint32_t registered_logtype)
 {
        telemetry_version = rte_version;
+       socket_dir = runtime_dir;
+       thread_cpuset = cpuset;
+       rte_log_ptr = log_fn;
+       logtype = registered_logtype;
+
 #ifndef RTE_EXEC_ENV_WINDOWS
-       if (telemetry_v2_init(runtime_dir, cpuset) != 0) {
-               *err_str = telemetry_log_error;
+       if (telemetry_v2_init() != 0)
                return -1;
-       }
-       if (telemetry_legacy_init(runtime_dir, cpuset) != 0) {
-               *err_str = telemetry_log_error;
-       }
-#else /* RTE_EXEC_ENV_WINDOWS */
-       RTE_SET_USED(runtime_dir);
-       RTE_SET_USED(cpuset);
-       RTE_SET_USED(err_str);
-
-       snprintf(telemetry_log_error, sizeof(telemetry_log_error),
-               "DPDK Telemetry is not supported on Windows.");
+       TMTY_LOG(DEBUG, "Telemetry initialized ok\n");
+       telemetry_legacy_init();
 #endif /* RTE_EXEC_ENV_WINDOWS */
 
        return 0;