From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id D3F84A054A; Tue, 25 Oct 2022 12:18:33 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 66594427FF; Tue, 25 Oct 2022 12:18:33 +0200 (CEST) Received: from mail.lysator.liu.se (mail.lysator.liu.se [130.236.254.3]) by mails.dpdk.org (Postfix) with ESMTP id B381441143 for ; Tue, 25 Oct 2022 12:18:31 +0200 (CEST) Received: from mail.lysator.liu.se (localhost [127.0.0.1]) by mail.lysator.liu.se (Postfix) with ESMTP id 70CA413FAC for ; Tue, 25 Oct 2022 12:18:31 +0200 (CEST) Received: by mail.lysator.liu.se (Postfix, from userid 1004) id 6F71413FAB; Tue, 25 Oct 2022 12:18:31 +0200 (CEST) X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on hermod.lysator.liu.se X-Spam-Level: X-Spam-Status: No, score=-1.5 required=5.0 tests=ALL_TRUSTED, AWL, NICE_REPLY_A autolearn=disabled version=3.4.6 X-Spam-Score: -1.5 Received: from [192.168.1.59] (h-62-63-215-114.A163.priv.bahnhof.se [62.63.215.114]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (P-256) server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mail.lysator.liu.se (Postfix) with ESMTPSA id 93D0913FAA; Tue, 25 Oct 2022 12:18:30 +0200 (CEST) Message-ID: <9955af9c-31a4-35f2-962f-53510b8d6681@lysator.liu.se> Date: Tue, 25 Oct 2022 12:18:30 +0200 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.2.2 Subject: Re: [PATCH v3 3/4] trace: enable trace operations via telemetry Content-Language: en-US To: David Marchand , dev@dpdk.org Cc: Jerin Jacob , Sunil Kumar Kori References: <20221013074928.3062458-1-david.marchand@redhat.com> <20221025090052.429232-1-david.marchand@redhat.com> <20221025090052.429232-4-david.marchand@redhat.com> From: =?UTF-8?Q?Mattias_R=c3=b6nnblom?= In-Reply-To: <20221025090052.429232-4-david.marchand@redhat.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit X-Virus-Scanned: ClamAV using ClamSMTP X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org On 2022-10-25 11:00, David Marchand wrote: > Register telemetry commands to list and configure trace points and later > save traces for a running DPDK application. > > 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": false, > "lib.ethdev.rxq.setup": false, > "lib.ethdev.txq.setup": false, > "lib.ethdev.start": false, > "lib.ethdev.stop": false, > "lib.ethdev.close": false, > "lib.ethdev.rx.burst": false, > "lib.ethdev.tx.burst": false}} > > --> /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": false, > "lib.ethdev.rxq.setup": false, > "lib.ethdev.txq.setup": false, > "lib.ethdev.start": true, > "lib.ethdev.stop": true, > "lib.ethdev.close": false, > "lib.ethdev.rx.burst": false, > "lib.ethdev.tx.burst": false}} > > 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 > Acked-by: Jerin Jacob > --- > Changes since v2: > - separated telemetry change in a dedicated patch, > - switched to boolean types, > > Changes since v1: > - added a note in the documentation, > > --- > doc/guides/prog_guide/trace_lib.rst | 39 +++++++++++++++ > lib/eal/common/eal_common_trace.c | 78 +++++++++++++++++++++++++++++ > 2 files changed, 117 insertions(+) > > diff --git a/doc/guides/prog_guide/trace_lib.rst b/doc/guides/prog_guide/trace_lib.rst > index 9a8f38073d..d0a6bdae4c 100644 > --- a/doc/guides/prog_guide/trace_lib.rst > +++ b/doc/guides/prog_guide/trace_lib.rst > @@ -233,6 +233,45 @@ This section steps you through the details of generating trace and viewing it. > > babeltrace $HOME/dpdk-traces/rte-yyyy-mm-dd-[AP]M-hh-mm-ss/ > > +Configuring traces on a running DPDK application > +------------------------------------------------ > + > +The DPDK trace library can be configured using the Telemetry interface. > + > +Examples:: > + > + --> /trace/list,lib.ethdev.* > + {"/trace/list": {"lib.ethdev.configure": false, > + "lib.ethdev.rxq.setup": false, > + "lib.ethdev.txq.setup": false, > + "lib.ethdev.start": false, > + "lib.ethdev.stop": false, > + "lib.ethdev.close": false, > + "lib.ethdev.rx.burst": false, > + "lib.ethdev.tx.burst": false}} > + > + --> /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": false, > + "lib.ethdev.rxq.setup": false, > + "lib.ethdev.txq.setup": false, > + "lib.ethdev.start": true, > + "lib.ethdev.stop": true, > + "lib.ethdev.close": false, > + "lib.ethdev.rx.burst": false, > + "lib.ethdev.tx.burst": false}} > + > + --> /trace/save > + {"/trace/save": {"Status": "OK", > + "Path": ".../dpdk-traces/rte-2022-10-12-AM-10-51-48"}} > + > +For more information on how to use the Telemetry interface, see > +the :doc:`../howto/telemetry`. > + > Implementation details > ---------------------- > > diff --git a/lib/eal/common/eal_common_trace.c b/lib/eal/common/eal_common_trace.c > index 5caaac8e59..bb26af618a 100644 > --- a/lib/eal/common/eal_common_trace.c > +++ b/lib/eal/common/eal_common_trace.c > @@ -12,6 +12,7 @@ > #include > #include > #include > +#include > > #include "eal_trace.h" > > @@ -521,3 +522,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; status is uint32_t. > + > + 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); Why "Count"? From what I could tell, trace.status tells if tracing is enabled or not. I also don't understand why &trace.status is loaded twice, especially in the light that future compilers, that more heavily optimize atomics, might merge those two loads into one, resulting in something equivalent to: rte_tel_data_add_dict_int(d, "Count", 0); Is one of the loads supposed to be a store (or, lock add, rather), enabling the tracing? Might be worth to wrap all the atomics in functions, making the code more clear. > + 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_bool(d, tp->name, > + rte_trace_point_is_enabled(tp->handle)); > + } > + > + 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."); > +}