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 09375A0560; Tue, 18 Oct 2022 15:28:22 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 6274D42B75; Tue, 18 Oct 2022 15:27:50 +0200 (CEST) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by mails.dpdk.org (Postfix) with ESMTP id 627F04282E for ; Tue, 18 Oct 2022 15:27:47 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1666099666; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=G/wH18kNG/C0vGROSlBhbSbOZYAY7/iDQo0HgegVbLI=; b=EhakHhqcFhiF3QXVJmtbLAz9/GU4hYX2P85r9M5+XA6cxrnqHR0Puj85B5zVbnTe1que0b caTSwr0LnJ8RHykrVfaBEppTQSqkogojqJyHY9wiNUTUK9I/LajLIyA9LD1KY1SpkXnBUE chEepf3u14aW3+D6Dzp3U4r3WQQgIOI= Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-615-vfc9uaO_OMe3Xe_IHCOpkw-1; Tue, 18 Oct 2022 09:27:45 -0400 X-MC-Unique: vfc9uaO_OMe3Xe_IHCOpkw-1 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.rdu2.redhat.com [10.11.54.4]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 69CE2882822; Tue, 18 Oct 2022 13:27:45 +0000 (UTC) Received: from localhost.localdomain (ovpn-192-244.brq.redhat.com [10.40.192.244]) by smtp.corp.redhat.com (Postfix) with ESMTP id 4BF912022C30; Tue, 18 Oct 2022 13:27:44 +0000 (UTC) From: David Marchand To: dev@dpdk.org Cc: jerinj@marvell.com, skori@marvell.com, Bruce Richardson , Ciara Power Subject: [PATCH v4 11/11] trace: enable trace operations via telemetry Date: Tue, 18 Oct 2022 15:26:54 +0200 Message-Id: <20221018132654.3760561-12-david.marchand@redhat.com> In-Reply-To: <20221018132654.3760561-1-david.marchand@redhat.com> References: <20220921120359.2201131-1-david.marchand@redhat.com> <20221018132654.3760561-1-david.marchand@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.1 on 10.11.54.4 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset="US-ASCII"; x-default=true 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 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 Acked-by: Jerin Jacob Acked-by: Bruce Richardson --- 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 +++++++++++++++++++++++++++++ lib/telemetry/telemetry_data.c | 1 + 3 files changed, 118 insertions(+) diff --git a/doc/guides/prog_guide/trace_lib.rst b/doc/guides/prog_guide/trace_lib.rst index 9a8f38073d..b7abf8e640 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": "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"}} + + --> /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 42f2c28c23..3c7c666269 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" @@ -528,3 +529,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) -- 2.37.3