]> git.droids-corp.org - dpdk.git/commitdiff
telemetry: invert dependency on metrics library
authorBruce Richardson <bruce.richardson@intel.com>
Thu, 30 Apr 2020 16:01:23 +0000 (17:01 +0100)
committerThomas Monjalon <thomas@monjalon.net>
Sun, 10 May 2020 21:52:00 +0000 (23:52 +0200)
Rather than having the telemetry library depend on the metrics
lib we invert the dependency so that metrics instead depends
on telemetry lib, and registers the needed functions with it
at init time. This prepares the way for a cleaner telemetry
architecture to be applied in later patches.

Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
Reviewed-by: Keith Wiles <keith.wiles@intel.com>
14 files changed:
lib/Makefile
lib/librte_metrics/Makefile
lib/librte_metrics/meson.build
lib/librte_metrics/rte_metrics.c
lib/librte_metrics/rte_metrics.h
lib/librte_metrics/rte_metrics_telemetry.c
lib/librte_telemetry/Makefile
lib/librte_telemetry/meson.build
lib/librte_telemetry/rte_telemetry.c
lib/librte_telemetry/rte_telemetry_internal.h
lib/librte_telemetry/rte_telemetry_parser.c
lib/librte_telemetry/rte_telemetry_version.map
lib/meson.build
mk/rte.app.mk

index 559fb03dc97d253a9af01fd4091cf293208e2c1d..7d5497b5d0b55f2ba15271510895911dbf2fada8 100644 (file)
@@ -22,6 +22,8 @@ DIRS-$(CONFIG_RTE_LIBRTE_CFGFILE) += librte_cfgfile
 DEPDIRS-librte_cfgfile := librte_eal
 DIRS-$(CONFIG_RTE_LIBRTE_CMDLINE) += librte_cmdline
 DEPDIRS-librte_cmdline := librte_eal librte_net
+DIRS-$(CONFIG_RTE_LIBRTE_TELEMETRY) += librte_telemetry
+DEPDIRS-librte_telemetry := librte_eal
 DIRS-$(CONFIG_RTE_LIBRTE_ETHER) += librte_ethdev
 DEPDIRS-librte_ethdev := librte_net librte_eal librte_mempool librte_ring
 DEPDIRS-librte_ethdev += librte_mbuf
@@ -72,6 +74,9 @@ DIRS-$(CONFIG_RTE_LIBRTE_JOBSTATS) += librte_jobstats
 DEPDIRS-librte_jobstats := librte_eal
 DIRS-$(CONFIG_RTE_LIBRTE_METRICS) += librte_metrics
 DEPDIRS-librte_metrics := librte_eal librte_ethdev
+ifeq ($(CONFIG_RTE_LIBRTE_TELEMETRY),y)
+DEPDIRS-librte_metrics += librte_telemetry
+endif
 DIRS-$(CONFIG_RTE_LIBRTE_BITRATE) += librte_bitratestats
 DEPDIRS-librte_bitratestats := librte_eal librte_metrics librte_ethdev
 DIRS-$(CONFIG_RTE_LIBRTE_LATENCY_STATS) += librte_latencystats
@@ -114,8 +119,6 @@ DEPDIRS-librte_bpf := librte_eal librte_mempool librte_mbuf librte_ethdev
 DIRS-$(CONFIG_RTE_LIBRTE_IPSEC) += librte_ipsec
 DEPDIRS-librte_ipsec := librte_eal librte_mbuf librte_cryptodev librte_security \
                        librte_net librte_hash
-DIRS-$(CONFIG_RTE_LIBRTE_TELEMETRY) += librte_telemetry
-DEPDIRS-librte_telemetry := librte_eal librte_metrics librte_ethdev
 DIRS-$(CONFIG_RTE_LIBRTE_RCU) += librte_rcu
 DEPDIRS-librte_rcu := librte_eal librte_ring
 
index aa4d8546f356334cbf23f14d82f57a61d86237fd..1264d3bbb07185eccc8e859060d6320f22498f5f 100644 (file)
@@ -18,9 +18,10 @@ ifeq ($(CONFIG_RTE_LIBRTE_TELEMETRY),y)
 SRCS-y += rte_metrics_telemetry.c
 SYMLINK-$(CONFIG_RTE_LIBRTE_METRICS)-include += rte_metrics_telemetry.h
 
-LDLIBS += -lrte_ethdev
+LDLIBS += -lrte_ethdev -lrte_telemetry
 LDLIBS += -ljansson
 
+CFLAGS += -I$(RTE_SDK)/lib/librte_telemetry/
 endif
 
 # Install header file
index a39bc7a2a6b6a3797e7ef7c02bf2bcfa3c957b01..27ccbd6550a91151c83173f4b71f12cdc1d71dae 100644 (file)
@@ -9,5 +9,6 @@ if jansson.found()
        ext_deps += jansson
        sources += files('rte_metrics_telemetry.c')
        headers = files('rte_metrics_telemetry.h')
-       deps += ['ethdev']
+       deps += ['ethdev', 'telemetry']
+       includes += include_directories('../librte_telemetry')
 endif
index 9b38d7787cb310ba9c2c116118e98cbf46e51024..e07670219fb72388505fc22edc0c85148815f6d4 100644 (file)
@@ -13,6 +13,8 @@
 #include <rte_memzone.h>
 #include <rte_spinlock.h>
 
+int metrics_initialized;
+
 #define RTE_METRICS_MEMZONE_NAME "RTE_METRICS"
 
 /**
@@ -60,6 +62,8 @@ rte_metrics_init(int socket_id)
        struct rte_metrics_data_s *stats;
        const struct rte_memzone *memzone;
 
+       if (metrics_initialized)
+               return;
        if (rte_eal_process_type() != RTE_PROC_PRIMARY)
                return;
 
@@ -73,6 +77,7 @@ rte_metrics_init(int socket_id)
        stats = memzone->addr;
        memset(stats, 0, sizeof(struct rte_metrics_data_s));
        rte_spinlock_init(&stats->lock);
+       metrics_initialized = 1;
 }
 
 int
index 466ca98c313c8faf58b0c15507e453e08ce180ba..fbe64ddf2b47fc23cb4ba37ec6f189bb46d9f0d2 100644 (file)
@@ -30,6 +30,8 @@
 extern "C" {
 #endif
 
+extern int metrics_initialized;
+
 /** Maximum length of metric name (including null-terminator) */
 #define RTE_METRICS_MAX_NAME_LEN 64
 #define RTE_METRICS_MAX_METRICS 256
index 1b9dfa4cb59c9d7b6dcb87fc86791dbb83ff9847..a207a19609ddcb991fd692eb2b32f652cb738291 100644 (file)
@@ -6,6 +6,9 @@
 
 #include <rte_ethdev.h>
 #include <rte_string_fns.h>
+#ifdef RTE_LIBRTE_TELEMETRY
+#include <rte_telemetry_internal.h>
+#endif
 
 #include "rte_metrics.h"
 #include "rte_metrics_telemetry.h"
@@ -76,6 +79,7 @@ rte_metrics_tel_reg_all_ethdev(int *metrics_register_done, int *reg_index_list)
        int ret, nb_drv_idx = 0;
        uint16_t d;
 
+       rte_metrics_init(rte_socket_id());
        RTE_ETH_FOREACH_DEV(d) {
                int i;
                /* Different device types have different numbers of stats, so
@@ -417,6 +421,16 @@ rte_metrics_tel_extract_data(struct telemetry_encode_param *ep, json_t *data)
 
 RTE_INIT(metrics_ctor)
 {
+#ifdef RTE_LIBRTE_TELEMETRY
+       static const struct metrics_functions fns = {
+               .reg_all_ethdev = rte_metrics_tel_reg_all_ethdev,
+               .encode_json_format = rte_metrics_tel_encode_json_format,
+               .get_port_stats_ids = rte_metrics_tel_get_port_stats_ids,
+               .get_ports_stats_json = rte_metrics_tel_get_ports_stats_json,
+               .extract_data = rte_metrics_tel_extract_data
+       };
+       rte_telemetry_set_metrics_fns(&fns); /* assign them to telemetry lib */
+#endif
        metrics_log_level = rte_log_register("lib.metrics");
        if (metrics_log_level >= 0)
                rte_log_set_level(metrics_log_level, RTE_LOG_ERR);
index 12009b9a7c9afc2b78154a0b5fdff734b7d774fb..2d7e442ab0c7ad7547776288cfdf31d2624fbd05 100644 (file)
@@ -8,9 +8,9 @@ LIB = librte_telemetry.a
 
 CFLAGS += -O3
 CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR)
+CFLAGS += -I$(RTE_SDK)/lib/librte_metrics/
 
-LDLIBS += -lrte_eal -lrte_ethdev
-LDLIBS += -lrte_metrics
+LDLIBS += -lrte_eal
 LDLIBS += -lpthread
 LDLIBS += -ljansson
 
index 1bdf128c1a0b158de6bd5c37be9ce0cf63407d97..18b214a8e82692c6d3b16ab2717f58e323cc23d6 100644 (file)
@@ -3,7 +3,7 @@
 
 sources = files('rte_telemetry.c', 'rte_telemetry_parser.c', 'rte_telemetry_parser_test.c')
 headers = files('rte_telemetry.h', 'rte_telemetry_internal.h', 'rte_telemetry_parser.h')
-deps += ['metrics', 'ethdev']
+includes += include_directories('../librte_metrics')
 
 jansson = dependency('jansson', required: false)
 if jansson.found()
index 2022ce68ebe215b29dfff7917772ac97686781e6..2fb8ffe8737a83d58d6c4cb51af726e36e936a03 100644 (file)
 #include <jansson.h>
 
 #include <rte_eal.h>
-#include <rte_ethdev.h>
 #include <rte_metrics.h>
 #include <rte_option.h>
 #include <rte_string_fns.h>
+#include <rte_lcore.h>
 
 #include "rte_telemetry.h"
 #include "rte_telemetry_internal.h"
@@ -43,6 +43,15 @@ struct json_data {
        int stat_value;
 };
 
+/* global array of functions pointers to metrics library */
+const struct metrics_functions *metrics_fns;
+
+void
+rte_telemetry_set_metrics_fns(const struct metrics_functions *fns)
+{
+       metrics_fns = fns;
+}
+
 static void
 rte_telemetry_get_runtime_dir(char *socket_path, size_t size)
 {
@@ -145,7 +154,7 @@ rte_telemetry_send_global_stats_values(struct telemetry_encode_param *ep,
                return -1;
        }
 
-       ret = rte_metrics_tel_encode_json_format(ep, &json_buffer);
+       ret = metrics_fns->encode_json_format(ep, &json_buffer);
        if (ret < 0) {
                TELEMETRY_LOG_ERR("JSON encode function failed");
                ret = rte_telemetry_send_error_response(telemetry, ret);
@@ -190,7 +199,7 @@ rte_telemetry_send_ports_stats_values(struct telemetry_encode_param *ep,
                goto einval_fail;
        }
 
-       ret = rte_metrics_tel_get_ports_stats_json(ep, telemetry->reg_index,
+       ret = metrics_fns->get_ports_stats_json(ep, telemetry->reg_index,
                        &json_buffer);
        if (ret < 0) {
                TELEMETRY_LOG_ERR("Function for get_ports_stats_json"
@@ -222,8 +231,7 @@ rte_telemetry_initial_accept(struct telemetry_impl *telemetry)
        int ret;
        int selftest = 0;
 
-       ret = rte_metrics_tel_reg_all_ethdev(
-                       &telemetry->metrics_register_done,
+       ret = metrics_fns->reg_all_ethdev(&telemetry->metrics_register_done,
                        telemetry->reg_index);
        if (ret < 0) {
                TELEMETRY_LOG_ERR("Failed to register ethdev metrics");
@@ -467,7 +475,6 @@ rte_telemetry_init(void)
        }
 
        static_telemetry->socket_id = rte_socket_id();
-       rte_metrics_init(static_telemetry->socket_id);
 
        ret = pthread_attr_init(&attr);
        if (ret != 0) {
index ca70e2ed7725185c16aaaef021dee775ede769e5..2ef72b1ec30ac52fa1fcaf15ed76abfd63e6df10 100644 (file)
 #ifndef _RTE_TELEMETRY_INTERNAL_H_
 #define _RTE_TELEMETRY_INTERNAL_H_
 
+/* function types for the functions coming from metrics library */
+typedef int32_t (*metrics_tel_reg_all_ethdev_t)(int *metrics_register_done,
+               int *reg_index_list);
+
+typedef int32_t (*metrics_tel_encode_json_format_t)(
+               struct telemetry_encode_param *ep, char **json_buffer);
+
+typedef int32_t (*metrics_tel_get_port_stats_ids_t)(
+               struct telemetry_encode_param *ep);
+
+typedef int32_t (*metrics_tel_get_ports_stats_json_t)(
+               struct telemetry_encode_param *ep,
+               int *reg_index, char **json_buffer);
+
+typedef int32_t (*metrics_tel_extract_data_t)(struct telemetry_encode_param *ep,
+               json_t *data);
+
+struct metrics_functions {
+       metrics_tel_reg_all_ethdev_t reg_all_ethdev;
+       metrics_tel_encode_json_format_t encode_json_format;
+       metrics_tel_get_port_stats_ids_t get_port_stats_ids;
+       metrics_tel_get_ports_stats_json_t get_ports_stats_json;
+       metrics_tel_extract_data_t extract_data;
+};
+extern const struct metrics_functions *metrics_fns;
+
+/* API for use by metrics libraries to provide the functions to use */
+__rte_experimental
+void rte_telemetry_set_metrics_fns(const struct metrics_functions *fns);
+
 /* Logging Macros */
 extern int telemetry_log_level;
 
index 4e236e1e6a07738a29689ecfeb8b343402f82df7..7dc84c2cf38f2137fa2f66cdbd6a3423588e24ec 100644 (file)
@@ -10,7 +10,6 @@
 
 #include <rte_metrics.h>
 #include <rte_common.h>
-#include <rte_ethdev.h>
 #include <rte_metrics_telemetry.h>
 
 #include "rte_telemetry_internal.h"
@@ -202,7 +201,7 @@ rte_telemetry_command_ports_all_stat_values(struct telemetry_impl *telemetry,
                return -1;
        }
 
-       ret = rte_metrics_tel_get_port_stats_ids(&ep);
+       ret = metrics_fns->get_port_stats_ids(&ep);
        if (ret < 0) {
                TELEMETRY_LOG_ERR("Could not get ports stat values");
                ret = rte_telemetry_send_error_response(telemetry, ret);
@@ -276,7 +275,7 @@ rte_telemetry_command_ports_stats_values_by_name(struct telemetry_impl
                return -1;
        }
 
-       ret = rte_metrics_tel_extract_data(&ep, data);
+       ret = metrics_fns->extract_data(&ep, data);
        if (ret < 0) {
                TELEMETRY_LOG_ERR("Extracting JSON data failed");
                ret = rte_telemetry_send_error_response(telemetry, ret);
index fa62d7718ce669c3fee1b05f376967e027c380eb..a80058c59ccf9a7aa4308452f415ce4660c20d68 100644 (file)
@@ -5,6 +5,7 @@ EXPERIMENTAL {
        rte_telemetry_init;
        rte_telemetry_parse;
        rte_telemetry_selftest;
+       rte_telemetry_set_metrics_fns;
 
        local: *;
 };
index e48efb519e131e4a501b71845ddbb25f36a84760..2ea22125ef6553530f965650acf09c811a673b24 100644 (file)
@@ -11,6 +11,7 @@
 libraries = [
        'kvargs', # eal depends on kvargs
        'eal', # everything depends on eal
+       'telemetry',
        'ring',
        'rcu', # rcu depends on ring
        'mempool', 'mbuf', 'net', 'meter', 'ethdev', 'pci', # core
@@ -32,7 +33,7 @@ libraries = [
        # add pkt framework libs which use other libs from above
        'port', 'table', 'pipeline',
        # flow_classify lib depends on pkt framework table lib
-       'flow_classify', 'bpf', 'graph', 'node', 'telemetry']
+       'flow_classify', 'bpf', 'graph', 'node']
 
 if is_windows
        libraries = ['kvargs','eal'] # only supported libraries for windows
index 3f1a448c5e1952000967b40767af49229ba1eb82..d9f09ae51ac2aa0417e4dab002d73735e26301ad 100644 (file)
@@ -49,11 +49,6 @@ _LDLIBS-$(CONFIG_RTE_LIBRTE_FIB)            += -lrte_fib
 _LDLIBS-$(CONFIG_RTE_LIBRTE_RIB)            += -lrte_rib
 _LDLIBS-$(CONFIG_RTE_LIBRTE_LPM)            += -lrte_lpm
 _LDLIBS-$(CONFIG_RTE_LIBRTE_ACL)            += -lrte_acl
-_LDLIBS-$(CONFIG_RTE_LIBRTE_TELEMETRY)      += --no-as-needed
-_LDLIBS-$(CONFIG_RTE_LIBRTE_TELEMETRY)      += --whole-archive
-_LDLIBS-$(CONFIG_RTE_LIBRTE_TELEMETRY)      += -lrte_telemetry -ljansson
-_LDLIBS-$(CONFIG_RTE_LIBRTE_TELEMETRY)      += --no-whole-archive
-_LDLIBS-$(CONFIG_RTE_LIBRTE_TELEMETRY)      += --as-needed
 _LDLIBS-$(CONFIG_RTE_LIBRTE_JOBSTATS)       += -lrte_jobstats
 _LDLIBS-$(CONFIG_RTE_LIBRTE_METRICS)        += --whole-archive
 _LDLIBS-$(CONFIG_RTE_LIBRTE_METRICS)        += -lrte_metrics
@@ -95,6 +90,7 @@ _LDLIBS-$(CONFIG_RTE_DRIVER_MEMPOOL_RING)   += -lrte_mempool_ring
 _LDLIBS-$(CONFIG_RTE_LIBRTE_OCTEONTX2_MEMPOOL) += -lrte_mempool_octeontx2
 _LDLIBS-$(CONFIG_RTE_LIBRTE_RING)           += -lrte_ring
 _LDLIBS-$(CONFIG_RTE_LIBRTE_PCI)            += -lrte_pci
+_LDLIBS-$(CONFIG_RTE_LIBRTE_TELEMETRY)      += -lrte_telemetry -ljansson
 _LDLIBS-$(CONFIG_RTE_LIBRTE_EAL)            += -lrte_eal
 _LDLIBS-$(CONFIG_RTE_LIBRTE_CMDLINE)        += -lrte_cmdline
 _LDLIBS-$(CONFIG_RTE_LIBRTE_REORDER)        += -lrte_reorder