From 37b881a96194a187a6e286f49bae481a0c4dd2bd Mon Sep 17 00:00:00 2001 From: Bruce Richardson Date: Thu, 25 Mar 2021 13:57:04 +0000 Subject: [PATCH] telemetry: use log function from pointer 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 Acked-by: Ciara Power --- lib/librte_eal/freebsd/eal.c | 10 ++-- lib/librte_eal/linux/eal.c | 10 ++-- lib/librte_telemetry/rte_telemetry.h | 15 ++++-- lib/librte_telemetry/telemetry.c | 74 +++++++++++++--------------- 4 files changed, 50 insertions(+), 59 deletions(-) diff --git a/lib/librte_eal/freebsd/eal.c b/lib/librte_eal/freebsd/eal.c index 62320d610f..97ce9976cd 100644 --- a/lib/librte_eal/freebsd/eal.c +++ b/lib/librte_eal/freebsd/eal.c @@ -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(); diff --git a/lib/librte_eal/linux/eal.c b/lib/librte_eal/linux/eal.c index 9ffb4b3314..f6dd67b6da 100644 --- a/lib/librte_eal/linux/eal.c +++ b/lib/librte_eal/linux/eal.c @@ -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(); diff --git a/lib/librte_telemetry/rte_telemetry.h b/lib/librte_telemetry/rte_telemetry.h index 027b048d78..d38894b97a 100644 --- a/lib/librte_telemetry/rte_telemetry.h +++ b/lib/librte_telemetry/rte_telemetry.h @@ -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 */ diff --git a/lib/librte_telemetry/telemetry.c b/lib/librte_telemetry/telemetry.c index 14b4ff5ea7..042136b820 100644 --- a/lib/librte_telemetry/telemetry.c +++ b/lib/librte_telemetry/telemetry.c @@ -15,6 +15,7 @@ #include #include #include +#include #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; -- 2.20.1