From patchwork Wed Mar 18 19:02:21 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jerin Jacob Kollanukkaran X-Patchwork-Id: 66861 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 38319A0579; Wed, 18 Mar 2020 20:04:13 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 072851BF30; Wed, 18 Mar 2020 20:02:53 +0100 (CET) Received: from mx0b-0016f401.pphosted.com (mx0b-0016f401.pphosted.com [67.231.156.173]) by dpdk.org (Postfix) with ESMTP id 0B0431BF30 for ; Wed, 18 Mar 2020 20:02:51 +0100 (CET) Received: from pps.filterd (m0045851.ppops.net [127.0.0.1]) by mx0b-0016f401.pphosted.com (8.16.0.42/8.16.0.42) with SMTP id 02IJ1QhJ019385; Wed, 18 Mar 2020 12:02:51 -0700 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=marvell.com; h=from : to : cc : subject : date : message-id : in-reply-to : references : mime-version : content-transfer-encoding : content-type; s=pfpt0818; bh=ELul6zQJFoTXOEKgoYfoQ4N3RK6AHLEK8dj6x2kWIPI=; b=H33gd6h0bmgjgGBPrrBRLFzSYRH2wJeTnl774UsJgu3YlPPEFLW3Io8LwE2LZym+yHrp 0YmopNIGftKjW5f/LR+zDzDrIPgq7pHcbnzsV0CUbFdk3lLFsJQcg9XdJSVcco7R/C1M tkaWlTf9F4ZB8NY2bAl0fafF9lS/7DUOWVDSXLPIJZ1E1XzlbN/5konawA1Jj52QUpIH iFD3SiG/joD2ci+9t+axiVIyfacKW/og2/TYQZ/CRl1myKL7oX2iin9aigzN6O4+uTtW FRo6yUwtz7g3t4XS3zX3+0SMUUyPo8U4IHox8YGIJTCUFwwbr2/l/w41NDtKaIMBAErI XA== Received: from sc-exch04.marvell.com ([199.233.58.184]) by mx0b-0016f401.pphosted.com with ESMTP id 2yu9rpbrt3-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT); Wed, 18 Mar 2020 12:02:51 -0700 Received: from SC-EXCH01.marvell.com (10.93.176.81) by SC-EXCH04.marvell.com (10.93.176.84) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Wed, 18 Mar 2020 12:02:49 -0700 Received: from maili.marvell.com (10.93.176.43) by SC-EXCH01.marvell.com (10.93.176.81) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Wed, 18 Mar 2020 12:02:49 -0700 Received: from jerin-lab.marvell.com (jerin-lab.marvell.com [10.28.34.14]) by maili.marvell.com (Postfix) with ESMTP id 6859B3F703F; Wed, 18 Mar 2020 12:02:47 -0700 (PDT) From: To: Jerin Jacob , Sunil Kumar Kori CC: , , , , Date: Thu, 19 Mar 2020 00:32:21 +0530 Message-ID: <20200318190241.3150971-13-jerinj@marvell.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200318190241.3150971-1-jerinj@marvell.com> References: <20200318190241.3150971-1-jerinj@marvell.com> MIME-Version: 1.0 X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:6.0.138, 18.0.645 definitions=2020-03-18_07:2020-03-18, 2020-03-18 signatures=0 Subject: [dpdk-dev] [PATCH v1 12/32] eal/trace: implement registration payload X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" From: Jerin Jacob The trace function payloads such as rte_trace_ctf_* have dual functions. The first to emit the payload for the registration function and the second one to act as trace memory emitters. When it used as registration payload, it will do the following to fulfill the registration job. - Find out the size of the event - Generate metadata field string using __rte_trace_emit_ctf_field(). Signed-off-by: Jerin Jacob Signed-off-by: Sunil Kumar Kori --- lib/librte_eal/common/eal_common_trace.c | 19 +++++++ lib/librte_eal/common/include/rte_trace.h | 20 ++++++++ .../common/include/rte_trace_register.h | 50 +++++++++++++++++++ lib/librte_eal/rte_eal_version.map | 2 + 4 files changed, 91 insertions(+) diff --git a/lib/librte_eal/common/eal_common_trace.c b/lib/librte_eal/common/eal_common_trace.c index 6cb724080..94d3da0d3 100644 --- a/lib/librte_eal/common/eal_common_trace.c +++ b/lib/librte_eal/common/eal_common_trace.c @@ -493,6 +493,25 @@ trace_mem_per_thread_free(void) rte_spinlock_unlock(&trace->lock); } +void +__rte_trace_emit_ctf_field(size_t sz, const char *in, const char *datatype) +{ + char *field = RTE_PER_LCORE(ctf_field); + int count = RTE_PER_LCORE(ctf_count); + int rc; + + RTE_PER_LCORE(trace_point_sz) += sz; + rc = snprintf(RTE_PTR_ADD(field, count), + RTE_MAX(0, TRACE_CTF_FIELD_SIZE - 1 - count), + "%s %s;", datatype, in); + if (rc <= 0) { + RTE_PER_LCORE(trace_point_sz) = 0; + trace_crit("CTF field is too long"); + return; + } + RTE_PER_LCORE(ctf_count) += rc; +} + int __rte_trace_point_register(rte_trace_t handle, const char *name, uint32_t level, void (*fn)(void)) diff --git a/lib/librte_eal/common/include/rte_trace.h b/lib/librte_eal/common/include/rte_trace.h index 358b1b7ca..c24fe8d66 100644 --- a/lib/librte_eal/common/include/rte_trace.h +++ b/lib/librte_eal/common/include/rte_trace.h @@ -520,6 +520,8 @@ _tp _args \ /** @internal Macro to define maximum emit length of string datatype. */ #define __RTE_TRACE_EMIT_STRING_LEN_MAX 32 +/** @internal Macro to define event header size. */ +#define __RTE_TRACE_EVENT_HEADER_SZ sizeof(uint64_t) /** * @internal @warning @@ -553,6 +555,24 @@ void __rte_trace_mem_per_thread_alloc(void); __rte_experimental int __rte_trace_point_register(rte_trace_t trace, const char *name, uint32_t level, void (*fn)(void)); +/** + * @internal @warning + * @b EXPERIMENTAL: this API may change without prior notice + * + * Helper function to emit ctf field. + * + * @param sz + * The tracepoint size. + * @param field + * The name of the trace event. + * @param type + * The datatype of the trace event as string. + * @return + * - 0: Success. + * - <0: Failure. + */ +__rte_experimental +void __rte_trace_emit_ctf_field(size_t sz, const char *field, const char *type); #ifdef RTE_TRACE_POINT_REGISTER_SELECT #include diff --git a/lib/librte_eal/common/include/rte_trace_register.h b/lib/librte_eal/common/include/rte_trace_register.h index e9940b414..93d6396df 100644 --- a/lib/librte_eal/common/include/rte_trace_register.h +++ b/lib/librte_eal/common/include/rte_trace_register.h @@ -10,6 +10,7 @@ #define _RTE_TRACE_REGISTER_H_ #include +#include RTE_DECLARE_PER_LCORE(volatile int, trace_point_sz); @@ -17,4 +18,53 @@ RTE_DECLARE_PER_LCORE(volatile int, trace_point_sz); __rte_trace_point_register(&__##trace, RTE_STR(name),\ RTE_LOG_ ## level, (void (*)(void)) trace) +#define __rte_trace_emit_header_generic(t)\ + RTE_PER_LCORE(trace_point_sz) = __RTE_TRACE_EVENT_HEADER_SZ + +#define __rte_trace_emit_header_dp(t) __rte_trace_emit_header_generic(t) + +#define rte_trace_ctf_u64(in)\ + RTE_BUILD_BUG_ON(sizeof(uint64_t) != sizeof(typeof(in)));\ + __rte_trace_emit_ctf_field(sizeof(uint64_t), RTE_STR(in), "uint64_t") +#define rte_trace_ctf_i64(in)\ + RTE_BUILD_BUG_ON(sizeof(int64_t) != sizeof(typeof(in)));\ + __rte_trace_emit_ctf_field(sizeof(int64_t), RTE_STR(in), "int64_t") +#define rte_trace_ctf_u32(in)\ + RTE_BUILD_BUG_ON(sizeof(uint32_t) != sizeof(typeof(in)));\ + __rte_trace_emit_ctf_field(sizeof(uint32_t), RTE_STR(in), "uint32_t") +#define rte_trace_ctf_i32(in)\ + RTE_BUILD_BUG_ON(sizeof(int32_t) != sizeof(typeof(in)));\ + __rte_trace_emit_ctf_field(sizeof(int32_t), RTE_STR(in), "int32_t") +#define rte_trace_ctf_u16(in)\ + RTE_BUILD_BUG_ON(sizeof(uint16_t) != sizeof(typeof(in)));\ + __rte_trace_emit_ctf_field(sizeof(uint16_t), RTE_STR(in), "uint16_t") +#define rte_trace_ctf_i16(in)\ + RTE_BUILD_BUG_ON(sizeof(int16_t) != sizeof(typeof(in)));\ + __rte_trace_emit_ctf_field(sizeof(int16_t), RTE_STR(in), "int16_t") +#define rte_trace_ctf_u8(in)\ + RTE_BUILD_BUG_ON(sizeof(uint8_t) != sizeof(typeof(in)));\ + __rte_trace_emit_ctf_field(sizeof(uint8_t), RTE_STR(in), "uint8_t") +#define rte_trace_ctf_i8(in)\ + RTE_BUILD_BUG_ON(sizeof(int8_t) != sizeof(typeof(in)));\ + __rte_trace_emit_ctf_field(sizeof(int8_t), RTE_STR(in), "int8_t") +#define rte_trace_ctf_int(in)\ + RTE_BUILD_BUG_ON(sizeof(int) != sizeof(typeof(in)));\ + __rte_trace_emit_ctf_field(sizeof(int), RTE_STR(in), "int32_t") +#define rte_trace_ctf_long(in)\ + RTE_BUILD_BUG_ON(sizeof(long) != sizeof(typeof(in)));\ + __rte_trace_emit_ctf_field(sizeof(long), RTE_STR(in), "long") +#define rte_trace_ctf_float(in)\ + RTE_BUILD_BUG_ON(sizeof(float) != sizeof(typeof(in)));\ + __rte_trace_emit_ctf_field(sizeof(float), RTE_STR(in), "float") +#define rte_trace_ctf_double(in)\ + RTE_BUILD_BUG_ON(sizeof(double) != sizeof(typeof(in)));\ + __rte_trace_emit_ctf_field(sizeof(double), RTE_STR(in), "double") +#define rte_trace_ctf_ptr(in)\ + RTE_BUILD_BUG_ON(sizeof(void *) != sizeof(typeof(in)));\ + __rte_trace_emit_ctf_field(sizeof(void *), RTE_STR(in), "uintptr_t") +#define rte_trace_ctf_string(in)\ + RTE_SET_USED(in);\ + __rte_trace_emit_ctf_field(__RTE_TRACE_EMIT_STRING_LEN_MAX,\ + RTE_STR(in)"[32]", "string_bounded_t") + #endif /* _RTE_TRACE_REGISTER_H_ */ diff --git a/lib/librte_eal/rte_eal_version.map b/lib/librte_eal/rte_eal_version.map index f56d1867e..0c787302f 100644 --- a/lib/librte_eal/rte_eal_version.map +++ b/lib/librte_eal/rte_eal_version.map @@ -339,7 +339,9 @@ EXPERIMENTAL { # added in 20.05 rte_thread_getname; __rte_trace_mem_per_thread_alloc; + __rte_trace_emit_ctf_field; __rte_trace_point_register; + per_lcore_trace_point_sz; per_lcore_trace_mem; rte_trace_global_is_enabled; rte_trace_global_is_disabled;