On Thu, Oct 13, 2022 at 09:49:28AM +0200, David Marchand wrote: > Register telemetry commands to list and configure trace points and later > save traces for a running DPDK application. > > Note: trace point names contain a '.', so the list of valid characters > used in telemetry commands and dictionary keys has been extended. > > Example with testpmd running with two net/null ports (startup command > from devtools/test-null.sh): > > --> /trace/list,lib.ethdev.* > {"/trace/list": {"lib.ethdev.configure": "Disabled", > "lib.ethdev.rxq.setup": "Disabled", > "lib.ethdev.txq.setup": "Disabled", > "lib.ethdev.start": "Disabled", > "lib.ethdev.stop": "Disabled", > "lib.ethdev.close": "Disabled", > "lib.ethdev.rx.burst": "Disabled", > "lib.ethdev.tx.burst": "Disabled"}} > > --> /trace/enable,lib.ethdev.st* > {"/trace/enable": {"Count": 2}} > --> /trace/enable,lib.ethdev.st* > {"/trace/enable": {"Count": 0}} > > --> /trace/list,lib.ethdev.* > {"/trace/list": {"lib.ethdev.configure": "Disabled", > "lib.ethdev.rxq.setup": "Disabled", > "lib.ethdev.txq.setup": "Disabled", > "lib.ethdev.start": "Enabled", > "lib.ethdev.stop": "Enabled", > "lib.ethdev.close": "Disabled", > "lib.ethdev.rx.burst": "Disabled", > "lib.ethdev.tx.burst": "Disabled"}} > > testpmd> stop > ... > testpmd> port stop all > ... > testpmd> port start all > ... > testpmd> start > ... > > --> /trace/save > {"/trace/save": {"Status": "OK", > "Path": ".../dpdk-traces/rte-2022-10-12-AM-10-51-48"}} > > $ babeltrace .../dpdk-traces/rte-2022-10-12-AM-10-51-48 > [10:51:36.229878723] (+?.?????????) lib.ethdev.stop: > { cpu_id = 0x0, name = "dpdk-testpmd" }, { port_id = 0x0, ret = 0 } > [10:51:36.229880251] (+0.000001528) lib.ethdev.stop: > { cpu_id = 0x0, name = "dpdk-testpmd" }, { port_id = 0x1, ret = 0 } > [10:51:40.449359774] (+4.219479523) lib.ethdev.start: > { cpu_id = 0x0, name = "dpdk-testpmd" }, { port_id = 0x0 } > [10:51:40.449377877] (+0.000018103) lib.ethdev.start: > { cpu_id = 0x0, name = "dpdk-testpmd" }, { port_id = 0x1 } > > --> /trace/disable,* > {"/trace/disable": {"Count": 2}} > > Signed-off-by: David Marchand <david.march...@redhat.com> > --- > For runtime testing, please use this patch in addition with series 25183. > Depends-on: series-25183 ("Trace subsystem fixes") > > --- > lib/eal/common/eal_common_trace.c | 78 +++++++++++++++++++++++++++++++ > lib/telemetry/telemetry_data.c | 1 + > 2 files changed, 79 insertions(+) > > diff --git a/lib/eal/common/eal_common_trace.c > b/lib/eal/common/eal_common_trace.c > index f9b187d15f..9a54987b42 100644 > --- a/lib/eal/common/eal_common_trace.c > +++ b/lib/eal/common/eal_common_trace.c > @@ -12,6 +12,7 @@ > #include <rte_lcore.h> > #include <rte_per_lcore.h> > #include <rte_string_fns.h> > +#include <rte_telemetry.h> > > #include "eal_trace.h" > > @@ -530,3 +531,80 @@ __rte_trace_point_register(rte_trace_point_t *handle, > const char *name, > > return -rte_errno; > } > + > +static int > +trace_telemetry_enable(const char *cmd __rte_unused, > + const char *params, struct rte_tel_data *d) > +{ > + unsigned int count; > + > + if (params == NULL || strlen(params) == 0) > + return -1; > + rte_tel_data_start_dict(d); > + count = __atomic_load_n(&trace.status, __ATOMIC_RELAXED); > + rte_trace_pattern(params, true); > + rte_tel_data_add_dict_int(d, "Count", > + __atomic_load_n(&trace.status, __ATOMIC_RELAXED) - count); > + return 0; > + > +} > + > +static int > +trace_telemetry_disable(const char *cmd __rte_unused, > + const char *params, struct rte_tel_data *d) > +{ > + unsigned int count; > + > + if (params == NULL || strlen(params) == 0) > + return -1; > + rte_tel_data_start_dict(d); > + count = __atomic_load_n(&trace.status, __ATOMIC_RELAXED); > + rte_trace_pattern(params, false); > + rte_tel_data_add_dict_int(d, "Count", > + count - __atomic_load_n(&trace.status, __ATOMIC_RELAXED)); > + return 0; > + > +} > + > +static int > +trace_telemetry_list(const char *cmd __rte_unused, > + const char *params, struct rte_tel_data *d) > +{ > + struct trace_point *tp; > + > + rte_tel_data_start_dict(d); > + STAILQ_FOREACH(tp, &tp_list, next) { > + if (params != NULL && fnmatch(params, tp->name, 0) != 0) > + continue; > + > + rte_tel_data_add_dict_string(d, tp->name, > + rte_trace_point_is_enabled(tp->handle) ? "Enabled" : > "Disabled"); > + } > + > + return 0; > +} > + > +static int > +trace_telemetry_save(const char *cmd __rte_unused, > + const char *params __rte_unused, struct rte_tel_data *d) > +{ > + struct trace *trace = trace_obj_get(); > + > + rte_tel_data_start_dict(d); > + rte_tel_data_add_dict_string(d, "Status", rte_trace_save() == 0 ? "OK" > : "KO"); > + rte_tel_data_add_dict_string(d, "Path", trace->dir); > + > + return 0; > +} > + > +RTE_INIT(trace_telemetry) > +{ > + rte_telemetry_register_cmd("/trace/enable", trace_telemetry_enable, > + "Enable trace points matching the provided pattern. Parameters: > string pattern."); > + rte_telemetry_register_cmd("/trace/disable", trace_telemetry_disable, > + "Disable trace points matching the provided pattern. > Parameters: string pattern."); > + rte_telemetry_register_cmd("/trace/list", trace_telemetry_list, > + "List trace points. Parameters: string pattern."); > + rte_telemetry_register_cmd("/trace/save", trace_telemetry_save, > + "Save current traces. Takes no parameter."); > +} > diff --git a/lib/telemetry/telemetry_data.c b/lib/telemetry/telemetry_data.c > index 34366ecee3..5b319c18fb 100644 > --- a/lib/telemetry/telemetry_data.c > +++ b/lib/telemetry/telemetry_data.c > @@ -106,6 +106,7 @@ valid_name(const char *name) > ['a' ... 'z'] = 1, > ['_'] = 1, > ['/'] = 1, > + ['.'] = 1, > }; > while (*name != '\0') { > if ((size_t)*name >= RTE_DIM(allowed) || allowed[(int)*name] == > 0)
I don't see an issue with allowing "." characters in dictionary names, so for this part: Acked-by: Bruce Richardson <bruce.richard...@intel.com>