From patchwork Wed Mar 18 19:02:12 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: 66853 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 3357EA0579; Wed, 18 Mar 2020 20:02:46 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id B50A1292D; Wed, 18 Mar 2020 20:02:22 +0100 (CET) Received: from mx0b-0016f401.pphosted.com (mx0b-0016f401.pphosted.com [67.231.156.173]) by dpdk.org (Postfix) with ESMTP id 875A0292D for ; Wed, 18 Mar 2020 20:02:20 +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 02IJ1Uft019414; Wed, 18 Mar 2020 12:02:20 -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=1VtdphLhicf0vmQ/bUb0ID/9mJVQmoJuz/bZIeNU5LM=; b=e/FJYy+Lf2vZLeEv+5mkYNb1+gpEPcypjRPolBIc5KwuJlYjy+4NZ3zu050DoAm5jJcs CKJYgYr1y5G1y6i4QWvXCuXm0MZocSFcwXJw9GO8Lhn4WzLoKXYcvlP5pcD7W9CpYHqn Hyhz3uiFIGboWjAYZH4pdvxCBLtl/vFi/PoNlnS4NAydRv1RFhzhK/37lrWNoYdCBWoN Li44P8pe6PyVwaB0J6x66qsVDo9pJyttNN8fk2EXMCjhugfGpAsSC+4tZ3hLisQOqQxR 990MP4Re3Dw8d8gLhH7O+PZbCAAF7c0/qtfzUpyswsG8ubcH/toaIMpWBfYz68e+SXNi yg== Received: from sc-exch01.marvell.com ([199.233.58.181]) by mx0b-0016f401.pphosted.com with ESMTP id 2yu9rpbrj6-2 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT); Wed, 18 Mar 2020 12:02:19 -0700 Received: from SC-EXCH03.marvell.com (10.93.176.83) by SC-EXCH01.marvell.com (10.93.176.81) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Wed, 18 Mar 2020 12:02:18 -0700 Received: from maili.marvell.com (10.93.176.43) by SC-EXCH03.marvell.com (10.93.176.83) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Wed, 18 Mar 2020 12:02:18 -0700 Received: from jerin-lab.marvell.com (jerin-lab.marvell.com [10.28.34.14]) by maili.marvell.com (Postfix) with ESMTP id 1688D3F7041; Wed, 18 Mar 2020 12:02:15 -0700 (PDT) From: To: Thomas Monjalon , Jerin Jacob , Sunil Kumar Kori CC: , , , Date: Thu, 19 Mar 2020 00:32:12 +0530 Message-ID: <20200318190241.3150971-4-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 03/32] eal/trace: implement trace register API 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 consumers of trace API defines the tracepoint and registers to eal. Internally these tracepoints will be stored in STAILQ for future use. This patch implements the tracepoint registration function. Signed-off-by: Jerin Jacob --- MAINTAINERS | 1 + lib/librte_eal/common/Makefile | 2 +- lib/librte_eal/common/eal_common_trace.c | 107 +++++++++++++++++- lib/librte_eal/common/eal_trace.h | 36 ++++++ lib/librte_eal/common/include/rte_trace.h | 29 +++++ .../common/include/rte_trace_provider.h | 24 ++++ .../common/include/rte_trace_register.h | 20 ++++ lib/librte_eal/common/meson.build | 2 + lib/librte_eal/rte_eal_version.map | 1 + 9 files changed, 220 insertions(+), 2 deletions(-) create mode 100644 lib/librte_eal/common/eal_trace.h create mode 100644 lib/librte_eal/common/include/rte_trace_provider.h create mode 100644 lib/librte_eal/common/include/rte_trace_register.h diff --git a/MAINTAINERS b/MAINTAINERS index 63d85c7da..452fd2c4f 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -201,6 +201,7 @@ M: Jerin Jacob M: Sunil Kumar Kori F: lib/librte_eal/common/include/rte_trace*.h F: lib/librte_eal/common/eal_common_trace*.c +F: lib/librte_eal/common/eal_trace.h Memory Allocation M: Anatoly Burakov diff --git a/lib/librte_eal/common/Makefile b/lib/librte_eal/common/Makefile index 9384d6f6e..8f2f25c1d 100644 --- a/lib/librte_eal/common/Makefile +++ b/lib/librte_eal/common/Makefile @@ -9,7 +9,7 @@ INC += rte_debug.h rte_eal.h rte_eal_interrupts.h INC += rte_errno.h rte_launch.h rte_lcore.h INC += rte_log.h rte_memory.h rte_memzone.h INC += rte_per_lcore.h rte_random.h -INC += rte_trace.h +INC += rte_trace.h rte_trace_provider.h rte_trace_register.h INC += rte_tailq.h rte_interrupts.h rte_alarm.h INC += rte_string_fns.h rte_version.h INC += rte_eal_memconfig.h diff --git a/lib/librte_eal/common/eal_common_trace.c b/lib/librte_eal/common/eal_common_trace.c index e18ba1c95..ddde04de5 100644 --- a/lib/librte_eal/common/eal_common_trace.c +++ b/lib/librte_eal/common/eal_common_trace.c @@ -2,5 +2,110 @@ * Copyright(C) 2020 Marvell International Ltd. */ -#include +#include +#include +#include +#include +#include +#include +#include + +#include "eal_trace.h" + +RTE_DEFINE_PER_LCORE(volatile int, trace_point_sz); +RTE_DEFINE_PER_LCORE(char, ctf_field[TRACE_CTF_FIELD_SIZE]); +RTE_DEFINE_PER_LCORE(int, ctf_count); + +static struct trace_point_head tp_list = STAILQ_HEAD_INITIALIZER(tp_list); +static struct trace trace; + +int +__rte_trace_point_register(rte_trace_t handle, const char *name, uint32_t level, + void (*fn)(void)) +{ + char *field = RTE_PER_LCORE(ctf_field); + struct trace_point *tp; + uint16_t sz; + + /* Sanity checks of arguments */ + if (name == NULL || fn == NULL || handle == NULL) { + trace_err("invalid arguments"); + rte_errno = EINVAL; goto fail; + } + + /* Sanity check of level */ + if (level > RTE_LOG_DEBUG || level > UINT8_MAX) { + trace_err("invalid log level=%d", level); + rte_errno = EINVAL; goto fail; + + } + + /* Check the size of the trace point object */ + RTE_PER_LCORE(trace_point_sz) = 0; + RTE_PER_LCORE(ctf_count) = 0; + fn(); + if (RTE_PER_LCORE(trace_point_sz) == 0) { + trace_err("missing rte_trace_emit_header() in register fn"); + rte_errno = EBADF; goto fail; + } + + /* Is size overflowed */ + if (RTE_PER_LCORE(trace_point_sz) > UINT16_MAX) { + trace_err("trace point size overflowed"); + rte_errno = ENOSPC; goto fail; + } + + /* Are we running out of space to store trace points? */ + if (trace.nb_trace_points > UINT16_MAX) { + trace_err("trace point exceeds the max count"); + rte_errno = ENOSPC; goto fail; + } + + /* Get the size of the trace point */ + sz = RTE_PER_LCORE(trace_point_sz); + tp = calloc(1, sizeof(struct trace_point)); + if (tp == NULL) { + trace_err("fail to allocate trace point memory"); + rte_errno = ENOMEM; goto fail; + } + + /* Initialize the trace point */ + if (rte_strscpy(tp->name, name, TRACE_POINT_NAME_SIZE) < 0) { + trace_err("name is too long"); + rte_errno = E2BIG; + goto free; + } + + /* Copy the field data for future use */ + if (rte_strscpy(tp->ctf_field, field, TRACE_CTF_FIELD_SIZE) < 0) { + trace_err("CTF field size is too long"); + rte_errno = E2BIG; + goto free; + } + + /* Clear field memory for the next event */ + memset(field, 0, TRACE_CTF_FIELD_SIZE); + + /* Form the trace handle */ + *handle = sz; + *handle |= trace.nb_trace_points << __RTE_TRACE_FIELD_ID_SHIFT; + *handle |= (uint64_t)level << __RTE_TRACE_FIELD_LEVEL_SHIFT; + + trace.nb_trace_points++; + tp->handle = handle; + + /* Add the trace point at tail */ + STAILQ_INSERT_TAIL(&tp_list, tp, next); + __atomic_thread_fence(__ATOMIC_RELEASE); + + /* All Good !!! */ + return 0; +free: + free(tp); +fail: + if (trace.register_errno == 0) + trace.register_errno = rte_errno; + + return -rte_errno; +} diff --git a/lib/librte_eal/common/eal_trace.h b/lib/librte_eal/common/eal_trace.h new file mode 100644 index 000000000..9aef536a0 --- /dev/null +++ b/lib/librte_eal/common/eal_trace.h @@ -0,0 +1,36 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(C) 2020 Marvell International Ltd. + */ + +#ifndef __EAL_TRACE_H +#define __EAL_TRACE_H + +#include + +#define trace_err(fmt, args...)\ + RTE_LOG(ERR, EAL, "%s():%u " fmt "\n",\ + __func__, __LINE__, ## args) + +#define trace_crit(fmt, args...)\ + RTE_LOG(CRIT, EAL, "%s():%u " fmt "\n",\ + __func__, __LINE__, ## args) + +#define TRACE_CTF_FIELD_SIZE 384 +#define TRACE_POINT_NAME_SIZE 64 + +struct trace_point { + STAILQ_ENTRY(trace_point) next; + rte_trace_t handle; + char name[TRACE_POINT_NAME_SIZE]; + char ctf_field[TRACE_CTF_FIELD_SIZE]; +}; + +struct trace { + int register_errno; + uint32_t nb_trace_points; +}; + +/* Trace point list functions */ +STAILQ_HEAD(trace_point_head, trace_point); + +#endif /* __EAL_TRACE_H */ diff --git a/lib/librte_eal/common/include/rte_trace.h b/lib/librte_eal/common/include/rte_trace.h index d008b64f1..da70dfdbb 100644 --- a/lib/librte_eal/common/include/rte_trace.h +++ b/lib/librte_eal/common/include/rte_trace.h @@ -518,6 +518,35 @@ _tp _args \ #endif /* __DOXYGEN__ */ +/** + * @internal @warning + * @b EXPERIMENTAL: this API may change without prior notice + * + * Helper function to register a dynamic tracepoint. + * Use RTE_TRACE_POINT_REGISTER() macro for tracepoint registration. + * + * @param trace + * The tracepoint object created using RTE_TRACE_POINT_DEFINE(). + * @param name + * The name of the tracepoint object. + * @param level + * Trace level. A value between RTE_LOG_EMERG (1) and RTE_LOG_DEBUG (8). + * @param f + * Trace registration function. + * @return + * - 0: Successfully registered the tracepoint. + * - <0: Failure to register the tracepoint. + */ +__rte_experimental +int __rte_trace_point_register(rte_trace_t trace, const char *name, + uint32_t level, void (*fn)(void)); + +#ifdef RTE_TRACE_POINT_REGISTER_SELECT +#include +#else +#include +#endif + #ifdef __cplusplus } #endif diff --git a/lib/librte_eal/common/include/rte_trace_provider.h b/lib/librte_eal/common/include/rte_trace_provider.h new file mode 100644 index 000000000..b4da87ba1 --- /dev/null +++ b/lib/librte_eal/common/include/rte_trace_provider.h @@ -0,0 +1,24 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(C) 2020 Marvell International Ltd. + */ + +#ifndef _RTE_TRACE_H_ +#error do not include this file directly, use instead +#endif + +#ifndef _RTE_TRACE_PROVIDER_H_ +#define _RTE_TRACE_PROVIDER_H_ + +#define __RTE_TRACE_EVENT_HEADER_ID_SHIFT (48) + +#define __RTE_TRACE_FIELD_ENABLE_MASK (1ULL << 63) +#define __RTE_TRACE_FIELD_ENABLE_DISCARD (1ULL << 62) +#define __RTE_TRACE_FIELD_SIZE_SHIFT 0 +#define __RTE_TRACE_FIELD_SIZE_MASK (0xffffULL << __RTE_TRACE_FIELD_SIZE_SHIFT) +#define __RTE_TRACE_FIELD_ID_SHIFT (16) +#define __RTE_TRACE_FIELD_ID_MASK (0xffffULL << __RTE_TRACE_FIELD_ID_SHIFT) +#define __RTE_TRACE_FIELD_LEVEL_SHIFT (32) +#define __RTE_TRACE_FIELD_LEVEL_MASK (0xffULL << __RTE_TRACE_FIELD_LEVEL_SHIFT) + + +#endif /* _RTE_TRACE_PROVIDER_H_ */ diff --git a/lib/librte_eal/common/include/rte_trace_register.h b/lib/librte_eal/common/include/rte_trace_register.h new file mode 100644 index 000000000..e9940b414 --- /dev/null +++ b/lib/librte_eal/common/include/rte_trace_register.h @@ -0,0 +1,20 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(C) 2020 Marvell International Ltd. + */ + +#ifndef _RTE_TRACE_H_ +#error do not include this file directly, use instead +#endif + +#ifndef _RTE_TRACE_REGISTER_H_ +#define _RTE_TRACE_REGISTER_H_ + +#include + +RTE_DECLARE_PER_LCORE(volatile int, trace_point_sz); + +#define RTE_TRACE_POINT_REGISTER(trace, name, level)\ + __rte_trace_point_register(&__##trace, RTE_STR(name),\ + RTE_LOG_ ## level, (void (*)(void)) trace) + +#endif /* _RTE_TRACE_REGISTER_H_ */ diff --git a/lib/librte_eal/common/meson.build b/lib/librte_eal/common/meson.build index 30fb9b85f..88c14ebe5 100644 --- a/lib/librte_eal/common/meson.build +++ b/lib/librte_eal/common/meson.build @@ -86,6 +86,8 @@ common_headers = files( 'include/rte_string_fns.h', 'include/rte_tailq.h', 'include/rte_trace.h', + 'include/rte_trace_provider.h', + 'include/rte_trace_register.h', 'include/rte_time.h', 'include/rte_uuid.h', 'include/rte_version.h', diff --git a/lib/librte_eal/rte_eal_version.map b/lib/librte_eal/rte_eal_version.map index cadfa6465..d97d14845 100644 --- a/lib/librte_eal/rte_eal_version.map +++ b/lib/librte_eal/rte_eal_version.map @@ -338,4 +338,5 @@ EXPERIMENTAL { # added in 20.05 rte_thread_getname; + __rte_trace_point_register; };