From: Bruce Richardson <bruce.richardson@intel.com>
To: David Marchand <david.marchand@redhat.com>
Cc: <dev@dpdk.org>, Jerin Jacob <jerinj@marvell.com>,
Sunil Kumar Kori <skori@marvell.com>,
Ciara Power <ciara.power@intel.com>
Subject: Re: [PATCH] trace: take live traces via telemetry
Date: Tue, 18 Oct 2022 14:14:37 +0100 [thread overview]
Message-ID: <Y06mvdLA/KYLQVDf@bricha3-MOBL.ger.corp.intel.com> (raw)
In-Reply-To: <20221013074928.3062458-1-david.marchand@redhat.com>
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.marchand@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.richardson@intel.com>
next prev parent reply other threads:[~2022-10-18 13:14 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-10-13 7:49 David Marchand
2022-10-13 14:09 ` Jerin Jacob
2022-10-18 13:14 ` Bruce Richardson [this message]
2022-10-19 10:53 ` Bruce Richardson
2022-10-19 13:46 ` David Marchand
2022-10-18 14:33 ` Morten Brørup
2022-10-18 16:20 ` Bruce Richardson
2022-10-19 7:38 ` David Marchand
2022-10-19 8:21 ` Morten Brørup
2022-10-19 8:28 ` David Marchand
2022-10-25 9:00 ` [PATCH v3 0/4] Telemetry support for traces David Marchand
2022-10-25 9:00 ` [PATCH v3 1/4] telemetry: support boolean type David Marchand
2022-10-25 9:34 ` Mattias Rönnblom
2022-10-25 9:43 ` David Marchand
2022-10-25 10:38 ` Bruce Richardson
2022-10-27 8:53 ` Power, Ciara
2022-10-25 9:00 ` [PATCH v3 2/4] telemetry: extend valid command characters David Marchand
2022-10-25 9:12 ` Power, Ciara
2024-10-02 17:11 ` Stephen Hemminger
2022-10-25 9:00 ` [PATCH v3 3/4] trace: enable trace operations via telemetry David Marchand
2022-10-25 10:18 ` Mattias Rönnblom
2022-10-25 9:00 ` [PATCH v3 4/4] trace: create new directory for each trace dump David Marchand
2022-10-25 9:41 ` Mattias Rönnblom
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=Y06mvdLA/KYLQVDf@bricha3-MOBL.ger.corp.intel.com \
--to=bruce.richardson@intel.com \
--cc=ciara.power@intel.com \
--cc=david.marchand@redhat.com \
--cc=dev@dpdk.org \
--cc=jerinj@marvell.com \
--cc=skori@marvell.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).