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 9FC724242B; Fri, 20 Jan 2023 09:44:24 +0100 (CET) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 9009440E5A; Fri, 20 Jan 2023 09:44:24 +0100 (CET) Received: from mx0b-0016f401.pphosted.com (mx0b-0016f401.pphosted.com [67.231.156.173]) by mails.dpdk.org (Postfix) with ESMTP id F066F400D5 for ; Fri, 20 Jan 2023 09:44:22 +0100 (CET) Received: from pps.filterd (m0045851.ppops.net [127.0.0.1]) by mx0b-0016f401.pphosted.com (8.17.1.19/8.17.1.19) with ESMTP id 30K7NeYj016191; Fri, 20 Jan 2023 00:41:57 -0800 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=pfpt0220; bh=Gm99hO7y88vmKKKfFfAT80WuZx9N5wYeDFw/wIzVSVQ=; b=GsUFxKNOAM6/b03V8vjMDZEoeum7IWkUD6tJiw5N2gyn3eOfk0MeSR3PZw9vd7HfX++g SzRD7M6uZwQ5wKYdwj7On1KaDJsam4IfI5XLAnsn8g4NWLzv+FBj4AE13YW3a8rBePxB Ld9zlFsm0Ay3/EabrBAg0j2ZpJ2Occ8revVh3ddXqgGQKzeC2YcajQaQQic4Samg6cJX lK5Vxbzvzc4LtOIeKijvK/lvjh9YwUKbQAyo/bW/wsWWUOiOXJPCnR6Sms/xsqvWFwrd e7e/Ckna3DUWxDTWr+5rYuKI7IyJojNOYoMLwjTAzLdvfnUHHXQBkSknGj1IBx6YelYd 3Q== Received: from dc5-exch01.marvell.com ([199.233.59.181]) by mx0b-0016f401.pphosted.com (PPS) with ESMTPS id 3n71cexjn9-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT); Fri, 20 Jan 2023 00:41:57 -0800 Received: from DC5-EXCH01.marvell.com (10.69.176.38) by DC5-EXCH01.marvell.com (10.69.176.38) with Microsoft SMTP Server (TLS) id 15.0.1497.42; Fri, 20 Jan 2023 00:41:55 -0800 Received: from maili.marvell.com (10.69.176.80) by DC5-EXCH01.marvell.com (10.69.176.38) with Microsoft SMTP Server id 15.0.1497.42 via Frontend Transport; Fri, 20 Jan 2023 00:41:55 -0800 Received: from localhost.localdomain (unknown [10.28.36.185]) by maili.marvell.com (Postfix) with ESMTP id 3EB653F7078; Fri, 20 Jan 2023 00:41:34 -0800 (PST) From: Ankur Dwivedi To: CC: , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , Ankur Dwivedi Subject: [PATCH v6 1/6] eal: trace: add trace point emit for blob Date: Fri, 20 Jan 2023 14:10:54 +0530 Message-ID: <20230120084059.2926575-2-adwivedi@marvell.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20230120084059.2926575-1-adwivedi@marvell.com> References: <20230112112140.807233-1-adwivedi@marvell.com> <20230120084059.2926575-1-adwivedi@marvell.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain X-Proofpoint-GUID: Tkf5cezxXCMmAMJG8Me6hhux0JKcK_L8 X-Proofpoint-ORIG-GUID: Tkf5cezxXCMmAMJG8Me6hhux0JKcK_L8 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.219,Aquarius:18.0.930,Hydra:6.0.562,FMLib:17.11.122.1 definitions=2023-01-20_06,2023-01-19_01,2022-06-22_01 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 Adds a trace point emit function for capturing a blob. The blob captures the length passed by the application followed by the array. The maximum blob bytes which can be captured is bounded by RTE_TRACE_BLOB_LEN_MAX macro. The value for max blob length macro is 64 bytes. If the length is less than 64 the remaining trailing bytes are set to zero. This patch also adds test case for emit blob tracepoint function. Signed-off-by: Ankur Dwivedi --- app/test/test_trace.c | 11 ++++++++ doc/guides/prog_guide/trace_lib.rst | 12 ++++++++ lib/eal/common/eal_common_trace_points.c | 2 ++ lib/eal/include/rte_eal_trace.h | 6 ++++ lib/eal/include/rte_trace_point.h | 32 ++++++++++++++++++++++ lib/eal/include/rte_trace_point_register.h | 9 ++++++ lib/eal/version.map | 3 ++ 7 files changed, 75 insertions(+) diff --git a/app/test/test_trace.c b/app/test/test_trace.c index 6bedf14024..ad4a394a29 100644 --- a/app/test/test_trace.c +++ b/app/test/test_trace.c @@ -4,6 +4,7 @@ #include #include +#include #include #include "test.h" @@ -177,7 +178,12 @@ test_fp_trace_points(void) static int test_generic_trace_points(void) { + uint8_t arr[RTE_TRACE_BLOB_LEN_MAX]; int tmp; + int i; + + for (i = 0; i < RTE_TRACE_BLOB_LEN_MAX; i++) + arr[i] = i; rte_eal_trace_generic_void(); rte_eal_trace_generic_u64(0x10000000000000); @@ -195,6 +201,11 @@ test_generic_trace_points(void) rte_eal_trace_generic_ptr(&tmp); rte_eal_trace_generic_str("my string"); rte_eal_trace_generic_size_t(sizeof(void *)); + rte_eal_trace_generic_blob(arr, 0); + rte_eal_trace_generic_blob(arr, 17); + rte_eal_trace_generic_blob(arr, RTE_TRACE_BLOB_LEN_MAX); + rte_eal_trace_generic_blob(arr, rte_rand() % + RTE_TRACE_BLOB_LEN_MAX); RTE_EAL_TRACE_GENERIC_FUNC; return TEST_SUCCESS; diff --git a/doc/guides/prog_guide/trace_lib.rst b/doc/guides/prog_guide/trace_lib.rst index 9a8f38073d..3e0ea5835c 100644 --- a/doc/guides/prog_guide/trace_lib.rst +++ b/doc/guides/prog_guide/trace_lib.rst @@ -352,3 +352,15 @@ event ID. The ``packet.header`` and ``packet.context`` will be written in the slow path at the time of trace memory creation. The ``trace.header`` and trace payload will be emitted when the tracepoint function is invoked. + +Limitations +----------- + +- The ``rte_trace_point_emit_blob()`` function can capture a maximum blob of + length ``RTE_TRACE_BLOB_LEN_MAX`` bytes. The application can call + ``rte_trace_point_emit_blob()`` multiple times with length less than or equal to + ``RTE_TRACE_BLOB_LEN_MAX``, if it needs to capture more than ``RTE_TRACE_BLOB_LEN_MAX`` + bytes. +- If the length passed to the ``rte_trace_point_emit_blob()`` is less than + ``RTE_TRACE_BLOB_LEN_MAX``, then the trailing ``(RTE_TRACE_BLOB_LEN_MAX - len)`` + bytes in the trace are set to zero. diff --git a/lib/eal/common/eal_common_trace_points.c b/lib/eal/common/eal_common_trace_points.c index 0b0b254615..051f89809c 100644 --- a/lib/eal/common/eal_common_trace_points.c +++ b/lib/eal/common/eal_common_trace_points.c @@ -40,6 +40,8 @@ RTE_TRACE_POINT_REGISTER(rte_eal_trace_generic_size_t, lib.eal.generic.size_t) RTE_TRACE_POINT_REGISTER(rte_eal_trace_generic_func, lib.eal.generic.func) +RTE_TRACE_POINT_REGISTER(rte_eal_trace_generic_blob, + lib.eal.generic.blob) RTE_TRACE_POINT_REGISTER(rte_eal_trace_alarm_set, lib.eal.alarm.set) diff --git a/lib/eal/include/rte_eal_trace.h b/lib/eal/include/rte_eal_trace.h index 5ef4398230..e0b836eb2f 100644 --- a/lib/eal/include/rte_eal_trace.h +++ b/lib/eal/include/rte_eal_trace.h @@ -143,6 +143,12 @@ RTE_TRACE_POINT( rte_trace_point_emit_string(func); ) +RTE_TRACE_POINT( + rte_eal_trace_generic_blob, + RTE_TRACE_POINT_ARGS(void *in, uint8_t len), + rte_trace_point_emit_blob(in, len); +) + #define RTE_EAL_TRACE_GENERIC_FUNC rte_eal_trace_generic_func(__func__) /* Interrupt */ diff --git a/lib/eal/include/rte_trace_point.h b/lib/eal/include/rte_trace_point.h index 0f8700974f..aca8344dbf 100644 --- a/lib/eal/include/rte_trace_point.h +++ b/lib/eal/include/rte_trace_point.h @@ -144,6 +144,16 @@ _tp _args \ #define rte_trace_point_emit_ptr(val) /** Tracepoint function payload for string datatype */ #define rte_trace_point_emit_string(val) +/** + * Tracepoint function to capture a blob. + * + * @param val + * Pointer to the array to be captured. + * @param len + * Length to be captured. The maximum supported length is + * RTE_TRACE_BLOB_LEN_MAX bytes. + */ +#define rte_trace_point_emit_blob(val, len) #endif /* __DOXYGEN__ */ @@ -152,6 +162,9 @@ _tp _args \ /** @internal Macro to define event header size. */ #define __RTE_TRACE_EVENT_HEADER_SZ sizeof(uint64_t) +/** Macro to define maximum emit length of blob. */ +#define RTE_TRACE_BLOB_LEN_MAX 64 + /** * Enable recording events of the given tracepoint in the trace buffer. * @@ -374,12 +387,31 @@ do { \ mem = RTE_PTR_ADD(mem, __RTE_TRACE_EMIT_STRING_LEN_MAX); \ } while (0) +#define rte_trace_point_emit_blob(in, len) \ +do { \ + if (unlikely(in == NULL)) \ + return; \ + if (len > RTE_TRACE_BLOB_LEN_MAX) \ + len = RTE_TRACE_BLOB_LEN_MAX; \ + __rte_trace_point_emit(len, uint8_t); \ + memcpy(mem, in, len); \ + mem = RTE_PTR_ADD(mem, len); \ + memset(mem, 0, RTE_TRACE_BLOB_LEN_MAX - len); \ + mem = RTE_PTR_ADD(mem, RTE_TRACE_BLOB_LEN_MAX - len); \ +} while (0) + #else #define __rte_trace_point_emit_header_generic(t) RTE_SET_USED(t) #define __rte_trace_point_emit_header_fp(t) RTE_SET_USED(t) #define __rte_trace_point_emit(in, type) RTE_SET_USED(in) #define rte_trace_point_emit_string(in) RTE_SET_USED(in) +#define rte_trace_point_emit_blob(in, len) \ +do { \ + RTE_SET_USED(in); \ + RTE_SET_USED(len); \ +} while (0) + #endif /* ALLOW_EXPERIMENTAL_API */ #endif /* _RTE_TRACE_POINT_REGISTER_H_ */ diff --git a/lib/eal/include/rte_trace_point_register.h b/lib/eal/include/rte_trace_point_register.h index a32f4d731b..7efbac8a72 100644 --- a/lib/eal/include/rte_trace_point_register.h +++ b/lib/eal/include/rte_trace_point_register.h @@ -47,6 +47,15 @@ do { \ RTE_STR(in)"[32]", "string_bounded_t"); \ } while (0) +#define rte_trace_point_emit_blob(in, len) \ +do { \ + RTE_SET_USED(in); \ + __rte_trace_point_emit(len, uint8_t); \ + __rte_trace_point_emit_field(RTE_TRACE_BLOB_LEN_MAX, \ + RTE_STR(in)"["RTE_STR(RTE_TRACE_BLOB_LEN_MAX)"]", \ + RTE_STR(uint8_t)); \ +} while (0) + #ifdef __cplusplus } #endif diff --git a/lib/eal/version.map b/lib/eal/version.map index 7ad12a7dc9..67be24686a 100644 --- a/lib/eal/version.map +++ b/lib/eal/version.map @@ -440,6 +440,9 @@ EXPERIMENTAL { rte_thread_detach; rte_thread_equal; rte_thread_join; + + # added in 23.03 + __rte_eal_trace_generic_blob; }; INTERNAL { -- 2.25.1