From patchwork Sun Apr 19 10:01:01 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: 68876 X-Patchwork-Delegate: david.marchand@redhat.com 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 1B4F8A0561; Sun, 19 Apr 2020 12:04:18 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 211C11D57C; Sun, 19 Apr 2020 12:02:09 +0200 (CEST) Received: from mx0b-0016f401.pphosted.com (mx0a-0016f401.pphosted.com [67.231.148.174]) by dpdk.org (Postfix) with ESMTP id 30D7A1D44D for ; Sun, 19 Apr 2020 12:01:59 +0200 (CEST) Received: from pps.filterd (m0045849.ppops.net [127.0.0.1]) by mx0a-0016f401.pphosted.com (8.16.0.42/8.16.0.42) with SMTP id 03J9vIqB031309; Sun, 19 Apr 2020 03:01:46 -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=t/hYBwlyqatsE7Idxddk5rwwUtCeIwo3U69xGvQrLqA=; b=pWnmnhmUy4hFlqMc2DzGh/Zvayt+E0t58bz1/O2mt6Dbf52mTEhq9eGLeksi1lwbsa0W FDnFFSXmqiKGaZUsnI3fNw4ffV1g4M0h98smHgXCSr3uOiezGg2s3KuUyu4whjbWurX/ t9wniFUPTKexx7g1C/+RttvXxdZTuiAFLmK2tMz5cynOZafE9g8djp0yOC1X7FezPLwB T7f5utgkGE5hc0hz9Z0in8NgLC5Dui608E/V9vSz13llt9vT4t9pyOxO56Q9cW9rqP0r /GJ2j1UmZEz8VY0k7OeYwlrA8JwijM2TJumRz2Dl4OFTfqzaNoGBi3wUg9V6y8ZjCkwX xQ== Received: from sc-exch03.marvell.com ([199.233.58.183]) by mx0a-0016f401.pphosted.com with ESMTP id 30fxwp3d25-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT); Sun, 19 Apr 2020 03:01:46 -0700 Received: from DC5-EXCH02.marvell.com (10.69.176.39) by SC-EXCH03.marvell.com (10.93.176.83) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Sun, 19 Apr 2020 03:01:44 -0700 Received: from maili.marvell.com (10.69.176.80) by DC5-EXCH02.marvell.com (10.69.176.39) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Sun, 19 Apr 2020 03:01:44 -0700 Received: from jerin-lab.marvell.com (jerin-lab.marvell.com [10.28.34.14]) by maili.marvell.com (Postfix) with ESMTP id 2788E3F703F; Sun, 19 Apr 2020 03:01:39 -0700 (PDT) From: To: Thomas Monjalon , Jerin Jacob , Pavan Nikhilesh , Liang Ma , Peter Mccarthy , Marko Kovacevic , Ori Kam , Bruce Richardson , Radu Nicolau , "Akhil Goyal" , Tomasz Kantecki , Sunil Kumar Kori , David Hunt , Honnappa Nagarahalli CC: , , Date: Sun, 19 Apr 2020 15:31:01 +0530 Message-ID: <20200419100133.3232316-2-jerinj@marvell.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200419100133.3232316-1-jerinj@marvell.com> References: <20200413150116.734047-1-jerinj@marvell.com> <20200419100133.3232316-1-jerinj@marvell.com> MIME-Version: 1.0 X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:6.0.138, 18.0.676 definitions=2020-04-19_02:2020-04-17, 2020-04-19 signatures=0 Subject: [dpdk-dev] [PATCH v6 01/33] meson: add libatomic as a global dependency for i686 clang 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: Pavan Nikhilesh Add libatomic as a global dependency when compiling for 32-bit using clang. As we need libatomic for 64-bit atomic ops. Cc: bruce.richardson@intel.com Signed-off-by: Pavan Nikhilesh Acked-by: Bruce Richardson --- config/meson.build | 8 ++++++++ drivers/event/octeontx/meson.build | 5 ----- drivers/event/octeontx2/meson.build | 5 ----- drivers/event/opdl/meson.build | 5 ----- examples/l2fwd-event/meson.build | 5 ----- lib/librte_distributor/meson.build | 5 ----- lib/librte_rcu/meson.build | 5 ----- 7 files changed, 8 insertions(+), 30 deletions(-) diff --git a/config/meson.build b/config/meson.build index 58421342b..8a4c692a9 100644 --- a/config/meson.build +++ b/config/meson.build @@ -173,6 +173,14 @@ if pcap_dep.found() and cc.has_header('pcap.h', dependencies: pcap_dep) dpdk_extra_ldflags += '-lpcap' endif + +# for clang 32-bit compiles we need libatomic for 64-bit atomic ops +if cc.get_id() == 'clang' and dpdk_conf.get('RTE_ARCH_64') == false + atomic_dep = cc.find_library('atomic', required: true) + add_project_link_arguments('-latomic', language: 'c') + dpdk_extra_ldflags += '-latomic' +endif + # add -include rte_config to cflags add_project_arguments('-include', 'rte_config.h', language: 'c') diff --git a/drivers/event/octeontx/meson.build b/drivers/event/octeontx/meson.build index 73118a485..2b74bb62d 100644 --- a/drivers/event/octeontx/meson.build +++ b/drivers/event/octeontx/meson.build @@ -11,8 +11,3 @@ sources = files('ssovf_worker.c', ) deps += ['common_octeontx', 'mempool_octeontx', 'bus_vdev', 'pmd_octeontx'] - -# for clang 32-bit compiles we need libatomic for 64-bit atomic ops -if cc.get_id() == 'clang' and dpdk_conf.get('RTE_ARCH_64') == false - ext_deps += cc.find_library('atomic') -endif diff --git a/drivers/event/octeontx2/meson.build b/drivers/event/octeontx2/meson.build index 4b938416b..0ade51cec 100644 --- a/drivers/event/octeontx2/meson.build +++ b/drivers/event/octeontx2/meson.build @@ -18,11 +18,6 @@ if not dpdk_conf.get('RTE_ARCH_64') extra_flags += ['-Wno-int-to-pointer-cast', '-Wno-pointer-to-int-cast'] endif -# for clang 32-bit compiles we need libatomic for 64-bit atomic ops -if cc.get_id() == 'clang' and dpdk_conf.get('RTE_ARCH_64') == false - ext_deps += cc.find_library('atomic') -endif - foreach flag: extra_flags if cc.has_argument(flag) cflags += flag diff --git a/drivers/event/opdl/meson.build b/drivers/event/opdl/meson.build index 1fe034ea1..cc6029c6f 100644 --- a/drivers/event/opdl/meson.build +++ b/drivers/event/opdl/meson.build @@ -9,8 +9,3 @@ sources = files( 'opdl_test.c', ) deps += ['bus_vdev'] - -# for clang 32-bit compiles we need libatomic for 64-bit atomic ops -if cc.get_id() == 'clang' and dpdk_conf.get('RTE_ARCH_64') == false - ext_deps += cc.find_library('atomic') -endif diff --git a/examples/l2fwd-event/meson.build b/examples/l2fwd-event/meson.build index c4664c3a3..4e9a069d6 100644 --- a/examples/l2fwd-event/meson.build +++ b/examples/l2fwd-event/meson.build @@ -16,8 +16,3 @@ sources = files( 'l2fwd_event_internal_port.c', 'l2fwd_event_generic.c' ) - -# for clang 32-bit compiles we need libatomic for 64-bit atomic ops -if cc.get_id() == 'clang' and dpdk_conf.get('RTE_ARCH_64') == false - ext_deps += cc.find_library('atomic') -endif diff --git a/lib/librte_distributor/meson.build b/lib/librte_distributor/meson.build index 266af6434..bd12ddb2f 100644 --- a/lib/librte_distributor/meson.build +++ b/lib/librte_distributor/meson.build @@ -9,8 +9,3 @@ else endif headers = files('rte_distributor.h') deps += ['mbuf'] - -# for clang 32-bit compiles we need libatomic for 64-bit atomic ops -if cc.get_id() == 'clang' and dpdk_conf.get('RTE_ARCH_64') == false - ext_deps += cc.find_library('atomic') -endif diff --git a/lib/librte_rcu/meson.build b/lib/librte_rcu/meson.build index 5929bd3a7..c009ae4b7 100644 --- a/lib/librte_rcu/meson.build +++ b/lib/librte_rcu/meson.build @@ -3,8 +3,3 @@ sources = files('rte_rcu_qsbr.c') headers = files('rte_rcu_qsbr.h') - -# for clang 32-bit compiles we need libatomic for 64-bit atomic ops -if cc.get_id() == 'clang' and dpdk_conf.get('RTE_ARCH_64') == false - ext_deps += cc.find_library('atomic') -endif From patchwork Sun Apr 19 10:01:02 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: 68874 X-Patchwork-Delegate: david.marchand@redhat.com 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 5210DA0561; Sun, 19 Apr 2020 12:02:54 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id F004D1D410; Sun, 19 Apr 2020 12:01:56 +0200 (CEST) Received: from mx0b-0016f401.pphosted.com (mx0b-0016f401.pphosted.com [67.231.156.173]) by dpdk.org (Postfix) with ESMTP id AF0611D40F for ; Sun, 19 Apr 2020 12:01:52 +0200 (CEST) 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 03JA18hX020147; Sun, 19 Apr 2020 03:01:50 -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=y5rY49KazOsctptEL7OxBmjI3ZtOcGMcUJJbWc807R0=; b=SVdsTmC7oIkpwNq3Yt5GP1q5WYJezG/9aP8kbZQJ07mHgZtGeMBnU1Q/BSxHecbRpPmP L6UzF0uibFPhhkBgGFdZcNoSqq6W+waflcNgvYLNfO96CMX7N+T081i0OCdp5IgWy1q7 oYrYdfYpOxiItXROxbPzKZy/eH3rJPlvG7nv3kS4+z/xEVHDuch9MdO6hETZNsjvGYfi krqgBvgHMqcVYiNE3SfSkc1RviJ4bSqBbwWwguXJ7fKLgKQXLAbAe6qUgB14jrS9jp10 K4qadheKQj8EFT7mU3vySAEW7U0aDx9qyCBDR+8+GMrBy1/uHEaU7ju39Z2aaoV0NZDo /w== Received: from sc-exch04.marvell.com ([199.233.58.184]) by mx0b-0016f401.pphosted.com with ESMTP id 30g12njx85-2 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT); Sun, 19 Apr 2020 03:01:50 -0700 Received: from DC5-EXCH02.marvell.com (10.69.176.39) by SC-EXCH04.marvell.com (10.93.176.84) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Sun, 19 Apr 2020 03:01:47 -0700 Received: from maili.marvell.com (10.69.176.80) by DC5-EXCH02.marvell.com (10.69.176.39) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Sun, 19 Apr 2020 03:01:48 -0700 Received: from jerin-lab.marvell.com (jerin-lab.marvell.com [10.28.34.14]) by maili.marvell.com (Postfix) with ESMTP id 45F463F703F; Sun, 19 Apr 2020 03:01:46 -0700 (PDT) From: To: Bruce Richardson CC: , , , , , Jerin Jacob Date: Sun, 19 Apr 2020 15:31:02 +0530 Message-ID: <20200419100133.3232316-3-jerinj@marvell.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200419100133.3232316-1-jerinj@marvell.com> References: <20200413150116.734047-1-jerinj@marvell.com> <20200419100133.3232316-1-jerinj@marvell.com> MIME-Version: 1.0 X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:6.0.138, 18.0.676 definitions=2020-04-19_02:2020-04-17, 2020-04-19 signatures=0 Subject: [dpdk-dev] [PATCH v6 02/33] eal: introduce API for getting thread name 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 Introduce rte_thread_getname() API to get the thread name and implement it for Linux and FreeBSD. FreeBSD does not support getting the thread name. One of the consumers of this API will be the trace subsystem where it used as an informative purpose. Signed-off-by: Jerin Jacob --- lib/librte_eal/freebsd/eal_thread.c | 9 +++++++++ lib/librte_eal/include/rte_lcore.h | 17 +++++++++++++++++ lib/librte_eal/linux/eal_thread.c | 15 +++++++++++++++ lib/librte_eal/rte_eal_version.map | 1 + 4 files changed, 42 insertions(+) diff --git a/lib/librte_eal/freebsd/eal_thread.c b/lib/librte_eal/freebsd/eal_thread.c index f21eddd93..d802c1d2e 100644 --- a/lib/librte_eal/freebsd/eal_thread.c +++ b/lib/librte_eal/freebsd/eal_thread.c @@ -175,3 +175,12 @@ int rte_thread_setname(pthread_t id, const char *name) pthread_set_name_np(id, name); return 0; } + +int rte_thread_getname(pthread_t id, char *name, size_t len) +{ + RTE_SET_USED(id); + RTE_SET_USED(name); + RTE_SET_USED(len); + + return -ENOTSUP; +} diff --git a/lib/librte_eal/include/rte_lcore.h b/lib/librte_eal/include/rte_lcore.h index 476b8ef3a..339046bc8 100644 --- a/lib/librte_eal/include/rte_lcore.h +++ b/lib/librte_eal/include/rte_lcore.h @@ -240,6 +240,23 @@ void rte_thread_get_affinity(rte_cpuset_t *cpusetp); */ int rte_thread_setname(pthread_t id, const char *name); +/** + * Get thread name. + * + * @note It fails with glibc < 2.12. + * + * @param id + * Thread id. + * @param name + * Thread name to set. + * @param len + * Thread name buffer length. + * @return + * On success, return 0; otherwise return a negative value. + */ +__rte_experimental +int rte_thread_getname(pthread_t id, char *name, size_t len); + /** * Create a control thread. * diff --git a/lib/librte_eal/linux/eal_thread.c b/lib/librte_eal/linux/eal_thread.c index 2fa5806b8..61fb2ed45 100644 --- a/lib/librte_eal/linux/eal_thread.c +++ b/lib/librte_eal/linux/eal_thread.c @@ -186,3 +186,18 @@ int rte_thread_setname(pthread_t id, const char *name) RTE_SET_USED(name); return -ret; } + +int rte_thread_getname(pthread_t id, char *name, size_t len) +{ + int ret = ENOSYS; +#if defined(__GLIBC__) && defined(__GLIBC_PREREQ) +#if __GLIBC_PREREQ(2, 12) + ret = pthread_getname_np(id, name, len); +#endif +#endif + RTE_SET_USED(id); + RTE_SET_USED(name); + RTE_SET_USED(len); + return -ret; + +} diff --git a/lib/librte_eal/rte_eal_version.map b/lib/librte_eal/rte_eal_version.map index f9ede5b41..71098581f 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_log_can_log; + rte_thread_getname; }; From patchwork Sun Apr 19 10:01:03 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: 68894 X-Patchwork-Delegate: david.marchand@redhat.com 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 8C484A0561; Sun, 19 Apr 2020 12:08:33 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id A0C381D63B; Sun, 19 Apr 2020 12:03:24 +0200 (CEST) Received: from mx0b-0016f401.pphosted.com (mx0a-0016f401.pphosted.com [67.231.148.174]) by dpdk.org (Postfix) with ESMTP id 878191D528 for ; Sun, 19 Apr 2020 12:01:56 +0200 (CEST) Received: from pps.filterd (m0045849.ppops.net [127.0.0.1]) by mx0a-0016f401.pphosted.com (8.16.0.42/8.16.0.42) with SMTP id 03J9wnCo032579; Sun, 19 Apr 2020 03:01:55 -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=o8dbsytyN97f7xueh5QFvaG9a341/ZAMSW6xXbgAko4=; b=M/HpmG4O9u/OMaMn70dxruFWQnxEM5thfgdUALA4mUh1f09lLkTNTKI82+Yxb8c/rEaq m9sgyfo+HIB+ouFiYMlp0DpZW9kDjFWQLMiVo5BGbLvT3XzGU3/xRCLaCNuYRNrnZO6F iWorac2YcGnTH4oGB/9pYt/naXubnuCLUMzGNx27wGODvnd8/znTTResizeY0TAQJ1iL lON1y1erI7E6kOAgPkLwap+GOM8ziJh0l6J1GI877ud7xE5APR0/nJ/ATDfN8vV3J99P YQFqgjNr5ZgGlZFHWGKJgIJw77Fu2nLB4F8tPqG4i+Jd1o6NTVtLfSTXuPWfsS65eESm oQ== Received: from sc-exch01.marvell.com ([199.233.58.181]) by mx0a-0016f401.pphosted.com with ESMTP id 30fxwp3d2u-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT); Sun, 19 Apr 2020 03:01:54 -0700 Received: from DC5-EXCH01.marvell.com (10.69.176.38) by SC-EXCH01.marvell.com (10.93.176.81) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Sun, 19 Apr 2020 03:01:53 -0700 Received: from DC5-EXCH02.marvell.com (10.69.176.39) by DC5-EXCH01.marvell.com (10.69.176.38) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Sun, 19 Apr 2020 03:01:52 -0700 Received: from maili.marvell.com (10.69.176.80) by DC5-EXCH02.marvell.com (10.69.176.39) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Sun, 19 Apr 2020 03:01:52 -0700 Received: from jerin-lab.marvell.com (jerin-lab.marvell.com [10.28.34.14]) by maili.marvell.com (Postfix) with ESMTP id DCA183F703F; Sun, 19 Apr 2020 03:01:49 -0700 (PDT) From: To: Thomas Monjalon , John McNamara , Marko Kovacevic , "Jerin Jacob" , Sunil Kumar Kori , "Bruce Richardson" CC: , , Date: Sun, 19 Apr 2020 15:31:03 +0530 Message-ID: <20200419100133.3232316-4-jerinj@marvell.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200419100133.3232316-1-jerinj@marvell.com> References: <20200413150116.734047-1-jerinj@marvell.com> <20200419100133.3232316-1-jerinj@marvell.com> MIME-Version: 1.0 X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:6.0.138, 18.0.676 definitions=2020-04-19_02:2020-04-17, 2020-04-19 signatures=0 Subject: [dpdk-dev] [PATCH v6 03/33] eal/trace: define the public API for trace support 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 Define the public API for trace support. This patch also adds support for the build infrastructure and update the MAINTAINERS file for the trace subsystem. The tracepoint object is of size 8B, it a global variable and used in fastpath. Created a new __rte_trace_point section to store the tracepoint objects as, - It is a mostly read-only data and not to mix with other "write" global variables. - Chances that the same subsystem Fast path variables come in the same fast path cache line. i.e, it will enable a more predictable performance number from build to build. Signed-off-by: Jerin Jacob Signed-off-by: Sunil Kumar Kori --- MAINTAINERS | 6 + config/common_base | 1 + config/meson.build | 1 + doc/api/doxy-api-index.md | 4 +- doc/guides/prog_guide/build-sdk-meson.rst | 5 + lib/librte_eal/common/eal_common_trace.c | 7 + lib/librte_eal/common/meson.build | 1 + lib/librte_eal/freebsd/Makefile | 1 + lib/librte_eal/include/meson.build | 2 + lib/librte_eal/include/rte_trace.h | 141 +++++++++++++ lib/librte_eal/include/rte_trace_point.h | 234 ++++++++++++++++++++++ lib/librte_eal/linux/Makefile | 1 + meson_options.txt | 2 + 13 files changed, 405 insertions(+), 1 deletion(-) create mode 100644 lib/librte_eal/common/eal_common_trace.c create mode 100644 lib/librte_eal/include/rte_trace.h create mode 100644 lib/librte_eal/include/rte_trace_point.h diff --git a/MAINTAINERS b/MAINTAINERS index 1bf00d7e5..bd76ec23f 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -194,6 +194,12 @@ F: app/test/test_string_fns.c F: app/test/test_tailq.c F: app/test/test_version.c +Trace - EXPERIMENTAL +M: Jerin Jacob +M: Sunil Kumar Kori +F: lib/librte_eal/include/rte_trace*.h +F: lib/librte_eal/common/eal_common_trace*.c + Memory Allocation M: Anatoly Burakov F: lib/librte_eal/include/rte_fbarray.h diff --git a/config/common_base b/config/common_base index c31175f9d..ac5257b8e 100644 --- a/config/common_base +++ b/config/common_base @@ -99,6 +99,7 @@ CONFIG_RTE_MAX_MEMZONE=2560 CONFIG_RTE_MAX_TAILQ=32 CONFIG_RTE_ENABLE_ASSERT=n CONFIG_RTE_LOG_DP_LEVEL=RTE_LOG_INFO +CONFIG_RTE_ENABLE_TRACE_FP=n CONFIG_RTE_LOG_HISTORY=256 CONFIG_RTE_BACKTRACE=y CONFIG_RTE_LIBEAL_USE_HPET=n diff --git a/config/meson.build b/config/meson.build index 8a4c692a9..f416be23e 100644 --- a/config/meson.build +++ b/config/meson.build @@ -230,6 +230,7 @@ dpdk_conf.set('RTE_MAX_LCORE', get_option('max_lcores')) dpdk_conf.set('RTE_MAX_NUMA_NODES', get_option('max_numa_nodes')) dpdk_conf.set('RTE_MAX_ETHPORTS', get_option('max_ethports')) dpdk_conf.set('RTE_LIBEAL_USE_HPET', get_option('use_hpet')) +dpdk_conf.set('RTE_ENABLE_TRACE_FP', get_option('enable_trace_fp')) # values which have defaults which may be overridden dpdk_conf.set('RTE_MAX_VFIO_GROUPS', 64) dpdk_conf.set('RTE_DRIVER_MEMPOOL_BUCKET_SIZE_KB', 64) diff --git a/doc/api/doxy-api-index.md b/doc/api/doxy-api-index.md index dff496be0..845a53491 100644 --- a/doc/api/doxy-api-index.md +++ b/doc/api/doxy-api-index.md @@ -174,7 +174,9 @@ The public API headers are grouped by topics: [hexdump] (@ref rte_hexdump.h), [debug] (@ref rte_debug.h), [log] (@ref rte_log.h), - [errno] (@ref rte_errno.h) + [errno] (@ref rte_errno.h), + [trace] (@ref rte_trace.h), + [trace_point] (@ref rte_trace_point.h) - **misc**: [EAL config] (@ref rte_eal.h), diff --git a/doc/guides/prog_guide/build-sdk-meson.rst b/doc/guides/prog_guide/build-sdk-meson.rst index e34daab91..a036299da 100644 --- a/doc/guides/prog_guide/build-sdk-meson.rst +++ b/doc/guides/prog_guide/build-sdk-meson.rst @@ -87,6 +87,9 @@ Project-specific options are passed used -Doption=value:: meson -Ddisable_drivers=event/*,net/tap # disable tap driver and all # eventdev PMDs for a smaller build + meson -Denable_trace_fp=true tracebuild # build with fastpath trace + #enabled + Examples of setting some of the same options using meson configure:: meson configure -Dwerror=true @@ -97,6 +100,8 @@ Examples of setting some of the same options using meson configure:: meson configure -Dmax_lcores=8 + meson configure -Denable_trace_fp=true + NOTE: once meson has been run to configure a build in a directory, it cannot be run again on the same directory. Instead ``meson configure`` should be used to change the build settings within the directory, and when diff --git a/lib/librte_eal/common/eal_common_trace.c b/lib/librte_eal/common/eal_common_trace.c new file mode 100644 index 000000000..33a6e563a --- /dev/null +++ b/lib/librte_eal/common/eal_common_trace.c @@ -0,0 +1,7 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(C) 2020 Marvell International Ltd. + */ + +#include +#include + diff --git a/lib/librte_eal/common/meson.build b/lib/librte_eal/common/meson.build index 02d9280cc..429e89f99 100644 --- a/lib/librte_eal/common/meson.build +++ b/lib/librte_eal/common/meson.build @@ -42,6 +42,7 @@ sources += files( 'eal_common_tailqs.c', 'eal_common_thread.c', 'eal_common_timer.c', + 'eal_common_trace.c', 'eal_common_uuid.c', 'hotplug_mp.c', 'malloc_elem.c', diff --git a/lib/librte_eal/freebsd/Makefile b/lib/librte_eal/freebsd/Makefile index 2d53ce9ee..500afc578 100644 --- a/lib/librte_eal/freebsd/Makefile +++ b/lib/librte_eal/freebsd/Makefile @@ -59,6 +59,7 @@ SRCS-$(CONFIG_RTE_EXEC_ENV_FREEBSD) += eal_common_thread.c SRCS-$(CONFIG_RTE_EXEC_ENV_FREEBSD) += eal_common_proc.c SRCS-$(CONFIG_RTE_EXEC_ENV_FREEBSD) += eal_common_fbarray.c SRCS-$(CONFIG_RTE_EXEC_ENV_FREEBSD) += eal_common_uuid.c +SRCS-$(CONFIG_RTE_EXEC_ENV_FREEBSD) += eal_common_trace.c SRCS-$(CONFIG_RTE_EXEC_ENV_FREEBSD) += rte_malloc.c SRCS-$(CONFIG_RTE_EXEC_ENV_FREEBSD) += hotplug_mp.c SRCS-$(CONFIG_RTE_EXEC_ENV_FREEBSD) += malloc_elem.c diff --git a/lib/librte_eal/include/meson.build b/lib/librte_eal/include/meson.build index 6fd427494..126455d1c 100644 --- a/lib/librte_eal/include/meson.build +++ b/lib/librte_eal/include/meson.build @@ -40,6 +40,8 @@ headers += files( 'rte_string_fns.h', 'rte_tailq.h', 'rte_time.h', + 'rte_trace.h', + 'rte_trace_point.h', 'rte_uuid.h', 'rte_version.h', 'rte_vfio.h', diff --git a/lib/librte_eal/include/rte_trace.h b/lib/librte_eal/include/rte_trace.h new file mode 100644 index 000000000..a7ff4590b --- /dev/null +++ b/lib/librte_eal/include/rte_trace.h @@ -0,0 +1,141 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(C) 2020 Marvell International Ltd. + */ + +#ifndef _RTE_TRACE_H_ +#define _RTE_TRACE_H_ + +/** + * @file + * + * RTE Trace API + * + * This file provides the trace API to RTE applications. + * + * @warning + * @b EXPERIMENTAL: this API may change without prior notice + */ + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include + +#include +#include + +/** + * Enumerate trace mode operation. + */ +enum rte_trace_mode { + /** + * In this mode, When no space left in trace buffer, the subsequent + * events overwrite the old events in the trace buffer. + */ + RTE_TRACE_MODE_OVERWRITE, + /** + * In this mode, When no space left on trace buffer, the subsequent + * events shall not be recorded in the trace buffer. + */ + RTE_TRACE_MODE_DISCARD, +}; + +/** + * Test if trace is enabled. + * + * @return + * true if trace is enabled, false otherwise. + */ +__rte_experimental +bool rte_trace_is_enabled(void); + +/** + * Set the trace mode. + * + * @param mode + * Trace mode. + */ +__rte_experimental +void rte_trace_mode_set(enum rte_trace_mode mode); + +/** + * Get the trace mode. + * + * @return + * The current trace mode. + */ +__rte_experimental +enum rte_trace_mode rte_trace_mode_get(void); + +/** + * Enable/Disable a set of tracepoints based on globbing pattern. + * + * @param pattern + * The match pattern identifying the tracepoint. + * @param enable + * true to enable tracepoint, false to disable the tracepoint, upon match. + * @return + * - 0: Success and no pattern match. + * - 1: Success and found pattern match. + * - (-ERANGE): Tracepoint object is not registered. + */ +__rte_experimental +int rte_trace_pattern(const char *pattern, bool enable); + +/** + * Enable/Disable a set of tracepoints based on regular expression. + * + * @param regex + * A regular expression identifying the tracepoint. + * @param enable + * true to enable tracepoint, false to disable the tracepoint, upon match. + * @return + * - 0: Success and no pattern match. + * - 1: Success and found pattern match. + * - (-ERANGE): Tracepoint object is not registered. + * - (-EINVAL): Invalid regular expression rule. + */ +__rte_experimental +int rte_trace_regexp(const char *regex, bool enable); + +/** + * Save the trace buffer to the trace directory. + * + * By default, trace directory will be created at $HOME directory and this can + * be overridden by --trace-dir EAL parameter. + * + * @return + * - 0: Success. + * - <0 : Failure. + */ +__rte_experimental +int rte_trace_save(void); + +/** + * Dump the trace metadata to a file. + * + * @param f + * A pointer to a file for output + * @return + * - 0: Success. + * - <0 : Failure. + */ +__rte_experimental +int rte_trace_metadata_dump(FILE *f); + +/** + * Dump the trace subsystem status to a file. + * + * @param f + * A pointer to a file for output + */ +__rte_experimental +void rte_trace_dump(FILE *f); + +#ifdef __cplusplus +} +#endif + +#endif /* _RTE_TRACE_H_ */ diff --git a/lib/librte_eal/include/rte_trace_point.h b/lib/librte_eal/include/rte_trace_point.h new file mode 100644 index 000000000..9d11830f6 --- /dev/null +++ b/lib/librte_eal/include/rte_trace_point.h @@ -0,0 +1,234 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(C) 2020 Marvell International Ltd. + */ + +#ifndef _RTE_TRACE_POINT_H_ +#define _RTE_TRACE_POINT_H_ + +/** + * @file + * + * RTE Tracepoint API + * + * This file provides the tracepoint API to RTE applications. + * + * @warning + * @b EXPERIMENTAL: this API may change without prior notice + */ + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include + +#include +#include + +/** The tracepoint object. */ +typedef uint64_t rte_trace_point_t; + +/** Macro to define the tracepoint. */ +#define RTE_TRACE_POINT_DEFINE(tp)\ +rte_trace_point_t __attribute__((section("__rte_trace_point"))) __##tp + +/** + * Macro to define the tracepoint arguments in RTE_TRACE_POINT macro. + + * @see RTE_TRACE_POINT, RTE_TRACE_POINT_FP + */ +#define RTE_TRACE_POINT_ARGS + +/** @internal Helper Macro to support RTE_TRACE_POINT and RTE_TRACE_POINT_FP */ +#define __RTE_TRACE_POINT(_mode, _tp, _args, ...)\ +extern rte_trace_point_t __##_tp;\ +static __rte_always_inline void \ +_tp _args \ +{\ + __rte_trace_point_emit_header_##_mode(&__##_tp);\ + __VA_ARGS__\ +} + +/** + * Create a tracepoint definition. + * + * A tracepoint definition defines, for a given tracepoint: + * - Its input arguments. They are the C function style parameters to define + * the arguments of tracepoint function. These input arguments embedded using + * RTE_TRACE_POINT_ARGS macro. + * - Its output event fields. They are the sources of event fields that form + * the payload of any event that the execution of the tracepoint macro emits + * for this particular tracepoint. The application uses rte_trace_point_emit_* + * macros to emit the output event fields. + * + * @param tp + * Tracepoint object. Before using the tracepoint, an application needs to + * define the tracepoint using RTE_TRACE_POINT_DEFINE macro. + * @param args + * C function style input arguments to define the arguments to tracepoint + * function. + * @param ... + * Define the payload of trace function. The payload will be formed using + * rte_trace_point_emit_* macros, Use ";" delimiter between two payloads. + * + * @see RTE_TRACE_POINT_ARGS, RTE_TRACE_POINT_DEFINE, rte_trace_point_emit_* + */ +#define RTE_TRACE_POINT(tp, args, ...)\ + __RTE_TRACE_POINT(generic, tp, args, __VA_ARGS__) + +/** + * Create a tracepoint definition for the data path. + * + * Similar to RTE_TRACE_POINT, except that it is removed at compilation time + * using RTE_ENABLE_TRACE_FP configuration parameter. + * + * @param tp + * Tracepoint object. Before using the tracepoint, an application needs to + * define the tracepoint using RTE_TRACE_POINT_DEFINE macro. + * @param args + * C function style input arguments to define the arguments to tracepoint. + * function. + * @param ... + * Define the payload of trace function. The payload will be formed using + * rte_trace_point_emit_* macros, Use ";" delimiter between two payloads. + * + * @see RTE_TRACE_POINT + */ +#define RTE_TRACE_POINT_FP(tp, args, ...)\ + __RTE_TRACE_POINT(fp, tp, args, __VA_ARGS__) + +#ifdef __DOXYGEN__ + +/** + * Macro to select rte_trace_point_emit_* definition for trace register function + * + * rte_trace_point_emit_* emits different definitions for trace function. + * Application must define RTE_TRACE_POINT_REGISTER_SELECT before including + * rte_trace_point.h in the C file where RTE_TRACE_POINT_REGISTER used. + * + * @see RTE_TRACE_POINT_REGISTER + */ +#define RTE_TRACE_POINT_REGISTER_SELECT + +/** + * Register a dynamic tracepoint. + * + * @param trace + * The tracepoint object created using RTE_TRACE_POINT_DEFINE. + * @param name + * The name of the tracepoint object. + * @return + * - 0: Successfully registered the tracepoint. + * - <0: Failure to register the tracepoint. + * + * @see RTE_TRACE_POINT_REGISTER_SELECT + */ +#define RTE_TRACE_POINT_REGISTER(trace, name) + +/** Tracepoint function payload for uint64_t datatype */ +#define rte_trace_point_emit_u64(val) +/** Tracepoint function payload for int64_t datatype */ +#define rte_trace_point_emit_i64(val) +/** Tracepoint function payload for uint32_t datatype */ +#define rte_trace_point_emit_u32(val) +/** Tracepoint function payload for int32_t datatype */ +#define rte_trace_point_emit_i32(val) +/** Tracepoint function payload for uint16_t datatype */ +#define rte_trace_point_emit_u16(val) +/** Tracepoint function payload for int16_t datatype */ +#define rte_trace_point_emit_i16(val) +/** Tracepoint function payload for uint8_t datatype */ +#define rte_trace_point_emit_u8(val) +/** Tracepoint function payload for int8_t datatype */ +#define rte_trace_point_emit_i8(val) +/** Tracepoint function payload for int datatype */ +#define rte_trace_point_emit_int(val) +/** Tracepoint function payload for long datatype */ +#define rte_trace_point_emit_long(val) +/** Tracepoint function payload for float datatype */ +#define rte_trace_point_emit_float(val) +/** Tracepoint function payload for double datatype */ +#define rte_trace_point_emit_double(val) +/** Tracepoint function payload for pointer datatype */ +#define rte_trace_point_emit_ptr(val) +/** Tracepoint function payload for string datatype */ +#define rte_trace_point_emit_string(val) + +#endif /* __DOXYGEN__ */ + +/** @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) + +/** + * Enable recording of the given tracepoint in the trace buffer. + * + * @param tp + * The tracepoint object to enable. + * @return + * - 0: Success. + * - (-ERANGE): Trace object is not registered. + */ +__rte_experimental +int rte_trace_point_enable(rte_trace_point_t *tp); + +/** + * Disable recording of the given tracepoint in the trace buffer. + * + * @param tp + * The tracepoint object to disable. + * @return + * - 0: Success. + * - (-ERANGE): Trace object is not registered. + */ +__rte_experimental +int rte_trace_point_disable(rte_trace_point_t *tp); + +/** + * Test if given tracepoint is enabled. + * + * @param tp + * The tracepoint object. + * @return + * true if tracepoint is enabled, false otherwise. + */ +__rte_experimental +bool rte_trace_point_is_enabled(rte_trace_point_t *tp); + +/** + * Lookup a tracepoint object from its name. + * + * @param name + * The name of the tracepoint. + * @return + * The tracepoint object or NULL if not found. + */ +__rte_experimental +rte_trace_point_t *rte_trace_point_lookup(const char *name); + +/** + * @internal + * + * Test if the tracepoint fastpath compile-time option is enabled. + * + * @return + * true if tracepoint fastpath enabled, false otherwise. + */ +__rte_experimental +static __rte_always_inline bool +__rte_trace_point_fp_is_enabled(void) +{ +#ifdef RTE_ENABLE_TRACE_FP + return true; +#else + return false; +#endif +} + +#ifdef __cplusplus +} +#endif + +#endif /* _RTE_TRACE_POINT_H_ */ diff --git a/lib/librte_eal/linux/Makefile b/lib/librte_eal/linux/Makefile index fc2316667..2ced2085b 100644 --- a/lib/librte_eal/linux/Makefile +++ b/lib/librte_eal/linux/Makefile @@ -66,6 +66,7 @@ SRCS-$(CONFIG_RTE_EXEC_ENV_LINUX) += eal_common_thread.c SRCS-$(CONFIG_RTE_EXEC_ENV_LINUX) += eal_common_proc.c SRCS-$(CONFIG_RTE_EXEC_ENV_LINUX) += eal_common_fbarray.c SRCS-$(CONFIG_RTE_EXEC_ENV_LINUX) += eal_common_uuid.c +SRCS-$(CONFIG_RTE_EXEC_ENV_LINUX) += eal_common_trace.c SRCS-$(CONFIG_RTE_EXEC_ENV_LINUX) += rte_malloc.c SRCS-$(CONFIG_RTE_EXEC_ENV_LINUX) += hotplug_mp.c SRCS-$(CONFIG_RTE_EXEC_ENV_LINUX) += malloc_elem.c diff --git a/meson_options.txt b/meson_options.txt index 9e4923a4f..3578a23ab 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -30,6 +30,8 @@ option('max_lcores', type: 'integer', value: 128, description: 'maximum number of cores/threads supported by EAL') option('max_numa_nodes', type: 'integer', value: 4, description: 'maximum number of NUMA nodes supported by EAL') +option('enable_trace_fp', type: 'boolean', value: false, + description: 'enable fastpath trace points.') option('tests', type: 'boolean', value: true, description: 'build unit tests') option('use_hpet', type: 'boolean', value: false, From patchwork Sun Apr 19 10:01:04 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: 68879 X-Patchwork-Delegate: david.marchand@redhat.com 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 67E56A0561; Sun, 19 Apr 2020 12:05:02 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id D15951D5B8; Sun, 19 Apr 2020 12:02:26 +0200 (CEST) Received: from mx0b-0016f401.pphosted.com (mx0b-0016f401.pphosted.com [67.231.156.173]) by dpdk.org (Postfix) with ESMTP id 014791D59B for ; Sun, 19 Apr 2020 12:02:07 +0200 (CEST) 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 03JA18ha020147; Sun, 19 Apr 2020 03:01:58 -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=TmKGmKgjZ6GP9ih3pO9addUhYLY6KP6bZUh/BecSZD0=; b=d1g4KGu2tuCzgoAO8b9bV4dnrZ/H/TqC7R7CBbS8aBLULF73wYbT+Y/qdKjcWM/7JzO5 6Je09I4Ci3JHct5pyEKbBIydIxe+FremY1q0SJYT9BC4noW8OPBRZkzf3u6OYFHucgQ6 cF2FgPOO4mxjofvBoq1kobX7W+ROojGEQ8NZws6dRqrq3n9Ki6e3TWUCiyT7C6vm+hOl dM5aQ/Qi8YasZ3cOCqaCbZrlXRcmiq9QWIwGXU3++LoJilf6qZ3v417joHgMAR9DnlFN IqMpY2WrdodcJR5b2F7uwNdNUfF4bgblT0EzOV9N9C9Hc7SydKeY7Bexg65X5bClr5V4 hg== Received: from sc-exch01.marvell.com ([199.233.58.181]) by mx0b-0016f401.pphosted.com with ESMTP id 30g12njx8t-2 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT); Sun, 19 Apr 2020 03:01:58 -0700 Received: from DC5-EXCH02.marvell.com (10.69.176.39) by SC-EXCH01.marvell.com (10.93.176.81) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Sun, 19 Apr 2020 03:01:55 -0700 Received: from maili.marvell.com (10.69.176.80) by DC5-EXCH02.marvell.com (10.69.176.39) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Sun, 19 Apr 2020 03:01:56 -0700 Received: from jerin-lab.marvell.com (jerin-lab.marvell.com [10.28.34.14]) by maili.marvell.com (Postfix) with ESMTP id D490D3F703F; Sun, 19 Apr 2020 03:01:53 -0700 (PDT) From: To: Thomas Monjalon , Jerin Jacob , Sunil Kumar Kori CC: , , , Date: Sun, 19 Apr 2020 15:31:04 +0530 Message-ID: <20200419100133.3232316-5-jerinj@marvell.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200419100133.3232316-1-jerinj@marvell.com> References: <20200413150116.734047-1-jerinj@marvell.com> <20200419100133.3232316-1-jerinj@marvell.com> MIME-Version: 1.0 X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:6.0.138, 18.0.676 definitions=2020-04-19_02:2020-04-17, 2020-04-19 signatures=0 Subject: [dpdk-dev] [PATCH v6 04/33] 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/eal_common_trace.c | 100 +++++++++++++++++- lib/librte_eal/common/eal_trace.h | 37 +++++++ lib/librte_eal/include/meson.build | 2 + lib/librte_eal/include/rte_trace_point.h | 26 +++++ .../include/rte_trace_point_provider.h | 21 ++++ .../include/rte_trace_point_register.h | 20 ++++ lib/librte_eal/rte_eal_version.map | 2 + 8 files changed, 207 insertions(+), 2 deletions(-) create mode 100644 lib/librte_eal/common/eal_trace.h create mode 100644 lib/librte_eal/include/rte_trace_point_provider.h create mode 100644 lib/librte_eal/include/rte_trace_point_register.h diff --git a/MAINTAINERS b/MAINTAINERS index bd76ec23f..4592abede 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -199,6 +199,7 @@ M: Jerin Jacob M: Sunil Kumar Kori F: lib/librte_eal/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/eal_common_trace.c b/lib/librte_eal/common/eal_common_trace.c index 33a6e563a..5c5cbd2a1 100644 --- a/lib/librte_eal/common/eal_common_trace.c +++ b/lib/librte_eal/common/eal_common_trace.c @@ -2,6 +2,102 @@ * Copyright(C) 2020 Marvell International Ltd. */ -#include -#include +#include +#include +#include +#include +#include +#include +#include + +#include "eal_trace.h" + +RTE_DEFINE_PER_LCORE(volatile int, trace_point_sz); +static RTE_DEFINE_PER_LCORE(char, ctf_field[TRACE_CTF_FIELD_SIZE]); +static 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_point_t *handle, const char *name, + void (*register_fn)(void)) +{ + char *field = RTE_PER_LCORE(ctf_field); + struct trace_point *tp; + uint16_t sz; + + /* Sanity checks of arguments */ + if (name == NULL || register_fn == NULL || handle == NULL) { + trace_err("invalid arguments"); + 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; + register_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; + + 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..4f1792768 --- /dev/null +++ b/lib/librte_eal/common/eal_trace.h @@ -0,0 +1,37 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(C) 2020 Marvell International Ltd. + */ + +#ifndef __EAL_TRACE_H +#define __EAL_TRACE_H + +#include +#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_point_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/include/meson.build b/lib/librte_eal/include/meson.build index 126455d1c..ce360615f 100644 --- a/lib/librte_eal/include/meson.build +++ b/lib/librte_eal/include/meson.build @@ -42,6 +42,8 @@ headers += files( 'rte_time.h', 'rte_trace.h', 'rte_trace_point.h', + 'rte_trace_point_provider.h', + 'rte_trace_point_register.h', 'rte_uuid.h', 'rte_version.h', 'rte_vfio.h', diff --git a/lib/librte_eal/include/rte_trace_point.h b/lib/librte_eal/include/rte_trace_point.h index 9d11830f6..f9924225a 100644 --- a/lib/librte_eal/include/rte_trace_point.h +++ b/lib/librte_eal/include/rte_trace_point.h @@ -227,6 +227,32 @@ __rte_trace_point_fp_is_enabled(void) #endif } +/** + * @internal + * + * 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 register_fn + * Trace registration function. + * @return + * - 0: Successfully registered the tracepoint. + * - <0: Failure to register the tracepoint. + */ +__rte_experimental +int __rte_trace_point_register(rte_trace_point_t *trace, const char *name, + void (*register_fn)(void)); + +#ifdef RTE_TRACE_POINT_REGISTER_SELECT +#include +#else +#include +#endif + #ifdef __cplusplus } #endif diff --git a/lib/librte_eal/include/rte_trace_point_provider.h b/lib/librte_eal/include/rte_trace_point_provider.h new file mode 100644 index 000000000..45a113c0d --- /dev/null +++ b/lib/librte_eal/include/rte_trace_point_provider.h @@ -0,0 +1,21 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(C) 2020 Marvell International Ltd. + */ + +#ifndef _RTE_TRACE_POINT_H_ +#error do not include this file directly, use instead +#endif + +#ifndef _RTE_TRACE_POINT_PROVIDER_H_ +#define _RTE_TRACE_POINT_PROVIDER_H_ + +#define __RTE_TRACE_EVENT_HEADER_ID_SHIFT (48) + +#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_ENABLE_MASK (1ULL << 63) +#define __RTE_TRACE_FIELD_ENABLE_DISCARD (1ULL << 62) + +#endif /* _RTE_TRACE_POINT_PROVIDER_H_ */ diff --git a/lib/librte_eal/include/rte_trace_point_register.h b/lib/librte_eal/include/rte_trace_point_register.h new file mode 100644 index 000000000..b21302c3d --- /dev/null +++ b/lib/librte_eal/include/rte_trace_point_register.h @@ -0,0 +1,20 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(C) 2020 Marvell International Ltd. + */ + +#ifndef _RTE_TRACE_POINT_H_ +#error do not include this file directly, use instead +#endif + +#ifndef _RTE_TRACE_POINT_REGISTER_H_ +#define _RTE_TRACE_POINT_REGISTER_H_ + +#include + +RTE_DECLARE_PER_LCORE(volatile int, trace_point_sz); + +#define RTE_TRACE_POINT_REGISTER(trace, name)\ + __rte_trace_point_register(&__##trace, RTE_STR(name),\ + (void (*)(void)) trace) + +#endif /* _RTE_TRACE_POINT_REGISTER_H_ */ diff --git a/lib/librte_eal/rte_eal_version.map b/lib/librte_eal/rte_eal_version.map index 71098581f..02a595126 100644 --- a/lib/librte_eal/rte_eal_version.map +++ b/lib/librte_eal/rte_eal_version.map @@ -337,6 +337,8 @@ EXPERIMENTAL { rte_thread_is_intr; # added in 20.05 + __rte_trace_point_register; + per_lcore_trace_point_sz; rte_log_can_log; rte_thread_getname; }; From patchwork Sun Apr 19 10:01:05 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: 68885 X-Patchwork-Delegate: david.marchand@redhat.com 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 D01FEA0561; Sun, 19 Apr 2020 12:06:27 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id C2DCA1D416; Sun, 19 Apr 2020 12:02:52 +0200 (CEST) Received: from mx0b-0016f401.pphosted.com (mx0b-0016f401.pphosted.com [67.231.156.173]) by dpdk.org (Postfix) with ESMTP id 560A31D59D for ; Sun, 19 Apr 2020 12:02:33 +0200 (CEST) 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 03JA11CK020104; Sun, 19 Apr 2020 03:02:02 -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=qIkZqGdF268gtr67oR7bdwblCaFEFGXxYoDGc4xJzEQ=; b=b/ongYd94E+UzzyEWz1T9omWBOwryAVP202RcLarwOHXE8GtE3Bj8ONVoLGKw1VmBBk3 FNBLdwMKZPfcqDspeDeIAOFunnWWr+JqaXeiPhahEmGn1dnL9Vl69Tl8sTx35AW6ngb1 isINJL6vX2GRyVvzp5BzWwxCKcy+ae89GilBTrMJyrV7diRqmRbHuMW/6vZGNj/EBEej RkwZ2ov35YLGHI5YpbOdUufsYcoLlNqo0hw7LhKdlBZv2FYoc/D7H5+YzC6xQdYv6sQI en6sbYWTAgqiaKdVvPG9c0f9YjyiIPn2yENUsGB++nhLF5sli8iPFYF1d3B/EatiC3tD kg== Received: from sc-exch03.marvell.com ([199.233.58.183]) by mx0b-0016f401.pphosted.com with ESMTP id 30g12njx91-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT); Sun, 19 Apr 2020 03:02:02 -0700 Received: from DC5-EXCH01.marvell.com (10.69.176.38) by SC-EXCH03.marvell.com (10.93.176.83) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Sun, 19 Apr 2020 03:01:59 -0700 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.2 via Frontend Transport; Sun, 19 Apr 2020 03:01:59 -0700 Received: from jerin-lab.marvell.com (jerin-lab.marvell.com [10.28.34.14]) by maili.marvell.com (Postfix) with ESMTP id 8F6A23F703F; Sun, 19 Apr 2020 03:01:57 -0700 (PDT) From: To: Jerin Jacob , Sunil Kumar Kori CC: , , , , Date: Sun, 19 Apr 2020 15:31:05 +0530 Message-ID: <20200419100133.3232316-6-jerinj@marvell.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200419100133.3232316-1-jerinj@marvell.com> References: <20200413150116.734047-1-jerinj@marvell.com> <20200419100133.3232316-1-jerinj@marvell.com> MIME-Version: 1.0 X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:6.0.138, 18.0.676 definitions=2020-04-19_02:2020-04-17, 2020-04-19 signatures=0 Subject: [dpdk-dev] [PATCH v6 05/33] eal/trace: implement trace operation APIs 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 This patch implements the following public trace APIs. - rte_trace_is_enabled() - rte_trace_mode_get() - rte_trace_mode_set() - rte_trace_pattern() - rte_trace_point_disable() - rte_trace_point_enable() - rte_trace_point_is_enabled() - rte_trace_point_lookup() - rte_trace_regexp() Signed-off-by: Jerin Jacob Signed-off-by: Sunil Kumar Kori --- lib/librte_eal/common/eal_common_trace.c | 147 +++++++++++++++++++++++ lib/librte_eal/common/eal_trace.h | 10 ++ lib/librte_eal/rte_eal_version.map | 9 ++ 3 files changed, 166 insertions(+) diff --git a/lib/librte_eal/common/eal_common_trace.c b/lib/librte_eal/common/eal_common_trace.c index 5c5cbd2a1..1ca702f68 100644 --- a/lib/librte_eal/common/eal_common_trace.c +++ b/lib/librte_eal/common/eal_common_trace.c @@ -3,7 +3,9 @@ */ #include +#include #include +#include #include #include @@ -20,6 +22,151 @@ static RTE_DEFINE_PER_LCORE(int, ctf_count); static struct trace_point_head tp_list = STAILQ_HEAD_INITIALIZER(tp_list); static struct trace trace; +bool +rte_trace_is_enabled(void) +{ + return trace.status; +} + +static void +trace_mode_set(rte_trace_point_t *trace, enum rte_trace_mode mode) +{ + if (mode == RTE_TRACE_MODE_OVERWRITE) + __atomic_and_fetch(trace, ~__RTE_TRACE_FIELD_ENABLE_DISCARD, + __ATOMIC_RELEASE); + else + __atomic_or_fetch(trace, __RTE_TRACE_FIELD_ENABLE_DISCARD, + __ATOMIC_RELEASE); +} + +void +rte_trace_mode_set(enum rte_trace_mode mode) +{ + struct trace_point *tp; + + if (rte_trace_is_enabled() == false) + return; + + STAILQ_FOREACH(tp, &tp_list, next) + trace_mode_set(tp->handle, mode); + + trace.mode = mode; +} + +enum +rte_trace_mode rte_trace_mode_get(void) +{ + return trace.mode; +} + +static bool +trace_point_is_invalid(rte_trace_point_t *t) +{ + if (t == NULL) + return false; + + if (trace_id_get(t) >= trace.nb_trace_points) + return true; + + return false; +} + +bool +rte_trace_point_is_enabled(rte_trace_point_t *trace) +{ + uint64_t val; + + if (trace_point_is_invalid(trace)) + return false; + + val = __atomic_load_n(trace, __ATOMIC_ACQUIRE); + return val & __RTE_TRACE_FIELD_ENABLE_MASK; +} + +int +rte_trace_point_enable(rte_trace_point_t *trace) +{ + if (trace_point_is_invalid(trace)) + return -ERANGE; + + __atomic_or_fetch(trace, __RTE_TRACE_FIELD_ENABLE_MASK, + __ATOMIC_RELEASE); + return 0; +} + +int +rte_trace_point_disable(rte_trace_point_t *trace) +{ + if (trace_point_is_invalid(trace)) + return -ERANGE; + + __atomic_and_fetch(trace, ~__RTE_TRACE_FIELD_ENABLE_MASK, + __ATOMIC_RELEASE); + return 0; +} + +int +rte_trace_pattern(const char *pattern, bool enable) +{ + struct trace_point *tp; + int rc = 0, found = 0; + + STAILQ_FOREACH(tp, &tp_list, next) { + if (fnmatch(pattern, tp->name, 0) == 0) { + if (enable) + rc = rte_trace_point_enable(tp->handle); + else + rc = rte_trace_point_disable(tp->handle); + found = 1; + } + if (rc < 0) + return rc; + } + + return rc | found; +} + +int +rte_trace_regexp(const char *regex, bool enable) +{ + struct trace_point *tp; + int rc = 0, found = 0; + regex_t r; + + if (regcomp(&r, regex, 0) != 0) + return -EINVAL; + + STAILQ_FOREACH(tp, &tp_list, next) { + if (regexec(&r, tp->name, 0, NULL, 0) == 0) { + if (enable) + rc = rte_trace_point_enable(tp->handle); + else + rc = rte_trace_point_disable(tp->handle); + found = 1; + } + if (rc < 0) + return rc; + } + regfree(&r); + + return rc | found; +} + +rte_trace_point_t * +rte_trace_point_lookup(const char *name) +{ + struct trace_point *tp; + + if (name == NULL) + return NULL; + + STAILQ_FOREACH(tp, &tp_list, next) + if (strncmp(tp->name, name, TRACE_POINT_NAME_SIZE) == 0) + return tp->handle; + + return NULL; +} + int __rte_trace_point_register(rte_trace_point_t *handle, const char *name, void (*register_fn)(void)) diff --git a/lib/librte_eal/common/eal_trace.h b/lib/librte_eal/common/eal_trace.h index 4f1792768..ebf7914ff 100644 --- a/lib/librte_eal/common/eal_trace.h +++ b/lib/librte_eal/common/eal_trace.h @@ -28,9 +28,19 @@ struct trace_point { struct trace { int register_errno; + bool status; + enum rte_trace_mode mode; uint32_t nb_trace_points; }; +/* Helper functions */ +static inline uint16_t +trace_id_get(rte_trace_point_t *trace) +{ + return (*trace & __RTE_TRACE_FIELD_ID_MASK) >> + __RTE_TRACE_FIELD_ID_SHIFT; +} + /* Trace point list functions */ STAILQ_HEAD(trace_point_head, trace_point); diff --git a/lib/librte_eal/rte_eal_version.map b/lib/librte_eal/rte_eal_version.map index 02a595126..2e6aacc17 100644 --- a/lib/librte_eal/rte_eal_version.map +++ b/lib/librte_eal/rte_eal_version.map @@ -341,4 +341,13 @@ EXPERIMENTAL { per_lcore_trace_point_sz; rte_log_can_log; rte_thread_getname; + rte_trace_is_enabled; + rte_trace_mode_get; + rte_trace_mode_set; + rte_trace_pattern; + rte_trace_point_disable; + rte_trace_point_enable; + rte_trace_point_is_enabled; + rte_trace_point_lookup; + rte_trace_regexp; }; From patchwork Sun Apr 19 10:01:06 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: 68878 X-Patchwork-Delegate: david.marchand@redhat.com 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 E9E84A0561; Sun, 19 Apr 2020 12:04:47 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 9C1A91D5AE; Sun, 19 Apr 2020 12:02:25 +0200 (CEST) Received: from mx0b-0016f401.pphosted.com (mx0b-0016f401.pphosted.com [67.231.156.173]) by dpdk.org (Postfix) with ESMTP id 758741D59F for ; Sun, 19 Apr 2020 12:02:17 +0200 (CEST) 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 03JA18hb020147; Sun, 19 Apr 2020 03:02:05 -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=wRHV2jDskc8ilD2AKsDwLWDVra+ovU2LrMxEwm/8qUQ=; b=s4BlD0XqeD+dSvsiXU+iA8LOhV3loeHv2KkmawnMQAPJuN16IOeaG31pkHa1GcpRRZxU qRQhzSqvQraMCH/hGQX5I5HVMJK6EG6OV8Pjo7IGMBwZL+mAIXbWmVHJH5lvrGorLRXU d9ER+ppkpRvK2GkbdEBnrMpv8zEOVrhzGFtrPSjqgLUMpjeeDwPtgyLLsYnvdOFAwRu1 JKMiPInvopNq5zEDQTi6c4uYhft7s2QVqWptEuxRDTVfT3yLe/Elgiu6EYi2S75+1QiK JzRMClRyQ93+HHJMwRgABrTiWf0v9Di5I9v8w/YBUuFFVk8w79bYYDmtixcQ7UOIiePv /Q== Received: from sc-exch01.marvell.com ([199.233.58.181]) by mx0b-0016f401.pphosted.com with ESMTP id 30g12njx9c-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT); Sun, 19 Apr 2020 03:02:05 -0700 Received: from DC5-EXCH02.marvell.com (10.69.176.39) by SC-EXCH01.marvell.com (10.93.176.81) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Sun, 19 Apr 2020 03:02:02 -0700 Received: from maili.marvell.com (10.69.176.80) by DC5-EXCH02.marvell.com (10.69.176.39) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Sun, 19 Apr 2020 03:02:03 -0700 Received: from jerin-lab.marvell.com (jerin-lab.marvell.com [10.28.34.14]) by maili.marvell.com (Postfix) with ESMTP id 02D453F703F; Sun, 19 Apr 2020 03:02:00 -0700 (PDT) From: To: Jerin Jacob , Sunil Kumar Kori , Bruce Richardson CC: , , , Date: Sun, 19 Apr 2020 15:31:06 +0530 Message-ID: <20200419100133.3232316-7-jerinj@marvell.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200419100133.3232316-1-jerinj@marvell.com> References: <20200413150116.734047-1-jerinj@marvell.com> <20200419100133.3232316-1-jerinj@marvell.com> MIME-Version: 1.0 X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:6.0.138, 18.0.676 definitions=2020-04-19_02:2020-04-17, 2020-04-19 signatures=0 Subject: [dpdk-dev] [PATCH v6 06/33] eal/trace: add internal trace init and fini interface 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 Define eal_trace_init() and eal_trace_fini() EAL interface functions that rte_eal_init() and rte_eal_cleanup() function can be use to initialize and finalize the trace subsystem. eal_trace_init() function will add the following functionality if trace is enabled through EAL command line param. - Test for trace registration failure. - Test for duplicate trace name registration - Generate UUID ver 4. - Create a trace directory Signed-off-by: Jerin Jacob Signed-off-by: Sunil Kumar Kori --- lib/librte_eal/common/eal_common_trace.c | 54 ++++++ .../common/eal_common_trace_utils.c | 173 ++++++++++++++++++ lib/librte_eal/common/eal_trace.h | 22 +++ lib/librte_eal/common/meson.build | 1 + lib/librte_eal/freebsd/Makefile | 1 + lib/librte_eal/linux/Makefile | 1 + 6 files changed, 252 insertions(+) create mode 100644 lib/librte_eal/common/eal_common_trace_utils.c diff --git a/lib/librte_eal/common/eal_common_trace.c b/lib/librte_eal/common/eal_common_trace.c index 1ca702f68..557054c65 100644 --- a/lib/librte_eal/common/eal_common_trace.c +++ b/lib/librte_eal/common/eal_common_trace.c @@ -22,6 +22,60 @@ static RTE_DEFINE_PER_LCORE(int, ctf_count); static struct trace_point_head tp_list = STAILQ_HEAD_INITIALIZER(tp_list); static struct trace trace; +struct trace* +trace_obj_get(void) +{ + return &trace; +} + +struct trace_point_head * +trace_list_head_get(void) +{ + return &tp_list; +} + +int +eal_trace_init(void) +{ + /* One of the Trace registration failed */ + if (trace.register_errno) { + rte_errno = trace.register_errno; + goto fail; + } + + if (rte_trace_is_enabled() == false) + return 0; + + rte_spinlock_init(&trace.lock); + + /* Is duplicate trace name registered */ + if (trace_has_duplicate_entry()) + goto fail; + + /* Generate UUID ver 4 with total size of events and number of events */ + trace_uuid_generate(); + + /* Create trace directory */ + if (trace_mkdir()) + goto fail; + + + rte_trace_mode_set(trace.mode); + + return 0; + +fail: + trace_err("failed to initialize trace [%s]", rte_strerror(rte_errno)); + return -rte_errno; +} + +void +eal_trace_fini(void) +{ + if (rte_trace_is_enabled() == false) + return; +} + bool rte_trace_is_enabled(void) { diff --git a/lib/librte_eal/common/eal_common_trace_utils.c b/lib/librte_eal/common/eal_common_trace_utils.c new file mode 100644 index 000000000..d2ab8f845 --- /dev/null +++ b/lib/librte_eal/common/eal_common_trace_utils.c @@ -0,0 +1,173 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(C) 2020 Marvell International Ltd. + */ + +#include +#include +#include +#include + +#include +#include +#include + +#include "eal_filesystem.h" +#include "eal_trace.h" + +static bool +trace_entry_compare(const char *name) +{ + struct trace_point_head *tp_list = trace_list_head_get(); + struct trace_point *tp; + int count = 0; + + STAILQ_FOREACH(tp, tp_list, next) { + if (strncmp(tp->name, name, TRACE_POINT_NAME_SIZE) == 0) + count++; + if (count > 1) { + trace_err("found duplicate entry %s", name); + rte_errno = EEXIST; + return true; + } + } + return false; +} + +bool +trace_has_duplicate_entry(void) +{ + struct trace_point_head *tp_list = trace_list_head_get(); + struct trace_point *tp; + + /* Is duplicate trace name registered */ + STAILQ_FOREACH(tp, tp_list, next) + if (trace_entry_compare(tp->name)) + return true; + + return false; +} + +void +trace_uuid_generate(void) +{ + struct trace_point_head *tp_list = trace_list_head_get(); + struct trace *trace = trace_obj_get(); + struct trace_point *tp; + uint64_t sz_total = 0; + + /* Go over the registered trace points to get total size of events */ + STAILQ_FOREACH(tp, tp_list, next) { + const uint16_t sz = *tp->handle & __RTE_TRACE_FIELD_SIZE_MASK; + sz_total += sz; + } + + rte_uuid_t uuid = RTE_UUID_INIT(sz_total, trace->nb_trace_points, + 0x4370, 0x8f50, 0x222ddd514176ULL); + rte_uuid_copy(trace->uuid, uuid); +} + +static int +trace_session_name_generate(char *trace_dir) +{ + struct tm *tm_result; + time_t tm; + int rc; + + tm = time(NULL); + if ((int)tm == -1) + goto fail; + + tm_result = localtime(&tm); + if (tm_result == NULL) + goto fail; + + rc = rte_strscpy(trace_dir, + eal_get_hugefile_prefix(), TRACE_PREFIX_LEN); + if (rc == -E2BIG) + rc = TRACE_PREFIX_LEN; + trace_dir[rc++] = '-'; + + rc = strftime(trace_dir + rc, TRACE_DIR_STR_LEN - rc, + "%Y-%m-%d-%p-%I-%M-%S", tm_result); + if (rc == 0) + goto fail; + + return rc; +fail: + rte_errno = errno; + return -rte_errno; +} + +static int +trace_dir_default_path_get(char *dir_path) +{ + struct trace *trace = trace_obj_get(); + uint32_t size = sizeof(trace->dir); + struct passwd *pwd; + char *home_dir; + + /* First check for shell environment variable */ + home_dir = getenv("HOME"); + if (home_dir == NULL) { + /* Fallback to password file entry */ + pwd = getpwuid(getuid()); + if (pwd == NULL) + return -EINVAL; + + home_dir = pwd->pw_dir; + } + + /* Append dpdk-traces to directory */ + if (snprintf(dir_path, size, "%s/dpdk-traces/", home_dir) < 0) + return -ENAMETOOLONG; + + return 0; +} + +int +trace_mkdir(void) +{ + struct trace *trace = trace_obj_get(); + char session[TRACE_DIR_STR_LEN]; + char *dir_path; + int rc; + + if (!trace->dir_offset) { + dir_path = calloc(1, sizeof(trace->dir)); + if (dir_path == NULL) { + trace_err("fail to allocate memory"); + return -ENOMEM; + } + + rc = trace_dir_default_path_get(dir_path); + if (rc < 0) { + trace_err("fail to get default path"); + free(dir_path); + return rc; + } + + } + + /* Create the path if it t exist, no "mkdir -p" available here */ + rc = mkdir(trace->dir, 0700); + if (rc < 0 && errno != EEXIST) { + trace_err("mkdir %s failed [%s]", trace->dir, strerror(errno)); + rte_errno = errno; + return -rte_errno; + } + + rc = trace_session_name_generate(session); + if (rc < 0) + return rc; + + rc = mkdir(trace->dir, 0700); + if (rc < 0) { + trace_err("mkdir %s failed [%s]", trace->dir, strerror(errno)); + rte_errno = errno; + return -rte_errno; + } + + RTE_LOG(INFO, EAL, "Trace dir: %s\n", trace->dir); + return 0; +} + diff --git a/lib/librte_eal/common/eal_trace.h b/lib/librte_eal/common/eal_trace.h index ebf7914ff..deb57dd4c 100644 --- a/lib/librte_eal/common/eal_trace.h +++ b/lib/librte_eal/common/eal_trace.h @@ -5,8 +5,10 @@ #ifndef __EAL_TRACE_H #define __EAL_TRACE_H +#include #include #include +#include #define trace_err(fmt, args...)\ RTE_LOG(ERR, EAL, "%s():%u " fmt "\n",\ @@ -16,6 +18,8 @@ RTE_LOG(CRIT, EAL, "%s():%u " fmt "\n",\ __func__, __LINE__, ## args) +#define TRACE_PREFIX_LEN 12 +#define TRACE_DIR_STR_LEN (sizeof("YYYY-mm-dd-AM-HH-MM-SS") + TRACE_PREFIX_LEN) #define TRACE_CTF_FIELD_SIZE 384 #define TRACE_POINT_NAME_SIZE 64 @@ -27,10 +31,15 @@ struct trace_point { }; struct trace { + char dir[PATH_MAX]; + int dir_offset; int register_errno; bool status; enum rte_trace_mode mode; + rte_uuid_t uuid; + uint32_t buff_len; uint32_t nb_trace_points; + rte_spinlock_t lock; }; /* Helper functions */ @@ -41,7 +50,20 @@ trace_id_get(rte_trace_point_t *trace) __RTE_TRACE_FIELD_ID_SHIFT; } +/* Trace object functions */ +struct trace *trace_obj_get(void); + /* Trace point list functions */ STAILQ_HEAD(trace_point_head, trace_point); +struct trace_point_head *trace_list_head_get(void); + +/* Util functions */ +bool trace_has_duplicate_entry(void); +void trace_uuid_generate(void); +int trace_mkdir(void); + +/* EAL interface */ +int eal_trace_init(void); +void eal_trace_fini(void); #endif /* __EAL_TRACE_H */ diff --git a/lib/librte_eal/common/meson.build b/lib/librte_eal/common/meson.build index 429e89f99..3dc320327 100644 --- a/lib/librte_eal/common/meson.build +++ b/lib/librte_eal/common/meson.build @@ -43,6 +43,7 @@ sources += files( 'eal_common_thread.c', 'eal_common_timer.c', 'eal_common_trace.c', + 'eal_common_trace_utils.c', 'eal_common_uuid.c', 'hotplug_mp.c', 'malloc_elem.c', diff --git a/lib/librte_eal/freebsd/Makefile b/lib/librte_eal/freebsd/Makefile index 500afc578..ae59c8c19 100644 --- a/lib/librte_eal/freebsd/Makefile +++ b/lib/librte_eal/freebsd/Makefile @@ -60,6 +60,7 @@ SRCS-$(CONFIG_RTE_EXEC_ENV_FREEBSD) += eal_common_proc.c SRCS-$(CONFIG_RTE_EXEC_ENV_FREEBSD) += eal_common_fbarray.c SRCS-$(CONFIG_RTE_EXEC_ENV_FREEBSD) += eal_common_uuid.c SRCS-$(CONFIG_RTE_EXEC_ENV_FREEBSD) += eal_common_trace.c +SRCS-$(CONFIG_RTE_EXEC_ENV_FREEBSD) += eal_common_trace_utils.c SRCS-$(CONFIG_RTE_EXEC_ENV_FREEBSD) += rte_malloc.c SRCS-$(CONFIG_RTE_EXEC_ENV_FREEBSD) += hotplug_mp.c SRCS-$(CONFIG_RTE_EXEC_ENV_FREEBSD) += malloc_elem.c diff --git a/lib/librte_eal/linux/Makefile b/lib/librte_eal/linux/Makefile index 2ced2085b..7992500a9 100644 --- a/lib/librte_eal/linux/Makefile +++ b/lib/librte_eal/linux/Makefile @@ -67,6 +67,7 @@ SRCS-$(CONFIG_RTE_EXEC_ENV_LINUX) += eal_common_proc.c SRCS-$(CONFIG_RTE_EXEC_ENV_LINUX) += eal_common_fbarray.c SRCS-$(CONFIG_RTE_EXEC_ENV_LINUX) += eal_common_uuid.c SRCS-$(CONFIG_RTE_EXEC_ENV_LINUX) += eal_common_trace.c +SRCS-$(CONFIG_RTE_EXEC_ENV_LINUX) += eal_common_trace_utils.c SRCS-$(CONFIG_RTE_EXEC_ENV_LINUX) += rte_malloc.c SRCS-$(CONFIG_RTE_EXEC_ENV_LINUX) += hotplug_mp.c SRCS-$(CONFIG_RTE_EXEC_ENV_LINUX) += malloc_elem.c From patchwork Sun Apr 19 10:01:07 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: 68877 X-Patchwork-Delegate: david.marchand@redhat.com 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 196E0A0561; Sun, 19 Apr 2020 12:04:34 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 455FC1D5A2; Sun, 19 Apr 2020 12:02:19 +0200 (CEST) Received: from mx0b-0016f401.pphosted.com (mx0b-0016f401.pphosted.com [67.231.156.173]) by dpdk.org (Postfix) with ESMTP id 5B4651D5A0 for ; Sun, 19 Apr 2020 12:02:15 +0200 (CEST) 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 03JA11CL020104; Sun, 19 Apr 2020 03:02:09 -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=Q9K8jNCH775yEcmgD7gCozApvo0yk/fMUdH02K22a0I=; b=tREK6Vo+WcxMZ64Ku4kh5MTMhIqvH5VyQqBi9JVdexzVdeqiCgNvgFsH4ZS63ZmCcdlz WStSvpPx1H/zZN8uk/ypqHy8YJSt1BnKorkBJWcQmpRmzrOsrF9oVSrYB/fnoLo7XvWA tEUUD2hPPzZ10szF+bNO3iM9CigHn62hH9R/1MAF8Pk1A14vq06XclfxKWdLTfk7E/y0 JBIfvCFJK9FWQw3epIR29wcxiBtc1peNkfL/f1SUuYmjN3/4yU4mAPx6cXXCi0oMfJje UiXBK7mTagXDr1gpq+2RD1s4Kz6hSzo2r6+Hpzv0ogexeno5TcV+S7PG2e9l7sf2sAmS ug== Received: from sc-exch03.marvell.com ([199.233.58.183]) by mx0b-0016f401.pphosted.com with ESMTP id 30g12njx9p-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT); Sun, 19 Apr 2020 03:02:09 -0700 Received: from DC5-EXCH01.marvell.com (10.69.176.38) by SC-EXCH03.marvell.com (10.93.176.83) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Sun, 19 Apr 2020 03:02:07 -0700 Received: from DC5-EXCH02.marvell.com (10.69.176.39) by DC5-EXCH01.marvell.com (10.69.176.38) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Sun, 19 Apr 2020 03:02:06 -0700 Received: from maili.marvell.com (10.69.176.80) by DC5-EXCH02.marvell.com (10.69.176.39) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Sun, 19 Apr 2020 03:02:06 -0700 Received: from jerin-lab.marvell.com (jerin-lab.marvell.com [10.28.34.14]) by maili.marvell.com (Postfix) with ESMTP id 689CE3F703F; Sun, 19 Apr 2020 03:02:04 -0700 (PDT) From: To: Jerin Jacob , Sunil Kumar Kori CC: , , , , Date: Sun, 19 Apr 2020 15:31:07 +0530 Message-ID: <20200419100133.3232316-8-jerinj@marvell.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200419100133.3232316-1-jerinj@marvell.com> References: <20200413150116.734047-1-jerinj@marvell.com> <20200419100133.3232316-1-jerinj@marvell.com> MIME-Version: 1.0 X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:6.0.138, 18.0.676 definitions=2020-04-19_02:2020-04-17, 2020-04-19 signatures=0 Subject: [dpdk-dev] [PATCH v6 07/33] eal/trace: get bootup timestamp for trace 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 Find epoch_sec, epoch_nsec and uptime_ticks time information on eal_trace_init()/bootup to derive the time in the trace. Signed-off-by: Jerin Jacob --- lib/librte_eal/common/eal_common_trace.c | 3 +++ .../common/eal_common_trace_utils.c | 22 +++++++++++++++++++ lib/librte_eal/common/eal_trace.h | 5 +++++ 3 files changed, 30 insertions(+) diff --git a/lib/librte_eal/common/eal_common_trace.c b/lib/librte_eal/common/eal_common_trace.c index 557054c65..bbfc4fc2f 100644 --- a/lib/librte_eal/common/eal_common_trace.c +++ b/lib/librte_eal/common/eal_common_trace.c @@ -59,6 +59,9 @@ eal_trace_init(void) if (trace_mkdir()) goto fail; + /* Save current epoch timestamp for future use */ + if (trace_epoch_time_save() < 0) + goto fail; rte_trace_mode_set(trace.mode); diff --git a/lib/librte_eal/common/eal_common_trace_utils.c b/lib/librte_eal/common/eal_common_trace_utils.c index d2ab8f845..f7700934b 100644 --- a/lib/librte_eal/common/eal_common_trace_utils.c +++ b/lib/librte_eal/common/eal_common_trace_utils.c @@ -98,6 +98,28 @@ trace_session_name_generate(char *trace_dir) return -rte_errno; } +int +trace_epoch_time_save(void) +{ + struct trace *trace = trace_obj_get(); + struct timespec epoch = { 0, 0 }; + uint64_t avg, start, end; + + start = rte_get_tsc_cycles(); + if (clock_gettime(CLOCK_REALTIME, &epoch) < 0) { + trace_err("failed to get the epoch time"); + return -1; + } + end = rte_get_tsc_cycles(); + avg = (start + end) >> 1; + + trace->epoch_sec = (uint64_t) epoch.tv_sec; + trace->epoch_nsec = (uint64_t) epoch.tv_nsec; + trace->uptime_ticks = avg; + + return 0; +} + static int trace_dir_default_path_get(char *dir_path) { diff --git a/lib/librte_eal/common/eal_trace.h b/lib/librte_eal/common/eal_trace.h index deb57dd4c..493163c1c 100644 --- a/lib/librte_eal/common/eal_trace.h +++ b/lib/librte_eal/common/eal_trace.h @@ -5,6 +5,7 @@ #ifndef __EAL_TRACE_H #define __EAL_TRACE_H +#include #include #include #include @@ -39,6 +40,9 @@ struct trace { rte_uuid_t uuid; uint32_t buff_len; uint32_t nb_trace_points; + uint64_t epoch_sec; + uint64_t epoch_nsec; + uint64_t uptime_ticks; rte_spinlock_t lock; }; @@ -61,6 +65,7 @@ struct trace_point_head *trace_list_head_get(void); bool trace_has_duplicate_entry(void); void trace_uuid_generate(void); int trace_mkdir(void); +int trace_epoch_time_save(void); /* EAL interface */ int eal_trace_init(void); From patchwork Sun Apr 19 10:01:08 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: 68881 X-Patchwork-Delegate: david.marchand@redhat.com 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 DA92EA0561; Sun, 19 Apr 2020 12:05:29 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id ACC6D1D5D5; Sun, 19 Apr 2020 12:02:35 +0200 (CEST) Received: from mx0b-0016f401.pphosted.com (mx0b-0016f401.pphosted.com [67.231.156.173]) by dpdk.org (Postfix) with ESMTP id 972721D5AD for ; Sun, 19 Apr 2020 12:02:13 +0200 (CEST) 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 03JA0tuq020047; Sun, 19 Apr 2020 03:02:12 -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=hkhYVrhD0bngDdmrMMdEX1p+1FV4lcMaCbKBmNnWI2M=; b=F/tgZa2EOlZHnbMuh6QKZX1ykV3hRW+nMQPJnqGmTCsCG74vziZGNNYKp5TEDAWL2vhX QzDCdVvnERqVbJraPY/gI1S277JiYkkfetjUr032LEgxuR8J4xLCNgLbSkqXywgGo86n 4cJvOlNgCVKaCcs3wk3exVNDSK9WnGHxQqF4hFLAGNO2A7GozpW9h8o9wJo9so2a9f2T VBYh1bcf/e6lQ4gEVuB3PUOe2dC3KQ5yDMwsN8Un52WCZ5v5huXZC8eJwibrGF+HeN3t kr9WHBBT9PNWRIN6DNCLi1+IupFVQGCI2iyGVC2aV5CjbFaF8DEE1Yy0nXd37jE7HI78 eA== Received: from sc-exch01.marvell.com ([199.233.58.181]) by mx0b-0016f401.pphosted.com with ESMTP id 30g12njx9y-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT); Sun, 19 Apr 2020 03:02:12 -0700 Received: from DC5-EXCH01.marvell.com (10.69.176.38) by SC-EXCH01.marvell.com (10.93.176.81) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Sun, 19 Apr 2020 03:02:09 -0700 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.2 via Frontend Transport; Sun, 19 Apr 2020 03:02:09 -0700 Received: from jerin-lab.marvell.com (jerin-lab.marvell.com [10.28.34.14]) by maili.marvell.com (Postfix) with ESMTP id B0A673F703F; Sun, 19 Apr 2020 03:02:07 -0700 (PDT) From: To: Jerin Jacob , Sunil Kumar Kori , Bruce Richardson CC: , , , Date: Sun, 19 Apr 2020 15:31:08 +0530 Message-ID: <20200419100133.3232316-9-jerinj@marvell.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200419100133.3232316-1-jerinj@marvell.com> References: <20200413150116.734047-1-jerinj@marvell.com> <20200419100133.3232316-1-jerinj@marvell.com> MIME-Version: 1.0 X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:6.0.138, 18.0.676 definitions=2020-04-19_02:2020-04-17, 2020-04-19 signatures=0 Subject: [dpdk-dev] [PATCH v6 08/33] eal/trace: create CTF TDSL metadata in memory 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 Common trace format(CTF) defines the metadata[1][2] for trace events, This patch creates the metadata for the DPDK events in memory and latter this will be saved to trace directory on rte_trace_save() invocation. [1] https://diamon.org/ctf/#specification [2] https://diamon.org/ctf/#examples Signed-off-by: Jerin Jacob --- lib/librte_eal/common/eal_common_trace.c | 9 +- lib/librte_eal/common/eal_common_trace_ctf.c | 302 +++++++++++++++++++ lib/librte_eal/common/eal_trace.h | 7 + lib/librte_eal/common/meson.build | 1 + lib/librte_eal/freebsd/Makefile | 1 + lib/librte_eal/linux/Makefile | 1 + 6 files changed, 320 insertions(+), 1 deletion(-) create mode 100644 lib/librte_eal/common/eal_common_trace_ctf.c diff --git a/lib/librte_eal/common/eal_common_trace.c b/lib/librte_eal/common/eal_common_trace.c index bbfc4fc2f..8bbc07c03 100644 --- a/lib/librte_eal/common/eal_common_trace.c +++ b/lib/librte_eal/common/eal_common_trace.c @@ -55,9 +55,13 @@ eal_trace_init(void) /* Generate UUID ver 4 with total size of events and number of events */ trace_uuid_generate(); + /* Generate CTF TDSL metadata */ + if (trace_metadata_create() < 0) + goto fail; + /* Create trace directory */ if (trace_mkdir()) - goto fail; + goto free_meta; /* Save current epoch timestamp for future use */ if (trace_epoch_time_save() < 0) @@ -67,6 +71,8 @@ eal_trace_init(void) return 0; +free_meta: + trace_metadata_destroy(); fail: trace_err("failed to initialize trace [%s]", rte_strerror(rte_errno)); return -rte_errno; @@ -77,6 +83,7 @@ eal_trace_fini(void) { if (rte_trace_is_enabled() == false) return; + trace_metadata_destroy(); } bool diff --git a/lib/librte_eal/common/eal_common_trace_ctf.c b/lib/librte_eal/common/eal_common_trace_ctf.c new file mode 100644 index 000000000..5ad44cc8d --- /dev/null +++ b/lib/librte_eal/common/eal_common_trace_ctf.c @@ -0,0 +1,302 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(C) 2020 Marvell International Ltd. + */ + +#include +#include + +#include +#include +#include +#include +#include + +#include "eal_trace.h" + +__rte_format_printf(2, 0) +static int +metadata_printf(char **str, const char *fmt, ...) +{ + va_list ap; + int rc; + + *str = NULL; + va_start(ap, fmt); + rc = vasprintf(str, fmt, ap); + va_end(ap); + + return rc; +} + +static int +meta_copy(char **meta, int *offset, char *str, int rc) +{ + int count = *offset; + char *ptr = *meta; + + if (rc < 0) + return rc; + + ptr = realloc(ptr, count + rc); + if (ptr == NULL) + goto free_str; + + memcpy(RTE_PTR_ADD(ptr, count), str, rc); + count += rc; + free(str); + + *meta = ptr; + *offset = count; + + return rc; + +free_str: + if (str) + free(str); + return -ENOMEM; +} + +static int +meta_data_type_emit(char **meta, int *offset) +{ + char *str = NULL; + int rc; + + rc = metadata_printf(&str, + "/* CTF 1.8 */\n" + "typealias integer {size = 8; base = x;}:= uint8_t;\n" + "typealias integer {size = 16; base = x;} := uint16_t;\n" + "typealias integer {size = 32; base = x;} := uint32_t;\n" + "typealias integer {size = 64; base = x;} := uint64_t;\n" + "typealias integer {size = 8; signed = true;} := int8_t;\n" + "typealias integer {size = 16; signed = true;} := int16_t;\n" + "typealias integer {size = 32; signed = true;} := int32_t;\n" + "typealias integer {size = 64; signed = true;} := int64_t;\n" +#ifdef RTE_ARCH_64 + "typealias integer {size = 64; base = x;} := uintptr_t;\n" +#else + "typealias integer {size = 32; base = x;} := uintptr_t;\n" +#endif +#ifdef RTE_ARCH_64 + "typealias integer {size = 64; base = x;} := long;\n" +#else + "typealias integer {size = 32; base = x;} := long;\n" +#endif + "typealias integer {size = 8; signed = false; encoding = ASCII; } := string_bounded_t;\n\n" + "typealias floating_point {\n" + " exp_dig = 8;\n" + " mant_dig = 24;\n" + "} := float;\n\n" + "typealias floating_point {\n" + " exp_dig = 11;\n" + " mant_dig = 53;\n" + "} := double;\n\n"); + + return meta_copy(meta, offset, str, rc); +} + +static int +is_be(void) +{ +#if RTE_BYTE_ORDER == RTE_BIG_ENDIAN + return 1; +#else + return 0; +#endif +} + +static int +meta_header_emit(char **meta, int *offset) +{ + struct trace *trace = trace_obj_get(); + char uustr[RTE_UUID_STRLEN]; + char *str = NULL; + int rc; + + rte_uuid_unparse(trace->uuid, uustr, RTE_UUID_STRLEN); + rc = metadata_printf(&str, + "trace {\n" + " major = 1;\n" + " minor = 8;\n" + " uuid = \"%s\";\n" + " byte_order = %s;\n" + " packet.header := struct {\n" + " uint32_t magic;\n" + " uint8_t uuid[16];\n" + " };\n" + "};\n\n", uustr, is_be() ? "be" : "le"); + return meta_copy(meta, offset, str, rc); +} + +static int +meta_env_emit(char **meta, int *offset) +{ + char *str = NULL; + int rc; + + rc = metadata_printf(&str, + "env {\n" + " dpdk_version = \"%s\";\n" + " tracer_name = \"dpdk\";\n" + "};\n\n", rte_version()); + return meta_copy(meta, offset, str, rc); +} + +static int +meta_clock_pass1_emit(char **meta, int *offset) +{ + char *str = NULL; + int rc; + + rc = metadata_printf(&str, + "clock {\n" + " name = \"dpdk\";\n" + " freq = "); + return meta_copy(meta, offset, str, rc); +} + +static int +meta_clock_pass2_emit(char **meta, int *offset) +{ + char *str = NULL; + int rc; + + rc = metadata_printf(&str, + "%20"PRIu64";\n" + " offset_s =", 0); + return meta_copy(meta, offset, str, rc); +} + +static int +meta_clock_pass3_emit(char **meta, int *offset) +{ + char *str = NULL; + int rc; + + rc = metadata_printf(&str, + "%20"PRIu64";\n" + " offset =", 0); + return meta_copy(meta, offset, str, rc); +} + +static int +meta_clock_pass4_emit(char **meta, int *offset) +{ + char *str = NULL; + int rc; + + rc = metadata_printf(&str, + "%20"PRIu64";\n};\n\n" + "typealias integer {\n" + " size = 48; align = 1; signed = false;\n" + " map = clock.dpdk.value;\n" + "} := uint48_clock_dpdk_t;\n\n", 0); + + return meta_copy(meta, offset, str, rc); +} + +static int +meta_stream_emit(char **meta, int *offset) +{ + char *str = NULL; + int rc; + + rc = metadata_printf(&str, + "stream {\n" + " packet.context := struct {\n" + " uint32_t cpu_id;\n" + " string_bounded_t name[32];\n" + " };\n" + " event.header := struct {\n" + " uint48_clock_dpdk_t timestamp;\n" + " uint16_t id;\n" + " } align(64);\n" + "};\n\n"); + return meta_copy(meta, offset, str, rc); +} + +static int +meta_event_emit(char **meta, int *offset, struct trace_point *tp) +{ + char *str = NULL; + int rc; + + rc = metadata_printf(&str, + "event {\n" + " id = %d;\n" + " name = \"%s\";\n" + " fields := struct {\n" + " %s\n" + " };\n" + "};\n\n", trace_id_get(tp->handle), tp->name, tp->ctf_field); + return meta_copy(meta, offset, str, rc); +} + +int +trace_metadata_create(void) +{ + struct trace_point_head *tp_list = trace_list_head_get(); + struct trace *trace = trace_obj_get(); + struct trace_point *tp; + int rc, offset = 0; + char *meta = NULL; + + rc = meta_data_type_emit(&meta, &offset); + if (rc < 0) + goto fail; + + rc = meta_header_emit(&meta, &offset); + if (rc < 0) + goto fail; + + rc = meta_env_emit(&meta, &offset); + if (rc < 0) + goto fail; + + rc = meta_clock_pass1_emit(&meta, &offset); + if (rc < 0) + goto fail; + trace->ctf_meta_offset_freq = offset; + + rc = meta_clock_pass2_emit(&meta, &offset); + if (rc < 0) + goto fail; + trace->ctf_meta_offset_freq_off_s = offset; + + rc = meta_clock_pass3_emit(&meta, &offset); + if (rc < 0) + goto fail; + trace->ctf_meta_offset_freq_off = offset; + + rc = meta_clock_pass4_emit(&meta, &offset); + if (rc < 0) + goto fail; + + rc = meta_stream_emit(&meta, &offset); + if (rc < 0) + goto fail; + + STAILQ_FOREACH(tp, tp_list, next) + if (meta_event_emit(&meta, &offset, tp) < 0) + goto fail; + + trace->ctf_meta = meta; + return 0; + +fail: + if (meta) + free(meta); + return -EBADF; +} + +void +trace_metadata_destroy(void) +{ + struct trace *trace = trace_obj_get(); + + if (trace->ctf_meta) { + free(trace->ctf_meta); + trace->ctf_meta = NULL; + } +} + diff --git a/lib/librte_eal/common/eal_trace.h b/lib/librte_eal/common/eal_trace.h index 493163c1c..8e8d1160e 100644 --- a/lib/librte_eal/common/eal_trace.h +++ b/lib/librte_eal/common/eal_trace.h @@ -43,6 +43,11 @@ struct trace { uint64_t epoch_sec; uint64_t epoch_nsec; uint64_t uptime_ticks; + char *ctf_meta; + uint32_t ctf_meta_offset_freq; + uint32_t ctf_meta_offset_freq_off_s; + uint32_t ctf_meta_offset_freq_off; + uint16_t ctf_fixup_done; rte_spinlock_t lock; }; @@ -64,6 +69,8 @@ struct trace_point_head *trace_list_head_get(void); /* Util functions */ bool trace_has_duplicate_entry(void); void trace_uuid_generate(void); +int trace_metadata_create(void); +void trace_metadata_destroy(void); int trace_mkdir(void); int trace_epoch_time_save(void); diff --git a/lib/librte_eal/common/meson.build b/lib/librte_eal/common/meson.build index 3dc320327..d2ac44313 100644 --- a/lib/librte_eal/common/meson.build +++ b/lib/librte_eal/common/meson.build @@ -43,6 +43,7 @@ sources += files( 'eal_common_thread.c', 'eal_common_timer.c', 'eal_common_trace.c', + 'eal_common_trace_ctf.c', 'eal_common_trace_utils.c', 'eal_common_uuid.c', 'hotplug_mp.c', diff --git a/lib/librte_eal/freebsd/Makefile b/lib/librte_eal/freebsd/Makefile index ae59c8c19..539ad44a7 100644 --- a/lib/librte_eal/freebsd/Makefile +++ b/lib/librte_eal/freebsd/Makefile @@ -60,6 +60,7 @@ SRCS-$(CONFIG_RTE_EXEC_ENV_FREEBSD) += eal_common_proc.c SRCS-$(CONFIG_RTE_EXEC_ENV_FREEBSD) += eal_common_fbarray.c SRCS-$(CONFIG_RTE_EXEC_ENV_FREEBSD) += eal_common_uuid.c SRCS-$(CONFIG_RTE_EXEC_ENV_FREEBSD) += eal_common_trace.c +SRCS-$(CONFIG_RTE_EXEC_ENV_FREEBSD) += eal_common_trace_ctf.c SRCS-$(CONFIG_RTE_EXEC_ENV_FREEBSD) += eal_common_trace_utils.c SRCS-$(CONFIG_RTE_EXEC_ENV_FREEBSD) += rte_malloc.c SRCS-$(CONFIG_RTE_EXEC_ENV_FREEBSD) += hotplug_mp.c diff --git a/lib/librte_eal/linux/Makefile b/lib/librte_eal/linux/Makefile index 7992500a9..f00588d6e 100644 --- a/lib/librte_eal/linux/Makefile +++ b/lib/librte_eal/linux/Makefile @@ -67,6 +67,7 @@ SRCS-$(CONFIG_RTE_EXEC_ENV_LINUX) += eal_common_proc.c SRCS-$(CONFIG_RTE_EXEC_ENV_LINUX) += eal_common_fbarray.c SRCS-$(CONFIG_RTE_EXEC_ENV_LINUX) += eal_common_uuid.c SRCS-$(CONFIG_RTE_EXEC_ENV_LINUX) += eal_common_trace.c +SRCS-$(CONFIG_RTE_EXEC_ENV_LINUX) += eal_common_trace_ctf.c SRCS-$(CONFIG_RTE_EXEC_ENV_LINUX) += eal_common_trace_utils.c SRCS-$(CONFIG_RTE_EXEC_ENV_LINUX) += rte_malloc.c SRCS-$(CONFIG_RTE_EXEC_ENV_LINUX) += hotplug_mp.c From patchwork Sun Apr 19 10:01:09 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: 68883 X-Patchwork-Delegate: david.marchand@redhat.com 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 04CBEA0561; Sun, 19 Apr 2020 12:05:59 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 04E211D5E4; Sun, 19 Apr 2020 12:02:44 +0200 (CEST) Received: from mx0b-0016f401.pphosted.com (mx0b-0016f401.pphosted.com [67.231.156.173]) by dpdk.org (Postfix) with ESMTP id 344F91D59D for ; Sun, 19 Apr 2020 12:02:16 +0200 (CEST) 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 03JA1FA3020166; Sun, 19 Apr 2020 03:02:16 -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=MR5rY+KVxdgm7gNRKXaHfWSSpB14QqT2rHD/8dtUbC0=; b=gCg1iasHNCjBEJVy29gHdP3BU4Rtqg0dFUVO1YNhnYu601k/zUA5RIELboC1ozhdNOa3 htiNkwRSWmpsdUvL+mJFnIjsa4B8fUR6RDw1Mh88OMfwQhsfriRNQXsLLurg8Mw0r3KU axXFfLvx11TXVsK40Z2xXdLmVoHZneQtWtIxMx/0uVcdvfn0kEhVwB2w3cvpD71EWOTW l8sr07x0Kts35IpK6sQ/iSFarOJt9o2/q8CKwXtL/f/kVSIL+3YNzHCp5AzDCYJU4jZU Z+k50TIiHEjMnAkNdQuFPteOgG//byAYiYVZnYq+B74UhfohF+J9UO2Q3r7ee4HDonk0 Ow== Received: from sc-exch02.marvell.com ([199.233.58.182]) by mx0b-0016f401.pphosted.com with ESMTP id 30g12njxaa-2 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT); Sun, 19 Apr 2020 03:02:15 -0700 Received: from DC5-EXCH01.marvell.com (10.69.176.38) by SC-EXCH02.marvell.com (10.93.176.82) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Sun, 19 Apr 2020 03:02:13 -0700 Received: from DC5-EXCH02.marvell.com (10.69.176.39) by DC5-EXCH01.marvell.com (10.69.176.38) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Sun, 19 Apr 2020 03:02:13 -0700 Received: from maili.marvell.com (10.69.176.80) by DC5-EXCH02.marvell.com (10.69.176.39) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Sun, 19 Apr 2020 03:02:13 -0700 Received: from jerin-lab.marvell.com (jerin-lab.marvell.com [10.28.34.14]) by maili.marvell.com (Postfix) with ESMTP id F0D833F703F; Sun, 19 Apr 2020 03:02:10 -0700 (PDT) From: To: Jerin Jacob , Sunil Kumar Kori CC: , , , , Date: Sun, 19 Apr 2020 15:31:09 +0530 Message-ID: <20200419100133.3232316-10-jerinj@marvell.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200419100133.3232316-1-jerinj@marvell.com> References: <20200413150116.734047-1-jerinj@marvell.com> <20200419100133.3232316-1-jerinj@marvell.com> MIME-Version: 1.0 X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:6.0.138, 18.0.676 definitions=2020-04-19_02:2020-04-17, 2020-04-19 signatures=0 Subject: [dpdk-dev] [PATCH v6 09/33] eal/trace: handle CTF keyword collision 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: Sunil Kumar Kori Some of the keyword like align, event, "." and "->" etc will be used in CTF metadata syntax. This patch support for handling those keywords with DPDK events name. Signed-off-by: Sunil Kumar Kori --- lib/librte_eal/common/eal_common_trace_ctf.c | 119 +++++++++++++++++++ 1 file changed, 119 insertions(+) diff --git a/lib/librte_eal/common/eal_common_trace_ctf.c b/lib/librte_eal/common/eal_common_trace_ctf.c index 5ad44cc8d..c4f00bf22 100644 --- a/lib/librte_eal/common/eal_common_trace_ctf.c +++ b/lib/librte_eal/common/eal_common_trace_ctf.c @@ -215,12 +215,131 @@ meta_stream_emit(char **meta, int *offset) return meta_copy(meta, offset, str, rc); } +static void +string_fixed_replace(char *input, const char *search, const char *replace) +{ + char *found; + size_t len; + + found = strstr(input, search); + if (found == NULL) + return; + + if (strlen(found) != strlen(search)) + return; + + len = strlen(replace); + memcpy(found, replace, len); + found[len] = '\0'; +} + +static void +ctf_fixup_align(char *str) +{ + string_fixed_replace(str, "align", "_align"); +} + +static void +ctf_fixup_arrow_deref(char *str) +{ + const char *replace = "_"; + const char *search = "->"; + char *found; + size_t len; + + found = strstr(str, search); + if (found == NULL) + return; + + do { + memcpy(found, replace, strlen(replace)); + len = strlen(found + 2); + memcpy(found + 1, found + 2, len); + found[len + 1] = '\0'; + found = strstr(str, search); + } while (found != NULL); +} + +static void +ctf_fixup_dot_deref(char *str) +{ + const char *replace = "_"; + const char *search = "."; + char *found; + size_t len; + + found = strstr(str, search); + if (found == NULL) + return; + + len = strlen(replace); + do { + memcpy(found, replace, len); + found = strstr(str, search); + } while (found != NULL); +} + +static void +ctf_fixup_event(char *str) +{ + string_fixed_replace(str, "event", "_event"); +} + +static int +ctf_fixup_keyword(char *str) +{ + char dup_str[TRACE_CTF_FIELD_SIZE]; + char input[TRACE_CTF_FIELD_SIZE]; + const char *delim = ";"; + char *from; + int len; + + if (str == NULL) + return 0; + + len = strlen(str); + if (len >= TRACE_CTF_FIELD_SIZE) { + trace_err("ctf_field reached its maximum limit"); + return -EMSGSIZE; + } + + /* Create duplicate string */ + strcpy(dup_str, str); + + len = 0; + from = strtok(dup_str, delim); + while (from != NULL) { + strcpy(input, from); + ctf_fixup_align(input); + ctf_fixup_dot_deref(input); + ctf_fixup_arrow_deref(input); + ctf_fixup_event(input); + + strcpy(&input[strlen(input)], delim); + if ((len + strlen(input)) >= TRACE_CTF_FIELD_SIZE) { + trace_err("ctf_field reached its maximum limit"); + return -EMSGSIZE; + } + + strcpy(str + len, input); + len += strlen(input); + from = strtok(NULL, delim); + } + + return 0; +} + static int meta_event_emit(char **meta, int *offset, struct trace_point *tp) { char *str = NULL; int rc; + /* Fixup ctf field string in case it using reserved ctf keywords */ + rc = ctf_fixup_keyword(tp->ctf_field); + if (rc) + return rc; + rc = metadata_printf(&str, "event {\n" " id = %d;\n" From patchwork Sun Apr 19 10:01:10 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: 68882 X-Patchwork-Delegate: david.marchand@redhat.com 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 D8243A0561; Sun, 19 Apr 2020 12:05:44 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id D3B3E1D5DD; Sun, 19 Apr 2020 12:02:42 +0200 (CEST) Received: from mx0b-0016f401.pphosted.com (mx0b-0016f401.pphosted.com [67.231.156.173]) by dpdk.org (Postfix) with ESMTP id B49491D5B6 for ; Sun, 19 Apr 2020 12:02:26 +0200 (CEST) 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 03JA18BG020144; Sun, 19 Apr 2020 03:02:19 -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=N6YU3a9SE19syceiFqz9r9DLUjJ1i1wcCYnufOKo0og=; b=sXbKVgYLZWBdoNoRW3Zl7jQ53tXJWKScNZ3RD4QiZ/BauDLDSS+tv7A1R4skccfJsoSW Dl7wuxekf3MKbJSLmOb1DU5k63DcC9LPZ+sPWCKKQha0nFsph5KAV6129jI5Nv4oqHHy IxCqJRsnOMk70cIgUU07UUGKSJHYrCrq/HEYyHIiiFld+d9tW6Bxd9YhV0vc7Ki1Akw6 JGtsmacAzTzZzNEsvsEmRrOXX/5pNm+ay3/TttkGR1IqPWyr9hBcZqbFHfrdyKIi1DEb gXSMcaAc14/jK8Zl3sPCi0A7ew43IgxnlYtdpyF+JwSNpepc4cLOk2gPHvV+zrHhJtyf ig== Received: from sc-exch01.marvell.com ([199.233.58.181]) by mx0b-0016f401.pphosted.com with ESMTP id 30g12njxah-2 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT); Sun, 19 Apr 2020 03:02:19 -0700 Received: from DC5-EXCH01.marvell.com (10.69.176.38) by SC-EXCH01.marvell.com (10.93.176.81) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Sun, 19 Apr 2020 03:02:17 -0700 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.2; Sun, 19 Apr 2020 03:02:16 -0700 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.2 via Frontend Transport; Sun, 19 Apr 2020 03:02:16 -0700 Received: from jerin-lab.marvell.com (jerin-lab.marvell.com [10.28.34.14]) by maili.marvell.com (Postfix) with ESMTP id 318D33F703F; Sun, 19 Apr 2020 03:02:13 -0700 (PDT) From: To: Jerin Jacob , Sunil Kumar Kori CC: , , , , Date: Sun, 19 Apr 2020 15:31:10 +0530 Message-ID: <20200419100133.3232316-11-jerinj@marvell.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200419100133.3232316-1-jerinj@marvell.com> References: <20200413150116.734047-1-jerinj@marvell.com> <20200419100133.3232316-1-jerinj@marvell.com> MIME-Version: 1.0 X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:6.0.138, 18.0.676 definitions=2020-04-19_02:2020-04-17, 2020-04-19 signatures=0 Subject: [dpdk-dev] [PATCH v6 10/33] eal/trace: implement trace memory allocation 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 Trace memory will be allocated per thread to enable lockless trace events updates to the memory. The allocator will first attempt to allocate from hugepage, if not available from hugepage then fallback to malloc memory. Later in the patches series, This API will be hooked to DPDK fastpath and control plane thread creation API. It is possible for non DPDK thread to use trace events, in that case, trace memory will be allocated on the first event emission. Signed-off-by: Jerin Jacob --- lib/librte_eal/common/eal_common_trace.c | 97 +++++++++++++++++++ .../common/eal_common_trace_utils.c | 20 ++++ lib/librte_eal/common/eal_trace.h | 28 ++++++ lib/librte_eal/include/rte_trace_point.h | 9 ++ .../include/rte_trace_point_provider.h | 20 ++++ lib/librte_eal/rte_eal_version.map | 2 + 6 files changed, 176 insertions(+) diff --git a/lib/librte_eal/common/eal_common_trace.c b/lib/librte_eal/common/eal_common_trace.c index 8bbc07c03..4c03a676a 100644 --- a/lib/librte_eal/common/eal_common_trace.c +++ b/lib/librte_eal/common/eal_common_trace.c @@ -16,6 +16,7 @@ #include "eal_trace.h" RTE_DEFINE_PER_LCORE(volatile int, trace_point_sz); +RTE_DEFINE_PER_LCORE(void *, trace_mem); static RTE_DEFINE_PER_LCORE(char, ctf_field[TRACE_CTF_FIELD_SIZE]); static RTE_DEFINE_PER_LCORE(int, ctf_count); @@ -37,6 +38,9 @@ trace_list_head_get(void) int eal_trace_init(void) { + /* Trace memory should start with 8B aligned for natural alignment */ + RTE_BUILD_BUG_ON((offsetof(struct __rte_trace_header, mem) % 8) != 0); + /* One of the Trace registration failed */ if (trace.register_errno) { rte_errno = trace.register_errno; @@ -83,6 +87,7 @@ eal_trace_fini(void) { if (rte_trace_is_enabled() == false) return; + trace_mem_per_thread_free(); trace_metadata_destroy(); } @@ -231,6 +236,98 @@ rte_trace_point_lookup(const char *name) return NULL; } +static inline size_t +list_sz(uint32_t index) +{ + return sizeof(struct thread_mem_meta) * (index + 1); +} + +void +__rte_trace_mem_per_thread_alloc(void) +{ + struct trace *trace = trace_obj_get(); + struct __rte_trace_header *header; + uint32_t count; + + if (rte_trace_is_enabled() == false) + return; + + if (RTE_PER_LCORE(trace_mem)) + return; + + rte_spinlock_lock(&trace->lock); + + count = trace->nb_trace_mem_list; + + /* Allocate room for storing the thread trace mem meta */ + trace->lcore_meta = realloc(trace->lcore_meta, list_sz(count)); + + /* Provide dummy space for fastpath to consume */ + if (trace->lcore_meta == NULL) { + trace_crit("trace mem meta memory realloc failed"); + header = NULL; goto fail; + } + + /* First attempt from huge page */ + header = rte_malloc(NULL, trace_mem_sz(trace->buff_len), 8); + if (header) { + trace->lcore_meta[count].area = TRACE_AREA_HUGEPAGE; + goto found; + } + + /* Second attempt from heap */ + header = malloc(trace_mem_sz(trace->buff_len)); + if (header == NULL) { + trace_crit("trace mem malloc attempt failed"); + header = NULL; goto fail; + + } + + /* Second attempt from heap is success */ + trace->lcore_meta[count].area = TRACE_AREA_HEAP; + + /* Initialize the trace header */ +found: + header->offset = 0; + header->len = trace->buff_len; + header->stream_header.magic = TRACE_CTF_MAGIC; + rte_uuid_copy(header->stream_header.uuid, trace->uuid); + header->stream_header.lcore_id = rte_lcore_id(); + + /* Store the thread name */ + char *name = header->stream_header.thread_name; + memset(name, 0, __RTE_TRACE_EMIT_STRING_LEN_MAX); + rte_thread_getname(pthread_self(), name, + __RTE_TRACE_EMIT_STRING_LEN_MAX); + + trace->lcore_meta[count].mem = header; + trace->nb_trace_mem_list++; +fail: + RTE_PER_LCORE(trace_mem) = header; + rte_spinlock_unlock(&trace->lock); +} + +void +trace_mem_per_thread_free(void) +{ + struct trace *trace = trace_obj_get(); + uint32_t count; + void *mem; + + if (rte_trace_is_enabled() == false) + return; + + rte_spinlock_lock(&trace->lock); + for (count = 0; count < trace->nb_trace_mem_list; count++) { + mem = trace->lcore_meta[count].mem; + if (trace->lcore_meta[count].area == TRACE_AREA_HUGEPAGE) + rte_free(mem); + else if (trace->lcore_meta[count].area == TRACE_AREA_HEAP) + free(mem); + } + rte_spinlock_unlock(&trace->lock); +} + int __rte_trace_point_register(rte_trace_point_t *handle, const char *name, void (*register_fn)(void)) diff --git a/lib/librte_eal/common/eal_common_trace_utils.c b/lib/librte_eal/common/eal_common_trace_utils.c index f7700934b..de8d43661 100644 --- a/lib/librte_eal/common/eal_common_trace_utils.c +++ b/lib/librte_eal/common/eal_common_trace_utils.c @@ -14,6 +14,26 @@ #include "eal_filesystem.h" #include "eal_trace.h" +const char * +trace_mode_to_string(enum rte_trace_mode mode) +{ + switch (mode) { + case RTE_TRACE_MODE_OVERWRITE: return "overwrite"; + case RTE_TRACE_MODE_DISCARD: return "discard"; + default: return "unknown"; + } +} + +const char * +trace_area_to_string(enum trace_area_e area) +{ + switch (area) { + case TRACE_AREA_HEAP: return "heap"; + case TRACE_AREA_HUGEPAGE: return "hugepage"; + default: return "unknown"; + } +} + static bool trace_entry_compare(const char *name) { diff --git a/lib/librte_eal/common/eal_trace.h b/lib/librte_eal/common/eal_trace.h index 8e8d1160e..e2538d24a 100644 --- a/lib/librte_eal/common/eal_trace.h +++ b/lib/librte_eal/common/eal_trace.h @@ -6,11 +6,16 @@ #define __EAL_TRACE_H #include +#include +#include #include #include #include #include +#include "eal_private.h" +#include "eal_thread.h" + #define trace_err(fmt, args...)\ RTE_LOG(ERR, EAL, "%s():%u " fmt "\n",\ __func__, __LINE__, ## args) @@ -23,6 +28,8 @@ #define TRACE_DIR_STR_LEN (sizeof("YYYY-mm-dd-AM-HH-MM-SS") + TRACE_PREFIX_LEN) #define TRACE_CTF_FIELD_SIZE 384 #define TRACE_POINT_NAME_SIZE 64 +#define TRACE_CTF_MAGIC 0xC1FC1FC1 + struct trace_point { STAILQ_ENTRY(trace_point) next; @@ -31,6 +38,16 @@ struct trace_point { char ctf_field[TRACE_CTF_FIELD_SIZE]; }; +enum trace_area_e { + TRACE_AREA_HEAP, + TRACE_AREA_HUGEPAGE, +}; + +struct thread_mem_meta { + void *mem; + enum trace_area_e area; +}; + struct trace { char dir[PATH_MAX]; int dir_offset; @@ -40,6 +57,8 @@ struct trace { rte_uuid_t uuid; uint32_t buff_len; uint32_t nb_trace_points; + uint32_t nb_trace_mem_list; + struct thread_mem_meta *lcore_meta; uint64_t epoch_sec; uint64_t epoch_nsec; uint64_t uptime_ticks; @@ -59,6 +78,12 @@ trace_id_get(rte_trace_point_t *trace) __RTE_TRACE_FIELD_ID_SHIFT; } +static inline size_t +trace_mem_sz(uint32_t len) +{ + return len + sizeof(struct __rte_trace_header); +} + /* Trace object functions */ struct trace *trace_obj_get(void); @@ -67,12 +92,15 @@ STAILQ_HEAD(trace_point_head, trace_point); struct trace_point_head *trace_list_head_get(void); /* Util functions */ +const char *trace_mode_to_string(enum rte_trace_mode mode); +const char *trace_area_to_string(enum trace_area_e area); bool trace_has_duplicate_entry(void); void trace_uuid_generate(void); int trace_metadata_create(void); void trace_metadata_destroy(void); int trace_mkdir(void); int trace_epoch_time_save(void); +void trace_mem_per_thread_free(void); /* EAL interface */ int eal_trace_init(void); diff --git a/lib/librte_eal/include/rte_trace_point.h b/lib/librte_eal/include/rte_trace_point.h index f9924225a..8e37f971e 100644 --- a/lib/librte_eal/include/rte_trace_point.h +++ b/lib/librte_eal/include/rte_trace_point.h @@ -227,6 +227,15 @@ __rte_trace_point_fp_is_enabled(void) #endif } +/** + * @internal + * + * Allocate trace memory buffer per thread. + * + */ +__rte_experimental +void __rte_trace_mem_per_thread_alloc(void); + /** * @internal * diff --git a/lib/librte_eal/include/rte_trace_point_provider.h b/lib/librte_eal/include/rte_trace_point_provider.h index 45a113c0d..b8d727387 100644 --- a/lib/librte_eal/include/rte_trace_point_provider.h +++ b/lib/librte_eal/include/rte_trace_point_provider.h @@ -9,6 +9,10 @@ #ifndef _RTE_TRACE_POINT_PROVIDER_H_ #define _RTE_TRACE_POINT_PROVIDER_H_ +#include +#include +#include + #define __RTE_TRACE_EVENT_HEADER_ID_SHIFT (48) #define __RTE_TRACE_FIELD_SIZE_SHIFT 0 @@ -18,4 +22,20 @@ #define __RTE_TRACE_FIELD_ENABLE_MASK (1ULL << 63) #define __RTE_TRACE_FIELD_ENABLE_DISCARD (1ULL << 62) +struct __rte_trace_stream_header { + uint32_t magic; + rte_uuid_t uuid; + uint32_t lcore_id; + char thread_name[__RTE_TRACE_EMIT_STRING_LEN_MAX]; +} __rte_packed; + +struct __rte_trace_header { + uint32_t offset; + uint32_t len; + struct __rte_trace_stream_header stream_header; + uint8_t mem[]; +}; + +RTE_DECLARE_PER_LCORE(void *, trace_mem); + #endif /* _RTE_TRACE_POINT_PROVIDER_H_ */ diff --git a/lib/librte_eal/rte_eal_version.map b/lib/librte_eal/rte_eal_version.map index 2e6aacc17..98e0f8413 100644 --- a/lib/librte_eal/rte_eal_version.map +++ b/lib/librte_eal/rte_eal_version.map @@ -337,7 +337,9 @@ EXPERIMENTAL { rte_thread_is_intr; # added in 20.05 + __rte_trace_mem_per_thread_alloc; __rte_trace_point_register; + per_lcore_trace_mem; per_lcore_trace_point_sz; rte_log_can_log; rte_thread_getname; From patchwork Sun Apr 19 10:01:11 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: 68906 X-Patchwork-Delegate: david.marchand@redhat.com 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 91253A0561; Sun, 19 Apr 2020 12:11:58 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 9FBBE1D6B7; Sun, 19 Apr 2020 12:04:01 +0200 (CEST) Received: from mx0b-0016f401.pphosted.com (mx0a-0016f401.pphosted.com [67.231.148.174]) by dpdk.org (Postfix) with ESMTP id 31A971D5EB for ; Sun, 19 Apr 2020 12:02:44 +0200 (CEST) Received: from pps.filterd (m0045849.ppops.net [127.0.0.1]) by mx0a-0016f401.pphosted.com (8.16.0.42/8.16.0.42) with SMTP id 03J9vQl2031337; Sun, 19 Apr 2020 03:02:21 -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=ts7VBTYke857eLBSHRzNdbuy0ihF4hwSjixoVfVA/kk=; b=wJb8rJbopKU+AajUoCZGASIhZX4kwKKZc50Tp6PN5qNJg+xrNufXA3LgqRo/GdghRJUK 67jpjX1a1J2B7AIc/gGYC7YzvdEP/fWYS06PH80UFwEhqxG4FbCDX5W6eFeTYsjPrhgE xWzr2NLN696K4CINZflj4tj3sbgSiuRooGAFVLQchcAyIavWX+f/r9DLGB6R2l9NOy5E iCGQDU2G7esbPMYZv4NFJYNwECxHhuetJV3LapuIazW3DSN5IoTPJlnVfAj1T1h3K/Ve epFr5TWh7L46HCkzUzWRwoFQDhAd/iDV4PHdKlU4nFo4OOAdj8FV/50/5pLr7HmIMP4N oQ== Received: from sc-exch02.marvell.com ([199.233.58.182]) by mx0a-0016f401.pphosted.com with ESMTP id 30fxwp3d4v-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT); Sun, 19 Apr 2020 03:02:21 -0700 Received: from DC5-EXCH02.marvell.com (10.69.176.39) by SC-EXCH02.marvell.com (10.93.176.82) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Sun, 19 Apr 2020 03:02:20 -0700 Received: from DC5-EXCH02.marvell.com (10.69.176.39) by DC5-EXCH02.marvell.com (10.69.176.39) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Sun, 19 Apr 2020 03:02:19 -0700 Received: from maili.marvell.com (10.69.176.80) by DC5-EXCH02.marvell.com (10.69.176.39) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Sun, 19 Apr 2020 03:02:19 -0700 Received: from jerin-lab.marvell.com (jerin-lab.marvell.com [10.28.34.14]) by maili.marvell.com (Postfix) with ESMTP id 737C83F703F; Sun, 19 Apr 2020 03:02:17 -0700 (PDT) From: To: Jerin Jacob , Sunil Kumar Kori CC: , , , , Date: Sun, 19 Apr 2020 15:31:11 +0530 Message-ID: <20200419100133.3232316-12-jerinj@marvell.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200419100133.3232316-1-jerinj@marvell.com> References: <20200413150116.734047-1-jerinj@marvell.com> <20200419100133.3232316-1-jerinj@marvell.com> MIME-Version: 1.0 X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:6.0.138, 18.0.676 definitions=2020-04-19_02:2020-04-17, 2020-04-19 signatures=0 Subject: [dpdk-dev] [PATCH v6 11/33] eal/trace: implement debug dump function 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 Implement rte_trace_metadata_dump() and rte_trace_dump() functions. Former one used to dump the CTF metadata file and the latter one to dump all the registered events and its status. Signed-off-by: Jerin Jacob Signed-off-by: Sunil Kumar Kori --- lib/librte_eal/common/eal_common_trace.c | 57 +++++++++++++++++ lib/librte_eal/common/eal_common_trace_ctf.c | 67 ++++++++++++++++++++ lib/librte_eal/rte_eal_version.map | 2 + 3 files changed, 126 insertions(+) diff --git a/lib/librte_eal/common/eal_common_trace.c b/lib/librte_eal/common/eal_common_trace.c index 4c03a676a..e8e1bc693 100644 --- a/lib/librte_eal/common/eal_common_trace.c +++ b/lib/librte_eal/common/eal_common_trace.c @@ -236,6 +236,63 @@ rte_trace_point_lookup(const char *name) return NULL; } +static void +trace_point_dump(FILE *f, struct trace_point *tp) +{ + rte_trace_point_t *handle = tp->handle; + + fprintf(f, "\tid %d, %s, size is %d, %s\n", + trace_id_get(handle), tp->name, + (uint16_t)(*handle & __RTE_TRACE_FIELD_SIZE_MASK), + rte_trace_point_is_enabled(handle) ? "enabled" : "disabled"); +} + +static void +trace_lcore_mem_dump(FILE *f) +{ + struct trace *trace = trace_obj_get(); + struct __rte_trace_header *header; + uint32_t count; + + if (trace->nb_trace_mem_list == 0) + return; + + rte_spinlock_lock(&trace->lock); + fprintf(f, "nb_trace_mem_list = %d\n", trace->nb_trace_mem_list); + fprintf(f, "\nTrace mem info\n--------------\n"); + for (count = 0; count < trace->nb_trace_mem_list; count++) { + header = trace->lcore_meta[count].mem; + fprintf(f, "\tid %d, mem=%p, area=%s, lcore_id=%d, name=%s\n", + count, header, + trace_area_to_string(trace->lcore_meta[count].area), + header->stream_header.lcore_id, + header->stream_header.thread_name); + } + rte_spinlock_unlock(&trace->lock); +} + +void +rte_trace_dump(FILE *f) +{ + struct trace_point_head *tp_list = trace_list_head_get(); + struct trace *trace = trace_obj_get(); + struct trace_point *tp; + + fprintf(f, "\nGlobal info\n-----------\n"); + fprintf(f, "status = %s\n", + rte_trace_is_enabled() ? "enabled" : "disabled"); + fprintf(f, "mode = %s\n", + trace_mode_to_string(rte_trace_mode_get())); + fprintf(f, "dir = %s\n", trace->dir); + fprintf(f, "buffer len = %d\n", trace->buff_len); + fprintf(f, "number of trace points = %d\n", trace->nb_trace_points); + + trace_lcore_mem_dump(f); + fprintf(f, "\nTrace point info\n----------------\n"); + STAILQ_FOREACH(tp, tp_list, next) + trace_point_dump(f, tp); +} + static inline size_t list_sz(uint32_t index) { diff --git a/lib/librte_eal/common/eal_common_trace_ctf.c b/lib/librte_eal/common/eal_common_trace_ctf.c index c4f00bf22..f17044f92 100644 --- a/lib/librte_eal/common/eal_common_trace_ctf.c +++ b/lib/librte_eal/common/eal_common_trace_ctf.c @@ -419,3 +419,70 @@ trace_metadata_destroy(void) } } +static void +meta_fix_freq(struct trace *trace, char *meta) +{ + char *str; + int rc; + + str = RTE_PTR_ADD(meta, trace->ctf_meta_offset_freq); + rc = sprintf(str, "%20"PRIu64"", rte_get_timer_hz()); + str[rc] = ';'; +} + +static void +meta_fix_freq_offset(struct trace *trace, char *meta) +{ + uint64_t uptime_tickes_floor, uptime_ticks, freq, uptime_sec; + uint64_t offset, offset_s; + char *str; + int rc; + + uptime_ticks = trace->uptime_ticks & + ((1ULL << __RTE_TRACE_EVENT_HEADER_ID_SHIFT) - 1); + freq = rte_get_tsc_hz(); + uptime_tickes_floor = RTE_ALIGN_MUL_FLOOR(uptime_ticks, freq); + + uptime_sec = uptime_tickes_floor / freq; + offset_s = trace->epoch_sec - uptime_sec; + + offset = uptime_ticks - uptime_tickes_floor; + offset += trace->epoch_nsec * (freq / NSEC_PER_SEC); + + str = RTE_PTR_ADD(meta, trace->ctf_meta_offset_freq_off_s); + rc = sprintf(str, "%20"PRIu64"", offset_s); + str[rc] = ';'; + str = RTE_PTR_ADD(meta, trace->ctf_meta_offset_freq_off); + rc = sprintf(str, "%20"PRIu64"", offset); + str[rc] = ';'; +} + +static void +meta_fixup(struct trace *trace, char *meta) +{ + meta_fix_freq(trace, meta); + meta_fix_freq_offset(trace, meta); +} + +int +rte_trace_metadata_dump(FILE *f) +{ + struct trace *trace = trace_obj_get(); + char *ctf_meta = trace->ctf_meta; + int rc; + + if (rte_trace_is_enabled() == false) + return 0; + + if (ctf_meta == NULL) + return -EINVAL; + + if (!__atomic_load_n(&trace->ctf_fixup_done, __ATOMIC_SEQ_CST) && + rte_get_timer_hz()) { + meta_fixup(trace, ctf_meta); + __atomic_store_n(&trace->ctf_fixup_done, 1, __ATOMIC_SEQ_CST); + } + + rc = fprintf(f, "%s", ctf_meta); + return rc < 0 ? rc : 0; +} diff --git a/lib/librte_eal/rte_eal_version.map b/lib/librte_eal/rte_eal_version.map index 98e0f8413..7bda1704c 100644 --- a/lib/librte_eal/rte_eal_version.map +++ b/lib/librte_eal/rte_eal_version.map @@ -343,7 +343,9 @@ EXPERIMENTAL { per_lcore_trace_point_sz; rte_log_can_log; rte_thread_getname; + rte_trace_dump; rte_trace_is_enabled; + rte_trace_metadata_dump; rte_trace_mode_get; rte_trace_mode_set; rte_trace_pattern; From patchwork Sun Apr 19 10:01: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: 68880 X-Patchwork-Delegate: david.marchand@redhat.com 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 A6530A0561; Sun, 19 Apr 2020 12:05:18 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 8A1F01D5CA; Sun, 19 Apr 2020 12:02:34 +0200 (CEST) Received: from mx0b-0016f401.pphosted.com (mx0b-0016f401.pphosted.com [67.231.156.173]) by dpdk.org (Postfix) with ESMTP id F0B3B1D5BB for ; Sun, 19 Apr 2020 12:02:26 +0200 (CEST) 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 03JA18sx020150; Sun, 19 Apr 2020 03:02:25 -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=YEov/QC6OTR5tjgWP9qOOnQ/vG+Wh/Bg3e0ICElOj/w=; b=GRr6w3VALgCW20n/ujBHQwydpuFVGTO9cKNtmQ0FOWxb+6tMsVPUnxyHGM94lQm7CGYN usxlhelpa32HkuGyw0KZEch4MVYoTxM8GR8AWvMjIDgPiICZ3/a4ZFBxalAL1ZBNgzde g30GP2JNCrTiRi2Jpb/CflmlApstOnSSZoSM+9f/cx5XYadjoRWhCO6kk+fY76Zke9bk yJCojWt/EuEZxCHMA01lUDxm0G3CYzgQOKjG7v0SAqpngyHnDECy1FZFttctnhxEkMw8 4vVkvGhjVQf0p0Waf2a1u2OTw2cZlRBCaDGP4mWo8aNGsOHYkIVc6N+agJ9aioCxEjWj xw== Received: from sc-exch04.marvell.com ([199.233.58.184]) by mx0b-0016f401.pphosted.com with ESMTP id 30g12njxb2-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT); Sun, 19 Apr 2020 03:02:25 -0700 Received: from DC5-EXCH01.marvell.com (10.69.176.38) by SC-EXCH04.marvell.com (10.93.176.84) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Sun, 19 Apr 2020 03:02:23 -0700 Received: from DC5-EXCH02.marvell.com (10.69.176.39) by DC5-EXCH01.marvell.com (10.69.176.38) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Sun, 19 Apr 2020 03:02:23 -0700 Received: from maili.marvell.com (10.69.176.80) by DC5-EXCH02.marvell.com (10.69.176.39) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Sun, 19 Apr 2020 03:02:22 -0700 Received: from jerin-lab.marvell.com (jerin-lab.marvell.com [10.28.34.14]) by maili.marvell.com (Postfix) with ESMTP id CAD213F703F; Sun, 19 Apr 2020 03:02:20 -0700 (PDT) From: To: Jerin Jacob , Sunil Kumar Kori CC: , , , , Date: Sun, 19 Apr 2020 15:31:12 +0530 Message-ID: <20200419100133.3232316-13-jerinj@marvell.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200419100133.3232316-1-jerinj@marvell.com> References: <20200413150116.734047-1-jerinj@marvell.com> <20200419100133.3232316-1-jerinj@marvell.com> MIME-Version: 1.0 X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:6.0.138, 18.0.676 definitions=2020-04-19_02:2020-04-17, 2020-04-19 signatures=0 Subject: [dpdk-dev] [PATCH v6 12/33] eal/trace: implement trace save 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 Implement rte_trace_save(), which will save the metadata file and trace memory snapshot to the trace directory. Signed-off-by: Jerin Jacob --- .../common/eal_common_trace_utils.c | 80 +++++++++++++++++++ lib/librte_eal/rte_eal_version.map | 1 + 2 files changed, 81 insertions(+) diff --git a/lib/librte_eal/common/eal_common_trace_utils.c b/lib/librte_eal/common/eal_common_trace_utils.c index de8d43661..bbe099473 100644 --- a/lib/librte_eal/common/eal_common_trace_utils.c +++ b/lib/librte_eal/common/eal_common_trace_utils.c @@ -213,3 +213,83 @@ trace_mkdir(void) return 0; } +static int +trace_meta_save(struct trace *trace) +{ + char file_name[PATH_MAX]; + FILE *f; + int rc; + + rc = snprintf(file_name, PATH_MAX, "%s/metadata", trace->dir); + if (rc < 0) + return rc; + + f = fopen(file_name, "w"); + if (f == NULL) + return -errno; + + rc = rte_trace_metadata_dump(f); + + if (fclose(f)) + rc = -errno; + + return rc; +} + + +static inline int +trace_file_sz(struct __rte_trace_header *hdr) +{ + return sizeof(struct __rte_trace_stream_header) + hdr->offset; +} + +static int +trace_mem_save(struct trace *trace, struct __rte_trace_header *hdr, + uint32_t cnt) +{ + char file_name[PATH_MAX]; + FILE *f; + int rc; + + rc = snprintf(file_name, PATH_MAX, "%s/channel0_%d", trace->dir, cnt); + if (rc < 0) + return rc; + + f = fopen(file_name, "w"); + if (f == NULL) + return -errno; + + rc = fwrite(&hdr->stream_header, trace_file_sz(hdr), 1, f); + rc = (rc == 1) ? 0 : -EACCES; + + if (fclose(f)) + rc = -errno; + + return rc; +} + +int +rte_trace_save(void) +{ + struct trace *trace = trace_obj_get(); + struct __rte_trace_header *header; + uint32_t count; + int rc = 0; + + if (trace->nb_trace_mem_list == 0) + return rc; + + rc = trace_meta_save(trace); + if (rc) + return rc; + + rte_spinlock_lock(&trace->lock); + for (count = 0; count < trace->nb_trace_mem_list; count++) { + header = trace->lcore_meta[count].mem; + rc = trace_mem_save(trace, header, count); + if (rc) + break; + } + rte_spinlock_unlock(&trace->lock); + return rc; +} diff --git a/lib/librte_eal/rte_eal_version.map b/lib/librte_eal/rte_eal_version.map index 7bda1704c..b4b3a92e5 100644 --- a/lib/librte_eal/rte_eal_version.map +++ b/lib/librte_eal/rte_eal_version.map @@ -354,4 +354,5 @@ EXPERIMENTAL { rte_trace_point_is_enabled; rte_trace_point_lookup; rte_trace_regexp; + rte_trace_save; }; From patchwork Sun Apr 19 10:01:13 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: 68884 X-Patchwork-Delegate: david.marchand@redhat.com 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 52D60A0561; Sun, 19 Apr 2020 12:06:14 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 97FC81D16B; Sun, 19 Apr 2020 12:02:51 +0200 (CEST) Received: from mx0b-0016f401.pphosted.com (mx0b-0016f401.pphosted.com [67.231.156.173]) by dpdk.org (Postfix) with ESMTP id 4B3A71D5D0 for ; Sun, 19 Apr 2020 12:02:34 +0200 (CEST) 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 03JA18b9020141; Sun, 19 Apr 2020 03:02:27 -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=3IEdVwYUBZpwv2ofS/2/iem5fHi2Ge7IzxbdcNR4x5o=; b=Cdrd+HN1/iaBCtePQZF4RhjvZ9M/jGbwFl28Q0pjFnFP06LnBqu0BJNBobLeDZqM0xC3 eHena8dV8lUBtNYpNkMctWUsgpE5ZtXOavPqltszCySfd0P6tWhmkSiBmF1MCRux0PwT pplR3xc7HDECVUohVASefDEQUw+V6aFRmb0xwOzrYfhT4D3HJWodHc8qJzEDkjgtBTp0 TwZfN0TCBVnZUwEhwXHAvlKf4MWy1OQelQnXqghTFwy9RyxNaoujjBj21zxrF8I4Aixs 8etVNdWXIsEnrtXceDcVx9SfRpvrNJ7kNcKD36W4SeLyYuWPTUCJvoxklOON/WefEIAi pg== Received: from sc-exch02.marvell.com ([199.233.58.182]) by mx0b-0016f401.pphosted.com with ESMTP id 30g12njxb8-2 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT); Sun, 19 Apr 2020 03:02:27 -0700 Received: from DC5-EXCH02.marvell.com (10.69.176.39) by SC-EXCH02.marvell.com (10.93.176.82) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Sun, 19 Apr 2020 03:02:26 -0700 Received: from maili.marvell.com (10.69.176.80) by DC5-EXCH02.marvell.com (10.69.176.39) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Sun, 19 Apr 2020 03:02:26 -0700 Received: from jerin-lab.marvell.com (jerin-lab.marvell.com [10.28.34.14]) by maili.marvell.com (Postfix) with ESMTP id 196013F703F; Sun, 19 Apr 2020 03:02:23 -0700 (PDT) From: To: Jerin Jacob , Sunil Kumar Kori CC: , , , , Date: Sun, 19 Apr 2020 15:31:13 +0530 Message-ID: <20200419100133.3232316-14-jerinj@marvell.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200419100133.3232316-1-jerinj@marvell.com> References: <20200413150116.734047-1-jerinj@marvell.com> <20200419100133.3232316-1-jerinj@marvell.com> MIME-Version: 1.0 X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:6.0.138, 18.0.676 definitions=2020-04-19_02:2020-04-17, 2020-04-19 signatures=0 Subject: [dpdk-dev] [PATCH v6 13/33] 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_point_emit_* 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_point_emit_field(). Signed-off-by: Jerin Jacob Signed-off-by: Sunil Kumar Kori --- lib/librte_eal/common/eal_common_trace.c | 19 +++++++++++++++++++ lib/librte_eal/include/rte_trace_point.h | 19 +++++++++++++++++++ .../include/rte_trace_point_register.h | 19 +++++++++++++++++++ lib/librte_eal/rte_eal_version.map | 1 + 4 files changed, 58 insertions(+) diff --git a/lib/librte_eal/common/eal_common_trace.c b/lib/librte_eal/common/eal_common_trace.c index e8e1bc693..d55a23df1 100644 --- a/lib/librte_eal/common/eal_common_trace.c +++ b/lib/librte_eal/common/eal_common_trace.c @@ -385,6 +385,25 @@ trace_mem_per_thread_free(void) rte_spinlock_unlock(&trace->lock); } +void +__rte_trace_point_emit_field(size_t sz, const char *in, const char *datatype) +{ + char *field = RTE_PER_LCORE(ctf_field); + int count = RTE_PER_LCORE(ctf_count); + size_t size; + int rc; + + size = RTE_MAX(0, TRACE_CTF_FIELD_SIZE - 1 - count); + RTE_PER_LCORE(trace_point_sz) += sz; + rc = snprintf(RTE_PTR_ADD(field, count), size, "%s %s;", datatype, in); + if (rc <= 0 || (size_t)rc >= size) { + 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_point_t *handle, const char *name, void (*register_fn)(void)) diff --git a/lib/librte_eal/include/rte_trace_point.h b/lib/librte_eal/include/rte_trace_point.h index 8e37f971e..f4e6d7e42 100644 --- a/lib/librte_eal/include/rte_trace_point.h +++ b/lib/librte_eal/include/rte_trace_point.h @@ -236,6 +236,25 @@ __rte_trace_point_fp_is_enabled(void) __rte_experimental void __rte_trace_mem_per_thread_alloc(void); +/** + * @internal + * + * Helper function to emit 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_point_emit_field(size_t sz, const char *field, + const char *type); + /** * @internal * diff --git a/lib/librte_eal/include/rte_trace_point_register.h b/lib/librte_eal/include/rte_trace_point_register.h index b21302c3d..3f61f8346 100644 --- a/lib/librte_eal/include/rte_trace_point_register.h +++ b/lib/librte_eal/include/rte_trace_point_register.h @@ -17,4 +17,23 @@ RTE_DECLARE_PER_LCORE(volatile int, trace_point_sz); __rte_trace_point_register(&__##trace, RTE_STR(name),\ (void (*)(void)) trace) +#define __rte_trace_point_emit_header_generic(t)\ + RTE_PER_LCORE(trace_point_sz) = __RTE_TRACE_EVENT_HEADER_SZ + +#define __rte_trace_point_emit_header_fp(t) \ + __rte_trace_point_emit_header_generic(t) + +#define __rte_trace_point_emit(in, type)\ +do {\ + RTE_BUILD_BUG_ON(sizeof(type) != sizeof(typeof(in)));\ + __rte_trace_point_emit_field(sizeof(type), RTE_STR(in), RTE_STR(type));\ +} while (0) + +#define rte_trace_point_emit_string(in)\ +do {\ + RTE_SET_USED(in);\ + __rte_trace_point_emit_field(__RTE_TRACE_EMIT_STRING_LEN_MAX,\ + RTE_STR(in)"[32]", "string_bounded_t");\ +} while (0) + #endif /* _RTE_TRACE_POINT_REGISTER_H_ */ diff --git a/lib/librte_eal/rte_eal_version.map b/lib/librte_eal/rte_eal_version.map index b4b3a92e5..8b51c8a5b 100644 --- a/lib/librte_eal/rte_eal_version.map +++ b/lib/librte_eal/rte_eal_version.map @@ -338,6 +338,7 @@ EXPERIMENTAL { # added in 20.05 __rte_trace_mem_per_thread_alloc; + __rte_trace_point_emit_field; __rte_trace_point_register; per_lcore_trace_mem; per_lcore_trace_point_sz; From patchwork Sun Apr 19 10:01:14 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: 68888 X-Patchwork-Delegate: david.marchand@redhat.com 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 19E00A0561; Sun, 19 Apr 2020 12:07:05 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 65B221D606; Sun, 19 Apr 2020 12:03:01 +0200 (CEST) Received: from mx0b-0016f401.pphosted.com (mx0b-0016f401.pphosted.com [67.231.156.173]) by dpdk.org (Postfix) with ESMTP id EE4FF1D43F for ; Sun, 19 Apr 2020 12:02:52 +0200 (CEST) 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 03JA1FA5020166; Sun, 19 Apr 2020 03:02:32 -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=0E2opw5xlbtGrsMpD6xcobkch6id3JW8yx/yX6vj51Q=; b=cHf4iQh36DsgqYQqncWQSpAN2W9LZeCngl7gdRhdamBZPbO1XH08gG14aBocq8dhWDj5 v0fOuPjDm7K4X9K3SKSR6PUe98uu5ORsFoV24/KcYQvpo4cTRFQVAxfLxk46YK226+F1 O+7inrBnewLdDBCiZ8WVzHcXnL9tXmWJRfbf56/EPdhT03GGM/ujj4cjWPVijfgkpfZu 7SVQWjW9990pCeyPDIRDebuRH2K80an+n2cIrhu6Him0EstX4uE8i1dyrnSmUgD/Huwe BfWr1K1EdPrtb3w9HFy3x3LEOiVhCk2Ehww5iqA6VvqfrlgPAze4D3A1ZItB3BYEAyMC iw== Received: from sc-exch01.marvell.com ([199.233.58.181]) by mx0b-0016f401.pphosted.com with ESMTP id 30g12njxbp-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT); Sun, 19 Apr 2020 03:02:32 -0700 Received: from DC5-EXCH02.marvell.com (10.69.176.39) by SC-EXCH01.marvell.com (10.93.176.81) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Sun, 19 Apr 2020 03:02:30 -0700 Received: from DC5-EXCH02.marvell.com (10.69.176.39) by DC5-EXCH02.marvell.com (10.69.176.39) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Sun, 19 Apr 2020 03:02:29 -0700 Received: from maili.marvell.com (10.69.176.80) by DC5-EXCH02.marvell.com (10.69.176.39) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Sun, 19 Apr 2020 03:02:29 -0700 Received: from jerin-lab.marvell.com (jerin-lab.marvell.com [10.28.34.14]) by maili.marvell.com (Postfix) with ESMTP id 6E6B73F703F; Sun, 19 Apr 2020 03:02:27 -0700 (PDT) From: To: Jerin Jacob , Sunil Kumar Kori CC: , , , , Date: Sun, 19 Apr 2020 15:31:14 +0530 Message-ID: <20200419100133.3232316-15-jerinj@marvell.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200419100133.3232316-1-jerinj@marvell.com> References: <20200413150116.734047-1-jerinj@marvell.com> <20200419100133.3232316-1-jerinj@marvell.com> MIME-Version: 1.0 X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:6.0.138, 18.0.676 definitions=2020-04-19_02:2020-04-17, 2020-04-19 signatures=0 Subject: [dpdk-dev] [PATCH v6 14/33] eal/trace: implement provider 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_point_emit_* have dual functions. The first to emit the payload for the registration function and the second one to act as trace mem emitters a.k.a provider payload. When it used as provider payload, those function copy the trace field to trace memory based on the tracing mode. Added payload definitions under ALLOW_EXPERIMENTAL define to allow the out_of_tree application to compile with out ALLOW_EXPERIMENTAL flag. Signed-off-by: Jerin Jacob Signed-off-by: Sunil Kumar Kori --- lib/librte_eal/include/rte_trace_point.h | 18 ++++ .../include/rte_trace_point_provider.h | 90 +++++++++++++++++++ 2 files changed, 108 insertions(+) diff --git a/lib/librte_eal/include/rte_trace_point.h b/lib/librte_eal/include/rte_trace_point.h index f4e6d7e42..eca48db72 100644 --- a/lib/librte_eal/include/rte_trace_point.h +++ b/lib/librte_eal/include/rte_trace_point.h @@ -281,6 +281,24 @@ int __rte_trace_point_register(rte_trace_point_t *trace, const char *name, #include #endif +#ifndef __DOXYGEN__ + +#define rte_trace_point_emit_u64(in) __rte_trace_point_emit(in, uint64_t) +#define rte_trace_point_emit_i64(in) __rte_trace_point_emit(in, int64_t) +#define rte_trace_point_emit_u32(in) __rte_trace_point_emit(in, uint32_t) +#define rte_trace_point_emit_i32(in) __rte_trace_point_emit(in, int32_t) +#define rte_trace_point_emit_u16(in) __rte_trace_point_emit(in, uint16_t) +#define rte_trace_point_emit_i16(in) __rte_trace_point_emit(in, int16_t) +#define rte_trace_point_emit_u8(in) __rte_trace_point_emit(in, uint8_t) +#define rte_trace_point_emit_i8(in) __rte_trace_point_emit(in, int8_t) +#define rte_trace_point_emit_int(in) __rte_trace_point_emit(in, int32_t) +#define rte_trace_point_emit_long(in) __rte_trace_point_emit(in, long) +#define rte_trace_point_emit_float(in) __rte_trace_point_emit(in, float) +#define rte_trace_point_emit_double(in) __rte_trace_point_emit(in, double) +#define rte_trace_point_emit_ptr(in) __rte_trace_point_emit(in, uintptr_t) + +#endif + #ifdef __cplusplus } #endif diff --git a/lib/librte_eal/include/rte_trace_point_provider.h b/lib/librte_eal/include/rte_trace_point_provider.h index b8d727387..9fbfed757 100644 --- a/lib/librte_eal/include/rte_trace_point_provider.h +++ b/lib/librte_eal/include/rte_trace_point_provider.h @@ -9,6 +9,10 @@ #ifndef _RTE_TRACE_POINT_PROVIDER_H_ #define _RTE_TRACE_POINT_PROVIDER_H_ +#ifdef ALLOW_EXPERIMENTAL_API + +#include +#include #include #include #include @@ -38,4 +42,90 @@ struct __rte_trace_header { RTE_DECLARE_PER_LCORE(void *, trace_mem); +static __rte_always_inline void* +__rte_trace_mem_get(uint64_t in) +{ + struct __rte_trace_header *trace = RTE_PER_LCORE(trace_mem); + const uint16_t sz = in & __RTE_TRACE_FIELD_SIZE_MASK; + + /* Trace memory is not initialized for this thread */ + if (unlikely(trace == NULL)) { + __rte_trace_mem_per_thread_alloc(); + trace = RTE_PER_LCORE(trace_mem); + if (unlikely(trace == NULL)) + return NULL; + } + /* Check the wrap around case */ + uint32_t offset = trace->offset; + if (unlikely((offset + sz) >= trace->len)) { + /* Disable the trace event if it in DISCARD mode */ + if (unlikely(in & __RTE_TRACE_FIELD_ENABLE_DISCARD)) + return NULL; + + offset = 0; + } + /* Align to event header size */ + offset = RTE_ALIGN_CEIL(offset, __RTE_TRACE_EVENT_HEADER_SZ); + void *mem = RTE_PTR_ADD(&trace->mem[0], offset); + offset += sz; + trace->offset = offset; + + return mem; +} + +static __rte_always_inline void* +__rte_trace_point_emit_ev_header(void *mem, uint64_t in) +{ + uint64_t val; + + /* Event header [63:0] = id [63:48] | timestamp [47:0] */ + val = rte_get_tsc_cycles() & + ~(0xffffULL << __RTE_TRACE_EVENT_HEADER_ID_SHIFT); + val |= ((in & __RTE_TRACE_FIELD_ID_MASK) << + (__RTE_TRACE_EVENT_HEADER_ID_SHIFT - __RTE_TRACE_FIELD_ID_SHIFT)); + + *(uint64_t *)mem = val; + return RTE_PTR_ADD(mem, __RTE_TRACE_EVENT_HEADER_SZ); +} + +#define __rte_trace_point_emit_header_generic(t)\ +void *mem;\ +do {\ + const uint64_t val = __atomic_load_n(t, __ATOMIC_ACQUIRE);\ + if (likely(!(val & __RTE_TRACE_FIELD_ENABLE_MASK)))\ + return;\ + mem = __rte_trace_mem_get(val);\ + if (unlikely(mem == NULL)) \ + return;\ + mem = __rte_trace_point_emit_ev_header(mem, val);\ +} while (0) + +#define __rte_trace_point_emit_header_fp(t)\ + if (__rte_trace_point_fp_is_enabled() == false)\ + return;\ + __rte_trace_point_emit_header_generic(t) + +#define __rte_trace_point_emit(in, type)\ +do {\ + memcpy(mem, &(in), sizeof(in));\ + mem = RTE_PTR_ADD(mem, sizeof(in));\ +} while (0) + +#define rte_trace_point_emit_string(in)\ +do {\ + if (unlikely(in == NULL))\ + return;\ + rte_strscpy(mem, in, __RTE_TRACE_EMIT_STRING_LEN_MAX);\ + mem = RTE_PTR_ADD(mem, __RTE_TRACE_EMIT_STRING_LEN_MAX);\ +} 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) + +#endif + #endif /* _RTE_TRACE_POINT_PROVIDER_H_ */ From patchwork Sun Apr 19 10:01:15 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: 68887 X-Patchwork-Delegate: david.marchand@redhat.com 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 BD1C2A0561; Sun, 19 Apr 2020 12:06:50 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 3D5CE1D5FE; Sun, 19 Apr 2020 12:03:00 +0200 (CEST) Received: from mx0b-0016f401.pphosted.com (mx0b-0016f401.pphosted.com [67.231.156.173]) by dpdk.org (Postfix) with ESMTP id 5F1EB1D5F6 for ; Sun, 19 Apr 2020 12:02:53 +0200 (CEST) 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 03JA0tur020047; Sun, 19 Apr 2020 03:02:35 -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=WmyRqa86hZOCsh2DUqN9iCZBA83SdXkZZuInWIlH41k=; b=fdxS4srYorm+wO1Avi3zsjRsZk8TSLQjsTzmGNAA5KFRvW7A6sGjY3sBGZ52B+yLvvu5 PPhApgI0Ua0KuuyhzUyYbE3dBX9V7YOa+0T5VBJzJzkQSsOdrrVYxqD+qaPuTGM+9ltP Zv6pS8UEeeceFwRANmIn5hswjsgbIfwFLOli5+U+1n/Q2/Kzj3UXFeTLkMR0FHrkaWIe TXzipkU+hHDg9j/VW7Zo9ZZxoPcUU9nH3kMMIzdKPKsDpQWRZ5s1lTasZJfiY8ulp5ig LYWcppLgCUTsATrz7zaSj4jX2L2FU3gfpD84iscPQcAnCQmiwKOJPxUtUOtSziVKiiLs 3Q== Received: from sc-exch01.marvell.com ([199.233.58.181]) by mx0b-0016f401.pphosted.com with ESMTP id 30g12njxc3-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT); Sun, 19 Apr 2020 03:02:35 -0700 Received: from DC5-EXCH02.marvell.com (10.69.176.39) by SC-EXCH01.marvell.com (10.93.176.81) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Sun, 19 Apr 2020 03:02:32 -0700 Received: from maili.marvell.com (10.69.176.80) by DC5-EXCH02.marvell.com (10.69.176.39) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Sun, 19 Apr 2020 03:02:33 -0700 Received: from jerin-lab.marvell.com (jerin-lab.marvell.com [10.28.34.14]) by maili.marvell.com (Postfix) with ESMTP id E48933F703F; Sun, 19 Apr 2020 03:02:30 -0700 (PDT) From: To: CC: , , , , , , Jerin Jacob Date: Sun, 19 Apr 2020 15:31:15 +0530 Message-ID: <20200419100133.3232316-16-jerinj@marvell.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200419100133.3232316-1-jerinj@marvell.com> References: <20200413150116.734047-1-jerinj@marvell.com> <20200419100133.3232316-1-jerinj@marvell.com> MIME-Version: 1.0 X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:6.0.138, 18.0.676 definitions=2020-04-19_02:2020-04-17, 2020-04-19 signatures=0 Subject: [dpdk-dev] [PATCH v6 15/33] eal/trace: hook internal trace APIs to Linux 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 Connect the internal trace interface API to Linux EAL. Signed-off-by: Jerin Jacob --- lib/librte_eal/common/eal_common_thread.c | 4 +++- lib/librte_eal/linux/eal.c | 9 +++++++++ lib/librte_eal/linux/eal_thread.c | 4 ++++ 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/lib/librte_eal/common/eal_common_thread.c b/lib/librte_eal/common/eal_common_thread.c index 99fe1aa4e..52c908b9e 100644 --- a/lib/librte_eal/common/eal_common_thread.c +++ b/lib/librte_eal/common/eal_common_thread.c @@ -15,6 +15,8 @@ #include #include #include +#include +#include #include "eal_internal_cfg.h" #include "eal_private.h" @@ -165,7 +167,7 @@ static void *rte_thread_init(void *arg) pthread_barrier_destroy(¶ms->configured); free(params); } - + __rte_trace_mem_per_thread_alloc(); return start_routine(routine_arg); } diff --git a/lib/librte_eal/linux/eal.c b/lib/librte_eal/linux/eal.c index d1e532fc1..937d867aa 100644 --- a/lib/librte_eal/linux/eal.c +++ b/lib/librte_eal/linux/eal.c @@ -58,6 +58,7 @@ #include "eal_filesystem.h" #include "eal_hugepages.h" #include "eal_memcfg.h" +#include "eal_trace.h" #include "eal_options.h" #include "eal_vfio.h" #include "hotplug_mp.h" @@ -1012,6 +1013,12 @@ rte_eal_init(int argc, char **argv) return -1; } + if (eal_trace_init() < 0) { + rte_eal_init_alert("Cannot init trace"); + rte_errno = EFAULT; + return -1; + } + if (eal_option_device_parse()) { rte_errno = ENODEV; rte_atomic32_clear(&run_once); @@ -1327,6 +1334,8 @@ rte_eal_cleanup(void) rte_memseg_walk(mark_freeable, NULL); rte_service_finalize(); rte_mp_channel_cleanup(); + rte_trace_save(); + eal_trace_fini(); eal_cleanup_config(&internal_config); return 0; } diff --git a/lib/librte_eal/linux/eal_thread.c b/lib/librte_eal/linux/eal_thread.c index 61fb2ed45..24772fc3d 100644 --- a/lib/librte_eal/linux/eal_thread.c +++ b/lib/librte_eal/linux/eal_thread.c @@ -20,6 +20,8 @@ #include #include #include +#include +#include #include "eal_private.h" #include "eal_thread.h" @@ -124,6 +126,8 @@ eal_thread_loop(__rte_unused void *arg) RTE_LOG(DEBUG, EAL, "lcore %u is ready (tid=%zx;cpuset=[%s%s])\n", lcore_id, (uintptr_t)thread_id, cpuset, ret == 0 ? "" : "..."); + __rte_trace_mem_per_thread_alloc(); + /* read on our pipe to get commands */ while (1) { void *fct_arg; From patchwork Sun Apr 19 10:01:16 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: 68886 X-Patchwork-Delegate: david.marchand@redhat.com 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 8EF84A0561; Sun, 19 Apr 2020 12:06:40 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 23D8E1D5F6; Sun, 19 Apr 2020 12:02:59 +0200 (CEST) Received: from mx0b-0016f401.pphosted.com (mx0b-0016f401.pphosted.com [67.231.156.173]) by dpdk.org (Postfix) with ESMTP id 4172C1D17F for ; Sun, 19 Apr 2020 12:02:51 +0200 (CEST) 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 03JA11CO020104; Sun, 19 Apr 2020 03:02:38 -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=fsRpxQ7nJ2Gy/18/FOSnp2Q4iF4khrLV+Z6ozYyzVI4=; b=eOV+4GYfGwQ+c7VP/49+4LGak5drfMVuW7dNMIGAQ6W8DRMa6OM1LCoi7Y1+AfDCoUkG 5FR92G2uD6Y1GHIrTkxtwG9nqgo40Xw/mcnC/Cm/jrVE3i0Kr52y2mFTIFq4Wj+Ng7RC cDWRA6Gtikl7W0tKwZ0TzmSD8JNHRcp5MCT40qW77cYLoPmtm7q844CFzdXs0IR2rkxs DjswrnHTH8TYJVRwhX8kNY08bYfQtHJZAGi/SVhror0QwByhfCHexzSC3u1+vLJPtOyb Y8jpLzH3s1P24ylj/AtkVG17oleT9+H2Nzo01i8ZgFBDN9ImofZqAukRo9v1ocdjfJRt 3g== Received: from sc-exch03.marvell.com ([199.233.58.183]) by mx0b-0016f401.pphosted.com with ESMTP id 30g12njxc9-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT); Sun, 19 Apr 2020 03:02:38 -0700 Received: from DC5-EXCH02.marvell.com (10.69.176.39) by SC-EXCH03.marvell.com (10.93.176.83) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Sun, 19 Apr 2020 03:02:36 -0700 Received: from maili.marvell.com (10.69.176.80) by DC5-EXCH02.marvell.com (10.69.176.39) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Sun, 19 Apr 2020 03:02:36 -0700 Received: from jerin-lab.marvell.com (jerin-lab.marvell.com [10.28.34.14]) by maili.marvell.com (Postfix) with ESMTP id 5B6E23F703F; Sun, 19 Apr 2020 03:02:34 -0700 (PDT) From: To: Bruce Richardson CC: , , , , , Jerin Jacob Date: Sun, 19 Apr 2020 15:31:16 +0530 Message-ID: <20200419100133.3232316-17-jerinj@marvell.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200419100133.3232316-1-jerinj@marvell.com> References: <20200413150116.734047-1-jerinj@marvell.com> <20200419100133.3232316-1-jerinj@marvell.com> MIME-Version: 1.0 X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:6.0.138, 18.0.676 definitions=2020-04-19_02:2020-04-17, 2020-04-19 signatures=0 Subject: [dpdk-dev] [PATCH v6 16/33] eal/trace: hook internal trace APIs to FreeBSD 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 Connect the internal trace interface API to FreeBSD EAL. Signed-off-by: Jerin Jacob --- lib/librte_eal/freebsd/eal.c | 10 ++++++++++ lib/librte_eal/freebsd/eal_thread.c | 4 ++++ 2 files changed, 14 insertions(+) diff --git a/lib/librte_eal/freebsd/eal.c b/lib/librte_eal/freebsd/eal.c index 80dc9aa78..540b7d38c 100644 --- a/lib/librte_eal/freebsd/eal.c +++ b/lib/librte_eal/freebsd/eal.c @@ -52,6 +52,7 @@ #include "eal_hugepages.h" #include "eal_options.h" #include "eal_memcfg.h" +#include "eal_trace.h" #define MEMSIZE_IF_NO_HUGE_PAGE (64ULL * 1024ULL * 1024ULL) @@ -751,6 +752,13 @@ rte_eal_init(int argc, char **argv) return -1; } + if (eal_trace_init() < 0) { + rte_eal_init_alert("Cannot init trace"); + rte_errno = EFAULT; + rte_atomic32_clear(&run_once); + return -1; + } + if (eal_option_device_parse()) { rte_errno = ENODEV; rte_atomic32_clear(&run_once); @@ -966,6 +974,8 @@ rte_eal_cleanup(void) { rte_service_finalize(); rte_mp_channel_cleanup(); + rte_trace_save(); + eal_trace_fini(); eal_cleanup_config(&internal_config); return 0; } diff --git a/lib/librte_eal/freebsd/eal_thread.c b/lib/librte_eal/freebsd/eal_thread.c index d802c1d2e..c25b4a019 100644 --- a/lib/librte_eal/freebsd/eal_thread.c +++ b/lib/librte_eal/freebsd/eal_thread.c @@ -20,6 +20,8 @@ #include #include #include +#include +#include #include "eal_private.h" #include "eal_thread.h" @@ -124,6 +126,8 @@ eal_thread_loop(__rte_unused void *arg) RTE_LOG(DEBUG, EAL, "lcore %u is ready (tid=%p;cpuset=[%s%s])\n", lcore_id, thread_id, cpuset, ret == 0 ? "" : "..."); + __rte_trace_mem_per_thread_alloc(); + /* read on our pipe to get commands */ while (1) { void *fct_arg; From patchwork Sun Apr 19 10:01:17 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: 68904 X-Patchwork-Delegate: david.marchand@redhat.com 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 06457A0561; Sun, 19 Apr 2020 12:11:33 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 573A01D6AB; Sun, 19 Apr 2020 12:03:59 +0200 (CEST) Received: from mx0b-0016f401.pphosted.com (mx0a-0016f401.pphosted.com [67.231.148.174]) by dpdk.org (Postfix) with ESMTP id D963F1D61B for ; Sun, 19 Apr 2020 12:03:27 +0200 (CEST) Received: from pps.filterd (m0045849.ppops.net [127.0.0.1]) by mx0a-0016f401.pphosted.com (8.16.0.42/8.16.0.42) with SMTP id 03J9vKX1031330; Sun, 19 Apr 2020 03:02:41 -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=sJPwhOqGyUZO+LSvVdghMl1yN7vmRAsgRYzG/suyMk8=; b=Is/0uUun+NwyTepoSet8giPcZcJ4MHV6d7goAOaB02UBFIBXd/BtRd2mtYaB8SruYOQh iegLjBQU2QVmptDMrkkbyxYkpaldj5SaXZRyZmClzvLl2Kc/hc5JxQWUe28Zz8ICDYju 7gJKdpXaveMJJgd8iowW0ZcT0b9grEqLTjx0jdm975TFCyJ99ofMjPwRy/NTEIYgj1rg TJPEvO4XbjDbrJvfIg90U924Oe+8rcBPQP10cSyhh7qnIU9xm8MW+ptHLQgfORGmHnBN cyVkwX6aoAi2u7KJJvcvcsMtBFkeOGnBEd/MwaOlrTDGSl0swRwfz64viZd2IR6rWZyC jA== Received: from sc-exch03.marvell.com ([199.233.58.183]) by mx0a-0016f401.pphosted.com with ESMTP id 30fxwp3d63-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT); Sun, 19 Apr 2020 03:02:41 -0700 Received: from DC5-EXCH01.marvell.com (10.69.176.38) by SC-EXCH03.marvell.com (10.93.176.83) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Sun, 19 Apr 2020 03:02:39 -0700 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.2 via Frontend Transport; Sun, 19 Apr 2020 03:02:39 -0700 Received: from jerin-lab.marvell.com (jerin-lab.marvell.com [10.28.34.14]) by maili.marvell.com (Postfix) with ESMTP id C14BB3F703F; Sun, 19 Apr 2020 03:02:37 -0700 (PDT) From: To: Jerin Jacob , Sunil Kumar Kori , Bruce Richardson CC: , , , Date: Sun, 19 Apr 2020 15:31:17 +0530 Message-ID: <20200419100133.3232316-18-jerinj@marvell.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200419100133.3232316-1-jerinj@marvell.com> References: <20200413150116.734047-1-jerinj@marvell.com> <20200419100133.3232316-1-jerinj@marvell.com> MIME-Version: 1.0 X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:6.0.138, 18.0.676 definitions=2020-04-19_02:2020-04-17, 2020-04-19 signatures=0 Subject: [dpdk-dev] [PATCH v6 17/33] eal/trace: add generic tracepoints 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 This patch creates the following generic tracepoint for generic tracing when there is no dedicated tracepoint is available. - rte_trace_lib_eal_generic_void() - rte_trace_lib_eal_generic_u64() - rte_trace_lib_eal_generic_u32() - rte_trace_lib_eal_generic_u16() - rte_trace_lib_eal_generic_u8() - rte_trace_lib_eal_generic_i64() - rte_trace_lib_eal_generic_i32() - rte_trace_lib_eal_generic_i16() - rte_trace_lib_eal_generic_i8() - rte_trace_lib_eal_generic_int() - rte_trace_lib_eal_generic_long() - rte_trace_lib_eal_generic_float() - rte_trace_lib_eal_generic_double() - rte_trace_lib_eal_generic_ptr() - rte_trace_lib_eal_generic_str() For example, if an application wishes to emit an int datatype, it can call rte_trace_lib_eal_generic_int(val) to emit the trace. Signed-off-by: Jerin Jacob Signed-off-by: Sunil Kumar Kori --- .../common/eal_common_trace_points.c | 60 +++++++++ lib/librte_eal/common/meson.build | 1 + lib/librte_eal/freebsd/Makefile | 1 + lib/librte_eal/include/meson.build | 1 + lib/librte_eal/include/rte_trace_eal.h | 122 ++++++++++++++++++ lib/librte_eal/linux/Makefile | 1 + lib/librte_eal/rte_eal_version.map | 17 +++ 7 files changed, 203 insertions(+) create mode 100644 lib/librte_eal/common/eal_common_trace_points.c create mode 100644 lib/librte_eal/include/rte_trace_eal.h diff --git a/lib/librte_eal/common/eal_common_trace_points.c b/lib/librte_eal/common/eal_common_trace_points.c new file mode 100644 index 000000000..cd70fc1e3 --- /dev/null +++ b/lib/librte_eal/common/eal_common_trace_points.c @@ -0,0 +1,60 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(C) 2020 Marvell International Ltd. + */ + +#define RTE_TRACE_POINT_REGISTER_SELECT /* Select trace point register macros */ + +#include + +RTE_TRACE_POINT_DEFINE(rte_trace_lib_eal_generic_void); +RTE_TRACE_POINT_DEFINE(rte_trace_lib_eal_generic_u64); +RTE_TRACE_POINT_DEFINE(rte_trace_lib_eal_generic_u32); +RTE_TRACE_POINT_DEFINE(rte_trace_lib_eal_generic_u16); +RTE_TRACE_POINT_DEFINE(rte_trace_lib_eal_generic_u8); +RTE_TRACE_POINT_DEFINE(rte_trace_lib_eal_generic_i64); +RTE_TRACE_POINT_DEFINE(rte_trace_lib_eal_generic_i32); +RTE_TRACE_POINT_DEFINE(rte_trace_lib_eal_generic_i16); +RTE_TRACE_POINT_DEFINE(rte_trace_lib_eal_generic_i8); +RTE_TRACE_POINT_DEFINE(rte_trace_lib_eal_generic_int); +RTE_TRACE_POINT_DEFINE(rte_trace_lib_eal_generic_long); +RTE_TRACE_POINT_DEFINE(rte_trace_lib_eal_generic_float); +RTE_TRACE_POINT_DEFINE(rte_trace_lib_eal_generic_double); +RTE_TRACE_POINT_DEFINE(rte_trace_lib_eal_generic_ptr); +RTE_TRACE_POINT_DEFINE(rte_trace_lib_eal_generic_str); +RTE_TRACE_POINT_DEFINE(rte_trace_lib_eal_generic_func); + +RTE_INIT(eal_trace_init) +{ + RTE_TRACE_POINT_REGISTER(rte_trace_lib_eal_generic_void, + lib.eal.generic.void); + RTE_TRACE_POINT_REGISTER(rte_trace_lib_eal_generic_u64, + lib.eal.generic.u64); + RTE_TRACE_POINT_REGISTER(rte_trace_lib_eal_generic_u32, + lib.eal.generic.u32); + RTE_TRACE_POINT_REGISTER(rte_trace_lib_eal_generic_u16, + lib.eal.generic.u16); + RTE_TRACE_POINT_REGISTER(rte_trace_lib_eal_generic_u8, + lib.eal.generic.u8); + RTE_TRACE_POINT_REGISTER(rte_trace_lib_eal_generic_i64, + lib.eal.generic.i64); + RTE_TRACE_POINT_REGISTER(rte_trace_lib_eal_generic_i32, + lib.eal.generic.i32); + RTE_TRACE_POINT_REGISTER(rte_trace_lib_eal_generic_i16, + lib.eal.generic.i16); + RTE_TRACE_POINT_REGISTER(rte_trace_lib_eal_generic_i8, + lib.eal.generic.i8); + RTE_TRACE_POINT_REGISTER(rte_trace_lib_eal_generic_int, + lib.eal.generic.int); + RTE_TRACE_POINT_REGISTER(rte_trace_lib_eal_generic_long, + lib.eal.generic.long); + RTE_TRACE_POINT_REGISTER(rte_trace_lib_eal_generic_float, + lib.eal.generic.float); + RTE_TRACE_POINT_REGISTER(rte_trace_lib_eal_generic_double, + lib.eal.generic.double); + RTE_TRACE_POINT_REGISTER(rte_trace_lib_eal_generic_ptr, + lib.eal.generic.ptr); + RTE_TRACE_POINT_REGISTER(rte_trace_lib_eal_generic_str, + lib.eal.generic.string); + RTE_TRACE_POINT_REGISTER(rte_trace_lib_eal_generic_func, + lib.eal.generic.func); +} diff --git a/lib/librte_eal/common/meson.build b/lib/librte_eal/common/meson.build index d2ac44313..155da29b4 100644 --- a/lib/librte_eal/common/meson.build +++ b/lib/librte_eal/common/meson.build @@ -44,6 +44,7 @@ sources += files( 'eal_common_timer.c', 'eal_common_trace.c', 'eal_common_trace_ctf.c', + 'eal_common_trace_points.c', 'eal_common_trace_utils.c', 'eal_common_uuid.c', 'hotplug_mp.c', diff --git a/lib/librte_eal/freebsd/Makefile b/lib/librte_eal/freebsd/Makefile index 539ad44a7..a8400f20a 100644 --- a/lib/librte_eal/freebsd/Makefile +++ b/lib/librte_eal/freebsd/Makefile @@ -61,6 +61,7 @@ SRCS-$(CONFIG_RTE_EXEC_ENV_FREEBSD) += eal_common_fbarray.c SRCS-$(CONFIG_RTE_EXEC_ENV_FREEBSD) += eal_common_uuid.c SRCS-$(CONFIG_RTE_EXEC_ENV_FREEBSD) += eal_common_trace.c SRCS-$(CONFIG_RTE_EXEC_ENV_FREEBSD) += eal_common_trace_ctf.c +SRCS-$(CONFIG_RTE_EXEC_ENV_FREEBSD) += eal_common_trace_points.c SRCS-$(CONFIG_RTE_EXEC_ENV_FREEBSD) += eal_common_trace_utils.c SRCS-$(CONFIG_RTE_EXEC_ENV_FREEBSD) += rte_malloc.c SRCS-$(CONFIG_RTE_EXEC_ENV_FREEBSD) += hotplug_mp.c diff --git a/lib/librte_eal/include/meson.build b/lib/librte_eal/include/meson.build index ce360615f..67448c27f 100644 --- a/lib/librte_eal/include/meson.build +++ b/lib/librte_eal/include/meson.build @@ -41,6 +41,7 @@ headers += files( 'rte_tailq.h', 'rte_time.h', 'rte_trace.h', + 'rte_trace_eal.h', 'rte_trace_point.h', 'rte_trace_point_provider.h', 'rte_trace_point_register.h', diff --git a/lib/librte_eal/include/rte_trace_eal.h b/lib/librte_eal/include/rte_trace_eal.h new file mode 100644 index 000000000..674c33d38 --- /dev/null +++ b/lib/librte_eal/include/rte_trace_eal.h @@ -0,0 +1,122 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(C) 2020 Marvell International Ltd. + */ + +#ifndef _RTE_TRACE_EAL_H_ +#define _RTE_TRACE_EAL_H_ + +/** + * @file + * + * API for EAL trace support + */ + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +/* Generic */ +RTE_TRACE_POINT( + rte_trace_lib_eal_generic_void, + RTE_TRACE_POINT_ARGS(void), +) + +RTE_TRACE_POINT( + rte_trace_lib_eal_generic_u64, + RTE_TRACE_POINT_ARGS(uint64_t in), + rte_trace_point_emit_u64(in); +) + +RTE_TRACE_POINT( + rte_trace_lib_eal_generic_u32, + RTE_TRACE_POINT_ARGS(uint32_t in), + rte_trace_point_emit_u32(in); +) + +RTE_TRACE_POINT( + rte_trace_lib_eal_generic_u16, + RTE_TRACE_POINT_ARGS(uint16_t in), + rte_trace_point_emit_u16(in); +) + +RTE_TRACE_POINT( + rte_trace_lib_eal_generic_u8, + RTE_TRACE_POINT_ARGS(uint8_t in), + rte_trace_point_emit_u8(in); +) + +RTE_TRACE_POINT( + rte_trace_lib_eal_generic_i64, + RTE_TRACE_POINT_ARGS(int64_t in), + rte_trace_point_emit_i64(in); +) + +RTE_TRACE_POINT( + rte_trace_lib_eal_generic_i32, + RTE_TRACE_POINT_ARGS(int32_t in), + rte_trace_point_emit_i32(in); +) + +RTE_TRACE_POINT( + rte_trace_lib_eal_generic_i16, + RTE_TRACE_POINT_ARGS(int16_t in), + rte_trace_point_emit_i16(in); +) + +RTE_TRACE_POINT( + rte_trace_lib_eal_generic_i8, + RTE_TRACE_POINT_ARGS(int8_t in), + rte_trace_point_emit_i8(in); +) + +RTE_TRACE_POINT( + rte_trace_lib_eal_generic_int, + RTE_TRACE_POINT_ARGS(int in), + rte_trace_point_emit_int(in); +) + +RTE_TRACE_POINT( + rte_trace_lib_eal_generic_long, + RTE_TRACE_POINT_ARGS(long in), + rte_trace_point_emit_long(in); +) + +RTE_TRACE_POINT( + rte_trace_lib_eal_generic_float, + RTE_TRACE_POINT_ARGS(float in), + rte_trace_point_emit_float(in); +) + +RTE_TRACE_POINT( + rte_trace_lib_eal_generic_double, + RTE_TRACE_POINT_ARGS(double in), + rte_trace_point_emit_double(in); +) + +RTE_TRACE_POINT( + rte_trace_lib_eal_generic_ptr, + RTE_TRACE_POINT_ARGS(const void *ptr), + rte_trace_point_emit_ptr(ptr); +) + +RTE_TRACE_POINT( + rte_trace_lib_eal_generic_str, + RTE_TRACE_POINT_ARGS(const char *str), + rte_trace_point_emit_string(str); +) + +RTE_TRACE_POINT( + rte_trace_lib_eal_generic_func, + RTE_TRACE_POINT_ARGS(const char *func), + rte_trace_point_emit_string(func); +) + +#define RTE_TRACE_LIB_EAL_GENERIC_FUNC rte_trace_lib_eal_generic_func(__func__) + +#ifdef __cplusplus +} +#endif + +#endif /* _RTE_TRACE_EAL_H_ */ diff --git a/lib/librte_eal/linux/Makefile b/lib/librte_eal/linux/Makefile index f00588d6e..a77eb1757 100644 --- a/lib/librte_eal/linux/Makefile +++ b/lib/librte_eal/linux/Makefile @@ -68,6 +68,7 @@ SRCS-$(CONFIG_RTE_EXEC_ENV_LINUX) += eal_common_fbarray.c SRCS-$(CONFIG_RTE_EXEC_ENV_LINUX) += eal_common_uuid.c SRCS-$(CONFIG_RTE_EXEC_ENV_LINUX) += eal_common_trace.c SRCS-$(CONFIG_RTE_EXEC_ENV_LINUX) += eal_common_trace_ctf.c +SRCS-$(CONFIG_RTE_EXEC_ENV_LINUX) += eal_common_trace_points.c SRCS-$(CONFIG_RTE_EXEC_ENV_LINUX) += eal_common_trace_utils.c SRCS-$(CONFIG_RTE_EXEC_ENV_LINUX) += rte_malloc.c SRCS-$(CONFIG_RTE_EXEC_ENV_LINUX) += hotplug_mp.c diff --git a/lib/librte_eal/rte_eal_version.map b/lib/librte_eal/rte_eal_version.map index 8b51c8a5b..c333ac900 100644 --- a/lib/librte_eal/rte_eal_version.map +++ b/lib/librte_eal/rte_eal_version.map @@ -356,4 +356,21 @@ EXPERIMENTAL { rte_trace_point_lookup; rte_trace_regexp; rte_trace_save; + + __rte_trace_lib_eal_generic_double; + __rte_trace_lib_eal_generic_float; + __rte_trace_lib_eal_generic_func; + __rte_trace_lib_eal_generic_i16; + __rte_trace_lib_eal_generic_i32; + __rte_trace_lib_eal_generic_i64; + __rte_trace_lib_eal_generic_i8; + __rte_trace_lib_eal_generic_int; + __rte_trace_lib_eal_generic_long; + __rte_trace_lib_eal_generic_ptr; + __rte_trace_lib_eal_generic_str; + __rte_trace_lib_eal_generic_u16; + __rte_trace_lib_eal_generic_u32; + __rte_trace_lib_eal_generic_u64; + __rte_trace_lib_eal_generic_u8; + __rte_trace_lib_eal_generic_void; }; From patchwork Sun Apr 19 10:01:18 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: 68889 X-Patchwork-Delegate: david.marchand@redhat.com 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 290CBA0561; Sun, 19 Apr 2020 12:07:18 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id ACDE71D612; Sun, 19 Apr 2020 12:03:02 +0200 (CEST) Received: from mx0b-0016f401.pphosted.com (mx0b-0016f401.pphosted.com [67.231.156.173]) by dpdk.org (Postfix) with ESMTP id 3EB9E1D43F for ; Sun, 19 Apr 2020 12:02:55 +0200 (CEST) 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 03JA18hg020147; Sun, 19 Apr 2020 03:02:45 -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=4dq9VPE66e2CzAuGjaMmwCzv4EsUylBruDCx75Rogn8=; b=OO8qlGiHj1zJleF4PK1xo7XDHjOWPby0XHakMTu+Lc6tJH+lm5NRbg0YKKC2fKv48Jk5 Nv4Wx0WazTwnMUadrNxPZPxNLQQ3TAakrqXXL2bfBSH+4xXqiT3GEEXGaMyNCUWa8sug YukqFJHIMsoRzaLGZ5QfF1fxGWAcVZq84sz2pqsyN2EAcsMT/j4uUThXWnsTDHNhOg+t +ItLPHMtqC1e3Sgj7UNBQV3nP4S81TPU/TYjptw5y89Op90Cln7fvTgMABsM9iSZQNop cFHmgziIX0VqykIWnbRDDUV5xQRjiv2cbxWnIWRyGu2BSjFpFIbskkspy43n7YcigvVT hw== Received: from sc-exch04.marvell.com ([199.233.58.184]) by mx0b-0016f401.pphosted.com with ESMTP id 30g12njxcq-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT); Sun, 19 Apr 2020 03:02:45 -0700 Received: from DC5-EXCH02.marvell.com (10.69.176.39) by SC-EXCH04.marvell.com (10.93.176.84) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Sun, 19 Apr 2020 03:02:42 -0700 Received: from maili.marvell.com (10.69.176.80) by DC5-EXCH02.marvell.com (10.69.176.39) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Sun, 19 Apr 2020 03:02:43 -0700 Received: from jerin-lab.marvell.com (jerin-lab.marvell.com [10.28.34.14]) by maili.marvell.com (Postfix) with ESMTP id 0B9733F703F; Sun, 19 Apr 2020 03:02:40 -0700 (PDT) From: To: Jerin Jacob , Sunil Kumar Kori , Bruce Richardson CC: , , , Date: Sun, 19 Apr 2020 15:31:18 +0530 Message-ID: <20200419100133.3232316-19-jerinj@marvell.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200419100133.3232316-1-jerinj@marvell.com> References: <20200413150116.734047-1-jerinj@marvell.com> <20200419100133.3232316-1-jerinj@marvell.com> MIME-Version: 1.0 X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:6.0.138, 18.0.676 definitions=2020-04-19_02:2020-04-17, 2020-04-19 signatures=0 Subject: [dpdk-dev] [PATCH v6 18/33] eal/trace: add alarm tracepoints 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 Add following alarm related trace points. - rte_trace_lib_eal_alarm_set() - rte_trace_lib_eal_alarm_cancel() Signed-off-by: Jerin Jacob --- .../common/eal_common_trace_points.c | 9 ++++++++ lib/librte_eal/freebsd/eal_alarm.c | 3 +++ lib/librte_eal/include/rte_trace_eal.h | 21 +++++++++++++++++++ lib/librte_eal/linux/eal_alarm.c | 4 ++++ lib/librte_eal/rte_eal_version.map | 2 ++ 5 files changed, 39 insertions(+) diff --git a/lib/librte_eal/common/eal_common_trace_points.c b/lib/librte_eal/common/eal_common_trace_points.c index cd70fc1e3..50c255034 100644 --- a/lib/librte_eal/common/eal_common_trace_points.c +++ b/lib/librte_eal/common/eal_common_trace_points.c @@ -23,6 +23,9 @@ RTE_TRACE_POINT_DEFINE(rte_trace_lib_eal_generic_ptr); RTE_TRACE_POINT_DEFINE(rte_trace_lib_eal_generic_str); RTE_TRACE_POINT_DEFINE(rte_trace_lib_eal_generic_func); +RTE_TRACE_POINT_DEFINE(rte_trace_lib_eal_alarm_set); +RTE_TRACE_POINT_DEFINE(rte_trace_lib_eal_alarm_cancel); + RTE_INIT(eal_trace_init) { RTE_TRACE_POINT_REGISTER(rte_trace_lib_eal_generic_void, @@ -57,4 +60,10 @@ RTE_INIT(eal_trace_init) lib.eal.generic.string); RTE_TRACE_POINT_REGISTER(rte_trace_lib_eal_generic_func, lib.eal.generic.func); + + RTE_TRACE_POINT_REGISTER(rte_trace_lib_eal_alarm_set, + lib.eal.alarm.set); + RTE_TRACE_POINT_REGISTER(rte_trace_lib_eal_alarm_cancel, + lib.eal.alarm.cancel); + } diff --git a/lib/librte_eal/freebsd/eal_alarm.c b/lib/librte_eal/freebsd/eal_alarm.c index 51ea4b8c0..5f03ab4c4 100644 --- a/lib/librte_eal/freebsd/eal_alarm.c +++ b/lib/librte_eal/freebsd/eal_alarm.c @@ -17,6 +17,7 @@ #include #include #include +#include #include "eal_private.h" #include "eal_alarm_private.h" @@ -223,6 +224,7 @@ rte_eal_alarm_set(uint64_t us, rte_eal_alarm_callback cb_fn, void *cb_arg) rte_spinlock_unlock(&alarm_list_lk); + rte_trace_lib_eal_alarm_set(us, cb_fn, cb_arg, ret); return ret; } @@ -310,5 +312,6 @@ rte_eal_alarm_cancel(rte_eal_alarm_callback cb_fn, void *cb_arg) rte_spinlock_unlock(&alarm_list_lk); + rte_trace_lib_eal_alarm_cancel(cb_fn, cb_arg, count); return count; } diff --git a/lib/librte_eal/include/rte_trace_eal.h b/lib/librte_eal/include/rte_trace_eal.h index 674c33d38..d1be9100e 100644 --- a/lib/librte_eal/include/rte_trace_eal.h +++ b/lib/librte_eal/include/rte_trace_eal.h @@ -15,6 +15,7 @@ extern "C" { #endif +#include #include /* Generic */ @@ -115,6 +116,26 @@ RTE_TRACE_POINT( #define RTE_TRACE_LIB_EAL_GENERIC_FUNC rte_trace_lib_eal_generic_func(__func__) +/* Alarm */ +RTE_TRACE_POINT( + rte_trace_lib_eal_alarm_set, + RTE_TRACE_POINT_ARGS(uint64_t us, rte_eal_alarm_callback cb_fn, + void *cb_arg, int rc), + rte_trace_point_emit_u64(us); + rte_trace_point_emit_ptr(cb_fn); + rte_trace_point_emit_ptr(cb_arg); + rte_trace_point_emit_int(rc); +) + +RTE_TRACE_POINT( + rte_trace_lib_eal_alarm_cancel, + RTE_TRACE_POINT_ARGS(rte_eal_alarm_callback cb_fn, void *cb_arg, + int count), + rte_trace_point_emit_ptr(cb_fn); + rte_trace_point_emit_ptr(cb_arg); + rte_trace_point_emit_int(count); +) + #ifdef __cplusplus } #endif diff --git a/lib/librte_eal/linux/eal_alarm.c b/lib/librte_eal/linux/eal_alarm.c index 0924c9205..9fef3e6c8 100644 --- a/lib/librte_eal/linux/eal_alarm.c +++ b/lib/librte_eal/linux/eal_alarm.c @@ -20,6 +20,8 @@ #include #include #include +#include + #include #ifndef TFD_NONBLOCK @@ -172,6 +174,7 @@ rte_eal_alarm_set(uint64_t us, rte_eal_alarm_callback cb_fn, void *cb_arg) } rte_spinlock_unlock(&alarm_list_lk); + rte_trace_lib_eal_alarm_set(us, cb_fn, cb_arg, ret); return ret; } @@ -240,5 +243,6 @@ rte_eal_alarm_cancel(rte_eal_alarm_callback cb_fn, void *cb_arg) else if (err) rte_errno = err; + rte_trace_lib_eal_alarm_cancel(cb_fn, cb_arg, count); return count; } diff --git a/lib/librte_eal/rte_eal_version.map b/lib/librte_eal/rte_eal_version.map index c333ac900..4cba9a55d 100644 --- a/lib/librte_eal/rte_eal_version.map +++ b/lib/librte_eal/rte_eal_version.map @@ -357,6 +357,8 @@ EXPERIMENTAL { rte_trace_regexp; rte_trace_save; + __rte_trace_lib_eal_alarm_cancel; + __rte_trace_lib_eal_alarm_set; __rte_trace_lib_eal_generic_double; __rte_trace_lib_eal_generic_float; __rte_trace_lib_eal_generic_func; From patchwork Sun Apr 19 10:01:19 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: 68891 X-Patchwork-Delegate: david.marchand@redhat.com 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 9C979A0561; Sun, 19 Apr 2020 12:07:47 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 34D9C1D623; Sun, 19 Apr 2020 12:03:21 +0200 (CEST) Received: from mx0b-0016f401.pphosted.com (mx0a-0016f401.pphosted.com [67.231.148.174]) by dpdk.org (Postfix) with ESMTP id 224441D617 for ; Sun, 19 Apr 2020 12:02:56 +0200 (CEST) Received: from pps.filterd (m0045849.ppops.net [127.0.0.1]) by mx0a-0016f401.pphosted.com (8.16.0.42/8.16.0.42) with SMTP id 03J9wl8h032547; Sun, 19 Apr 2020 03:02:48 -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=y2H1OhhZAgIfaXuK/oNg924JxLzUfNwB9NM+Fhx5fPs=; b=QQvvXOENJCe7PRsf3RdKOwZzGI+eEXw6+JwkUE+lhdc/5yReGp6y+RRMGbpH++oerlgu V16IIIEqm5ZdgviOf9dCo7qNyIq+VPwnKKNCZ0DMcCirKriBkC3KroIhEEE7JhT4FTV4 VpLdLttHe6VAJ8AyZiSgxdow9unn/VYftO01byiiCuVJS3cuza18QVtGjh9e/x9txo54 V54IvSgpVkBe8VLEyOnYl01D/nCAPxIUA/PsaMxdl8rAT1LdD/QQCpg7Q+ZCjVlGvnP6 oQReobqdcEm5vsXiEa6zitQQkNKLX/JzfOJL/IwF1fz7vnNdi7dzKpw80rhPxUlG/RYb 1w== Received: from sc-exch03.marvell.com ([199.233.58.183]) by mx0a-0016f401.pphosted.com with ESMTP id 30fxwp3d66-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT); Sun, 19 Apr 2020 03:02:48 -0700 Received: from DC5-EXCH02.marvell.com (10.69.176.39) by SC-EXCH03.marvell.com (10.93.176.83) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Sun, 19 Apr 2020 03:02:46 -0700 Received: from maili.marvell.com (10.69.176.80) by DC5-EXCH02.marvell.com (10.69.176.39) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Sun, 19 Apr 2020 03:02:46 -0700 Received: from jerin-lab.marvell.com (jerin-lab.marvell.com [10.28.34.14]) by maili.marvell.com (Postfix) with ESMTP id 503C83F703F; Sun, 19 Apr 2020 03:02:44 -0700 (PDT) From: To: Jerin Jacob , Sunil Kumar Kori , Anatoly Burakov CC: , , , , Date: Sun, 19 Apr 2020 15:31:19 +0530 Message-ID: <20200419100133.3232316-20-jerinj@marvell.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200419100133.3232316-1-jerinj@marvell.com> References: <20200413150116.734047-1-jerinj@marvell.com> <20200419100133.3232316-1-jerinj@marvell.com> MIME-Version: 1.0 X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:6.0.138, 18.0.676 definitions=2020-04-19_02:2020-04-17, 2020-04-19 signatures=0 Subject: [dpdk-dev] [PATCH v6 19/33] eal/trace: add memory tracepoints 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 Add the following memory-related tracepoints. - rte_trace_lib_eal_mem_zmalloc() - rte_trace_lib_eal_mem_malloc() - rte_trace_lib_eal_mem_realloc() - rte_trace_lib_eal_mem_free() rte_malloc() and rte_free() has been used in the trace implementation, in order to avoid tracing implementation specific events, added an internal no trace version rte_malloc() and rte_free(). Signed-off-by: Jerin Jacob --- lib/librte_eal/common/eal_common_trace.c | 4 +- .../common/eal_common_trace_points.c | 14 +++++ lib/librte_eal/common/eal_private.h | 5 ++ lib/librte_eal/common/rte_malloc.c | 60 ++++++++++++++++--- lib/librte_eal/include/rte_trace_eal.h | 39 ++++++++++++ lib/librte_eal/rte_eal_version.map | 4 ++ 6 files changed, 115 insertions(+), 11 deletions(-) diff --git a/lib/librte_eal/common/eal_common_trace.c b/lib/librte_eal/common/eal_common_trace.c index d55a23df1..73277ae80 100644 --- a/lib/librte_eal/common/eal_common_trace.c +++ b/lib/librte_eal/common/eal_common_trace.c @@ -326,7 +326,7 @@ __rte_trace_mem_per_thread_alloc(void) } /* First attempt from huge page */ - header = rte_malloc(NULL, trace_mem_sz(trace->buff_len), 8); + header = eal_malloc_no_trace(NULL, trace_mem_sz(trace->buff_len), 8); if (header) { trace->lcore_meta[count].area = TRACE_AREA_HUGEPAGE; goto found; @@ -378,7 +378,7 @@ trace_mem_per_thread_free(void) for (count = 0; count < trace->nb_trace_mem_list; count++) { mem = trace->lcore_meta[count].mem; if (trace->lcore_meta[count].area == TRACE_AREA_HUGEPAGE) - rte_free(mem); + eal_free_no_trace(mem); else if (trace->lcore_meta[count].area == TRACE_AREA_HEAP) free(mem); } diff --git a/lib/librte_eal/common/eal_common_trace_points.c b/lib/librte_eal/common/eal_common_trace_points.c index 50c255034..5a8444f07 100644 --- a/lib/librte_eal/common/eal_common_trace_points.c +++ b/lib/librte_eal/common/eal_common_trace_points.c @@ -26,6 +26,11 @@ RTE_TRACE_POINT_DEFINE(rte_trace_lib_eal_generic_func); RTE_TRACE_POINT_DEFINE(rte_trace_lib_eal_alarm_set); RTE_TRACE_POINT_DEFINE(rte_trace_lib_eal_alarm_cancel); +RTE_TRACE_POINT_DEFINE(rte_trace_lib_eal_mem_zmalloc); +RTE_TRACE_POINT_DEFINE(rte_trace_lib_eal_mem_malloc); +RTE_TRACE_POINT_DEFINE(rte_trace_lib_eal_mem_realloc); +RTE_TRACE_POINT_DEFINE(rte_trace_lib_eal_mem_free); + RTE_INIT(eal_trace_init) { RTE_TRACE_POINT_REGISTER(rte_trace_lib_eal_generic_void, @@ -66,4 +71,13 @@ RTE_INIT(eal_trace_init) RTE_TRACE_POINT_REGISTER(rte_trace_lib_eal_alarm_cancel, lib.eal.alarm.cancel); + RTE_TRACE_POINT_REGISTER(rte_trace_lib_eal_mem_zmalloc, + lib.eal.mem.zmalloc); + RTE_TRACE_POINT_REGISTER(rte_trace_lib_eal_mem_malloc, + lib.eal.mem.malloc); + RTE_TRACE_POINT_REGISTER(rte_trace_lib_eal_mem_realloc, + lib.eal.mem.realloc); + RTE_TRACE_POINT_REGISTER(rte_trace_lib_eal_mem_free, + lib.eal.mem.free); + } diff --git a/lib/librte_eal/common/eal_private.h b/lib/librte_eal/common/eal_private.h index 8536ed70b..ecf827914 100644 --- a/lib/librte_eal/common/eal_private.h +++ b/lib/librte_eal/common/eal_private.h @@ -443,4 +443,9 @@ rte_option_usage(void); uint64_t eal_get_baseaddr(void); +void * +eal_malloc_no_trace(const char *type, size_t size, unsigned int align); + +void eal_free_no_trace(void *addr); + #endif /* _EAL_PRIVATE_H_ */ diff --git a/lib/librte_eal/common/rte_malloc.c b/lib/librte_eal/common/rte_malloc.c index d6026a2b1..9ad032aed 100644 --- a/lib/librte_eal/common/rte_malloc.c +++ b/lib/librte_eal/common/rte_malloc.c @@ -20,6 +20,7 @@ #include #include #include +#include #include #include "malloc_elem.h" @@ -30,20 +31,35 @@ /* Free the memory space back to heap */ -void rte_free(void *addr) +static void +mem_free(void *addr, const bool trace_ena) { + if (trace_ena == true) + rte_trace_lib_eal_mem_free(addr); + if (addr == NULL) return; if (malloc_heap_free(malloc_elem_from_data(addr)) < 0) RTE_LOG(ERR, EAL, "Error: Invalid memory\n"); } -/* - * Allocate memory on specified heap. - */ -void * -rte_malloc_socket(const char *type, size_t size, unsigned int align, - int socket_arg) +void +rte_free(void *addr) { + return mem_free(addr, true); +} + +void +eal_free_no_trace(void *addr) +{ + return mem_free(addr, false); +} + +static void * +malloc_socket(const char *type, size_t size, unsigned int align, + int socket_arg, const bool trace_ena) +{ + void *ptr; + /* return NULL if size is 0 or alignment is not power-of-2 */ if (size == 0 || (align && !rte_is_power_of_2(align))) return NULL; @@ -57,8 +73,29 @@ rte_malloc_socket(const char *type, size_t size, unsigned int align, !rte_eal_has_hugepages()) socket_arg = SOCKET_ID_ANY; - return malloc_heap_alloc(type, size, socket_arg, 0, + ptr = malloc_heap_alloc(type, size, socket_arg, 0, align == 0 ? 1 : align, 0, false); + + if (trace_ena == true) + rte_trace_lib_eal_mem_malloc(type, size, align, + socket_arg, ptr); + return ptr; +} + +/* + * Allocate memory on specified heap. + */ +void * +rte_malloc_socket(const char *type, size_t size, unsigned int align, + int socket_arg) +{ + return malloc_socket(type, size, align, socket_arg, true); +} + +void * +eal_malloc_no_trace(const char *type, size_t size, unsigned int align) +{ + return malloc_socket(type, size, align, SOCKET_ID_ANY, false); } /* @@ -87,6 +124,8 @@ rte_zmalloc_socket(const char *type, size_t size, unsigned align, int socket) if (ptr != NULL) memset(ptr, 0, size); #endif + + rte_trace_lib_eal_mem_zmalloc(type, size, align, socket, ptr); return ptr; } @@ -140,8 +179,10 @@ rte_realloc_socket(void *ptr, size_t size, unsigned int align, int socket) if ((socket == SOCKET_ID_ANY || (unsigned int)socket == elem->heap->socket_id) && RTE_PTR_ALIGN(ptr, align) == ptr && - malloc_heap_resize(elem, size) == 0) + malloc_heap_resize(elem, size) == 0) { + rte_trace_lib_eal_mem_realloc(size, align, socket, ptr); return ptr; + } /* either requested socket id doesn't match, alignment is off * or we have no room to expand, @@ -155,6 +196,7 @@ rte_realloc_socket(void *ptr, size_t size, unsigned int align, int socket) rte_memcpy(new_ptr, ptr, old_size < size ? old_size : size); rte_free(ptr); + rte_trace_lib_eal_mem_realloc(size, align, socket, new_ptr); return new_ptr; } diff --git a/lib/librte_eal/include/rte_trace_eal.h b/lib/librte_eal/include/rte_trace_eal.h index d1be9100e..bd236ad65 100644 --- a/lib/librte_eal/include/rte_trace_eal.h +++ b/lib/librte_eal/include/rte_trace_eal.h @@ -136,6 +136,45 @@ RTE_TRACE_POINT( rte_trace_point_emit_int(count); ) +/* Memory */ +RTE_TRACE_POINT( + rte_trace_lib_eal_mem_zmalloc, + RTE_TRACE_POINT_ARGS(const char *type, size_t size, unsigned int align, + int socket, void *ptr), + rte_trace_point_emit_string(type); + rte_trace_point_emit_long(size); + rte_trace_point_emit_u32(align); + rte_trace_point_emit_int(socket); + rte_trace_point_emit_ptr(ptr); +) + +RTE_TRACE_POINT( + rte_trace_lib_eal_mem_malloc, + RTE_TRACE_POINT_ARGS(const char *type, size_t size, unsigned int align, + int socket, void *ptr), + rte_trace_point_emit_string(type); + rte_trace_point_emit_long(size); + rte_trace_point_emit_u32(align); + rte_trace_point_emit_int(socket); + rte_trace_point_emit_ptr(ptr); +) + +RTE_TRACE_POINT( + rte_trace_lib_eal_mem_realloc, + RTE_TRACE_POINT_ARGS(size_t size, unsigned int align, + int socket, void *ptr), + rte_trace_point_emit_long(size); + rte_trace_point_emit_u32(align); + rte_trace_point_emit_int(socket); + rte_trace_point_emit_ptr(ptr); +) + +RTE_TRACE_POINT( + rte_trace_lib_eal_mem_free, + RTE_TRACE_POINT_ARGS(void *ptr), + rte_trace_point_emit_ptr(ptr); +) + #ifdef __cplusplus } #endif diff --git a/lib/librte_eal/rte_eal_version.map b/lib/librte_eal/rte_eal_version.map index 4cba9a55d..909a8ba56 100644 --- a/lib/librte_eal/rte_eal_version.map +++ b/lib/librte_eal/rte_eal_version.map @@ -375,4 +375,8 @@ EXPERIMENTAL { __rte_trace_lib_eal_generic_u64; __rte_trace_lib_eal_generic_u8; __rte_trace_lib_eal_generic_void; + __rte_trace_lib_eal_mem_free; + __rte_trace_lib_eal_mem_malloc; + __rte_trace_lib_eal_mem_realloc; + __rte_trace_lib_eal_mem_zmalloc; }; From patchwork Sun Apr 19 10:01:20 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: 68890 X-Patchwork-Delegate: david.marchand@redhat.com 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 2886AA0561; Sun, 19 Apr 2020 12:07:34 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 1C1AA1D617; Sun, 19 Apr 2020 12:03:16 +0200 (CEST) Received: from mx0b-0016f401.pphosted.com (mx0b-0016f401.pphosted.com [67.231.156.173]) by dpdk.org (Postfix) with ESMTP id A0C421D60D for ; Sun, 19 Apr 2020 12:03:01 +0200 (CEST) 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 03JA0tus020047; Sun, 19 Apr 2020 03:02:52 -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=a+2j7jJbQqrCmFlxIfYdhZfVf3BUJZlmj57eQLS7/cI=; b=nKv1Lns1Esc4EQQz4RCtzqvDS6MY6bJd+zNAcf6XocOdhXlknCVLrGAwWJnQ0oBcZmmS HZnmzlEf6PUQzt3iOjF7+ywVC/zOt6XGax24nBjClOTA9yvQCHkFegIkKmsqnjHDeApl JFPTJ1BCZJLPNK47VNubyIQvZLT/QW7SV/or6nYDWDGE7YPQi06RzX1osoUPpLTH6tFp OD7wXR3YTFb/a0+1jCtsy6Rd674yHD7S9DGTX7YoUtJQVE6xPkUuzgyI9RvTBNTzIzXj 9HRo+gLP+ad/kOm79cScBHswFd9ReMA2Oi3Dw7QWQBomzWKBVWiFc5qFdbN19VpbdzYE fA== Received: from sc-exch04.marvell.com ([199.233.58.184]) by mx0b-0016f401.pphosted.com with ESMTP id 30g12njxd5-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT); Sun, 19 Apr 2020 03:02:52 -0700 Received: from DC5-EXCH02.marvell.com (10.69.176.39) by SC-EXCH04.marvell.com (10.93.176.84) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Sun, 19 Apr 2020 03:02:49 -0700 Received: from maili.marvell.com (10.69.176.80) by DC5-EXCH02.marvell.com (10.69.176.39) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Sun, 19 Apr 2020 03:02:50 -0700 Received: from jerin-lab.marvell.com (jerin-lab.marvell.com [10.28.34.14]) by maili.marvell.com (Postfix) with ESMTP id E8A463F703F; Sun, 19 Apr 2020 03:02:47 -0700 (PDT) From: To: Anatoly Burakov , Jerin Jacob , Sunil Kumar Kori CC: , , , , Date: Sun, 19 Apr 2020 15:31:20 +0530 Message-ID: <20200419100133.3232316-21-jerinj@marvell.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200419100133.3232316-1-jerinj@marvell.com> References: <20200413150116.734047-1-jerinj@marvell.com> <20200419100133.3232316-1-jerinj@marvell.com> MIME-Version: 1.0 X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:6.0.138, 18.0.676 definitions=2020-04-19_02:2020-04-17, 2020-04-19 signatures=0 Subject: [dpdk-dev] [PATCH v6 20/33] eal/trace: add memzone tracepoints 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 Add the following memzone related tracepoints. - rte_trace_lib_eal_memzone_reserve() - rte_trace_lib_eal_memzone_lookup() - rte_trace_lib_eal_memzone_free() Signed-off-by: Jerin Jacob --- lib/librte_eal/common/eal_common_memzone.c | 9 ++++++ .../common/eal_common_trace_points.c | 10 ++++++ lib/librte_eal/include/rte_trace_eal.h | 31 +++++++++++++++++++ lib/librte_eal/rte_eal_version.map | 3 ++ 4 files changed, 53 insertions(+) diff --git a/lib/librte_eal/common/eal_common_memzone.c b/lib/librte_eal/common/eal_common_memzone.c index 86f61369b..0f6556714 100644 --- a/lib/librte_eal/common/eal_common_memzone.c +++ b/lib/librte_eal/common/eal_common_memzone.c @@ -19,6 +19,7 @@ #include #include #include +#include #include "malloc_heap.h" #include "malloc_elem.h" @@ -201,6 +202,9 @@ rte_memzone_reserve_thread_safe(const char *name, size_t len, int socket_id, mz = memzone_reserve_aligned_thread_unsafe( name, len, socket_id, flags, align, bound); + rte_trace_lib_eal_memzone_reserve(name, len, socket_id, flags, align, + bound, mz); + rte_rwlock_write_unlock(&mcfg->mlock); return mz; @@ -246,6 +250,7 @@ rte_memzone_reserve(const char *name, size_t len, int socket_id, int rte_memzone_free(const struct rte_memzone *mz) { + char name[RTE_MEMZONE_NAMESIZE]; struct rte_mem_config *mcfg; struct rte_fbarray *arr; struct rte_memzone *found_mz; @@ -256,6 +261,7 @@ rte_memzone_free(const struct rte_memzone *mz) if (mz == NULL) return -EINVAL; + rte_strlcpy(name, mz->name, RTE_MEMZONE_NAMESIZE); mcfg = rte_eal_get_configuration()->mem_config; arr = &mcfg->memzones; @@ -280,6 +286,8 @@ rte_memzone_free(const struct rte_memzone *mz) if (addr != NULL) rte_free(addr); + rte_trace_lib_eal_memzone_free(name, addr, ret); + return ret; } @@ -300,6 +308,7 @@ rte_memzone_lookup(const char *name) rte_rwlock_read_unlock(&mcfg->mlock); + rte_trace_lib_eal_memzone_lookup(name, memzone); return memzone; } diff --git a/lib/librte_eal/common/eal_common_trace_points.c b/lib/librte_eal/common/eal_common_trace_points.c index 5a8444f07..a3c9bc01b 100644 --- a/lib/librte_eal/common/eal_common_trace_points.c +++ b/lib/librte_eal/common/eal_common_trace_points.c @@ -31,6 +31,10 @@ RTE_TRACE_POINT_DEFINE(rte_trace_lib_eal_mem_malloc); RTE_TRACE_POINT_DEFINE(rte_trace_lib_eal_mem_realloc); RTE_TRACE_POINT_DEFINE(rte_trace_lib_eal_mem_free); +RTE_TRACE_POINT_DEFINE(rte_trace_lib_eal_memzone_reserve); +RTE_TRACE_POINT_DEFINE(rte_trace_lib_eal_memzone_lookup); +RTE_TRACE_POINT_DEFINE(rte_trace_lib_eal_memzone_free); + RTE_INIT(eal_trace_init) { RTE_TRACE_POINT_REGISTER(rte_trace_lib_eal_generic_void, @@ -80,4 +84,10 @@ RTE_INIT(eal_trace_init) RTE_TRACE_POINT_REGISTER(rte_trace_lib_eal_mem_free, lib.eal.mem.free); + RTE_TRACE_POINT_REGISTER(rte_trace_lib_eal_memzone_reserve, + lib.eal.memzone.reserve); + RTE_TRACE_POINT_REGISTER(rte_trace_lib_eal_memzone_lookup, + lib.eal.memzone.lookup); + RTE_TRACE_POINT_REGISTER(rte_trace_lib_eal_memzone_free, + lib.eal.memzone.free); } diff --git a/lib/librte_eal/include/rte_trace_eal.h b/lib/librte_eal/include/rte_trace_eal.h index bd236ad65..d13b434ca 100644 --- a/lib/librte_eal/include/rte_trace_eal.h +++ b/lib/librte_eal/include/rte_trace_eal.h @@ -175,6 +175,37 @@ RTE_TRACE_POINT( rte_trace_point_emit_ptr(ptr); ) +/* Memzone */ +RTE_TRACE_POINT( + rte_trace_lib_eal_memzone_reserve, + RTE_TRACE_POINT_ARGS(const char *name, size_t len, int socket_id, + unsigned int flags, unsigned int align, + unsigned int bound, const void *mz), + rte_trace_point_emit_string(name); + rte_trace_point_emit_long(len); + rte_trace_point_emit_int(socket_id); + rte_trace_point_emit_u32(flags); + rte_trace_point_emit_u32(align); + rte_trace_point_emit_u32(bound); + rte_trace_point_emit_ptr(mz); +) + +RTE_TRACE_POINT( + rte_trace_lib_eal_memzone_lookup, + RTE_TRACE_POINT_ARGS(const char *name, const void *memzone), + rte_trace_point_emit_string(name); + rte_trace_point_emit_ptr(memzone); +) + +RTE_TRACE_POINT( + rte_trace_lib_eal_memzone_free, + RTE_TRACE_POINT_ARGS(const char *name, void *addr, int rc), + rte_trace_point_emit_string(name); + rte_trace_point_emit_ptr(addr); + rte_trace_point_emit_int(rc); +) + + #ifdef __cplusplus } #endif diff --git a/lib/librte_eal/rte_eal_version.map b/lib/librte_eal/rte_eal_version.map index 909a8ba56..22455c7c0 100644 --- a/lib/librte_eal/rte_eal_version.map +++ b/lib/librte_eal/rte_eal_version.map @@ -379,4 +379,7 @@ EXPERIMENTAL { __rte_trace_lib_eal_mem_malloc; __rte_trace_lib_eal_mem_realloc; __rte_trace_lib_eal_mem_zmalloc; + __rte_trace_lib_eal_memzone_free; + __rte_trace_lib_eal_memzone_lookup; + __rte_trace_lib_eal_memzone_reserve; }; From patchwork Sun Apr 19 10:01: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: 68892 X-Patchwork-Delegate: david.marchand@redhat.com 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 B5399A0561; Sun, 19 Apr 2020 12:08:01 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 724A31D632; Sun, 19 Apr 2020 12:03:22 +0200 (CEST) Received: from mx0b-0016f401.pphosted.com (mx0b-0016f401.pphosted.com [67.231.156.173]) by dpdk.org (Postfix) with ESMTP id 7058F1D623 for ; Sun, 19 Apr 2020 12:03:14 +0200 (CEST) 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 03JA18BI020144; Sun, 19 Apr 2020 03:02:56 -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=rwv0kf6g7Oi2Sn57UWV2W3gphfiF7neD0S7TgxC6pB0=; b=fQSPsTRfZzKEVgmQQXZT1AVM5POIBsAQVrH6EcmS/6H9cfdKPe+nixO4b0c/0Cz+O4Rp q4QQL74ZmQU+z2EHPIwLmEWzOp94RvPGscP4AbokQw6eyGnMBpEq7XqZru9gTwZ7/QCX MxShfrWQr8qoU889qw7pGZ1W/+wuIfLXSKbD60ockkkb/Rr7hnbhwu6Gs2dou+PVi+nX 8IjoUZ+JRGnz9lgILK/uE67Jbf1lAv6IY6XMmr+QtRM31e6PRpSsjFakoneBTFj/TXJY +OO7c4cCDJP22HkbYw3yn+zL2FfFy96fdVU36pGAgywIk3gUlLGrS9xHwDzA4RLVmgOv CQ== Received: from sc-exch03.marvell.com ([199.233.58.183]) by mx0b-0016f401.pphosted.com with ESMTP id 30g12njxdh-2 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT); Sun, 19 Apr 2020 03:02:56 -0700 Received: from DC5-EXCH01.marvell.com (10.69.176.38) by SC-EXCH03.marvell.com (10.93.176.83) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Sun, 19 Apr 2020 03:02:54 -0700 Received: from DC5-EXCH02.marvell.com (10.69.176.39) by DC5-EXCH01.marvell.com (10.69.176.38) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Sun, 19 Apr 2020 03:02:54 -0700 Received: from maili.marvell.com (10.69.176.80) by DC5-EXCH02.marvell.com (10.69.176.39) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Sun, 19 Apr 2020 03:02:53 -0700 Received: from jerin-lab.marvell.com (jerin-lab.marvell.com [10.28.34.14]) by maili.marvell.com (Postfix) with ESMTP id BB6763F703F; Sun, 19 Apr 2020 03:02:51 -0700 (PDT) From: To: Jerin Jacob , Sunil Kumar Kori , Bruce Richardson CC: , , , Date: Sun, 19 Apr 2020 15:31:21 +0530 Message-ID: <20200419100133.3232316-22-jerinj@marvell.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200419100133.3232316-1-jerinj@marvell.com> References: <20200413150116.734047-1-jerinj@marvell.com> <20200419100133.3232316-1-jerinj@marvell.com> MIME-Version: 1.0 X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:6.0.138, 18.0.676 definitions=2020-04-19_02:2020-04-17, 2020-04-19 signatures=0 Subject: [dpdk-dev] [PATCH v6 21/33] eal/trace: add thread tracepoints 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 Add the following thread related tracepoints. - rte_trace_lib_eal_thread_remote_launch() - rte_trace_lib_eal_thread_lcore_ready() Signed-off-by: Jerin Jacob --- lib/librte_eal/common/eal_common_trace_points.c | 8 ++++++++ lib/librte_eal/freebsd/eal_interrupts.c | 2 +- lib/librte_eal/freebsd/eal_thread.c | 12 ++++++++---- lib/librte_eal/include/rte_trace_eal.h | 17 +++++++++++++++++ lib/librte_eal/linux/eal_thread.c | 12 ++++++++---- lib/librte_eal/rte_eal_version.map | 2 ++ 6 files changed, 44 insertions(+), 9 deletions(-) diff --git a/lib/librte_eal/common/eal_common_trace_points.c b/lib/librte_eal/common/eal_common_trace_points.c index a3c9bc01b..9cecd8206 100644 --- a/lib/librte_eal/common/eal_common_trace_points.c +++ b/lib/librte_eal/common/eal_common_trace_points.c @@ -35,6 +35,9 @@ RTE_TRACE_POINT_DEFINE(rte_trace_lib_eal_memzone_reserve); RTE_TRACE_POINT_DEFINE(rte_trace_lib_eal_memzone_lookup); RTE_TRACE_POINT_DEFINE(rte_trace_lib_eal_memzone_free); +RTE_TRACE_POINT_DEFINE(rte_trace_lib_eal_thread_remote_launch); +RTE_TRACE_POINT_DEFINE(rte_trace_lib_eal_thread_lcore_ready); + RTE_INIT(eal_trace_init) { RTE_TRACE_POINT_REGISTER(rte_trace_lib_eal_generic_void, @@ -90,4 +93,9 @@ RTE_INIT(eal_trace_init) lib.eal.memzone.lookup); RTE_TRACE_POINT_REGISTER(rte_trace_lib_eal_memzone_free, lib.eal.memzone.free); + + RTE_TRACE_POINT_REGISTER(rte_trace_lib_eal_thread_remote_launch, + lib.eal.thread.remote.launch); + RTE_TRACE_POINT_REGISTER(rte_trace_lib_eal_thread_lcore_ready, + lib.eal.thread.lcore.ready); } diff --git a/lib/librte_eal/freebsd/eal_interrupts.c b/lib/librte_eal/freebsd/eal_interrupts.c index 00991f26a..7def3189b 100644 --- a/lib/librte_eal/freebsd/eal_interrupts.c +++ b/lib/librte_eal/freebsd/eal_interrupts.c @@ -85,7 +85,7 @@ rte_intr_callback_register(const struct rte_intr_handle *intr_handle, { struct rte_intr_callback *callback; struct rte_intr_source *src; - int ret, add_event = 0; + int ret = 0, add_event = 0; /* first do parameter checking */ if (intr_handle == NULL || intr_handle->fd < 0 || cb == NULL) { diff --git a/lib/librte_eal/freebsd/eal_thread.c b/lib/librte_eal/freebsd/eal_thread.c index c25b4a019..d6d0e3af2 100644 --- a/lib/librte_eal/freebsd/eal_thread.c +++ b/lib/librte_eal/freebsd/eal_thread.c @@ -20,8 +20,7 @@ #include #include #include -#include -#include +#include #include "eal_private.h" #include "eal_thread.h" @@ -42,9 +41,10 @@ rte_eal_remote_launch(int (*f)(void *), void *arg, unsigned slave_id) char c = 0; int m2s = lcore_config[slave_id].pipe_master2slave[1]; int s2m = lcore_config[slave_id].pipe_slave2master[0]; + int rc = -EBUSY; if (lcore_config[slave_id].state != WAIT) - return -EBUSY; + goto finish; lcore_config[slave_id].f = f; lcore_config[slave_id].arg = arg; @@ -64,7 +64,10 @@ rte_eal_remote_launch(int (*f)(void *), void *arg, unsigned slave_id) if (n <= 0) rte_panic("cannot read on configuration pipe\n"); - return 0; + rc = 0; +finish: + rte_trace_lib_eal_thread_remote_launch(f, arg, slave_id, rc); + return rc; } /* set affinity for current thread */ @@ -127,6 +130,7 @@ eal_thread_loop(__rte_unused void *arg) lcore_id, thread_id, cpuset, ret == 0 ? "" : "..."); __rte_trace_mem_per_thread_alloc(); + rte_trace_lib_eal_thread_lcore_ready(lcore_id, cpuset); /* read on our pipe to get commands */ while (1) { diff --git a/lib/librte_eal/include/rte_trace_eal.h b/lib/librte_eal/include/rte_trace_eal.h index d13b434ca..da805e804 100644 --- a/lib/librte_eal/include/rte_trace_eal.h +++ b/lib/librte_eal/include/rte_trace_eal.h @@ -205,6 +205,23 @@ RTE_TRACE_POINT( rte_trace_point_emit_int(rc); ) +/* Thread */ +RTE_TRACE_POINT( + rte_trace_lib_eal_thread_remote_launch, + RTE_TRACE_POINT_ARGS(int (*f)(void *), void *arg, + unsigned int slave_id, int rc), + rte_trace_point_emit_ptr(f); + rte_trace_point_emit_ptr(arg); + rte_trace_point_emit_u32(slave_id); + rte_trace_point_emit_int(rc); +) +RTE_TRACE_POINT( + rte_trace_lib_eal_thread_lcore_ready, + RTE_TRACE_POINT_ARGS(unsigned int lcore_id, const char *cpuset), + rte_trace_point_emit_u32(lcore_id); + rte_trace_point_emit_string(cpuset); +) + #ifdef __cplusplus } diff --git a/lib/librte_eal/linux/eal_thread.c b/lib/librte_eal/linux/eal_thread.c index 24772fc3d..c2940bc4a 100644 --- a/lib/librte_eal/linux/eal_thread.c +++ b/lib/librte_eal/linux/eal_thread.c @@ -20,8 +20,7 @@ #include #include #include -#include -#include +#include #include "eal_private.h" #include "eal_thread.h" @@ -42,9 +41,10 @@ rte_eal_remote_launch(int (*f)(void *), void *arg, unsigned slave_id) char c = 0; int m2s = lcore_config[slave_id].pipe_master2slave[1]; int s2m = lcore_config[slave_id].pipe_slave2master[0]; + int rc = -EBUSY; if (lcore_config[slave_id].state != WAIT) - return -EBUSY; + goto finish; lcore_config[slave_id].f = f; lcore_config[slave_id].arg = arg; @@ -64,7 +64,10 @@ rte_eal_remote_launch(int (*f)(void *), void *arg, unsigned slave_id) if (n <= 0) rte_panic("cannot read on configuration pipe\n"); - return 0; + rc = 0; +finish: + rte_trace_lib_eal_thread_remote_launch(f, arg, slave_id, rc); + return rc; } /* set affinity for current EAL thread */ @@ -127,6 +130,7 @@ eal_thread_loop(__rte_unused void *arg) lcore_id, (uintptr_t)thread_id, cpuset, ret == 0 ? "" : "..."); __rte_trace_mem_per_thread_alloc(); + rte_trace_lib_eal_thread_lcore_ready(lcore_id, cpuset); /* read on our pipe to get commands */ while (1) { diff --git a/lib/librte_eal/rte_eal_version.map b/lib/librte_eal/rte_eal_version.map index 22455c7c0..83fb686f4 100644 --- a/lib/librte_eal/rte_eal_version.map +++ b/lib/librte_eal/rte_eal_version.map @@ -382,4 +382,6 @@ EXPERIMENTAL { __rte_trace_lib_eal_memzone_free; __rte_trace_lib_eal_memzone_lookup; __rte_trace_lib_eal_memzone_reserve; + __rte_trace_lib_eal_thread_lcore_ready; + __rte_trace_lib_eal_thread_remote_launch; }; From patchwork Sun Apr 19 10:01:22 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: 68896 X-Patchwork-Delegate: david.marchand@redhat.com 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 145C8A0561; Sun, 19 Apr 2020 12:09:16 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 4DE4E1D656; Sun, 19 Apr 2020 12:03:37 +0200 (CEST) Received: from mx0b-0016f401.pphosted.com (mx0b-0016f401.pphosted.com [67.231.156.173]) by dpdk.org (Postfix) with ESMTP id 49B751D604 for ; Sun, 19 Apr 2020 12:03:00 +0200 (CEST) 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 03JA0tut020047; Sun, 19 Apr 2020 03:02:59 -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=De30aXBmVrzCc3CTrko04p6rj/pMscXVvvS/viVQsxA=; b=IQSbGxl9uhgppO4YuSf/rIfvgAWs4pckM3DJkIxXThYBqxPqi5eDUAMFg8SBftDkIeup 01/5WE7XJAUylCmeno5EBPPh4YqT5ZXqNvMm6QT27sP/pef9Fd2goO0YFekmq4itUKOb h4JOL5d6Ig2OVlWU2BXYPEYWhAUcq+dqaoZFmMFXx69dCauy2wglO6hI+D1EDT4gl7bE BgV11dcJon9N0EjZa85kUYQdbByFzD5JBlmH5JilSC97NrUaljJbueA0dbRQkeh446bv QT3PI+lCB6qFxg2tHO3EuIs34kXHy1zzGkcb81pmnEcKyFbyRuk1O9QWWV+cfM0IQVaZ mg== Received: from sc-exch01.marvell.com ([199.233.58.181]) by mx0b-0016f401.pphosted.com with ESMTP id 30g12njxdw-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT); Sun, 19 Apr 2020 03:02:59 -0700 Received: from DC5-EXCH02.marvell.com (10.69.176.39) by SC-EXCH01.marvell.com (10.93.176.81) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Sun, 19 Apr 2020 03:02:57 -0700 Received: from maili.marvell.com (10.69.176.80) by DC5-EXCH02.marvell.com (10.69.176.39) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Sun, 19 Apr 2020 03:02:57 -0700 Received: from jerin-lab.marvell.com (jerin-lab.marvell.com [10.28.34.14]) by maili.marvell.com (Postfix) with ESMTP id 317533F703F; Sun, 19 Apr 2020 03:02:54 -0700 (PDT) From: To: Jerin Jacob , Sunil Kumar Kori , Bruce Richardson CC: , , , Date: Sun, 19 Apr 2020 15:31:22 +0530 Message-ID: <20200419100133.3232316-23-jerinj@marvell.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200419100133.3232316-1-jerinj@marvell.com> References: <20200413150116.734047-1-jerinj@marvell.com> <20200419100133.3232316-1-jerinj@marvell.com> MIME-Version: 1.0 X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:6.0.138, 18.0.676 definitions=2020-04-19_02:2020-04-17, 2020-04-19 signatures=0 Subject: [dpdk-dev] [PATCH v6 22/33] eal/trace: add interrupt tracepoints 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 Add the following interrupt related tracepoints. - rte_trace_lib_eal_intr_callback_register() - rte_trace_lib_eal_intr_callback_unregister() - rte_trace_lib_eal_intr_enable() - rte_trace_lib_eal_intr_disable() Signed-off-by: Jerin Jacob --- .../common/eal_common_trace_points.c | 14 ++++ lib/librte_eal/freebsd/eal_interrupts.c | 52 ++++++++---- lib/librte_eal/include/rte_trace_eal.h | 48 +++++++++++ lib/librte_eal/linux/eal_interrupts.c | 84 ++++++++++++------- lib/librte_eal/rte_eal_version.map | 4 + 5 files changed, 154 insertions(+), 48 deletions(-) diff --git a/lib/librte_eal/common/eal_common_trace_points.c b/lib/librte_eal/common/eal_common_trace_points.c index 9cecd8206..4c1dd699b 100644 --- a/lib/librte_eal/common/eal_common_trace_points.c +++ b/lib/librte_eal/common/eal_common_trace_points.c @@ -38,6 +38,11 @@ RTE_TRACE_POINT_DEFINE(rte_trace_lib_eal_memzone_free); RTE_TRACE_POINT_DEFINE(rte_trace_lib_eal_thread_remote_launch); RTE_TRACE_POINT_DEFINE(rte_trace_lib_eal_thread_lcore_ready); +RTE_TRACE_POINT_DEFINE(rte_trace_lib_eal_intr_callback_register); +RTE_TRACE_POINT_DEFINE(rte_trace_lib_eal_intr_callback_unregister); +RTE_TRACE_POINT_DEFINE(rte_trace_lib_eal_intr_enable); +RTE_TRACE_POINT_DEFINE(rte_trace_lib_eal_intr_disable); + RTE_INIT(eal_trace_init) { RTE_TRACE_POINT_REGISTER(rte_trace_lib_eal_generic_void, @@ -98,4 +103,13 @@ RTE_INIT(eal_trace_init) lib.eal.thread.remote.launch); RTE_TRACE_POINT_REGISTER(rte_trace_lib_eal_thread_lcore_ready, lib.eal.thread.lcore.ready); + + RTE_TRACE_POINT_REGISTER(rte_trace_lib_eal_intr_callback_register, + lib.eal.intr.register); + RTE_TRACE_POINT_REGISTER(rte_trace_lib_eal_intr_callback_unregister, + lib.eal.intr.unregister); + RTE_TRACE_POINT_REGISTER(rte_trace_lib_eal_intr_enable, + lib.eal.intr.enable); + RTE_TRACE_POINT_REGISTER(rte_trace_lib_eal_intr_disable, + lib.eal.intr.disable); } diff --git a/lib/librte_eal/freebsd/eal_interrupts.c b/lib/librte_eal/freebsd/eal_interrupts.c index 7def3189b..71f3189ff 100644 --- a/lib/librte_eal/freebsd/eal_interrupts.c +++ b/lib/librte_eal/freebsd/eal_interrupts.c @@ -13,6 +13,7 @@ #include #include #include +#include #include "eal_private.h" #include "eal_alarm_private.h" @@ -182,6 +183,7 @@ rte_intr_callback_register(const struct rte_intr_handle *intr_handle, goto fail; } } + rte_trace_lib_eal_intr_callback_register(intr_handle, cb, cb_arg, ret); rte_spinlock_unlock(&intr_lock); return 0; @@ -196,6 +198,7 @@ rte_intr_callback_register(const struct rte_intr_handle *intr_handle, } } free(callback); + rte_trace_lib_eal_intr_callback_register(intr_handle, cb, cb_arg, ret); rte_spinlock_unlock(&intr_lock); return ret; } @@ -335,6 +338,8 @@ rte_intr_callback_unregister(const struct rte_intr_handle *intr_handle, } } out: + rte_trace_lib_eal_intr_callback_unregister(intr_handle, cb_fn, + cb_arg, ret); rte_spinlock_unlock(&intr_lock); return ret; @@ -343,55 +348,68 @@ rte_intr_callback_unregister(const struct rte_intr_handle *intr_handle, int rte_intr_enable(const struct rte_intr_handle *intr_handle) { - if (intr_handle && intr_handle->type == RTE_INTR_HANDLE_VDEV) - return 0; + int rc = 0; - if (!intr_handle || intr_handle->fd < 0 || intr_handle->uio_cfg_fd < 0) - return -1; + if (intr_handle && intr_handle->type == RTE_INTR_HANDLE_VDEV) { + rc = 0; goto out; + } + + if (!intr_handle || intr_handle->fd < 0 || + intr_handle->uio_cfg_fd < 0) { + rc = -1; goto out; + } switch (intr_handle->type) { /* not used at this moment */ case RTE_INTR_HANDLE_ALARM: - return -1; + rc = -1; break; /* not used at this moment */ case RTE_INTR_HANDLE_DEV_EVENT: - return -1; + rc = -1; break; /* unknown handle type */ default: RTE_LOG(ERR, EAL, "Unknown handle type of fd %d\n", intr_handle->fd); - return -1; + rc = -1; break; } - return 0; +out: + rte_trace_lib_eal_intr_enable(intr_handle, rc); + return rc; } int rte_intr_disable(const struct rte_intr_handle *intr_handle) { - if (intr_handle && intr_handle->type == RTE_INTR_HANDLE_VDEV) - return 0; + int rc = 0; - if (!intr_handle || intr_handle->fd < 0 || intr_handle->uio_cfg_fd < 0) - return -1; + if (intr_handle && intr_handle->type == RTE_INTR_HANDLE_VDEV) { + rc = 0; goto out; + } + + if (!intr_handle || intr_handle->fd < 0 || + intr_handle->uio_cfg_fd < 0) { + rc = -1; goto out; + } switch (intr_handle->type) { /* not used at this moment */ case RTE_INTR_HANDLE_ALARM: - return -1; + rc = -1; break; /* not used at this moment */ case RTE_INTR_HANDLE_DEV_EVENT: - return -1; + rc = -1; break; /* unknown handle type */ default: RTE_LOG(ERR, EAL, "Unknown handle type of fd %d\n", intr_handle->fd); - return -1; + rc = -1; break; } - - return 0; +out: + rte_trace_lib_eal_intr_disable(intr_handle, rc); + return rc; } int diff --git a/lib/librte_eal/include/rte_trace_eal.h b/lib/librte_eal/include/rte_trace_eal.h index da805e804..acf8d154d 100644 --- a/lib/librte_eal/include/rte_trace_eal.h +++ b/lib/librte_eal/include/rte_trace_eal.h @@ -16,6 +16,7 @@ extern "C" { #endif #include +#include #include /* Generic */ @@ -222,6 +223,53 @@ RTE_TRACE_POINT( rte_trace_point_emit_string(cpuset); ) +/* Interrupt */ +RTE_TRACE_POINT( + rte_trace_lib_eal_intr_callback_register, + RTE_TRACE_POINT_ARGS(const struct rte_intr_handle *handle, + rte_intr_callback_fn cb, void *cb_arg, int rc), + rte_trace_point_emit_int(rc); + rte_trace_point_emit_int(handle->vfio_dev_fd); + rte_trace_point_emit_int(handle->fd); + rte_trace_point_emit_int(handle->type); + rte_trace_point_emit_u32(handle->max_intr); + rte_trace_point_emit_u32(handle->nb_efd); + rte_trace_point_emit_ptr(cb); + rte_trace_point_emit_ptr(cb_arg); +) +RTE_TRACE_POINT( + rte_trace_lib_eal_intr_callback_unregister, + RTE_TRACE_POINT_ARGS(const struct rte_intr_handle *handle, + rte_intr_callback_fn cb, void *cb_arg, int rc), + rte_trace_point_emit_int(rc); + rte_trace_point_emit_int(handle->vfio_dev_fd); + rte_trace_point_emit_int(handle->fd); + rte_trace_point_emit_int(handle->type); + rte_trace_point_emit_u32(handle->max_intr); + rte_trace_point_emit_u32(handle->nb_efd); + rte_trace_point_emit_ptr(cb); + rte_trace_point_emit_ptr(cb_arg); +) +RTE_TRACE_POINT( + rte_trace_lib_eal_intr_enable, + RTE_TRACE_POINT_ARGS(const struct rte_intr_handle *handle, int rc), + rte_trace_point_emit_int(rc); + rte_trace_point_emit_int(handle->vfio_dev_fd); + rte_trace_point_emit_int(handle->fd); + rte_trace_point_emit_int(handle->type); + rte_trace_point_emit_u32(handle->max_intr); + rte_trace_point_emit_u32(handle->nb_efd); +) +RTE_TRACE_POINT( + rte_trace_lib_eal_intr_disable, + RTE_TRACE_POINT_ARGS(const struct rte_intr_handle *handle, int rc), + rte_trace_point_emit_int(rc); + rte_trace_point_emit_int(handle->vfio_dev_fd); + rte_trace_point_emit_int(handle->fd); + rte_trace_point_emit_int(handle->type); + rte_trace_point_emit_u32(handle->max_intr); + rte_trace_point_emit_u32(handle->nb_efd); +) #ifdef __cplusplus } diff --git a/lib/librte_eal/linux/eal_interrupts.c b/lib/librte_eal/linux/eal_interrupts.c index 3893e4065..e5a4fc2fd 100644 --- a/lib/librte_eal/linux/eal_interrupts.c +++ b/lib/librte_eal/linux/eal_interrupts.c @@ -34,6 +34,7 @@ #include #include #include +#include #include "eal_private.h" #include "eal_vfio.h" @@ -539,8 +540,9 @@ rte_intr_callback_register(const struct rte_intr_handle *intr_handle, */ if (wake_thread) if (write(intr_pipe.writefd, "1", 1) < 0) - return -EPIPE; + ret = -EPIPE; + rte_trace_lib_eal_intr_callback_register(intr_handle, cb, cb_arg, ret); return ret; } @@ -656,63 +658,74 @@ rte_intr_callback_unregister(const struct rte_intr_handle *intr_handle, ret = -EPIPE; } + rte_trace_lib_eal_intr_callback_unregister(intr_handle, cb_fn, + cb_arg, ret); return ret; } int rte_intr_enable(const struct rte_intr_handle *intr_handle) { - if (intr_handle && intr_handle->type == RTE_INTR_HANDLE_VDEV) - return 0; + int rc = 0; - if (!intr_handle || intr_handle->fd < 0 || intr_handle->uio_cfg_fd < 0) - return -1; + if (intr_handle && intr_handle->type == RTE_INTR_HANDLE_VDEV) { + rc = 0; goto out; + } + + if (!intr_handle || intr_handle->fd < 0 || + intr_handle->uio_cfg_fd < 0) { + rc = -1; goto out; + } switch (intr_handle->type){ /* write to the uio fd to enable the interrupt */ case RTE_INTR_HANDLE_UIO: if (uio_intr_enable(intr_handle)) - return -1; + rc = -1; break; case RTE_INTR_HANDLE_UIO_INTX: if (uio_intx_intr_enable(intr_handle)) - return -1; + rc = -1; break; /* not used at this moment */ case RTE_INTR_HANDLE_ALARM: - return -1; + rc = -1; + break; #ifdef VFIO_PRESENT case RTE_INTR_HANDLE_VFIO_MSIX: if (vfio_enable_msix(intr_handle)) - return -1; + rc = -1; break; case RTE_INTR_HANDLE_VFIO_MSI: if (vfio_enable_msi(intr_handle)) - return -1; + rc = -1; break; case RTE_INTR_HANDLE_VFIO_LEGACY: if (vfio_enable_intx(intr_handle)) - return -1; + rc = -1; break; #ifdef HAVE_VFIO_DEV_REQ_INTERFACE case RTE_INTR_HANDLE_VFIO_REQ: if (vfio_enable_req(intr_handle)) - return -1; + rc = -1; break; #endif #endif /* not used at this moment */ case RTE_INTR_HANDLE_DEV_EVENT: - return -1; + rc = -1; + break; /* unknown handle type */ default: RTE_LOG(ERR, EAL, "Unknown handle type of fd %d\n", intr_handle->fd); - return -1; + rc = -1; + break; } - - return 0; +out: + rte_trace_lib_eal_intr_enable(intr_handle, rc); + return rc; } /** @@ -778,57 +791,66 @@ rte_intr_ack(const struct rte_intr_handle *intr_handle) int rte_intr_disable(const struct rte_intr_handle *intr_handle) { - if (intr_handle && intr_handle->type == RTE_INTR_HANDLE_VDEV) - return 0; + int rc = 0; - if (!intr_handle || intr_handle->fd < 0 || intr_handle->uio_cfg_fd < 0) - return -1; + if (intr_handle && intr_handle->type == RTE_INTR_HANDLE_VDEV) { + rc = 0; goto out; + } + + if (!intr_handle || intr_handle->fd < 0 || + intr_handle->uio_cfg_fd < 0) { + rc = -1; goto out; + } switch (intr_handle->type){ /* write to the uio fd to disable the interrupt */ case RTE_INTR_HANDLE_UIO: if (uio_intr_disable(intr_handle)) - return -1; + rc = -1; break; case RTE_INTR_HANDLE_UIO_INTX: if (uio_intx_intr_disable(intr_handle)) - return -1; + rc = -1; break; /* not used at this moment */ case RTE_INTR_HANDLE_ALARM: - return -1; + rc = -1; + break; #ifdef VFIO_PRESENT case RTE_INTR_HANDLE_VFIO_MSIX: if (vfio_disable_msix(intr_handle)) - return -1; + rc = -1; break; case RTE_INTR_HANDLE_VFIO_MSI: if (vfio_disable_msi(intr_handle)) - return -1; + rc = -1; break; case RTE_INTR_HANDLE_VFIO_LEGACY: if (vfio_disable_intx(intr_handle)) - return -1; + rc = -1; break; #ifdef HAVE_VFIO_DEV_REQ_INTERFACE case RTE_INTR_HANDLE_VFIO_REQ: if (vfio_disable_req(intr_handle)) - return -1; + rc = -1; break; #endif #endif /* not used at this moment */ case RTE_INTR_HANDLE_DEV_EVENT: - return -1; + rc = -1; + break; /* unknown handle type */ default: RTE_LOG(ERR, EAL, "Unknown handle type of fd %d\n", intr_handle->fd); - return -1; + rc = -1; + break; } - - return 0; +out: + rte_trace_lib_eal_intr_disable(intr_handle, rc); + return rc; } static int diff --git a/lib/librte_eal/rte_eal_version.map b/lib/librte_eal/rte_eal_version.map index 83fb686f4..9b5ce3ba7 100644 --- a/lib/librte_eal/rte_eal_version.map +++ b/lib/librte_eal/rte_eal_version.map @@ -375,6 +375,10 @@ EXPERIMENTAL { __rte_trace_lib_eal_generic_u64; __rte_trace_lib_eal_generic_u8; __rte_trace_lib_eal_generic_void; + __rte_trace_lib_eal_intr_callback_register; + __rte_trace_lib_eal_intr_callback_unregister; + __rte_trace_lib_eal_intr_enable; + __rte_trace_lib_eal_intr_disable; __rte_trace_lib_eal_mem_free; __rte_trace_lib_eal_mem_malloc; __rte_trace_lib_eal_mem_realloc; From patchwork Sun Apr 19 10:01:23 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: 68895 X-Patchwork-Delegate: david.marchand@redhat.com 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 670B7A0561; Sun, 19 Apr 2020 12:08:50 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id A20F31D642; Sun, 19 Apr 2020 12:03:25 +0200 (CEST) Received: from mx0b-0016f401.pphosted.com (mx0a-0016f401.pphosted.com [67.231.148.174]) by dpdk.org (Postfix) with ESMTP id 10A601D5C1 for ; Sun, 19 Apr 2020 12:03:11 +0200 (CEST) Received: from pps.filterd (m0045849.ppops.net [127.0.0.1]) by mx0a-0016f401.pphosted.com (8.16.0.42/8.16.0.42) with SMTP id 03J9vKX2031330; Sun, 19 Apr 2020 03:03:03 -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=68JBw5WLRJL1r5TqgWwx3E4yM7IeupqyJOOxWOjQsUY=; b=YY9ACzR0IiYTyZhfTb9ROpjSq4f+ChTWNSDWrJ/DOckq4851WRQpboO9KfX9ORqTmtep yzDKC9bKPkE6Nc2LCEdpGng+oc60zd/9FYsis8DJxLEoVjW0r2qlI7SKlo9y4j/qkKmN DhPDxb4NclzG4U19PYOaRNgrZfZJDLPzPtY8oJWx803mDRW6lqh3ROpQNHf3eOxu4gwL gYRJULR7WYcujPZbbcaFVCpxbcOvTinxAwEOL2tgqGGn6lQQLX7qWB0/dcKoa8yEEkLD jP3CHngw5gHDte1v+ltaFDM+ixZe+73b4CmseRgVVVzvhgugi5MHc7Aa7eG3+9FcatUz Lg== Received: from sc-exch03.marvell.com ([199.233.58.183]) by mx0a-0016f401.pphosted.com with ESMTP id 30fxwp3d7f-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT); Sun, 19 Apr 2020 03:03:02 -0700 Received: from DC5-EXCH02.marvell.com (10.69.176.39) by SC-EXCH03.marvell.com (10.93.176.83) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Sun, 19 Apr 2020 03:03:01 -0700 Received: from maili.marvell.com (10.69.176.80) by DC5-EXCH02.marvell.com (10.69.176.39) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Sun, 19 Apr 2020 03:03:01 -0700 Received: from jerin-lab.marvell.com (jerin-lab.marvell.com [10.28.34.14]) by maili.marvell.com (Postfix) with ESMTP id B0AC13F703F; Sun, 19 Apr 2020 03:02:58 -0700 (PDT) From: To: John McNamara , Marko Kovacevic , Jerin Jacob , "Sunil Kumar Kori" CC: , , , , Date: Sun, 19 Apr 2020 15:31:23 +0530 Message-ID: <20200419100133.3232316-24-jerinj@marvell.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200419100133.3232316-1-jerinj@marvell.com> References: <20200413150116.734047-1-jerinj@marvell.com> <20200419100133.3232316-1-jerinj@marvell.com> MIME-Version: 1.0 X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:6.0.138, 18.0.676 definitions=2020-04-19_02:2020-04-17, 2020-04-19 signatures=0 Subject: [dpdk-dev] [PATCH v6 23/33] eal/trace: add trace configuration parameter 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: Sunil Kumar Kori Trace library exposes --trace EAL parameter to enable trace points. Signed-off-by: Sunil Kumar Kori --- doc/guides/linux_gsg/eal_args.include.rst | 16 +++++ lib/librte_eal/common/eal_common_options.c | 16 +++++ lib/librte_eal/common/eal_common_trace.c | 10 ++++ .../common/eal_common_trace_utils.c | 59 +++++++++++++++++++ lib/librte_eal/common/eal_options.h | 2 + lib/librte_eal/common/eal_trace.h | 11 +++- 6 files changed, 113 insertions(+), 1 deletion(-) diff --git a/doc/guides/linux_gsg/eal_args.include.rst b/doc/guides/linux_gsg/eal_args.include.rst index ed8b0e35b..d9e6a1d95 100644 --- a/doc/guides/linux_gsg/eal_args.include.rst +++ b/doc/guides/linux_gsg/eal_args.include.rst @@ -136,6 +136,22 @@ Debugging options Can be specified multiple times. +* ``--trace=`` + + Enable trace based on regular expression trace name. By default, the trace is + disabled. User must specify this option to enable trace. + For example: + + Global trace configuration for EAL only:: + + --trace=eal + + Global trace configuration for ALL the components:: + + --trace=.* + + Can be specified multiple times up to 32 times. + Other options ~~~~~~~~~~~~~ diff --git a/lib/librte_eal/common/eal_common_options.c b/lib/librte_eal/common/eal_common_options.c index eaba611fa..bb6c13177 100644 --- a/lib/librte_eal/common/eal_common_options.c +++ b/lib/librte_eal/common/eal_common_options.c @@ -34,6 +34,7 @@ #include "eal_options.h" #include "eal_filesystem.h" #include "eal_private.h" +#include "eal_trace.h" #define BITS_PER_HEX 4 #define LCORE_OPT_LST 1 @@ -67,6 +68,7 @@ eal_long_options[] = { {OPT_IOVA_MODE, 1, NULL, OPT_IOVA_MODE_NUM }, {OPT_LCORES, 1, NULL, OPT_LCORES_NUM }, {OPT_LOG_LEVEL, 1, NULL, OPT_LOG_LEVEL_NUM }, + {OPT_TRACE, 1, NULL, OPT_TRACE_NUM }, {OPT_MASTER_LCORE, 1, NULL, OPT_MASTER_LCORE_NUM }, {OPT_MBUF_POOL_OPS_NAME, 1, NULL, OPT_MBUF_POOL_OPS_NAME_NUM}, {OPT_NO_HPET, 0, NULL, OPT_NO_HPET_NUM }, @@ -1418,6 +1420,16 @@ eal_parse_common_option(int opt, const char *optarg, } break; } + + case OPT_TRACE_NUM: { + if (eal_trace_args_save(optarg) < 0) { + RTE_LOG(ERR, EAL, "invalid parameters for --" + OPT_TRACE "\n"); + return -1; + } + break; + } + case OPT_LCORES_NUM: if (eal_parse_lcores(optarg) < 0) { RTE_LOG(ERR, EAL, "invalid parameter for --" @@ -1693,6 +1705,10 @@ eal_common_usage(void) " --"OPT_LOG_LEVEL"= Set global log level\n" " --"OPT_LOG_LEVEL"=:\n" " Set specific log level\n" + " --"OPT_TRACE"=\n" + " Enable trace based on regular expression trace name.\n" + " By default, the trace is disabled.\n" + " User must specify this option to enable trace.\n" " -v Display version information on startup\n" " -h, --help This help\n" " --"OPT_IN_MEMORY" Operate entirely in memory. This will\n" diff --git a/lib/librte_eal/common/eal_common_trace.c b/lib/librte_eal/common/eal_common_trace.c index 73277ae80..2a86b740f 100644 --- a/lib/librte_eal/common/eal_common_trace.c +++ b/lib/librte_eal/common/eal_common_trace.c @@ -38,6 +38,8 @@ trace_list_head_get(void) int eal_trace_init(void) { + uint8_t i; + /* Trace memory should start with 8B aligned for natural alignment */ RTE_BUILD_BUG_ON((offsetof(struct __rte_trace_header, mem) % 8) != 0); @@ -47,6 +49,9 @@ eal_trace_init(void) goto fail; } + if (trace.args.nb_args) + trace.status = true; + if (rte_trace_is_enabled() == false) return 0; @@ -71,6 +76,10 @@ eal_trace_init(void) if (trace_epoch_time_save() < 0) goto fail; + /* Apply global configurations */ + for (i = 0; i < trace.args.nb_args; i++) + trace_args_apply(trace.args.args[i]); + rte_trace_mode_set(trace.mode); return 0; @@ -89,6 +98,7 @@ eal_trace_fini(void) return; trace_mem_per_thread_free(); trace_metadata_destroy(); + eal_trace_args_free(); } bool diff --git a/lib/librte_eal/common/eal_common_trace_utils.c b/lib/librte_eal/common/eal_common_trace_utils.c index bbe099473..7f4726d62 100644 --- a/lib/librte_eal/common/eal_common_trace_utils.c +++ b/lib/librte_eal/common/eal_common_trace_utils.c @@ -118,6 +118,65 @@ trace_session_name_generate(char *trace_dir) return -rte_errno; } +int +eal_trace_args_save(const char *optarg) +{ + struct trace *trace = trace_obj_get(); + char *trace_args; + uint8_t nb_args; + + nb_args = trace->args.nb_args; + + if (nb_args >= TRACE_MAX_ARGS) { + trace_err("ignoring trace %s as limit exceeds", optarg); + return 0; + } + + trace_args = calloc(1, (strlen(optarg) + 1)); + if (trace_args == NULL) { + trace_err("fail to allocate memory for %s", optarg); + return -ENOMEM; + } + + memcpy(trace_args, optarg, strlen(optarg)); + trace->args.args[nb_args++] = trace_args; + trace->args.nb_args = nb_args; + return 0; +} + +void +eal_trace_args_free(void) +{ + struct trace *trace = trace_obj_get(); + int i; + + for (i = 0; i < trace->args.nb_args; i++) { + if (trace->args.args[i]) { + free((void *)trace->args.args[i]); + trace->args.args[i] = NULL; + } + } +} + +int +trace_args_apply(const char *arg) +{ + char *str; + + str = strdup(arg); + if (str == NULL) + return -1; + + if (rte_trace_regexp(str, true) < 0) { + trace_err("cannot enable trace for %s", str); + free(str); + return -1; + } + + free(str); + return 0; +} + int trace_epoch_time_save(void) { diff --git a/lib/librte_eal/common/eal_options.h b/lib/librte_eal/common/eal_options.h index 9855429e5..4700410fd 100644 --- a/lib/librte_eal/common/eal_options.h +++ b/lib/librte_eal/common/eal_options.h @@ -33,6 +33,8 @@ enum { OPT_LCORES_NUM, #define OPT_LOG_LEVEL "log-level" OPT_LOG_LEVEL_NUM, +#define OPT_TRACE "trace" + OPT_TRACE_NUM, #define OPT_MASTER_LCORE "master-lcore" OPT_MASTER_LCORE_NUM, #define OPT_MBUF_POOL_OPS_NAME "mbuf-pool-ops-name" diff --git a/lib/librte_eal/common/eal_trace.h b/lib/librte_eal/common/eal_trace.h index e2538d24a..df4dd8efd 100644 --- a/lib/librte_eal/common/eal_trace.h +++ b/lib/librte_eal/common/eal_trace.h @@ -29,7 +29,7 @@ #define TRACE_CTF_FIELD_SIZE 384 #define TRACE_POINT_NAME_SIZE 64 #define TRACE_CTF_MAGIC 0xC1FC1FC1 - +#define TRACE_MAX_ARGS 32 struct trace_point { STAILQ_ENTRY(trace_point) next; @@ -48,6 +48,11 @@ struct thread_mem_meta { enum trace_area_e area; }; +struct trace_args { + uint8_t nb_args; + char *args[TRACE_MAX_ARGS]; +}; + struct trace { char dir[PATH_MAX]; int dir_offset; @@ -56,6 +61,7 @@ struct trace { enum rte_trace_mode mode; rte_uuid_t uuid; uint32_t buff_len; + struct trace_args args; uint32_t nb_trace_points; uint32_t nb_trace_mem_list; struct thread_mem_meta *lcore_meta; @@ -94,6 +100,7 @@ struct trace_point_head *trace_list_head_get(void); /* Util functions */ const char *trace_mode_to_string(enum rte_trace_mode mode); const char *trace_area_to_string(enum trace_area_e area); +int trace_args_apply(const char *arg); bool trace_has_duplicate_entry(void); void trace_uuid_generate(void); int trace_metadata_create(void); @@ -105,5 +112,7 @@ void trace_mem_per_thread_free(void); /* EAL interface */ int eal_trace_init(void); void eal_trace_fini(void); +int eal_trace_args_save(const char *optarg); +void eal_trace_args_free(void); #endif /* __EAL_TRACE_H */ From patchwork Sun Apr 19 10:01:24 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: 68903 X-Patchwork-Delegate: david.marchand@redhat.com 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 0A064A0561; Sun, 19 Apr 2020 12:11:20 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 1F0681D6A6; Sun, 19 Apr 2020 12:03:58 +0200 (CEST) Received: from mx0b-0016f401.pphosted.com (mx0a-0016f401.pphosted.com [67.231.148.174]) by dpdk.org (Postfix) with ESMTP id 0BBAE1D63F for ; Sun, 19 Apr 2020 12:03:42 +0200 (CEST) Received: from pps.filterd (m0045849.ppops.net [127.0.0.1]) by mx0a-0016f401.pphosted.com (8.16.0.42/8.16.0.42) with SMTP id 03J9vB8R031288; Sun, 19 Apr 2020 03:03:07 -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=Z1up+m60O6einzqDdfybEzP6k1ZLT8Kw/oscnNX2wsQ=; b=jzocU0iZQw26lGjwLMNBd1Suqr1PFT5qM9YgrRV3Y5NwtmPzv6mep9tg8SHHP8j7tRIA y5iQfXAJu68homRU8u5QkWzJqBxQ9rij9Ay6neWYxPn+PjcLUF2sY/2+W12SimgO71To Kp7T0CICOSXHUKJ4J57yLecS2IcFTDjLJwC+4vsY8PmjKvWdIfIiiL4eGXBgOwq6nwMy EO9QQmWNQzwkfZlom9uKPnHc5Ih2L+Bqldg3YSWgUTi/CWNUFtpkF4ogq7snMkGeiBUE PeYmuVT5MEih7XLrV1pSmIECibzJZVzR8M5PSVR9QfuPbkVdEHCQumTouzET340WSaVw dA== Received: from sc-exch01.marvell.com ([199.233.58.181]) by mx0a-0016f401.pphosted.com with ESMTP id 30fxwp3d7m-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT); Sun, 19 Apr 2020 03:03:07 -0700 Received: from DC5-EXCH02.marvell.com (10.69.176.39) by SC-EXCH01.marvell.com (10.93.176.81) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Sun, 19 Apr 2020 03:03:05 -0700 Received: from maili.marvell.com (10.69.176.80) by DC5-EXCH02.marvell.com (10.69.176.39) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Sun, 19 Apr 2020 03:03:05 -0700 Received: from jerin-lab.marvell.com (jerin-lab.marvell.com [10.28.34.14]) by maili.marvell.com (Postfix) with ESMTP id B65753F7043; Sun, 19 Apr 2020 03:03:02 -0700 (PDT) From: To: John McNamara , Marko Kovacevic , Jerin Jacob , "Sunil Kumar Kori" CC: , , , , Date: Sun, 19 Apr 2020 15:31:24 +0530 Message-ID: <20200419100133.3232316-25-jerinj@marvell.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200419100133.3232316-1-jerinj@marvell.com> References: <20200413150116.734047-1-jerinj@marvell.com> <20200419100133.3232316-1-jerinj@marvell.com> MIME-Version: 1.0 X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:6.0.138, 18.0.676 definitions=2020-04-19_02:2020-04-17, 2020-04-19 signatures=0 Subject: [dpdk-dev] [PATCH v6 24/33] eal/trace: add trace dir configuration parameter 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: Sunil Kumar Kori Trace library exposes --trace-dir EAL parameter to configure directory where traces will be generated. Signed-off-by: Sunil Kumar Kori --- doc/guides/linux_gsg/eal_args.include.rst | 11 ++++ lib/librte_eal/common/eal_common_options.c | 15 ++++++ .../common/eal_common_trace_utils.c | 54 +++++++++++++++++++ lib/librte_eal/common/eal_options.h | 2 + lib/librte_eal/common/eal_trace.h | 1 + 5 files changed, 83 insertions(+) diff --git a/doc/guides/linux_gsg/eal_args.include.rst b/doc/guides/linux_gsg/eal_args.include.rst index d9e6a1d95..98bfcd357 100644 --- a/doc/guides/linux_gsg/eal_args.include.rst +++ b/doc/guides/linux_gsg/eal_args.include.rst @@ -152,6 +152,17 @@ Debugging options Can be specified multiple times up to 32 times. +* ``--trace-dir=`` + + Specify trace directory for trace output. For example: + + Configuring ``/tmp/`` as a trace output directory:: + + --trace-dir=/tmp + + By default, trace output will created at ``home`` directory and parameter + must be specified once only. + Other options ~~~~~~~~~~~~~ diff --git a/lib/librte_eal/common/eal_common_options.c b/lib/librte_eal/common/eal_common_options.c index bb6c13177..f242d56a7 100644 --- a/lib/librte_eal/common/eal_common_options.c +++ b/lib/librte_eal/common/eal_common_options.c @@ -69,6 +69,7 @@ eal_long_options[] = { {OPT_LCORES, 1, NULL, OPT_LCORES_NUM }, {OPT_LOG_LEVEL, 1, NULL, OPT_LOG_LEVEL_NUM }, {OPT_TRACE, 1, NULL, OPT_TRACE_NUM }, + {OPT_TRACE_DIR, 1, NULL, OPT_TRACE_DIR_NUM }, {OPT_MASTER_LCORE, 1, NULL, OPT_MASTER_LCORE_NUM }, {OPT_MBUF_POOL_OPS_NAME, 1, NULL, OPT_MBUF_POOL_OPS_NAME_NUM}, {OPT_NO_HPET, 0, NULL, OPT_NO_HPET_NUM }, @@ -1430,6 +1431,15 @@ eal_parse_common_option(int opt, const char *optarg, break; } + case OPT_TRACE_DIR_NUM: { + if (eal_trace_dir_args_save(optarg) < 0) { + RTE_LOG(ERR, EAL, "invalid parameters for --" + OPT_TRACE_DIR "\n"); + return -1; + } + break; + } + case OPT_LCORES_NUM: if (eal_parse_lcores(optarg) < 0) { RTE_LOG(ERR, EAL, "invalid parameter for --" @@ -1709,6 +1719,11 @@ eal_common_usage(void) " Enable trace based on regular expression trace name.\n" " By default, the trace is disabled.\n" " User must specify this option to enable trace.\n" + " --"OPT_TRACE_DIR"=\n" + " Specify trace directory for trace output.\n" + " By default, trace output will created at\n" + " $HOME directory and parameter must be\n" + " specified once only.\n" " -v Display version information on startup\n" " -h, --help This help\n" " --"OPT_IN_MEMORY" Operate entirely in memory. This will\n" diff --git a/lib/librte_eal/common/eal_common_trace_utils.c b/lib/librte_eal/common/eal_common_trace_utils.c index 7f4726d62..41f2bdd05 100644 --- a/lib/librte_eal/common/eal_common_trace_utils.c +++ b/lib/librte_eal/common/eal_common_trace_utils.c @@ -118,6 +118,22 @@ trace_session_name_generate(char *trace_dir) return -rte_errno; } +static int +trace_dir_update(const char *str) +{ + struct trace *trace = trace_obj_get(); + int rc, remaining; + + remaining = sizeof(trace->dir) - trace->dir_offset; + rc = rte_strscpy(&trace->dir[0] + trace->dir_offset, str, remaining); + if (rc < 0) + goto fail; + + trace->dir_offset += rc; +fail: + return rc; +} + int eal_trace_args_save(const char *optarg) { @@ -177,6 +193,37 @@ trace_args_apply(const char *arg) return 0; } +int +eal_trace_dir_args_save(char const *optarg) +{ + struct trace *trace = trace_obj_get(); + uint32_t size = sizeof(trace->dir); + char *dir_path = NULL; + int rc; + + if (optarg == NULL) { + trace_err("no optarg is passed"); + return -EINVAL; + } + + if (strlen(optarg) >= size) { + trace_err("input string is too big"); + return -ENAMETOOLONG; + } + + dir_path = (char *)calloc(1, size); + if (dir_path == NULL) { + trace_err("fail to allocate memory"); + return -ENOMEM; + } + + sprintf(dir_path, "%s/", optarg); + rc = trace_dir_update(dir_path); + + free(dir_path); + return rc; +} + int trace_epoch_time_save(void) { @@ -247,6 +294,10 @@ trace_mkdir(void) return rc; } + rc = trace_dir_update(dir_path); + free(dir_path); + if (rc < 0) + return rc; } /* Create the path if it t exist, no "mkdir -p" available here */ @@ -258,6 +309,9 @@ trace_mkdir(void) } rc = trace_session_name_generate(session); + if (rc < 0) + return rc; + rc = trace_dir_update(session); if (rc < 0) return rc; diff --git a/lib/librte_eal/common/eal_options.h b/lib/librte_eal/common/eal_options.h index 4700410fd..04222e57f 100644 --- a/lib/librte_eal/common/eal_options.h +++ b/lib/librte_eal/common/eal_options.h @@ -35,6 +35,8 @@ enum { OPT_LOG_LEVEL_NUM, #define OPT_TRACE "trace" OPT_TRACE_NUM, +#define OPT_TRACE_DIR "trace-dir" + OPT_TRACE_DIR_NUM, #define OPT_MASTER_LCORE "master-lcore" OPT_MASTER_LCORE_NUM, #define OPT_MBUF_POOL_OPS_NAME "mbuf-pool-ops-name" diff --git a/lib/librte_eal/common/eal_trace.h b/lib/librte_eal/common/eal_trace.h index df4dd8efd..7af7d63f0 100644 --- a/lib/librte_eal/common/eal_trace.h +++ b/lib/librte_eal/common/eal_trace.h @@ -114,5 +114,6 @@ int eal_trace_init(void); void eal_trace_fini(void); int eal_trace_args_save(const char *optarg); void eal_trace_args_free(void); +int eal_trace_dir_args_save(const char *optarg); #endif /* __EAL_TRACE_H */ From patchwork Sun Apr 19 10:01:25 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: 68897 X-Patchwork-Delegate: david.marchand@redhat.com 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 75E27A0561; Sun, 19 Apr 2020 12:09:36 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 532A61D65E; Sun, 19 Apr 2020 12:03:38 +0200 (CEST) Received: from mx0b-0016f401.pphosted.com (mx0b-0016f401.pphosted.com [67.231.156.173]) by dpdk.org (Postfix) with ESMTP id BA9771D528 for ; Sun, 19 Apr 2020 12:03:20 +0200 (CEST) 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 03JA18BJ020144; Sun, 19 Apr 2020 03:03:10 -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=sEQYf8Li9Rh9X+7sS5/bQkNV4sZB88kt7mTPBMYAEtE=; b=AqGbcjkhlEXdt2NtSB6Eeh43Qj8bl1/7DqZYPkK4hxI6fbQtGmHeoKK84iuafnmhrATe lyvRodu5GFQTZz0oBPZF3+6DxfC9l8Gdqi3XuDwdt4A0XHhFo/sb6Rnc6iXD5/bS+U+3 YguTXLXppxhlWcnuaMY+85dCnYsAC1OjWLvBBRzQChiMC/sHzOdlTmeh+WlJPDDCnVfl pRmL1zx12gz1sCPDFGoG9ngu+d1R3DLIacW+CQst/910g810ZvQafmSZ6XXIDFNeQdki NXXlAWeVKGMvZvVFIAnFAZU6sbwVFbhTZC1UUFZ8NKzQDOdIoeFkDniJ7D8nY3hCOmRU lQ== Received: from sc-exch03.marvell.com ([199.233.58.183]) by mx0b-0016f401.pphosted.com with ESMTP id 30g12njxe9-2 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT); Sun, 19 Apr 2020 03:03:10 -0700 Received: from DC5-EXCH02.marvell.com (10.69.176.39) by SC-EXCH03.marvell.com (10.93.176.83) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Sun, 19 Apr 2020 03:03:09 -0700 Received: from maili.marvell.com (10.69.176.80) by DC5-EXCH02.marvell.com (10.69.176.39) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Sun, 19 Apr 2020 03:03:09 -0700 Received: from jerin-lab.marvell.com (jerin-lab.marvell.com [10.28.34.14]) by maili.marvell.com (Postfix) with ESMTP id ABDC63F703F; Sun, 19 Apr 2020 03:03:06 -0700 (PDT) From: To: John McNamara , Marko Kovacevic , Jerin Jacob , "Sunil Kumar Kori" CC: , , , , Date: Sun, 19 Apr 2020 15:31:25 +0530 Message-ID: <20200419100133.3232316-26-jerinj@marvell.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200419100133.3232316-1-jerinj@marvell.com> References: <20200413150116.734047-1-jerinj@marvell.com> <20200419100133.3232316-1-jerinj@marvell.com> MIME-Version: 1.0 X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:6.0.138, 18.0.676 definitions=2020-04-19_02:2020-04-17, 2020-04-19 signatures=0 Subject: [dpdk-dev] [PATCH v6 25/33] eal/trace: add trace bufsize configuration parameter 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: Sunil Kumar Kori Trace library exposes --trace-bufsz EAL parameter to configure maximum size of ring buffer where events are to be stored. Signed-off-by: Sunil Kumar Kori --- doc/guides/linux_gsg/eal_args.include.rst | 13 ++++++++ lib/librte_eal/common/eal_common_options.c | 17 +++++++++++ lib/librte_eal/common/eal_common_trace.c | 3 ++ .../common/eal_common_trace_utils.c | 30 +++++++++++++++++++ lib/librte_eal/common/eal_options.h | 2 ++ lib/librte_eal/common/eal_trace.h | 2 ++ 6 files changed, 67 insertions(+) diff --git a/doc/guides/linux_gsg/eal_args.include.rst b/doc/guides/linux_gsg/eal_args.include.rst index 98bfcd357..b921c83b8 100644 --- a/doc/guides/linux_gsg/eal_args.include.rst +++ b/doc/guides/linux_gsg/eal_args.include.rst @@ -163,6 +163,19 @@ Debugging options By default, trace output will created at ``home`` directory and parameter must be specified once only. +* ``--trace-bufsz=`` + + Specify maximum size of allocated memory for trace output for each thread. + Valid unit can be either ``B`` or ``K`` or ``M`` for ``Bytes``, ``KBytes`` + and ``MBytes`` respectively. For example: + + Configuring ``2MB`` as a maximum size for trace output file:: + + --trace-bufsz=2M + + By default, size of trace output file is ``1MB`` and parameter + must be specified once only. + Other options ~~~~~~~~~~~~~ diff --git a/lib/librte_eal/common/eal_common_options.c b/lib/librte_eal/common/eal_common_options.c index f242d56a7..32b163a81 100644 --- a/lib/librte_eal/common/eal_common_options.c +++ b/lib/librte_eal/common/eal_common_options.c @@ -70,6 +70,7 @@ eal_long_options[] = { {OPT_LOG_LEVEL, 1, NULL, OPT_LOG_LEVEL_NUM }, {OPT_TRACE, 1, NULL, OPT_TRACE_NUM }, {OPT_TRACE_DIR, 1, NULL, OPT_TRACE_DIR_NUM }, + {OPT_TRACE_BUF_SIZE, 1, NULL, OPT_TRACE_BUF_SIZE_NUM }, {OPT_MASTER_LCORE, 1, NULL, OPT_MASTER_LCORE_NUM }, {OPT_MBUF_POOL_OPS_NAME, 1, NULL, OPT_MBUF_POOL_OPS_NAME_NUM}, {OPT_NO_HPET, 0, NULL, OPT_NO_HPET_NUM }, @@ -1440,6 +1441,15 @@ eal_parse_common_option(int opt, const char *optarg, break; } + case OPT_TRACE_BUF_SIZE_NUM: { + if (eal_trace_bufsz_args_save(optarg) < 0) { + RTE_LOG(ERR, EAL, "invalid parameters for --" + OPT_TRACE_BUF_SIZE "\n"); + return -1; + } + break; + } + case OPT_LCORES_NUM: if (eal_parse_lcores(optarg) < 0) { RTE_LOG(ERR, EAL, "invalid parameter for --" @@ -1724,6 +1734,13 @@ eal_common_usage(void) " By default, trace output will created at\n" " $HOME directory and parameter must be\n" " specified once only.\n" + " --"OPT_TRACE_BUF_SIZE"=\n" + " Specify maximum size of allocated memory\n" + " for trace output for each thread. Valid\n" + " unit can be either 'B|K|M' for 'Bytes',\n" + " 'KBytes' and 'MBytes' respectively.\n" + " Default is 1MB and parameter must be\n" + " specified once only.\n" " -v Display version information on startup\n" " -h, --help This help\n" " --"OPT_IN_MEMORY" Operate entirely in memory. This will\n" diff --git a/lib/librte_eal/common/eal_common_trace.c b/lib/librte_eal/common/eal_common_trace.c index 2a86b740f..3d9201d2f 100644 --- a/lib/librte_eal/common/eal_common_trace.c +++ b/lib/librte_eal/common/eal_common_trace.c @@ -64,6 +64,9 @@ eal_trace_init(void) /* Generate UUID ver 4 with total size of events and number of events */ trace_uuid_generate(); + /* Apply buffer size configuration for trace output */ + trace_bufsz_args_apply(); + /* Generate CTF TDSL metadata */ if (trace_metadata_create() < 0) goto fail; diff --git a/lib/librte_eal/common/eal_common_trace_utils.c b/lib/librte_eal/common/eal_common_trace_utils.c index 41f2bdd05..b4ac79c95 100644 --- a/lib/librte_eal/common/eal_common_trace_utils.c +++ b/lib/librte_eal/common/eal_common_trace_utils.c @@ -193,6 +193,36 @@ trace_args_apply(const char *arg) return 0; } +int +eal_trace_bufsz_args_save(char const *optarg) +{ + struct trace *trace = trace_obj_get(); + uint64_t bufsz; + + if (optarg == NULL) { + trace_err("no optarg is passed"); + return -EINVAL; + } + + bufsz = rte_str_to_size(optarg); + if (bufsz == 0) { + trace_err("buffer size cannot be zero"); + return -EINVAL; + } + + trace->buff_len = bufsz; + return 0; +} + +void +trace_bufsz_args_apply(void) +{ + struct trace *trace = trace_obj_get(); + + if (trace->buff_len == 0) + trace->buff_len = 1024 * 1024; /* 1MB */ +} + int eal_trace_dir_args_save(char const *optarg) { diff --git a/lib/librte_eal/common/eal_options.h b/lib/librte_eal/common/eal_options.h index 04222e57f..3e9a54f3a 100644 --- a/lib/librte_eal/common/eal_options.h +++ b/lib/librte_eal/common/eal_options.h @@ -37,6 +37,8 @@ enum { OPT_TRACE_NUM, #define OPT_TRACE_DIR "trace-dir" OPT_TRACE_DIR_NUM, +#define OPT_TRACE_BUF_SIZE "trace-bufsz" + OPT_TRACE_BUF_SIZE_NUM, #define OPT_MASTER_LCORE "master-lcore" OPT_MASTER_LCORE_NUM, #define OPT_MBUF_POOL_OPS_NAME "mbuf-pool-ops-name" diff --git a/lib/librte_eal/common/eal_trace.h b/lib/librte_eal/common/eal_trace.h index 7af7d63f0..2fd73c5d5 100644 --- a/lib/librte_eal/common/eal_trace.h +++ b/lib/librte_eal/common/eal_trace.h @@ -101,6 +101,7 @@ struct trace_point_head *trace_list_head_get(void); const char *trace_mode_to_string(enum rte_trace_mode mode); const char *trace_area_to_string(enum trace_area_e area); int trace_args_apply(const char *arg); +void trace_bufsz_args_apply(void); bool trace_has_duplicate_entry(void); void trace_uuid_generate(void); int trace_metadata_create(void); @@ -115,5 +116,6 @@ void eal_trace_fini(void); int eal_trace_args_save(const char *optarg); void eal_trace_args_free(void); int eal_trace_dir_args_save(const char *optarg); +int eal_trace_bufsz_args_save(const char *optarg); #endif /* __EAL_TRACE_H */ From patchwork Sun Apr 19 10:01:26 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: 68893 X-Patchwork-Delegate: david.marchand@redhat.com 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 D9FD9A0561; Sun, 19 Apr 2020 12:08:16 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 801ED1D636; Sun, 19 Apr 2020 12:03:23 +0200 (CEST) Received: from mx0b-0016f401.pphosted.com (mx0b-0016f401.pphosted.com [67.231.156.173]) by dpdk.org (Postfix) with ESMTP id 244841D62C for ; Sun, 19 Apr 2020 12:03:16 +0200 (CEST) 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 03JA0tuu020047; Sun, 19 Apr 2020 03:03:16 -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=AyHMjlD8zTGjXyxJjQ06173Udf+9ZenEizEdGJXlZqg=; b=ZSzsEHCkm0qodKSpJsDePIJwVXBdeW55qGKRXmoSNZhiOX2244Pj0vcftY7gaQjbcTCJ qZfk4/HUhYg7VIRXwxz5G+dpGnJyEdJJpH9O42qy03vyI3C62XRnh4sQDJaHbW/cmf+T O/BEFnymyvKQA7VkZB7AB/2y+3YoaTk3vnMwOZ0UhVmAtc8iBxnGo9glXS+2GScIpmQ7 /dSKyQAG6Juol64Nw8NrGb+gkQZ3HkenPcuR2E/eRF/kH71Wj/3hxQ0S2s8jncS9Qv5p 4JPgVlblEwRp+aexFSi/i4sfX23RwqHstdTGy6gsPLTpAU742mYbpgSg6mNpm6sLWhb+ tQ== Received: from sc-exch02.marvell.com ([199.233.58.182]) by mx0b-0016f401.pphosted.com with ESMTP id 30g12njxen-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT); Sun, 19 Apr 2020 03:03:16 -0700 Received: from DC5-EXCH02.marvell.com (10.69.176.39) by SC-EXCH02.marvell.com (10.93.176.82) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Sun, 19 Apr 2020 03:03:14 -0700 Received: from DC5-EXCH01.marvell.com (10.69.176.38) by DC5-EXCH02.marvell.com (10.69.176.39) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Sun, 19 Apr 2020 03:03:13 -0700 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.2 via Frontend Transport; Sun, 19 Apr 2020 03:03:13 -0700 Received: from jerin-lab.marvell.com (jerin-lab.marvell.com [10.28.34.14]) by maili.marvell.com (Postfix) with ESMTP id AAC723F703F; Sun, 19 Apr 2020 03:03:10 -0700 (PDT) From: To: John McNamara , Marko Kovacevic , Jerin Jacob , "Sunil Kumar Kori" CC: , , , , Date: Sun, 19 Apr 2020 15:31:26 +0530 Message-ID: <20200419100133.3232316-27-jerinj@marvell.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200419100133.3232316-1-jerinj@marvell.com> References: <20200413150116.734047-1-jerinj@marvell.com> <20200419100133.3232316-1-jerinj@marvell.com> MIME-Version: 1.0 X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:6.0.138, 18.0.676 definitions=2020-04-19_02:2020-04-17, 2020-04-19 signatures=0 Subject: [dpdk-dev] [PATCH v6 26/33] eal/trace: add trace mode configuration parameter 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: Sunil Kumar Kori Trace library exposes --trace-mode eal parameter to configure event record mode when ring buffers are full. Signed-off-by: Sunil Kumar Kori --- doc/guides/linux_gsg/eal_args.include.rst | 12 ++++++ lib/librte_eal/common/eal_common_options.c | 17 ++++++++ .../common/eal_common_trace_utils.c | 40 +++++++++++++++++++ lib/librte_eal/common/eal_options.h | 2 + lib/librte_eal/common/eal_trace.h | 1 + 5 files changed, 72 insertions(+) diff --git a/doc/guides/linux_gsg/eal_args.include.rst b/doc/guides/linux_gsg/eal_args.include.rst index b921c83b8..361c7cf67 100644 --- a/doc/guides/linux_gsg/eal_args.include.rst +++ b/doc/guides/linux_gsg/eal_args.include.rst @@ -176,6 +176,18 @@ Debugging options By default, size of trace output file is ``1MB`` and parameter must be specified once only. +* ``--trace-mode=`` + + Specify the mode of update of trace output file. Either update on a file + can be wrapped or discarded when file size reaches its maximum limit. + For example: + + To ``discard`` update on trace output file:: + + --trace-mode=d or --trace-mode=discard + + Default mode is ``overwrite`` and parameter must be specified once only. + Other options ~~~~~~~~~~~~~ diff --git a/lib/librte_eal/common/eal_common_options.c b/lib/librte_eal/common/eal_common_options.c index 32b163a81..7e3a7df9c 100644 --- a/lib/librte_eal/common/eal_common_options.c +++ b/lib/librte_eal/common/eal_common_options.c @@ -71,6 +71,7 @@ eal_long_options[] = { {OPT_TRACE, 1, NULL, OPT_TRACE_NUM }, {OPT_TRACE_DIR, 1, NULL, OPT_TRACE_DIR_NUM }, {OPT_TRACE_BUF_SIZE, 1, NULL, OPT_TRACE_BUF_SIZE_NUM }, + {OPT_TRACE_MODE, 1, NULL, OPT_TRACE_MODE_NUM }, {OPT_MASTER_LCORE, 1, NULL, OPT_MASTER_LCORE_NUM }, {OPT_MBUF_POOL_OPS_NAME, 1, NULL, OPT_MBUF_POOL_OPS_NAME_NUM}, {OPT_NO_HPET, 0, NULL, OPT_NO_HPET_NUM }, @@ -1450,6 +1451,15 @@ eal_parse_common_option(int opt, const char *optarg, break; } + case OPT_TRACE_MODE_NUM: { + if (eal_trace_mode_args_save(optarg) < 0) { + RTE_LOG(ERR, EAL, "invalid parameters for --" + OPT_TRACE_MODE "\n"); + return -1; + } + break; + } + case OPT_LCORES_NUM: if (eal_parse_lcores(optarg) < 0) { RTE_LOG(ERR, EAL, "invalid parameter for --" @@ -1741,6 +1751,13 @@ eal_common_usage(void) " 'KBytes' and 'MBytes' respectively.\n" " Default is 1MB and parameter must be\n" " specified once only.\n" + " --"OPT_TRACE_MODE"=\n" + " Specify the mode of update of trace\n" + " output file. Either update on a file can\n" + " be wrapped or discarded when file size\n" + " reaches its maximum limit.\n" + " Default mode is 'overwrite' and parameter\n" + " must be specified once only.\n" " -v Display version information on startup\n" " -h, --help This help\n" " --"OPT_IN_MEMORY" Operate entirely in memory. This will\n" diff --git a/lib/librte_eal/common/eal_common_trace_utils.c b/lib/librte_eal/common/eal_common_trace_utils.c index b4ac79c95..5b2906677 100644 --- a/lib/librte_eal/common/eal_common_trace_utils.c +++ b/lib/librte_eal/common/eal_common_trace_utils.c @@ -223,6 +223,46 @@ trace_bufsz_args_apply(void) trace->buff_len = 1024 * 1024; /* 1MB */ } +int +eal_trace_mode_args_save(const char *optarg) +{ + struct trace *trace = trace_obj_get(); + size_t len = strlen(optarg); + unsigned long tmp; + char *pattern; + + if (optarg == NULL) { + trace_err("no optarg is passed"); + return -EINVAL; + } + + if (len == 0) { + trace_err("value is not provided with option"); + return -EINVAL; + } + + pattern = (char *)calloc(1, len + 2); + if (pattern == NULL) { + trace_err("fail to allocate memory"); + return -ENOMEM; + } + + sprintf(pattern, "%s*", optarg); + + if (fnmatch(pattern, "overwrite", 0) == 0) + tmp = RTE_TRACE_MODE_OVERWRITE; + else if (fnmatch(pattern, "discard", 0) == 0) + tmp = RTE_TRACE_MODE_DISCARD; + else { + free(pattern); + return -EINVAL; + } + + trace->mode = tmp; + free(pattern); + return 0; +} + int eal_trace_dir_args_save(char const *optarg) { diff --git a/lib/librte_eal/common/eal_options.h b/lib/librte_eal/common/eal_options.h index 3e9a54f3a..90ead1b7c 100644 --- a/lib/librte_eal/common/eal_options.h +++ b/lib/librte_eal/common/eal_options.h @@ -39,6 +39,8 @@ enum { OPT_TRACE_DIR_NUM, #define OPT_TRACE_BUF_SIZE "trace-bufsz" OPT_TRACE_BUF_SIZE_NUM, +#define OPT_TRACE_MODE "trace-mode" + OPT_TRACE_MODE_NUM, #define OPT_MASTER_LCORE "master-lcore" OPT_MASTER_LCORE_NUM, #define OPT_MBUF_POOL_OPS_NAME "mbuf-pool-ops-name" diff --git a/lib/librte_eal/common/eal_trace.h b/lib/librte_eal/common/eal_trace.h index 2fd73c5d5..dc3eca6eb 100644 --- a/lib/librte_eal/common/eal_trace.h +++ b/lib/librte_eal/common/eal_trace.h @@ -116,6 +116,7 @@ void eal_trace_fini(void); int eal_trace_args_save(const char *optarg); void eal_trace_args_free(void); int eal_trace_dir_args_save(const char *optarg); +int eal_trace_mode_args_save(const char *optarg); int eal_trace_bufsz_args_save(const char *optarg); #endif /* __EAL_TRACE_H */ From patchwork Sun Apr 19 10:01:27 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: 68898 X-Patchwork-Delegate: david.marchand@redhat.com 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 2C8CFA0561; Sun, 19 Apr 2020 12:09:52 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id D47731D66A; Sun, 19 Apr 2020 12:03:39 +0200 (CEST) Received: from mx0b-0016f401.pphosted.com (mx0b-0016f401.pphosted.com [67.231.156.173]) by dpdk.org (Postfix) with ESMTP id 5AABA1D604 for ; Sun, 19 Apr 2020 12:03:21 +0200 (CEST) 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 03JA18bB020141; Sun, 19 Apr 2020 03:03: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=yx0hFrEoX4TNGHiLUirngM1tuA+bEqSODzcAwjTSU5I=; b=PWRCTjsliCN75xrCg1RK61cg67soAE1jPehq8Ql/8R1R9R5kC6FoWIdgNZ4DoXT46WGX RGXMs9U0QqdM2UifNqZPgb8aoT+KZf+485/b70ibP5mi8a2+LhrPaLirXL0QVQigCW9/ hwZ4R+WQC9jK8Dlqw5COD8xI9RGTQRFm/3Q2iwRBD11ARLpe7MjN+5QODyiAvny/r6+/ 11ZjGFmJ60nvZ13ctPF+ke3tst4lnTIeKzTxtEfZ+X9UV77pW/X7vT2cGQ/1cVuaEdWp DzBF84RX1xcb1VYpAKBEGk2aD2m7XzOKOnuMUXOaikNIO0MjK0o31zm1FDpBBQl3msAY VQ== Received: from sc-exch01.marvell.com ([199.233.58.181]) by mx0b-0016f401.pphosted.com with ESMTP id 30g12njxet-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT); Sun, 19 Apr 2020 03:03:19 -0700 Received: from DC5-EXCH02.marvell.com (10.69.176.39) by SC-EXCH01.marvell.com (10.93.176.81) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Sun, 19 Apr 2020 03:03:17 -0700 Received: from DC5-EXCH02.marvell.com (10.69.176.39) by DC5-EXCH02.marvell.com (10.69.176.39) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Sun, 19 Apr 2020 03:03:16 -0700 Received: from maili.marvell.com (10.69.176.80) by DC5-EXCH02.marvell.com (10.69.176.39) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Sun, 19 Apr 2020 03:03:16 -0700 Received: from jerin-lab.marvell.com (jerin-lab.marvell.com [10.28.34.14]) by maili.marvell.com (Postfix) with ESMTP id C40873F703F; Sun, 19 Apr 2020 03:03:14 -0700 (PDT) From: To: CC: , , , , , Date: Sun, 19 Apr 2020 15:31:27 +0530 Message-ID: <20200419100133.3232316-28-jerinj@marvell.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200419100133.3232316-1-jerinj@marvell.com> References: <20200413150116.734047-1-jerinj@marvell.com> <20200419100133.3232316-1-jerinj@marvell.com> MIME-Version: 1.0 X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:6.0.138, 18.0.676 definitions=2020-04-19_02:2020-04-17, 2020-04-19 signatures=0 Subject: [dpdk-dev] [PATCH v6 27/33] eal/trace: add unit test cases 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: Sunil Kumar Kori Example commands to run UT and check the traces with babeltrace viewer. - Delete the existing /root/dpdk-traces/ directory if needed. > sudo rm -rf /root/dpdk-traces/ - Start the dpdk-test > sudo ./build/app/test/dpdk-test -c 0x3 - --trace=.* - Run trace_autotest > trace_autotest - View the traces with babletrace viewer. > sudo babeltrace /root/dpdk-traces/ Signed-off-by: Sunil Kumar Kori --- app/test/Makefile | 3 +- app/test/meson.build | 2 + app/test/test_trace.c | 223 +++++++++++++++++++++++++++++++++ app/test/test_trace.h | 15 +++ app/test/test_trace_register.c | 17 +++ 5 files changed, 259 insertions(+), 1 deletion(-) create mode 100644 app/test/test_trace.c create mode 100644 app/test/test_trace.h create mode 100644 app/test/test_trace_register.c diff --git a/app/test/Makefile b/app/test/Makefile index be53d33c3..9fb7b843f 100644 --- a/app/test/Makefile +++ b/app/test/Makefile @@ -148,7 +148,8 @@ SRCS-y += test_alarm.c SRCS-y += test_interrupts.c SRCS-y += test_version.c SRCS-y += test_func_reentrancy.c - +SRCS-y += test_trace.c +SRCS-y += test_trace_register.c SRCS-y += test_service_cores.c ifeq ($(CONFIG_RTE_LIBRTE_PMD_RING),y) diff --git a/app/test/meson.build b/app/test/meson.build index 04b59cffa..78023ee71 100644 --- a/app/test/meson.build +++ b/app/test/meson.build @@ -121,6 +121,8 @@ test_sources = files('commands.c', 'test_timer_racecond.c', 'test_timer_secondary.c', 'test_ticketlock.c', + 'test_trace.c', + 'test_trace_register.c', 'test_version.c', 'virtual_pmd.c' ) diff --git a/app/test/test_trace.c b/app/test/test_trace.c new file mode 100644 index 000000000..26b403e62 --- /dev/null +++ b/app/test/test_trace.c @@ -0,0 +1,223 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(C) 2020 Marvell International Ltd. + */ + +#include +#include +#include + +#include "test.h" +#include "test_trace.h" + +static int32_t +test_trace_point_globbing(void) +{ + bool val; + int rc; + + rc = rte_trace_pattern("app.dpdk.test*", false); + if (rc != 1) + goto failed; + + val = rte_trace_point_is_enabled(&__app_dpdk_test_tp); + if (val == true) + goto failed; + + rc = rte_trace_pattern("app.dpdk.test*", true); + if (rc != 1) + goto failed; + + val = rte_trace_point_is_enabled(&__app_dpdk_test_tp); + if (val == false) + goto failed; + + rc = rte_trace_pattern("invalid_testpoint.*", true); + if (rc != 0) + goto failed; + + return TEST_SUCCESS; + +failed: + return TEST_FAILED; +} + +static int32_t +test_trace_point_regex(void) +{ + bool val; + int rc; + + + rc = rte_trace_regexp("app.dpdk.test*", false); + if (rc != 1) + goto failed; + + val = rte_trace_point_is_enabled(&__app_dpdk_test_tp); + if (val == true) + goto failed; + + rc = rte_trace_regexp("app.dpdk.test*", true); + if (rc != 1) + goto failed; + + val = rte_trace_point_is_enabled(&__app_dpdk_test_tp); + if (val == false) + goto failed; + + rc = rte_trace_regexp("invalid_testpoint.*", true); + if (rc != 0) + goto failed; + + return TEST_SUCCESS; + +failed: + return TEST_FAILED; +} + +static int32_t +test_trace_point_disable_enable(void) +{ + bool val; + int rc; + + rc = rte_trace_point_disable(&__app_dpdk_test_tp); + if (rc < 0) + goto failed; + + val = rte_trace_point_is_enabled(&__app_dpdk_test_tp); + if (val == true) + goto failed; + + rc = rte_trace_point_enable(&__app_dpdk_test_tp); + if (rc < 0) + goto failed; + + val = rte_trace_point_is_enabled(&__app_dpdk_test_tp); + if (val == false) + goto failed; + + /* Emit the trace */ + app_dpdk_test_tp("app.dpdk.test.tp"); + return TEST_SUCCESS; + +failed: + return TEST_FAILED; +} + +static int +test_trace_mode(void) +{ + enum rte_trace_mode current; + + current = rte_trace_mode_get(); + + if (rte_trace_is_enabled() == false) + return TEST_SKIPPED; + + rte_trace_mode_set(RTE_TRACE_MODE_DISCARD); + if (rte_trace_mode_get() != RTE_TRACE_MODE_DISCARD) + goto failed; + + rte_trace_mode_set(RTE_TRACE_MODE_OVERWRITE); + if (rte_trace_mode_get() != RTE_TRACE_MODE_OVERWRITE) + goto failed; + + rte_trace_mode_set(current); + return TEST_SUCCESS; + +failed: + return TEST_FAILED; + +} + +static int +test_trace_points_lookup(void) +{ + rte_trace_point_t *trace; + + trace = rte_trace_point_lookup("app.dpdk.test.tp"); + if (trace == NULL) + goto fail; + trace = rte_trace_point_lookup("this_trace_point_does_not_exist"); + if (trace != NULL) + goto fail; + + return TEST_SUCCESS; +fail: + return TEST_FAILED; +} + +static int +test_trace_fastpath_point(void) +{ + /* Emit the FP trace */ + app_dpdk_test_fp(); + + return TEST_SUCCESS; +} + +static int +test_generic_trace_points(void) +{ + int tmp; + + rte_trace_lib_eal_generic_void(); + rte_trace_lib_eal_generic_u64(0x10000000000000); + rte_trace_lib_eal_generic_u32(0x10000000); + rte_trace_lib_eal_generic_u16(0xffee); + rte_trace_lib_eal_generic_u8(0xc); + rte_trace_lib_eal_generic_i64(-1234); + rte_trace_lib_eal_generic_i32(-1234567); + rte_trace_lib_eal_generic_i16(12); + rte_trace_lib_eal_generic_i8(-3); + rte_trace_lib_eal_generic_int(3333333); + rte_trace_lib_eal_generic_long(333); + rte_trace_lib_eal_generic_float(20.45); + rte_trace_lib_eal_generic_double(20000.5000004); + rte_trace_lib_eal_generic_ptr(&tmp); + rte_trace_lib_eal_generic_str("my string"); + RTE_TRACE_LIB_EAL_GENERIC_FUNC; + + return TEST_SUCCESS; +} + +static struct unit_test_suite trace_tests = { + .suite_name = "trace autotest", + .setup = NULL, + .teardown = NULL, + .unit_test_cases = { + TEST_CASE(test_trace_mode), + TEST_CASE(test_generic_trace_points), + TEST_CASE(test_trace_fastpath_point), + TEST_CASE(test_trace_point_disable_enable), + TEST_CASE(test_trace_point_globbing), + TEST_CASE(test_trace_point_regex), + TEST_CASE(test_trace_points_lookup), + TEST_CASES_END() + } +}; + +static int +test_trace(void) +{ + return unit_test_suite_runner(&trace_tests); +} + +REGISTER_TEST_COMMAND(trace_autotest, test_trace); + +static int +test_trace_dump(void) +{ + rte_trace_dump(stdout); + return 0; +} + +REGISTER_TEST_COMMAND(trace_dump, test_trace_dump); + +static int +test_trace_metadata_dump(void) +{ + return rte_trace_metadata_dump(stdout); +} + +REGISTER_TEST_COMMAND(trace_metadata_dump, test_trace_metadata_dump); diff --git a/app/test/test_trace.h b/app/test/test_trace.h new file mode 100644 index 000000000..413842f60 --- /dev/null +++ b/app/test/test_trace.h @@ -0,0 +1,15 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(C) 2020 Marvell International Ltd. + */ +#include + +RTE_TRACE_POINT( + app_dpdk_test_tp, + RTE_TRACE_POINT_ARGS(const char *str), + rte_trace_point_emit_string(str); +) + +RTE_TRACE_POINT_FP( + app_dpdk_test_fp, + RTE_TRACE_POINT_ARGS(void), +) diff --git a/app/test/test_trace_register.c b/app/test/test_trace_register.c new file mode 100644 index 000000000..1735149a2 --- /dev/null +++ b/app/test/test_trace_register.c @@ -0,0 +1,17 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(C) 2020 Marvell International Ltd. + */ +#define RTE_TRACE_POINT_REGISTER_SELECT /* Select trace point register macros */ + +#include "test_trace.h" + +/* Define trace points */ +RTE_TRACE_POINT_DEFINE(app_dpdk_test_tp); +RTE_TRACE_POINT_DEFINE(app_dpdk_test_fp); + +RTE_INIT(register_valid_trace_points) +{ + RTE_TRACE_POINT_REGISTER(app_dpdk_test_tp, app.dpdk.test.tp); + RTE_TRACE_POINT_REGISTER(app_dpdk_test_fp, app.dpdk.test.fp); +} + From patchwork Sun Apr 19 10:01:28 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: 68901 X-Patchwork-Delegate: david.marchand@redhat.com 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 5F8F2A0561; Sun, 19 Apr 2020 12:10:50 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id D67011D69A; Sun, 19 Apr 2020 12:03:55 +0200 (CEST) Received: from mx0b-0016f401.pphosted.com (mx0a-0016f401.pphosted.com [67.231.148.174]) by dpdk.org (Postfix) with ESMTP id 5ACE21D63F for ; Sun, 19 Apr 2020 12:03:25 +0200 (CEST) Received: from pps.filterd (m0045849.ppops.net [127.0.0.1]) by mx0a-0016f401.pphosted.com (8.16.0.42/8.16.0.42) with SMTP id 03J9vQl5031337; Sun, 19 Apr 2020 03:03:22 -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=GilAl6dTMGT1dOShqh/q2qPpEUtvFYgJOBdqMz57UVo=; b=uOVZPsWP1OH6fp3NwI5RAmOi1+Vx8usAd3/XnwwIhjb1DU6bMI34CDO0ehTGI7H3RMNp xjrXwSkiAS4uuRfhZ+5lB8Le7ElyrKNtQ24eAXcDDbwXqr2mz3S5FCe2NvlVfW97/4jR 0G5dqxSHu8jVI3nSaXzIL0qGQjuCUHMlQQzedQDY2RZUXFgAJ+3gXHfefiBFHtJ43/Tt 4gbeHhQCeYBuVuQwrHg6ri90+ep21OLF3HniY4gBo0LNUE0bCNojZvOLiGYtY2lNGrWN FV/NX2wHSy1djIdd8SeBH6F5bOsYy3SffFa2zyOroAePtQCUamqwIfYqAAbgyEdFXU92 qQ== Received: from sc-exch02.marvell.com ([199.233.58.182]) by mx0a-0016f401.pphosted.com with ESMTP id 30fxwp3d8a-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT); Sun, 19 Apr 2020 03:03:22 -0700 Received: from DC5-EXCH01.marvell.com (10.69.176.38) by SC-EXCH02.marvell.com (10.93.176.82) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Sun, 19 Apr 2020 03:03:21 -0700 Received: from DC5-EXCH02.marvell.com (10.69.176.39) by DC5-EXCH01.marvell.com (10.69.176.38) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Sun, 19 Apr 2020 03:03:20 -0700 Received: from maili.marvell.com (10.69.176.80) by DC5-EXCH02.marvell.com (10.69.176.39) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Sun, 19 Apr 2020 03:03:20 -0700 Received: from jerin-lab.marvell.com (jerin-lab.marvell.com [10.28.34.14]) by maili.marvell.com (Postfix) with ESMTP id 1105E3F703F; Sun, 19 Apr 2020 03:03:17 -0700 (PDT) From: To: CC: , , , , , , Jerin Jacob Date: Sun, 19 Apr 2020 15:31:28 +0530 Message-ID: <20200419100133.3232316-29-jerinj@marvell.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200419100133.3232316-1-jerinj@marvell.com> References: <20200413150116.734047-1-jerinj@marvell.com> <20200419100133.3232316-1-jerinj@marvell.com> MIME-Version: 1.0 X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:6.0.138, 18.0.676 definitions=2020-04-19_02:2020-04-17, 2020-04-19 signatures=0 Subject: [dpdk-dev] [PATCH v6 28/33] eal/trace: add trace performance test cases 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 This test case shall be used to measure the trace overhead. Example command to run the performance test case. echo "trace_perf" | ./build/app/test/dpdk-test -c 0x3 --trace=.* Signed-off-by: Jerin Jacob --- app/test/Makefile | 1 + app/test/meson.build | 1 + app/test/test_trace_perf.c | 183 +++++++++++++++++++++++++++++++++++++ 3 files changed, 185 insertions(+) create mode 100644 app/test/test_trace_perf.c diff --git a/app/test/Makefile b/app/test/Makefile index 9fb7b843f..0f990a0ae 100644 --- a/app/test/Makefile +++ b/app/test/Makefile @@ -150,6 +150,7 @@ SRCS-y += test_version.c SRCS-y += test_func_reentrancy.c SRCS-y += test_trace.c SRCS-y += test_trace_register.c +SRCS-y += test_trace_perf.c SRCS-y += test_service_cores.c ifeq ($(CONFIG_RTE_LIBRTE_PMD_RING),y) diff --git a/app/test/meson.build b/app/test/meson.build index 78023ee71..00dc6f540 100644 --- a/app/test/meson.build +++ b/app/test/meson.build @@ -123,6 +123,7 @@ test_sources = files('commands.c', 'test_ticketlock.c', 'test_trace.c', 'test_trace_register.c', + 'test_trace_perf.c', 'test_version.c', 'virtual_pmd.c' ) diff --git a/app/test/test_trace_perf.c b/app/test/test_trace_perf.c new file mode 100644 index 000000000..0f2fc22bd --- /dev/null +++ b/app/test/test_trace_perf.c @@ -0,0 +1,183 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(C) 2020 Marvell International Ltd. + */ + +#include +#include +#include +#include +#include +#include + +#include "test.h" +#include "test_trace.h" + +struct test_data; + +struct lcore_data { + volatile bool done; + volatile bool started; + uint64_t total_cycles; + uint64_t total_calls; +} __rte_cache_aligned; + +struct test_data { + unsigned int nb_workers; + struct lcore_data ldata[]; +} __rte_cache_aligned; + +#define STEP 100 +#define CENT_OPS(OP) do { \ +OP; OP; OP; OP; OP; OP; OP; OP; OP; OP;\ +OP; OP; OP; OP; OP; OP; OP; OP; OP; OP;\ +OP; OP; OP; OP; OP; OP; OP; OP; OP; OP;\ +OP; OP; OP; OP; OP; OP; OP; OP; OP; OP;\ +OP; OP; OP; OP; OP; OP; OP; OP; OP; OP;\ +OP; OP; OP; OP; OP; OP; OP; OP; OP; OP;\ +OP; OP; OP; OP; OP; OP; OP; OP; OP; OP;\ +OP; OP; OP; OP; OP; OP; OP; OP; OP; OP;\ +OP; OP; OP; OP; OP; OP; OP; OP; OP; OP;\ +OP; OP; OP; OP; OP; OP; OP; OP; OP; OP;\ +} while (0) + +static void +measure_perf(const char *str, struct test_data *data) +{ + uint64_t hz = rte_get_timer_hz(); + uint64_t total_cycles = 0; + uint64_t total_calls = 0; + double cycles, ns; + unsigned int workers; + + for (workers = 0; workers < data->nb_workers; workers++) { + total_cycles += data->ldata[workers].total_cycles; + total_calls += data->ldata[workers].total_calls; + } + + cycles = total_calls ? (double)total_cycles / (double)total_calls : 0; + cycles /= STEP; + cycles /= 100; /* CENT_OPS */ + + ns = (cycles / (double)hz) * 1E9; + printf("%16s: cycles=%f ns=%f\n", str, cycles, ns); +} + +static void +wait_till_workers_are_ready(struct test_data *data) +{ + unsigned int workers; + + for (workers = 0; workers < data->nb_workers; workers++) + while (!data->ldata[workers].started) + rte_pause(); +} + +static void +signal_workers_to_finish(struct test_data *data) +{ + unsigned int workers; + + for (workers = 0; workers < data->nb_workers; workers++) { + data->ldata[workers].done = 1; + rte_smp_wmb(); + } +} + +#define WORKER_DEFINE(func)\ +static void __rte_noinline \ +__worker_##func(struct lcore_data *ldata)\ +{\ + uint64_t start;\ + int i;\ + while (!ldata->done) {\ + start = rte_get_timer_cycles();\ + for (i = 0; i < STEP; i++)\ + CENT_OPS(func);\ + ldata->total_cycles += rte_get_timer_cycles() - start;\ + ldata->total_calls++;\ + } \ +} \ +static int \ +worker_fn_##func(void *arg)\ +{\ + struct lcore_data *ldata = arg;\ + ldata->started = 1;\ + rte_smp_wmb();\ + __worker_##func(ldata);\ + return 0;\ +} + + +/* Test to find trace overhead */ +#define GENERIC_VOID rte_trace_lib_eal_generic_void() +#define GENERIC_U64 rte_trace_lib_eal_generic_u64(0x120000) +#define GENERIC_INT rte_trace_lib_eal_generic_int(-34) +#define GENERIC_FLOAT rte_trace_lib_eal_generic_float(3.3f) +#define GENERIC_DOUBLE rte_trace_lib_eal_generic_double(3.66666) +#define GENERIC_STR rte_trace_lib_eal_generic_str("hello world") +#define VOID_FP app_dpdk_test_fp() + +WORKER_DEFINE(GENERIC_VOID) +WORKER_DEFINE(GENERIC_U64) +WORKER_DEFINE(GENERIC_INT) +WORKER_DEFINE(GENERIC_FLOAT) +WORKER_DEFINE(GENERIC_DOUBLE) +WORKER_DEFINE(GENERIC_STR) +WORKER_DEFINE(VOID_FP) + +static void +run_test(const char *str, lcore_function_t f, struct test_data *data, size_t sz) +{ + unsigned int id, worker = 0; + + memset(data, 0, sz); + data->nb_workers = rte_lcore_count() - 1; + RTE_LCORE_FOREACH_SLAVE(id) + rte_eal_remote_launch(f, &data->ldata[worker++], id); + + wait_till_workers_are_ready(data); + rte_delay_ms(100); /* Wait for some time to accumulate the stats */ + measure_perf(str, data); + signal_workers_to_finish(data); + + RTE_LCORE_FOREACH_SLAVE(id) + rte_eal_wait_lcore(id); +} + +static int +test_trace_perf(void) +{ + unsigned int nb_cores, nb_workers; + struct test_data *data; + size_t sz; + + nb_cores = rte_lcore_count(); + nb_workers = nb_cores - 1; + if (nb_cores < 2) { + printf("Need minimum two cores for testing\n"); + return TEST_SKIPPED; + } + + printf("Timer running at %5.2fMHz\n", rte_get_timer_hz()/1E6); + sz = sizeof(struct test_data); + sz += nb_workers * sizeof(struct lcore_data); + + data = rte_zmalloc(NULL, sz, RTE_CACHE_LINE_SIZE); + if (data == NULL) { + printf("Failed to allocate memory\n"); + return TEST_FAILED; + } + + run_test("void", worker_fn_GENERIC_VOID, data, sz); + run_test("u64", worker_fn_GENERIC_U64, data, sz); + run_test("int", worker_fn_GENERIC_INT, data, sz); + run_test("float", worker_fn_GENERIC_FLOAT, data, sz); + run_test("double", worker_fn_GENERIC_DOUBLE, data, sz); + run_test("string", worker_fn_GENERIC_STR, data, sz); + run_test("void_fp", worker_fn_VOID_FP, data, sz); + + rte_free(data); + return TEST_SUCCESS; +} + +REGISTER_TEST_COMMAND(trace_perf, test_trace_perf); From patchwork Sun Apr 19 10:01:29 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: 68900 X-Patchwork-Delegate: david.marchand@redhat.com 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 91818A0561; Sun, 19 Apr 2020 12:10:34 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id A940B1D690; Sun, 19 Apr 2020 12:03:54 +0200 (CEST) Received: from mx0b-0016f401.pphosted.com (mx0b-0016f401.pphosted.com [67.231.156.173]) by dpdk.org (Postfix) with ESMTP id 9927B1D662 for ; Sun, 19 Apr 2020 12:03:38 +0200 (CEST) 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 03JA18hi020147; Sun, 19 Apr 2020 03:03:33 -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=+AqOj8y+enUmmNzWRm4nrs4juHoRDYHddExZN+gfKBc=; b=RwAwZ22ZMC3h16RnZmbwZ6+ij1V28gqmVTwbJ+NGealCSWf7wf3wpNZqFij+RY5BXcbe SF7PUQSe0gXs3Q7ywb0Sk43qunq9+HnmXKmoSsEp+OlBhtPeSmYmpHmKLjma9cK2qriV Qwj1ZvPv7yo7CGt0hvOqIVDVyEgKINL0b1CaHlBKWK2Y2MuQJgALMWY2y15ngHNrVD6b c63ViEwl9KkINtST3lwyvpAvO2HFUrv0YGKsDW7DdfGJjRkL14PgdHErAE0Gn2nbx9mq jSA+OZXqUh/MID8MT5hhunotjRKBE63PlPgTgNRL+ihH10YnikywSRZDV7O15xWpH4UI OA== Received: from sc-exch03.marvell.com ([199.233.58.183]) by mx0b-0016f401.pphosted.com with ESMTP id 30g12njxfm-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT); Sun, 19 Apr 2020 03:03:32 -0700 Received: from DC5-EXCH01.marvell.com (10.69.176.38) by SC-EXCH03.marvell.com (10.93.176.83) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Sun, 19 Apr 2020 03:03:30 -0700 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.2 via Frontend Transport; Sun, 19 Apr 2020 03:03:30 -0700 Received: from jerin-lab.marvell.com (jerin-lab.marvell.com [10.28.34.14]) by maili.marvell.com (Postfix) with ESMTP id D45903F703F; Sun, 19 Apr 2020 03:03:21 -0700 (PDT) From: To: Olivier Matz , David Hunt , Marko Kovacevic , Ori Kam , Bruce Richardson , Radu Nicolau , Akhil Goyal , Tomasz Kantecki , Sunil Kumar Kori , "Pavan Nikhilesh" , Harry van Haaren , Konstantin Ananyev , Anatoly Burakov , Xiaoyun Li , Jingjing Wu , Reshma Pattan , John McNamara , Kirill Rybalchenko , Cristian Dumitrescu , Jasvinder Singh , Byron Marohn , "Yipeng Wang" , Robert Sanford , "Erik Gabriel Carrillo" , Thomas Monjalon , Ferruh Yigit , "Andrew Rybchenko" CC: , , Date: Sun, 19 Apr 2020 15:31:29 +0530 Message-ID: <20200419100133.3232316-30-jerinj@marvell.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200419100133.3232316-1-jerinj@marvell.com> References: <20200413150116.734047-1-jerinj@marvell.com> <20200419100133.3232316-1-jerinj@marvell.com> MIME-Version: 1.0 X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:6.0.138, 18.0.676 definitions=2020-04-19_02:2020-04-17, 2020-04-19 signatures=0 Subject: [dpdk-dev] [PATCH v6 29/33] ethdev: add tracepoints 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: Sunil Kumar Kori Add tracepoints at important and mandatory APIs for tracing support. Signed-off-by: Sunil Kumar Kori --- examples/cmdline/Makefile | 1 + examples/cmdline/meson.build | 1 + examples/distributor/Makefile | 1 + examples/distributor/meson.build | 1 + examples/ethtool/ethtool-app/Makefile | 1 + examples/eventdev_pipeline/meson.build | 1 + examples/flow_filtering/Makefile | 1 + examples/flow_filtering/meson.build | 1 + examples/helloworld/Makefile | 1 + examples/helloworld/meson.build | 1 + examples/ioat/Makefile | 1 + examples/ioat/meson.build | 1 + examples/ip_fragmentation/Makefile | 2 + examples/ip_fragmentation/meson.build | 1 + examples/ip_reassembly/Makefile | 1 + examples/ip_reassembly/meson.build | 1 + examples/ipv4_multicast/Makefile | 1 + examples/ipv4_multicast/meson.build | 1 + examples/l2fwd-cat/Makefile | 1 + examples/l2fwd-cat/meson.build | 1 + examples/l2fwd-event/Makefile | 1 + examples/l2fwd-event/meson.build | 1 + examples/l2fwd-jobstats/Makefile | 1 + examples/l2fwd-jobstats/meson.build | 1 + examples/l2fwd-keepalive/Makefile | 1 + examples/l2fwd-keepalive/ka-agent/Makefile | 1 + examples/l2fwd-keepalive/meson.build | 1 + examples/l3fwd-acl/Makefile | 1 + examples/l3fwd-acl/meson.build | 1 + examples/l3fwd/Makefile | 1 + examples/l3fwd/meson.build | 1 + examples/link_status_interrupt/Makefile | 1 + examples/link_status_interrupt/meson.build | 1 + .../client_server_mp/mp_client/Makefile | 1 + .../client_server_mp/mp_client/meson.build | 1 + .../client_server_mp/mp_server/meson.build | 1 + examples/multi_process/hotplug_mp/Makefile | 1 + examples/multi_process/hotplug_mp/meson.build | 1 + examples/multi_process/simple_mp/Makefile | 1 + examples/multi_process/simple_mp/meson.build | 1 + examples/multi_process/symmetric_mp/Makefile | 1 + .../multi_process/symmetric_mp/meson.build | 1 + examples/ntb/Makefile | 1 + examples/ntb/meson.build | 1 + examples/packet_ordering/Makefile | 1 + examples/packet_ordering/meson.build | 1 + .../performance-thread/l3fwd-thread/Makefile | 1 + .../l3fwd-thread/meson.build | 1 + .../performance-thread/pthread_shim/Makefile | 1 + .../pthread_shim/meson.build | 1 + examples/ptpclient/Makefile | 1 + examples/ptpclient/meson.build | 1 + examples/qos_meter/Makefile | 1 + examples/qos_meter/meson.build | 1 + examples/qos_sched/Makefile | 1 + examples/qos_sched/meson.build | 1 + examples/server_node_efd/node/Makefile | 1 + examples/server_node_efd/node/meson.build | 1 + examples/server_node_efd/server/Makefile | 1 + examples/server_node_efd/server/meson.build | 1 + examples/service_cores/Makefile | 1 + examples/service_cores/meson.build | 1 + examples/skeleton/Makefile | 1 + examples/skeleton/meson.build | 1 + examples/timer/Makefile | 1 + examples/timer/meson.build | 1 + examples/vm_power_manager/Makefile | 1 + examples/vm_power_manager/meson.build | 1 + examples/vmdq/Makefile | 1 + examples/vmdq/meson.build | 1 + examples/vmdq_dcb/Makefile | 1 + examples/vmdq_dcb/meson.build | 1 + lib/librte_ethdev/Makefile | 3 + lib/librte_ethdev/ethdev_trace_points.c | 43 ++++++++ lib/librte_ethdev/meson.build | 5 +- lib/librte_ethdev/rte_ethdev.c | 12 +++ lib/librte_ethdev/rte_ethdev.h | 5 + lib/librte_ethdev/rte_ethdev_version.map | 10 ++ lib/librte_ethdev/rte_trace_ethdev.h | 97 +++++++++++++++++++ lib/librte_ethdev/rte_trace_ethdev_fp.h | 44 +++++++++ 80 files changed, 291 insertions(+), 1 deletion(-) create mode 100644 lib/librte_ethdev/ethdev_trace_points.c create mode 100644 lib/librte_ethdev/rte_trace_ethdev.h create mode 100644 lib/librte_ethdev/rte_trace_ethdev_fp.h diff --git a/examples/cmdline/Makefile b/examples/cmdline/Makefile index 0b6b54540..9a33355d0 100644 --- a/examples/cmdline/Makefile +++ b/examples/cmdline/Makefile @@ -57,6 +57,7 @@ SRCS-y := main.c commands.c parse_obj_list.c CFLAGS += -O3 CFLAGS += $(WERROR_FLAGS) +CFLAGS += -DALLOW_EXPERIMENTAL_API include $(RTE_SDK)/mk/rte.extapp.mk diff --git a/examples/cmdline/meson.build b/examples/cmdline/meson.build index a8608c21a..7de0f1625 100644 --- a/examples/cmdline/meson.build +++ b/examples/cmdline/meson.build @@ -6,6 +6,7 @@ # To build this example as a standalone application with an already-installed # DPDK instance, use 'make' +allow_experimental_apis = true sources = files( 'commands.c', 'main.c', 'parse_obj_list.c' ) diff --git a/examples/distributor/Makefile b/examples/distributor/Makefile index 4192d8a4a..63c14dfca 100644 --- a/examples/distributor/Makefile +++ b/examples/distributor/Makefile @@ -50,6 +50,7 @@ RTE_TARGET ?= $(notdir $(abspath $(dir $(firstword $(wildcard $(RTE_SDK)/*/.conf include $(RTE_SDK)/mk/rte.vars.mk CFLAGS += $(WERROR_FLAGS) +CFLAGS += -DALLOW_EXPERIMENTAL_API # workaround for a gcc bug with noreturn attribute # http://gcc.gnu.org/bugzilla/show_bug.cgi?id=12603 diff --git a/examples/distributor/meson.build b/examples/distributor/meson.build index 26f108d65..9fec7f883 100644 --- a/examples/distributor/meson.build +++ b/examples/distributor/meson.build @@ -9,6 +9,7 @@ # require the power library build = dpdk_conf.has('RTE_LIBRTE_POWER') +allow_experimental_apis = true deps += ['distributor', 'power'] sources = files( 'main.c' diff --git a/examples/ethtool/ethtool-app/Makefile b/examples/ethtool/ethtool-app/Makefile index 3543bdee0..20ac0d324 100644 --- a/examples/ethtool/ethtool-app/Makefile +++ b/examples/ethtool/ethtool-app/Makefile @@ -18,6 +18,7 @@ SRCS-y := main.c ethapp.c CFLAGS += -O3 -pthread -I$(SRCDIR)/../lib CFLAGS += $(WERROR_FLAGS) +CFLAGS += -DALLOW_EXPERIMENTAL_API LDLIBS += -L$(subst ethtool-app,lib,$(RTE_OUTPUT))/lib LDLIBS += -lrte_ethtool diff --git a/examples/eventdev_pipeline/meson.build b/examples/eventdev_pipeline/meson.build index a54c35aa7..1dfeba0d3 100644 --- a/examples/eventdev_pipeline/meson.build +++ b/examples/eventdev_pipeline/meson.build @@ -6,6 +6,7 @@ # To build this example as a standalone application with an already-installed # DPDK instance, use 'make' +allow_experimental_apis = true deps += 'eventdev' sources = files( 'main.c', diff --git a/examples/flow_filtering/Makefile b/examples/flow_filtering/Makefile index 6c51c0b7a..e0d546de9 100644 --- a/examples/flow_filtering/Makefile +++ b/examples/flow_filtering/Makefile @@ -49,6 +49,7 @@ include $(RTE_SDK)/mk/rte.vars.mk CFLAGS += -O3 CFLAGS += $(WERROR_FLAGS) +CFLAGS += -DALLOW_EXPERIMENTAL_API include $(RTE_SDK)/mk/rte.extapp.mk diff --git a/examples/flow_filtering/meson.build b/examples/flow_filtering/meson.build index 407795c42..6f5d1b08a 100644 --- a/examples/flow_filtering/meson.build +++ b/examples/flow_filtering/meson.build @@ -6,6 +6,7 @@ # To build this example as a standalone application with an already-installed # DPDK instance, use 'make' +allow_experimental_apis = true sources = files( 'main.c', ) diff --git a/examples/helloworld/Makefile b/examples/helloworld/Makefile index 16d82b02f..0f5af0806 100644 --- a/examples/helloworld/Makefile +++ b/examples/helloworld/Makefile @@ -51,6 +51,7 @@ include $(RTE_SDK)/mk/rte.vars.mk CFLAGS += -O3 CFLAGS += $(WERROR_FLAGS) +CFLAGS += -DALLOW_EXPERIMENTAL_API include $(RTE_SDK)/mk/rte.extapp.mk diff --git a/examples/helloworld/meson.build b/examples/helloworld/meson.build index c34e11e36..2b0a25036 100644 --- a/examples/helloworld/meson.build +++ b/examples/helloworld/meson.build @@ -6,6 +6,7 @@ # To build this example as a standalone application with an already-installed # DPDK instance, use 'make' +allow_experimental_apis = true sources = files( 'main.c' ) diff --git a/examples/ioat/Makefile b/examples/ioat/Makefile index ef63f5d68..9b277eb7b 100644 --- a/examples/ioat/Makefile +++ b/examples/ioat/Makefile @@ -51,6 +51,7 @@ include $(RTE_SDK)/mk/rte.vars.mk CFLAGS += -O3 CFLAGS += $(WERROR_FLAGS) +CFLAGS += -DALLOW_EXPERIMENTAL_API include $(RTE_SDK)/mk/rte.extapp.mk endif diff --git a/examples/ioat/meson.build b/examples/ioat/meson.build index ed8328963..f72cf70e7 100644 --- a/examples/ioat/meson.build +++ b/examples/ioat/meson.build @@ -6,6 +6,7 @@ # To build this example as a standalone application with an already-installed # DPDK instance, use 'make' +allow_experimental_apis = true build = dpdk_conf.has('RTE_LIBRTE_PMD_IOAT_RAWDEV') deps += ['rawdev_ioat'] diff --git a/examples/ip_fragmentation/Makefile b/examples/ip_fragmentation/Makefile index ede0c4f02..8babbbf82 100644 --- a/examples/ip_fragmentation/Makefile +++ b/examples/ip_fragmentation/Makefile @@ -22,6 +22,7 @@ PKGCONF ?= pkg-config PC_FILE := $(shell $(PKGCONF) --path libdpdk 2>/dev/null) CFLAGS += -O3 $(shell $(PKGCONF) --cflags libdpdk) +CFLAGS += -DALLOW_EXPERIMENTAL_API LDFLAGS_SHARED = $(shell $(PKGCONF) --libs libdpdk) LDFLAGS_STATIC = -Wl,-Bstatic $(shell $(PKGCONF) --static --libs libdpdk) @@ -52,6 +53,7 @@ include $(RTE_SDK)/mk/rte.vars.mk CFLAGS += -O3 CFLAGS += $(WERROR_FLAGS) +CFLAGS += -DALLOW_EXPERIMENTAL_API # workaround for a gcc bug with noreturn attribute # http://gcc.gnu.org/bugzilla/show_bug.cgi?id=12603 diff --git a/examples/ip_fragmentation/meson.build b/examples/ip_fragmentation/meson.build index 304203eed..1230db477 100644 --- a/examples/ip_fragmentation/meson.build +++ b/examples/ip_fragmentation/meson.build @@ -6,6 +6,7 @@ # To build this example as a standalone application with an already-installed # DPDK instance, use 'make' +allow_experimental_apis = true deps += ['ip_frag', 'lpm'] sources = files( 'main.c' diff --git a/examples/ip_reassembly/Makefile b/examples/ip_reassembly/Makefile index 3f2888b33..11be2a74a 100644 --- a/examples/ip_reassembly/Makefile +++ b/examples/ip_reassembly/Makefile @@ -52,6 +52,7 @@ include $(RTE_SDK)/mk/rte.vars.mk CFLAGS += -O3 CFLAGS += $(WERROR_FLAGS) +CFLAGS += -DALLOW_EXPERIMENTAL_API # workaround for a gcc bug with noreturn attribute # http://gcc.gnu.org/bugzilla/show_bug.cgi?id=12603 diff --git a/examples/ip_reassembly/meson.build b/examples/ip_reassembly/meson.build index 8ebd48291..517bd4e19 100644 --- a/examples/ip_reassembly/meson.build +++ b/examples/ip_reassembly/meson.build @@ -6,6 +6,7 @@ # To build this example as a standalone application with an already-installed # DPDK instance, use 'make' +allow_experimental_apis = true deps += ['lpm', 'ip_frag'] sources = files( 'main.c' diff --git a/examples/ipv4_multicast/Makefile b/examples/ipv4_multicast/Makefile index 92d3db0f4..b9f0813ed 100644 --- a/examples/ipv4_multicast/Makefile +++ b/examples/ipv4_multicast/Makefile @@ -52,6 +52,7 @@ include $(RTE_SDK)/mk/rte.vars.mk CFLAGS += -O3 CFLAGS += $(WERROR_FLAGS) +CFLAGS += -DALLOW_EXPERIMENTAL_API # workaround for a gcc bug with noreturn attribute # http://gcc.gnu.org/bugzilla/show_bug.cgi?id=12603 diff --git a/examples/ipv4_multicast/meson.build b/examples/ipv4_multicast/meson.build index d9e4c7c21..7dc13fb8f 100644 --- a/examples/ipv4_multicast/meson.build +++ b/examples/ipv4_multicast/meson.build @@ -6,6 +6,7 @@ # To build this example as a standalone application with an already-installed # DPDK instance, use 'make' +allow_experimental_apis = true deps += 'hash' sources = files( 'main.c' diff --git a/examples/l2fwd-cat/Makefile b/examples/l2fwd-cat/Makefile index b0e53c37e..ca1202be1 100644 --- a/examples/l2fwd-cat/Makefile +++ b/examples/l2fwd-cat/Makefile @@ -56,6 +56,7 @@ RTE_TARGET ?= $(notdir $(abspath $(dir $(firstword $(wildcard $(RTE_SDK)/*/.conf include $(RTE_SDK)/mk/rte.vars.mk CFLAGS += $(WERROR_FLAGS) +CFLAGS += -DALLOW_EXPERIMENTAL_API # workaround for a gcc bug with noreturn attribute # http://gcc.gnu.org/bugzilla/show_bug.cgi?id=12603 diff --git a/examples/l2fwd-cat/meson.build b/examples/l2fwd-cat/meson.build index 4e2777a03..2bed18e74 100644 --- a/examples/l2fwd-cat/meson.build +++ b/examples/l2fwd-cat/meson.build @@ -9,6 +9,7 @@ pqos = cc.find_library('pqos', required: false) build = pqos.found() ext_deps += pqos +allow_experimental_apis = true cflags += '-I/usr/local/include' # assume pqos lib installed in /usr/local sources = files( 'cat.c', 'l2fwd-cat.c' diff --git a/examples/l2fwd-event/Makefile b/examples/l2fwd-event/Makefile index 4cdae36f1..807f7f1b8 100644 --- a/examples/l2fwd-event/Makefile +++ b/examples/l2fwd-event/Makefile @@ -57,6 +57,7 @@ include $(RTE_SDK)/mk/rte.vars.mk CFLAGS += -O3 CFLAGS += $(WERROR_FLAGS) +CFLAGS += -DALLOW_EXPERIMENTAL_API include $(RTE_SDK)/mk/rte.extapp.mk endif diff --git a/examples/l2fwd-event/meson.build b/examples/l2fwd-event/meson.build index 4e9a069d6..4a546eaf8 100644 --- a/examples/l2fwd-event/meson.build +++ b/examples/l2fwd-event/meson.build @@ -7,6 +7,7 @@ # To build this example as a standalone application with an already-installed # DPDK instance, use 'make' +allow_experimental_apis = true deps += 'eventdev' sources = files( 'main.c', diff --git a/examples/l2fwd-jobstats/Makefile b/examples/l2fwd-jobstats/Makefile index 73c91faa8..6cd9dcd9c 100644 --- a/examples/l2fwd-jobstats/Makefile +++ b/examples/l2fwd-jobstats/Makefile @@ -52,6 +52,7 @@ include $(RTE_SDK)/mk/rte.vars.mk CFLAGS += -O3 CFLAGS += $(WERROR_FLAGS) +CFLAGS += -DALLOW_EXPERIMENTAL_API include $(RTE_SDK)/mk/rte.extapp.mk endif diff --git a/examples/l2fwd-jobstats/meson.build b/examples/l2fwd-jobstats/meson.build index 1ffd484e2..72273736b 100644 --- a/examples/l2fwd-jobstats/meson.build +++ b/examples/l2fwd-jobstats/meson.build @@ -6,6 +6,7 @@ # To build this example as a standalone application with an already-installed # DPDK instance, use 'make' +allow_experimental_apis = true deps += ['jobstats', 'timer'] sources = files( 'main.c' diff --git a/examples/l2fwd-keepalive/Makefile b/examples/l2fwd-keepalive/Makefile index 94d1e58bb..0db5e6015 100644 --- a/examples/l2fwd-keepalive/Makefile +++ b/examples/l2fwd-keepalive/Makefile @@ -53,6 +53,7 @@ include $(RTE_SDK)/mk/rte.vars.mk CFLAGS += -O3 CFLAGS += $(WERROR_FLAGS) +CFLAGS += -DALLOW_EXPERIMENTAL_API LDFLAGS += -lrt include $(RTE_SDK)/mk/rte.extapp.mk diff --git a/examples/l2fwd-keepalive/ka-agent/Makefile b/examples/l2fwd-keepalive/ka-agent/Makefile index 755e47438..8d5061b17 100644 --- a/examples/l2fwd-keepalive/ka-agent/Makefile +++ b/examples/l2fwd-keepalive/ka-agent/Makefile @@ -17,5 +17,6 @@ APP = ka-agent SRCS-y := main.c CFLAGS += $(WERROR_FLAGS) -I$(SRCDIR)/../ +CFLAGS += -DALLOW_EXPERIMENTAL_API LDFLAGS += -lrt include $(RTE_SDK)/mk/rte.extapp.mk diff --git a/examples/l2fwd-keepalive/meson.build b/examples/l2fwd-keepalive/meson.build index 6f7b007e1..d678a8ddd 100644 --- a/examples/l2fwd-keepalive/meson.build +++ b/examples/l2fwd-keepalive/meson.build @@ -6,6 +6,7 @@ # To build this example as a standalone application with an already-installed # DPDK instance, use 'make' +allow_experimental_apis = true ext_deps += cc.find_library('rt') deps += 'timer' sources = files( diff --git a/examples/l3fwd-acl/Makefile b/examples/l3fwd-acl/Makefile index d9909584b..9f31abef8 100644 --- a/examples/l3fwd-acl/Makefile +++ b/examples/l3fwd-acl/Makefile @@ -51,6 +51,7 @@ include $(RTE_SDK)/mk/rte.vars.mk CFLAGS += -O3 CFLAGS += $(WERROR_FLAGS) +CFLAGS += -DALLOW_EXPERIMENTAL_API # workaround for a gcc bug with noreturn attribute # http://gcc.gnu.org/bugzilla/show_bug.cgi?id=12603 diff --git a/examples/l3fwd-acl/meson.build b/examples/l3fwd-acl/meson.build index 7096e00c1..6fa468b3a 100644 --- a/examples/l3fwd-acl/meson.build +++ b/examples/l3fwd-acl/meson.build @@ -6,6 +6,7 @@ # To build this example as a standalone application with an already-installed # DPDK instance, use 'make' +allow_experimental_apis = true deps += ['acl', 'lpm', 'hash'] sources = files( 'main.c' diff --git a/examples/l3fwd/Makefile b/examples/l3fwd/Makefile index 59a110d12..839439f0f 100644 --- a/examples/l3fwd/Makefile +++ b/examples/l3fwd/Makefile @@ -53,6 +53,7 @@ include $(RTE_SDK)/mk/rte.vars.mk CFLAGS += -I$(SRCDIR) CFLAGS += -O3 $(USER_FLAGS) CFLAGS += $(WERROR_FLAGS) +CFLAGS += -DALLOW_EXPERIMENTAL_API include $(RTE_SDK)/mk/rte.extapp.mk endif diff --git a/examples/l3fwd/meson.build b/examples/l3fwd/meson.build index ebed3b518..7d72b1b36 100644 --- a/examples/l3fwd/meson.build +++ b/examples/l3fwd/meson.build @@ -6,6 +6,7 @@ # To build this example as a standalone application with an already-installed # DPDK instance, use 'make' +allow_experimental_apis = true deps += ['hash', 'lpm', 'eventdev'] sources = files( 'l3fwd_em.c', 'l3fwd_lpm.c', 'l3fwd_event.c', diff --git a/examples/link_status_interrupt/Makefile b/examples/link_status_interrupt/Makefile index 4f02a8901..613bb1167 100644 --- a/examples/link_status_interrupt/Makefile +++ b/examples/link_status_interrupt/Makefile @@ -51,6 +51,7 @@ include $(RTE_SDK)/mk/rte.vars.mk CFLAGS += -O3 CFLAGS += $(WERROR_FLAGS) +CFLAGS += -DALLOW_EXPERIMENTAL_API include $(RTE_SDK)/mk/rte.extapp.mk endif diff --git a/examples/link_status_interrupt/meson.build b/examples/link_status_interrupt/meson.build index c34e11e36..2b0a25036 100644 --- a/examples/link_status_interrupt/meson.build +++ b/examples/link_status_interrupt/meson.build @@ -6,6 +6,7 @@ # To build this example as a standalone application with an already-installed # DPDK instance, use 'make' +allow_experimental_apis = true sources = files( 'main.c' ) diff --git a/examples/multi_process/client_server_mp/mp_client/Makefile b/examples/multi_process/client_server_mp/mp_client/Makefile index 298e1b020..7c447feba 100644 --- a/examples/multi_process/client_server_mp/mp_client/Makefile +++ b/examples/multi_process/client_server_mp/mp_client/Makefile @@ -16,5 +16,6 @@ SRCS-y := client.c CFLAGS += $(WERROR_FLAGS) -O3 CFLAGS += -I$(SRCDIR)/../shared +CFLAGS += -DALLOW_EXPERIMENTAL_API include $(RTE_SDK)/mk/rte.extapp.mk diff --git a/examples/multi_process/client_server_mp/mp_client/meson.build b/examples/multi_process/client_server_mp/mp_client/meson.build index a6241b83a..69c3d3bfb 100644 --- a/examples/multi_process/client_server_mp/mp_client/meson.build +++ b/examples/multi_process/client_server_mp/mp_client/meson.build @@ -8,6 +8,7 @@ includes += include_directories('../shared') +allow_experimental_apis = true sources = files( 'client.c' ) diff --git a/examples/multi_process/client_server_mp/mp_server/meson.build b/examples/multi_process/client_server_mp/mp_server/meson.build index 1b2f78638..0ef6424f4 100644 --- a/examples/multi_process/client_server_mp/mp_server/meson.build +++ b/examples/multi_process/client_server_mp/mp_server/meson.build @@ -8,6 +8,7 @@ includes += include_directories('../shared') +allow_experimental_apis = true sources = files( 'args.c', 'init.c', 'main.c' ) diff --git a/examples/multi_process/hotplug_mp/Makefile b/examples/multi_process/hotplug_mp/Makefile index 3ff74d52a..1fd7aa085 100644 --- a/examples/multi_process/hotplug_mp/Makefile +++ b/examples/multi_process/hotplug_mp/Makefile @@ -18,5 +18,6 @@ SRCS-y := main.c commands.c CFLAGS += -O3 CFLAGS += $(WERROR_FLAGS) +CFLAGS += -DALLOW_EXPERIMENTAL_API include $(RTE_SDK)/mk/rte.extapp.mk diff --git a/examples/multi_process/hotplug_mp/meson.build b/examples/multi_process/hotplug_mp/meson.build index 076f4e3dc..f82f4d48a 100644 --- a/examples/multi_process/hotplug_mp/meson.build +++ b/examples/multi_process/hotplug_mp/meson.build @@ -6,6 +6,7 @@ # To build this example as a standalone application with an already-installed # DPDK instance, use 'make' +allow_experimental_apis = true sources = files( 'commands.c', 'main.c' ) diff --git a/examples/multi_process/simple_mp/Makefile b/examples/multi_process/simple_mp/Makefile index 4c0764451..f88b499bd 100644 --- a/examples/multi_process/simple_mp/Makefile +++ b/examples/multi_process/simple_mp/Makefile @@ -18,5 +18,6 @@ SRCS-y := main.c mp_commands.c CFLAGS += -O3 CFLAGS += $(WERROR_FLAGS) +CFLAGS += -DALLOW_EXPERIMENTAL_API include $(RTE_SDK)/mk/rte.extapp.mk diff --git a/examples/multi_process/simple_mp/meson.build b/examples/multi_process/simple_mp/meson.build index b2261e00e..cb02c65a6 100644 --- a/examples/multi_process/simple_mp/meson.build +++ b/examples/multi_process/simple_mp/meson.build @@ -6,6 +6,7 @@ # To build this example as a standalone application with an already-installed # DPDK instance, use 'make' +allow_experimental_apis = true sources = files( 'mp_commands.c', 'main.c' ) diff --git a/examples/multi_process/symmetric_mp/Makefile b/examples/multi_process/symmetric_mp/Makefile index bdc415621..b7544489b 100644 --- a/examples/multi_process/symmetric_mp/Makefile +++ b/examples/multi_process/symmetric_mp/Makefile @@ -18,5 +18,6 @@ SRCS-y := main.c CFLAGS += -O3 CFLAGS += $(WERROR_FLAGS) +CFLAGS += -DALLOW_EXPERIMENTAL_API include $(RTE_SDK)/mk/rte.extapp.mk diff --git a/examples/multi_process/symmetric_mp/meson.build b/examples/multi_process/symmetric_mp/meson.build index 458f83642..14167825b 100644 --- a/examples/multi_process/symmetric_mp/meson.build +++ b/examples/multi_process/symmetric_mp/meson.build @@ -6,6 +6,7 @@ # To build this example as a standalone application with an already-installed # DPDK instance, use 'make' +allow_experimental_apis = true sources = files( 'main.c' ) diff --git a/examples/ntb/Makefile b/examples/ntb/Makefile index baeba11e8..f2920ed54 100644 --- a/examples/ntb/Makefile +++ b/examples/ntb/Makefile @@ -25,6 +25,7 @@ LDFLAGS += -pthread PC_FILE := $(shell $(PKGCONF) --path libdpdk 2>/dev/null) CFLAGS += -O3 $(shell $(PKGCONF) --cflags libdpdk) +CFLAGS += -DALLOW_EXPERIMENTAL_API LDFLAGS_SHARED = $(shell $(PKGCONF) --libs libdpdk) LDFLAGS_STATIC = -Wl,-Bstatic $(shell $(PKGCONF) --static --libs libdpdk) diff --git a/examples/ntb/meson.build b/examples/ntb/meson.build index f5435fe12..ab449d093 100644 --- a/examples/ntb/meson.build +++ b/examples/ntb/meson.build @@ -6,6 +6,7 @@ # To build this example as a standalone application with an already-installed # DPDK instance, use 'make' +allow_experimental_apis = true if host_machine.system() != 'linux' build = false endif diff --git a/examples/packet_ordering/Makefile b/examples/packet_ordering/Makefile index 261b7f06a..f5b68c97e 100644 --- a/examples/packet_ordering/Makefile +++ b/examples/packet_ordering/Makefile @@ -51,6 +51,7 @@ include $(RTE_SDK)/mk/rte.vars.mk CFLAGS += -O3 CFLAGS += $(WERROR_FLAGS) +CFLAGS += -DALLOW_EXPERIMENTAL_API include $(RTE_SDK)/mk/rte.extapp.mk endif diff --git a/examples/packet_ordering/meson.build b/examples/packet_ordering/meson.build index 6c2fccdcb..b38195914 100644 --- a/examples/packet_ordering/meson.build +++ b/examples/packet_ordering/meson.build @@ -6,6 +6,7 @@ # To build this example as a standalone application with an already-installed # DPDK instance, use 'make' +allow_experimental_apis = true deps += 'reorder' sources = files( 'main.c' diff --git a/examples/performance-thread/l3fwd-thread/Makefile b/examples/performance-thread/l3fwd-thread/Makefile index b14b21e30..c6cf05a43 100644 --- a/examples/performance-thread/l3fwd-thread/Makefile +++ b/examples/performance-thread/l3fwd-thread/Makefile @@ -19,5 +19,6 @@ SRCS-y := main.c include $(RTE_SDK)/examples/performance-thread/common/common.mk CFLAGS += -O3 -g $(USER_FLAGS) $(INCLUDES) $(WERROR_FLAGS) +CFLAGS += -DALLOW_EXPERIMENTAL_API include $(RTE_SDK)/mk/rte.extapp.mk diff --git a/examples/performance-thread/l3fwd-thread/meson.build b/examples/performance-thread/l3fwd-thread/meson.build index 185fa59a4..99de24be7 100644 --- a/examples/performance-thread/l3fwd-thread/meson.build +++ b/examples/performance-thread/l3fwd-thread/meson.build @@ -8,6 +8,7 @@ build = dpdk_conf.has('RTE_ARCH_X86_64') deps += ['timer', 'lpm'] +allow_experimental_apis = true # get the performance thread (pt) architecture subdir if dpdk_conf.has('RTE_ARCH_ARM64') diff --git a/examples/performance-thread/pthread_shim/Makefile b/examples/performance-thread/pthread_shim/Makefile index efd66febf..cdadf2cb7 100644 --- a/examples/performance-thread/pthread_shim/Makefile +++ b/examples/performance-thread/pthread_shim/Makefile @@ -20,6 +20,7 @@ include $(RTE_SDK)/examples/performance-thread/common/common.mk CFLAGS += -g -O3 $(USER_FLAGS) $(INCLUDES) CFLAGS += $(WERROR_FLAGS) +CFLAGS += -DALLOW_EXPERIMENTAL_API LDFLAGS += -lpthread diff --git a/examples/performance-thread/pthread_shim/meson.build b/examples/performance-thread/pthread_shim/meson.build index 393fbd122..26ef78635 100644 --- a/examples/performance-thread/pthread_shim/meson.build +++ b/examples/performance-thread/pthread_shim/meson.build @@ -8,6 +8,7 @@ build = dpdk_conf.has('RTE_ARCH_X86_64') or dpdk_conf.has('RTE_ARCH_ARM64') deps += ['timer'] +allow_experimental_apis = true # get the performance thread (pt) architecture subdir if dpdk_conf.has('RTE_ARCH_ARM64') diff --git a/examples/ptpclient/Makefile b/examples/ptpclient/Makefile index 82d72b3e3..7cd36632a 100644 --- a/examples/ptpclient/Makefile +++ b/examples/ptpclient/Makefile @@ -51,6 +51,7 @@ include $(RTE_SDK)/mk/rte.vars.mk CFLAGS += -O3 CFLAGS += $(WERROR_FLAGS) +CFLAGS += -DALLOW_EXPERIMENTAL_API # workaround for a gcc bug with noreturn attribute # http://gcc.gnu.org/bugzilla/show_bug.cgi?id=12603 diff --git a/examples/ptpclient/meson.build b/examples/ptpclient/meson.build index fa0cbe93c..d4171a218 100644 --- a/examples/ptpclient/meson.build +++ b/examples/ptpclient/meson.build @@ -6,6 +6,7 @@ # To build this example as a standalone application with an already-installed # DPDK instance, use 'make' +allow_experimental_apis = true sources = files( 'ptpclient.c' ) diff --git a/examples/qos_meter/Makefile b/examples/qos_meter/Makefile index 7c2bf88a9..90e3533d1 100644 --- a/examples/qos_meter/Makefile +++ b/examples/qos_meter/Makefile @@ -53,6 +53,7 @@ include $(RTE_SDK)/mk/rte.vars.mk CFLAGS += -O3 CFLAGS += $(WERROR_FLAGS) +CFLAGS += -DALLOW_EXPERIMENTAL_API # workaround for a gcc bug with noreturn attribute # http://gcc.gnu.org/bugzilla/show_bug.cgi?id=12603 diff --git a/examples/qos_meter/meson.build b/examples/qos_meter/meson.build index ef7779f2f..2f9ab13af 100644 --- a/examples/qos_meter/meson.build +++ b/examples/qos_meter/meson.build @@ -6,6 +6,7 @@ # To build this example as a standalone application with an already-installed # DPDK instance, use 'make' +allow_experimental_apis = true deps += 'meter' sources = files( 'main.c', 'rte_policer.c' diff --git a/examples/qos_sched/Makefile b/examples/qos_sched/Makefile index 525061ca0..92e3de79b 100644 --- a/examples/qos_sched/Makefile +++ b/examples/qos_sched/Makefile @@ -58,6 +58,7 @@ else CFLAGS += -O3 CFLAGS += $(WERROR_FLAGS) +CFLAGS += -DALLOW_EXPERIMENTAL_API include $(RTE_SDK)/mk/rte.extapp.mk diff --git a/examples/qos_sched/meson.build b/examples/qos_sched/meson.build index 289b81ce8..ba59d3c9e 100644 --- a/examples/qos_sched/meson.build +++ b/examples/qos_sched/meson.build @@ -6,6 +6,7 @@ # To build this example as a standalone application with an already-installed # DPDK instance, use 'make' +allow_experimental_apis = true deps += ['sched', 'cfgfile'] sources = files( 'app_thread.c', 'args.c', 'cfg_file.c', 'cmdline.c', diff --git a/examples/server_node_efd/node/Makefile b/examples/server_node_efd/node/Makefile index fffbe3576..ecc551e1d 100644 --- a/examples/server_node_efd/node/Makefile +++ b/examples/server_node_efd/node/Makefile @@ -16,5 +16,6 @@ SRCS-y := node.c CFLAGS += $(WERROR_FLAGS) -O3 CFLAGS += -I$(SRCDIR)/../shared +CFLAGS += -DALLOW_EXPERIMENTAL_API include $(RTE_SDK)/mk/rte.extapp.mk diff --git a/examples/server_node_efd/node/meson.build b/examples/server_node_efd/node/meson.build index 30f28761f..1c720968a 100644 --- a/examples/server_node_efd/node/meson.build +++ b/examples/server_node_efd/node/meson.build @@ -8,6 +8,7 @@ name = 'efd_node' +allow_experimental_apis = true deps += ['hash'] sources += files('node.c') includes += include_directories('../shared') diff --git a/examples/server_node_efd/server/Makefile b/examples/server_node_efd/server/Makefile index 4837bd3ea..acbd12ae2 100644 --- a/examples/server_node_efd/server/Makefile +++ b/examples/server_node_efd/server/Makefile @@ -25,5 +25,6 @@ INC := $(sort $(wildcard *.h)) CFLAGS += $(WERROR_FLAGS) -O3 CFLAGS += -I$(SRCDIR)/../shared +CFLAGS += -DALLOW_EXPERIMENTAL_API include $(RTE_SDK)/mk/rte.extapp.mk diff --git a/examples/server_node_efd/server/meson.build b/examples/server_node_efd/server/meson.build index 23e08d1ae..7abc333e1 100644 --- a/examples/server_node_efd/server/meson.build +++ b/examples/server_node_efd/server/meson.build @@ -8,6 +8,7 @@ name = 'efd_server' +allow_experimental_apis = true deps += 'efd' sources += files('args.c', 'init.c', 'main.c') includes += include_directories('../shared') diff --git a/examples/service_cores/Makefile b/examples/service_cores/Makefile index c47055813..aac207bd9 100644 --- a/examples/service_cores/Makefile +++ b/examples/service_cores/Makefile @@ -50,6 +50,7 @@ RTE_TARGET ?= $(notdir $(abspath $(dir $(firstword $(wildcard $(RTE_SDK)/*/.conf include $(RTE_SDK)/mk/rte.vars.mk CFLAGS += $(WERROR_FLAGS) +CFLAGS += -DALLOW_EXPERIMENTAL_API # workaround for a gcc bug with noreturn attribute # http://gcc.gnu.org/bugzilla/show_bug.cgi?id=12603 diff --git a/examples/service_cores/meson.build b/examples/service_cores/meson.build index c34e11e36..2b0a25036 100644 --- a/examples/service_cores/meson.build +++ b/examples/service_cores/meson.build @@ -6,6 +6,7 @@ # To build this example as a standalone application with an already-installed # DPDK instance, use 'make' +allow_experimental_apis = true sources = files( 'main.c' ) diff --git a/examples/skeleton/Makefile b/examples/skeleton/Makefile index 2c29004d7..2612688c0 100644 --- a/examples/skeleton/Makefile +++ b/examples/skeleton/Makefile @@ -50,6 +50,7 @@ RTE_TARGET ?= $(notdir $(abspath $(dir $(firstword $(wildcard $(RTE_SDK)/*/.conf include $(RTE_SDK)/mk/rte.vars.mk CFLAGS += $(WERROR_FLAGS) +CFLAGS += -DALLOW_EXPERIMENTAL_API # workaround for a gcc bug with noreturn attribute # http://gcc.gnu.org/bugzilla/show_bug.cgi?id=12603 diff --git a/examples/skeleton/meson.build b/examples/skeleton/meson.build index 9bb9ec329..ef46b187e 100644 --- a/examples/skeleton/meson.build +++ b/examples/skeleton/meson.build @@ -6,6 +6,7 @@ # To build this example as a standalone application with an already-installed # DPDK instance, use 'make' +allow_experimental_apis = true sources = files( 'basicfwd.c' ) diff --git a/examples/timer/Makefile b/examples/timer/Makefile index bf86339ab..e58e90a28 100644 --- a/examples/timer/Makefile +++ b/examples/timer/Makefile @@ -51,6 +51,7 @@ include $(RTE_SDK)/mk/rte.vars.mk CFLAGS += -O3 CFLAGS += $(WERROR_FLAGS) +CFLAGS += -DALLOW_EXPERIMENTAL_API # workaround for a gcc bug with noreturn attribute # http://gcc.gnu.org/bugzilla/show_bug.cgi?id=12603 diff --git a/examples/timer/meson.build b/examples/timer/meson.build index c3d901637..87c21a867 100644 --- a/examples/timer/meson.build +++ b/examples/timer/meson.build @@ -6,6 +6,7 @@ # To build this example as a standalone application with an already-installed # DPDK instance, use 'make' +allow_experimental_apis = true deps += 'timer' sources = files( 'main.c' diff --git a/examples/vm_power_manager/Makefile b/examples/vm_power_manager/Makefile index 2fdb991d7..65c2ad179 100644 --- a/examples/vm_power_manager/Makefile +++ b/examples/vm_power_manager/Makefile @@ -28,6 +28,7 @@ endif CFLAGS += -O3 -I$(RTE_SDK)/lib/librte_power/ CFLAGS += $(WERROR_FLAGS) +CFLAGS += -DALLOW_EXPERIMENTAL_API LDLIBS += -lvirt diff --git a/examples/vm_power_manager/meson.build b/examples/vm_power_manager/meson.build index 20a4a05b3..54e2b584f 100644 --- a/examples/vm_power_manager/meson.build +++ b/examples/vm_power_manager/meson.build @@ -25,6 +25,7 @@ if dpdk_conf.has('RTE_LIBRTE_IXGBE_PMD') deps += ['pmd_ixgbe'] endif +allow_experimental_apis = true sources = files( 'channel_manager.c', 'channel_monitor.c', 'main.c', 'parse.c', 'power_manager.c', 'vm_power_cli.c' ) diff --git a/examples/vmdq/Makefile b/examples/vmdq/Makefile index 0767c715a..98e644fa7 100644 --- a/examples/vmdq/Makefile +++ b/examples/vmdq/Makefile @@ -50,6 +50,7 @@ RTE_TARGET ?= $(notdir $(abspath $(dir $(firstword $(wildcard $(RTE_SDK)/*/.conf include $(RTE_SDK)/mk/rte.vars.mk CFLAGS += $(WERROR_FLAGS) +CFLAGS += -DALLOW_EXPERIMENTAL_API EXTRA_CFLAGS += -O3 diff --git a/examples/vmdq/meson.build b/examples/vmdq/meson.build index c34e11e36..2b0a25036 100644 --- a/examples/vmdq/meson.build +++ b/examples/vmdq/meson.build @@ -6,6 +6,7 @@ # To build this example as a standalone application with an already-installed # DPDK instance, use 'make' +allow_experimental_apis = true sources = files( 'main.c' ) diff --git a/examples/vmdq_dcb/Makefile b/examples/vmdq_dcb/Makefile index 2a9b04143..3eb7c9f43 100644 --- a/examples/vmdq_dcb/Makefile +++ b/examples/vmdq_dcb/Makefile @@ -50,6 +50,7 @@ RTE_TARGET ?= $(notdir $(abspath $(dir $(firstword $(wildcard $(RTE_SDK)/*/.conf include $(RTE_SDK)/mk/rte.vars.mk CFLAGS += $(WERROR_FLAGS) +CFLAGS += -DALLOW_EXPERIMENTAL_API # workaround for a gcc bug with noreturn attribute # http://gcc.gnu.org/bugzilla/show_bug.cgi?id=12603 diff --git a/examples/vmdq_dcb/meson.build b/examples/vmdq_dcb/meson.build index c34e11e36..2b0a25036 100644 --- a/examples/vmdq_dcb/meson.build +++ b/examples/vmdq_dcb/meson.build @@ -6,6 +6,7 @@ # To build this example as a standalone application with an already-installed # DPDK instance, use 'make' +allow_experimental_apis = true sources = files( 'main.c' ) diff --git a/lib/librte_ethdev/Makefile b/lib/librte_ethdev/Makefile index 943fb8c87..dbc03f264 100644 --- a/lib/librte_ethdev/Makefile +++ b/lib/librte_ethdev/Makefile @@ -22,6 +22,7 @@ SRCS-y += rte_flow.c SRCS-y += rte_tm.c SRCS-y += rte_mtr.c SRCS-y += ethdev_profile.c +SRCS-y += ethdev_trace_points.c # # Export include files @@ -39,5 +40,7 @@ SYMLINK-y-include += rte_tm.h SYMLINK-y-include += rte_tm_driver.h SYMLINK-y-include += rte_mtr.h SYMLINK-y-include += rte_mtr_driver.h +SYMLINK-y-include += rte_trace_ethdev.h +SYMLINK-y-include += rte_trace_ethdev_fp.h include $(RTE_SDK)/mk/rte.lib.mk diff --git a/lib/librte_ethdev/ethdev_trace_points.c b/lib/librte_ethdev/ethdev_trace_points.c new file mode 100644 index 000000000..3cb79e6d6 --- /dev/null +++ b/lib/librte_ethdev/ethdev_trace_points.c @@ -0,0 +1,43 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(C) 2020 Marvell International Ltd. + */ + +#define RTE_TRACE_POINT_REGISTER_SELECT /* Select trace point register macros */ + +#include + +RTE_TRACE_POINT_DEFINE(rte_trace_lib_ethdev_configure); +RTE_TRACE_POINT_DEFINE(rte_trace_lib_ethdev_rxq_setup); +RTE_TRACE_POINT_DEFINE(rte_trace_lib_ethdev_txq_setup); +RTE_TRACE_POINT_DEFINE(rte_trace_lib_ethdev_start); +RTE_TRACE_POINT_DEFINE(rte_trace_lib_ethdev_stop); +RTE_TRACE_POINT_DEFINE(rte_trace_lib_ethdev_close); +RTE_TRACE_POINT_DEFINE(rte_trace_lib_ethdev_rx_burst); +RTE_TRACE_POINT_DEFINE(rte_trace_lib_ethdev_tx_burst); + +RTE_INIT(ethdev_trace_init) +{ + RTE_TRACE_POINT_REGISTER(rte_trace_lib_ethdev_configure, + lib.ethdev.configure); + + RTE_TRACE_POINT_REGISTER(rte_trace_lib_ethdev_rxq_setup, + lib.ethdev.rxq.setup); + + RTE_TRACE_POINT_REGISTER(rte_trace_lib_ethdev_txq_setup, + lib.ethdev.txq.setup); + + RTE_TRACE_POINT_REGISTER(rte_trace_lib_ethdev_start, + lib.ethdev.start); + + RTE_TRACE_POINT_REGISTER(rte_trace_lib_ethdev_stop, + lib.ethdev.stop); + + RTE_TRACE_POINT_REGISTER(rte_trace_lib_ethdev_close, + lib.ethdev.close); + + RTE_TRACE_POINT_REGISTER(rte_trace_lib_ethdev_rx_burst, + lib.ethdev.rx.burst); + + RTE_TRACE_POINT_REGISTER(rte_trace_lib_ethdev_tx_burst, + lib.ethdev.tx.burst); +} diff --git a/lib/librte_ethdev/meson.build b/lib/librte_ethdev/meson.build index ab341d9c0..f73b760fc 100644 --- a/lib/librte_ethdev/meson.build +++ b/lib/librte_ethdev/meson.build @@ -4,6 +4,7 @@ name = 'ethdev' sources = files('ethdev_private.c', 'ethdev_profile.c', + 'ethdev_trace_points.c', 'rte_class_eth.c', 'rte_ethdev.c', 'rte_flow.c', @@ -22,6 +23,8 @@ headers = files('rte_ethdev.h', 'rte_mtr.h', 'rte_mtr_driver.h', 'rte_tm.h', - 'rte_tm_driver.h') + 'rte_tm_driver.h', + 'rte_trace_ethdev.h', + 'rte_trace_ethdev_fp.h') deps += ['net', 'kvargs', 'meter'] diff --git a/lib/librte_ethdev/rte_ethdev.c b/lib/librte_ethdev/rte_ethdev.c index 0854ef883..bf7d842cc 100644 --- a/lib/librte_ethdev/rte_ethdev.c +++ b/lib/librte_ethdev/rte_ethdev.c @@ -39,6 +39,7 @@ #include #include +#include "rte_trace_ethdev.h" #include "rte_ethdev.h" #include "rte_ethdev_driver.h" #include "ethdev_profile.h" @@ -1470,6 +1471,7 @@ rte_eth_dev_configure(uint16_t port_id, uint16_t nb_rx_q, uint16_t nb_tx_q, goto reset_queues; } + rte_trace_lib_ethdev_configure(port_id, nb_rx_q, nb_tx_q, dev_conf, 0); return 0; reset_queues: rte_eth_dev_rx_queue_config(dev, 0); @@ -1477,6 +1479,8 @@ rte_eth_dev_configure(uint16_t port_id, uint16_t nb_rx_q, uint16_t nb_tx_q, rollback: memcpy(&dev->data->dev_conf, &orig_conf, sizeof(dev->data->dev_conf)); + rte_trace_lib_ethdev_configure(port_id, nb_rx_q, nb_tx_q, dev_conf, + ret); return ret; } @@ -1647,6 +1651,8 @@ rte_eth_dev_start(uint16_t port_id) RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->link_update, -ENOTSUP); (*dev->dev_ops->link_update)(dev, 0); } + + rte_trace_lib_ethdev_start(port_id); return 0; } @@ -1669,6 +1675,7 @@ rte_eth_dev_stop(uint16_t port_id) dev->data->dev_started = 0; (*dev->dev_ops->dev_stop)(dev); + rte_trace_lib_ethdev_stop(port_id); } int @@ -1709,6 +1716,7 @@ rte_eth_dev_close(uint16_t port_id) dev->data->dev_started = 0; (*dev->dev_ops->dev_close)(dev); + rte_trace_lib_ethdev_close(port_id); /* check behaviour flag - temporary for PMD migration */ if ((dev->data->dev_flags & RTE_ETH_DEV_CLOSE_REMOVE) != 0) { /* new behaviour: send event + reset state + free all data */ @@ -1918,6 +1926,8 @@ rte_eth_rx_queue_setup(uint16_t port_id, uint16_t rx_queue_id, dev->data->min_rx_buf_size = mbp_buf_size; } + rte_trace_lib_ethdev_rxq_setup(port_id, rx_queue_id, nb_rx_desc, mp, + rx_conf, ret); return eth_err(port_id, ret); } @@ -2088,6 +2098,8 @@ rte_eth_tx_queue_setup(uint16_t port_id, uint16_t tx_queue_id, return -EINVAL; } + rte_trace_lib_ethdev_txq_setup(port_id, tx_queue_id, nb_tx_desc, + tx_conf); return eth_err(port_id, (*dev->dev_ops->tx_queue_setup)(dev, tx_queue_id, nb_tx_desc, socket_id, &local_conf)); } diff --git a/lib/librte_ethdev/rte_ethdev.h b/lib/librte_ethdev/rte_ethdev.h index e9e3a1699..12a192b7a 100644 --- a/lib/librte_ethdev/rte_ethdev.h +++ b/lib/librte_ethdev/rte_ethdev.h @@ -158,6 +158,7 @@ extern "C" { #include #include +#include "rte_trace_ethdev_fp.h" #include "rte_dev_info.h" extern int rte_eth_dev_logtype; @@ -4400,6 +4401,8 @@ rte_eth_rx_burst(uint16_t port_id, uint16_t queue_id, } #endif + rte_trace_lib_ethdev_rx_burst(port_id, queue_id, (void **)rx_pkts, + nb_rx); return nb_rx; } @@ -4663,6 +4666,8 @@ rte_eth_tx_burst(uint16_t port_id, uint16_t queue_id, } #endif + rte_trace_lib_ethdev_tx_burst(port_id, queue_id, (void **)tx_pkts, + nb_pkts); return (*dev->tx_pkt_burst)(dev->data->tx_queues[queue_id], tx_pkts, nb_pkts); } diff --git a/lib/librte_ethdev/rte_ethdev_version.map b/lib/librte_ethdev/rte_ethdev_version.map index 3f32fdecf..28c07117c 100644 --- a/lib/librte_ethdev/rte_ethdev_version.map +++ b/lib/librte_ethdev/rte_ethdev_version.map @@ -230,4 +230,14 @@ EXPERIMENTAL { # added in 20.02 rte_flow_dev_dump; + + # added in 20.05 + __rte_trace_lib_ethdev_configure; + __rte_trace_lib_ethdev_rxq_setup; + __rte_trace_lib_ethdev_txq_setup; + __rte_trace_lib_ethdev_start; + __rte_trace_lib_ethdev_stop; + __rte_trace_lib_ethdev_close; + __rte_trace_lib_ethdev_rx_burst; + __rte_trace_lib_ethdev_tx_burst; }; diff --git a/lib/librte_ethdev/rte_trace_ethdev.h b/lib/librte_ethdev/rte_trace_ethdev.h new file mode 100644 index 000000000..c10fddd9d --- /dev/null +++ b/lib/librte_ethdev/rte_trace_ethdev.h @@ -0,0 +1,97 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(C) 2020 Marvell International Ltd. + */ + +#ifndef _RTE_TRACE_ETHDEV_H_ +#define _RTE_TRACE_ETHDEV_H_ + +/** + * @file + * + * API for ethdev trace support + */ + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +#include "rte_ethdev.h" + +RTE_TRACE_POINT( + rte_trace_lib_ethdev_configure, + RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t nb_rx_q, + uint16_t nb_tx_q, + const struct rte_eth_conf *dev_conf, + int rc), + rte_trace_point_emit_u16(port_id); + rte_trace_point_emit_u16(nb_rx_q); + rte_trace_point_emit_u16(nb_tx_q); + rte_trace_point_emit_u32(dev_conf->link_speeds); + rte_trace_point_emit_u32(dev_conf->rxmode.mq_mode); + rte_trace_point_emit_u32(dev_conf->rxmode.max_rx_pkt_len); + rte_trace_point_emit_u64(dev_conf->rxmode.offloads); + rte_trace_point_emit_u32(dev_conf->txmode.mq_mode); + rte_trace_point_emit_u64(dev_conf->txmode.offloads); + rte_trace_point_emit_u32(dev_conf->lpbk_mode); + rte_trace_point_emit_int(rc); +) + +RTE_TRACE_POINT( + rte_trace_lib_ethdev_rxq_setup, + RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t rx_queue_id, + uint16_t nb_rx_desc, void *mp, + const struct rte_eth_rxconf *rx_conf, int rc), + rte_trace_point_emit_u16(port_id); + rte_trace_point_emit_u16(rx_queue_id); + rte_trace_point_emit_u16(nb_rx_desc); + rte_trace_point_emit_ptr(mp); + rte_trace_point_emit_u8(rx_conf->rx_thresh.pthresh); + rte_trace_point_emit_u8(rx_conf->rx_thresh.hthresh); + rte_trace_point_emit_u8(rx_conf->rx_thresh.wthresh); + rte_trace_point_emit_u8(rx_conf->rx_drop_en); + rte_trace_point_emit_u8(rx_conf->rx_deferred_start); + rte_trace_point_emit_u64(rx_conf->offloads); + rte_trace_point_emit_int(rc); +) + +RTE_TRACE_POINT( + rte_trace_lib_ethdev_txq_setup, + RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t tx_queue_id, + uint16_t nb_tx_desc, + const struct rte_eth_txconf *tx_conf), + rte_trace_point_emit_u16(port_id); + rte_trace_point_emit_u16(tx_queue_id); + rte_trace_point_emit_u16(nb_tx_desc); + rte_trace_point_emit_u8(tx_conf->tx_thresh.pthresh); + rte_trace_point_emit_u8(tx_conf->tx_thresh.hthresh); + rte_trace_point_emit_u8(tx_conf->tx_thresh.wthresh); + rte_trace_point_emit_u8(tx_conf->tx_deferred_start); + rte_trace_point_emit_u16(tx_conf->tx_free_thresh); + rte_trace_point_emit_u64(tx_conf->offloads); +) + +RTE_TRACE_POINT( + rte_trace_lib_ethdev_start, + RTE_TRACE_POINT_ARGS(uint16_t port_id), + rte_trace_point_emit_u16(port_id); +) + +RTE_TRACE_POINT( + rte_trace_lib_ethdev_stop, + RTE_TRACE_POINT_ARGS(uint16_t port_id), + rte_trace_point_emit_u16(port_id); +) + +RTE_TRACE_POINT( + rte_trace_lib_ethdev_close, + RTE_TRACE_POINT_ARGS(uint16_t port_id), + rte_trace_point_emit_u16(port_id); +) + +#ifdef __cplusplus +} +#endif + +#endif /* _RTE_TRACE_ETHDEV_H_ */ diff --git a/lib/librte_ethdev/rte_trace_ethdev_fp.h b/lib/librte_ethdev/rte_trace_ethdev_fp.h new file mode 100644 index 000000000..57b7af0fd --- /dev/null +++ b/lib/librte_ethdev/rte_trace_ethdev_fp.h @@ -0,0 +1,44 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(C) 2020 Marvell International Ltd. + */ + +#ifndef _RTE_TRACE_ETHDEV_FP_H_ +#define _RTE_TRACE_ETHDEV_FP_H_ + +/** + * @file + * + * API for ethdev trace support + */ + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +RTE_TRACE_POINT_FP( + rte_trace_lib_ethdev_rx_burst, + RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t queue_id, + void **pkt_tbl, uint16_t nb_rx), + rte_trace_point_emit_u16(port_id); + rte_trace_point_emit_u16(queue_id); + rte_trace_point_emit_ptr(pkt_tbl); + rte_trace_point_emit_u16(nb_rx); +) + +RTE_TRACE_POINT_FP( + rte_trace_lib_ethdev_tx_burst, + RTE_TRACE_POINT_ARGS(uint16_t port_id, uint16_t queue_id, + void **pkts_tbl, uint16_t nb_pkts), + rte_trace_point_emit_u16(port_id); + rte_trace_point_emit_u16(queue_id); + rte_trace_point_emit_ptr(pkts_tbl); + rte_trace_point_emit_u16(nb_pkts); +) + +#ifdef __cplusplus +} +#endif + +#endif /* _RTE_TRACE_ETHDEV_FP_H_ */ From patchwork Sun Apr 19 10:01:30 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: 68899 X-Patchwork-Delegate: david.marchand@redhat.com 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 3F2A6A0561; Sun, 19 Apr 2020 12:10:18 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 75DA01D64A; Sun, 19 Apr 2020 12:03:53 +0200 (CEST) Received: from mx0b-0016f401.pphosted.com (mx0a-0016f401.pphosted.com [67.231.148.174]) by dpdk.org (Postfix) with ESMTP id B79E91D663 for ; Sun, 19 Apr 2020 12:03:38 +0200 (CEST) Received: from pps.filterd (m0045849.ppops.net [127.0.0.1]) by mx0a-0016f401.pphosted.com (8.16.0.42/8.16.0.42) with SMTP id 03J9vQl6031337; Sun, 19 Apr 2020 03:03:37 -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=HlO/tYTuyks540CTNjKEqcRw4IkLij/rpx8LRF8Ovfg=; b=dsioa2Ka40Joe6kEua50p1bmiUCs7eZh1GUb+t1a4dhAfx2dqm2UANuOYPbepPG82XD2 WMKFcy11NX+MlgWSKTJy1yQ1kDGcD2bQk8BoQc1bxlmtT5HNtUUHaBDFhpnT9PDAvEtY xgYzexvH8JWxVwVglQujf0FZfF8VevwIyLaBZXhNee426JJI7dcAIPqEedw0GzsQ3sai l/WRmMvJl2rOjf2BsCEMa80lSG/Sm2OtZSPZBsWDhDeaiZiC3hTq9Q1KKRXferE79hdk wJElB4t44Tcyp8t9j8GmAUl7khdpPkA+xjb0Q3VfK/tnaJe5sWfq65J5JYFZ0K1UKoSG NA== Received: from sc-exch03.marvell.com ([199.233.58.183]) by mx0a-0016f401.pphosted.com with ESMTP id 30fxwp3d94-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT); Sun, 19 Apr 2020 03:03:36 -0700 Received: from DC5-EXCH02.marvell.com (10.69.176.39) by SC-EXCH03.marvell.com (10.93.176.83) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Sun, 19 Apr 2020 03:03:34 -0700 Received: from maili.marvell.com (10.69.176.80) by DC5-EXCH02.marvell.com (10.69.176.39) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Sun, 19 Apr 2020 03:03:34 -0700 Received: from jerin-lab.marvell.com (jerin-lab.marvell.com [10.28.34.14]) by maili.marvell.com (Postfix) with ESMTP id A99383F703F; Sun, 19 Apr 2020 03:03:31 -0700 (PDT) From: To: Jerin Jacob , Abhinandan Gujjar , Nikhil Rao , "Erik Gabriel Carrillo" CC: , , , , , Date: Sun, 19 Apr 2020 15:31:30 +0530 Message-ID: <20200419100133.3232316-31-jerinj@marvell.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200419100133.3232316-1-jerinj@marvell.com> References: <20200413150116.734047-1-jerinj@marvell.com> <20200419100133.3232316-1-jerinj@marvell.com> MIME-Version: 1.0 X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:6.0.138, 18.0.676 definitions=2020-04-19_02:2020-04-17, 2020-04-19 signatures=0 Subject: [dpdk-dev] [PATCH v6 30/33] eventdev: add tracepoints 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: Sunil Kumar Kori Add tracepoints at important and mandatory APIs for tracing support. Signed-off-by: Sunil Kumar Kori --- lib/librte_eventdev/Makefile | 3 + lib/librte_eventdev/eventdev_trace_points.c | 173 ++++++++++ lib/librte_eventdev/meson.build | 3 + .../rte_event_crypto_adapter.c | 10 + .../rte_event_eth_rx_adapter.c | 11 + .../rte_event_eth_tx_adapter.c | 13 +- .../rte_event_eth_tx_adapter.h | 2 + lib/librte_eventdev/rte_event_timer_adapter.c | 8 +- lib/librte_eventdev/rte_event_timer_adapter.h | 8 + lib/librte_eventdev/rte_eventdev.c | 9 + lib/librte_eventdev/rte_eventdev.h | 5 +- lib/librte_eventdev/rte_eventdev_version.map | 42 +++ lib/librte_eventdev/rte_trace_eventdev.h | 311 ++++++++++++++++++ lib/librte_eventdev/rte_trace_eventdev_fp.h | 85 +++++ 14 files changed, 679 insertions(+), 4 deletions(-) create mode 100644 lib/librte_eventdev/eventdev_trace_points.c create mode 100644 lib/librte_eventdev/rte_trace_eventdev.h create mode 100644 lib/librte_eventdev/rte_trace_eventdev_fp.h diff --git a/lib/librte_eventdev/Makefile b/lib/librte_eventdev/Makefile index c85c0d3cf..843016893 100644 --- a/lib/librte_eventdev/Makefile +++ b/lib/librte_eventdev/Makefile @@ -21,6 +21,7 @@ LDLIBS += -lrte_mbuf -lrte_cryptodev -lpthread # library source files SRCS-y += rte_eventdev.c SRCS-y += rte_event_ring.c +SRCS-y += eventdev_trace_points.c SRCS-y += rte_event_eth_rx_adapter.c SRCS-y += rte_event_timer_adapter.c SRCS-y += rte_event_crypto_adapter.c @@ -29,6 +30,8 @@ SRCS-y += rte_event_eth_tx_adapter.c # export include files SYMLINK-y-include += rte_eventdev.h SYMLINK-y-include += rte_eventdev_pmd.h +SYMLINK-y-include += rte_trace_eventdev.h +SYMLINK-y-include += rte_trace_eventdev_fp.h SYMLINK-y-include += rte_eventdev_pmd_pci.h SYMLINK-y-include += rte_eventdev_pmd_vdev.h SYMLINK-y-include += rte_event_ring.h diff --git a/lib/librte_eventdev/eventdev_trace_points.c b/lib/librte_eventdev/eventdev_trace_points.c new file mode 100644 index 000000000..76b49b420 --- /dev/null +++ b/lib/librte_eventdev/eventdev_trace_points.c @@ -0,0 +1,173 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(C) 2020 Marvell International Ltd. + */ + +#define RTE_TRACE_POINT_REGISTER_SELECT /* Select trace point register macros */ + +#include "rte_trace_eventdev.h" + +/* Eventdev trace points */ +RTE_TRACE_POINT_DEFINE(rte_trace_lib_eventdev_configure); +RTE_TRACE_POINT_DEFINE(rte_trace_lib_event_queue_setup); +RTE_TRACE_POINT_DEFINE(rte_trace_lib_event_port_setup); +RTE_TRACE_POINT_DEFINE(rte_trace_lib_event_port_link); +RTE_TRACE_POINT_DEFINE(rte_trace_lib_event_port_unlink); +RTE_TRACE_POINT_DEFINE(rte_trace_lib_eventdev_start); +RTE_TRACE_POINT_DEFINE(rte_trace_lib_eventdev_stop); +RTE_TRACE_POINT_DEFINE(rte_trace_lib_eventdev_close); +RTE_TRACE_POINT_DEFINE(rte_trace_lib_event_enq_burst); +RTE_TRACE_POINT_DEFINE(rte_trace_lib_event_deq_burst); + +/* Eventdev Rx adapter trace points */ +RTE_TRACE_POINT_DEFINE(rte_trace_lib_event_eth_rx_adapter_create); +RTE_TRACE_POINT_DEFINE(rte_trace_lib_event_eth_rx_adapter_free); +RTE_TRACE_POINT_DEFINE(rte_trace_lib_event_eth_rx_adapter_queue_add); +RTE_TRACE_POINT_DEFINE(rte_trace_lib_event_eth_rx_adapter_queue_del); +RTE_TRACE_POINT_DEFINE(rte_trace_lib_event_eth_rx_adapter_start); +RTE_TRACE_POINT_DEFINE(rte_trace_lib_event_eth_rx_adapter_stop); + +/* Eventdev Tx adapter trace points */ +RTE_TRACE_POINT_DEFINE(rte_trace_lib_event_eth_tx_adapter_create); +RTE_TRACE_POINT_DEFINE(rte_trace_lib_event_eth_tx_adapter_free); +RTE_TRACE_POINT_DEFINE(rte_trace_lib_event_eth_tx_adapter_queue_add); +RTE_TRACE_POINT_DEFINE(rte_trace_lib_event_eth_tx_adapter_queue_del); +RTE_TRACE_POINT_DEFINE(rte_trace_lib_event_eth_tx_adapter_start); +RTE_TRACE_POINT_DEFINE(rte_trace_lib_event_eth_tx_adapter_stop); +RTE_TRACE_POINT_DEFINE(rte_trace_lib_event_eth_tx_adapter_enqueue); + +/* Eventdev Timer adapter trace points */ +RTE_TRACE_POINT_DEFINE(rte_trace_lib_event_timer_adapter_create); +RTE_TRACE_POINT_DEFINE(rte_trace_lib_event_timer_adapter_start); +RTE_TRACE_POINT_DEFINE(rte_trace_lib_event_timer_adapter_stop); +RTE_TRACE_POINT_DEFINE(rte_trace_lib_event_timer_adapter_free); +RTE_TRACE_POINT_DEFINE(rte_trace_lib_event_timer_arm_burst); +RTE_TRACE_POINT_DEFINE(rte_trace_lib_event_timer_arm_tmo_tick_burst); +RTE_TRACE_POINT_DEFINE(rte_trace_lib_event_timer_cancel_burst); + +/* Eventdev Crypto adapter trace points */ +RTE_TRACE_POINT_DEFINE(rte_trace_lib_event_crypto_adapter_create); +RTE_TRACE_POINT_DEFINE(rte_trace_lib_event_crypto_adapter_free); +RTE_TRACE_POINT_DEFINE(rte_trace_lib_event_crypto_adapter_queue_pair_add); +RTE_TRACE_POINT_DEFINE(rte_trace_lib_event_crypto_adapter_queue_pair_del); +RTE_TRACE_POINT_DEFINE(rte_trace_lib_event_crypto_adapter_start); +RTE_TRACE_POINT_DEFINE(rte_trace_lib_event_crypto_adapter_stop); + +RTE_INIT(eventdev_trace_init) +{ + /* Eventdev trace points */ + RTE_TRACE_POINT_REGISTER(rte_trace_lib_eventdev_configure, + lib.eventdev.configure); + + RTE_TRACE_POINT_REGISTER(rte_trace_lib_event_queue_setup, + lib.eventdev.queue.setup); + + RTE_TRACE_POINT_REGISTER(rte_trace_lib_event_port_setup, + lib.eventdev.port.setup); + + RTE_TRACE_POINT_REGISTER(rte_trace_lib_event_port_link, + lib.eventdev.port.link); + + RTE_TRACE_POINT_REGISTER(rte_trace_lib_event_port_unlink, + lib.eventdev.port.unlink); + + RTE_TRACE_POINT_REGISTER(rte_trace_lib_eventdev_start, + lib.eventdev.start); + + RTE_TRACE_POINT_REGISTER(rte_trace_lib_eventdev_stop, + lib.eventdev.stop); + + RTE_TRACE_POINT_REGISTER(rte_trace_lib_eventdev_close, + lib.eventdev.close); + + RTE_TRACE_POINT_REGISTER(rte_trace_lib_event_enq_burst, + lib.eventdev.enq.burst); + + RTE_TRACE_POINT_REGISTER(rte_trace_lib_event_deq_burst, + lib.eventdev.deq.burst); + + + /* Eventdev Rx adapter trace points */ + RTE_TRACE_POINT_REGISTER(rte_trace_lib_event_eth_rx_adapter_create, + lib.eventdev.rx.adapter.create); + + RTE_TRACE_POINT_REGISTER(rte_trace_lib_event_eth_rx_adapter_free, + lib.eventdev.rx.adapter.free); + + RTE_TRACE_POINT_REGISTER(rte_trace_lib_event_eth_rx_adapter_queue_add, + lib.eventdev.rx.adapter.queue.add); + + RTE_TRACE_POINT_REGISTER(rte_trace_lib_event_eth_rx_adapter_queue_del, + lib.eventdev.rx.adapter.queue.del); + + RTE_TRACE_POINT_REGISTER(rte_trace_lib_event_eth_rx_adapter_start, + lib.eventdev.rx.adapter.start); + + RTE_TRACE_POINT_REGISTER(rte_trace_lib_event_eth_rx_adapter_stop, + lib.eventdev.rx.adapter.stop); + + /* Eventdev Tx adapter trace points */ + RTE_TRACE_POINT_REGISTER(rte_trace_lib_event_eth_tx_adapter_create, + lib.eventdev.tx.adapter.create); + + RTE_TRACE_POINT_REGISTER(rte_trace_lib_event_eth_tx_adapter_free, + lib.eventdev.tx.adapter.free); + + RTE_TRACE_POINT_REGISTER(rte_trace_lib_event_eth_tx_adapter_queue_add, + lib.eventdev.tx.adapter.queue.add); + + RTE_TRACE_POINT_REGISTER(rte_trace_lib_event_eth_tx_adapter_queue_del, + lib.eventdev.tx.adapter.queue.del); + + RTE_TRACE_POINT_REGISTER(rte_trace_lib_event_eth_tx_adapter_start, + lib.eventdev.tx.adapter.start); + + RTE_TRACE_POINT_REGISTER(rte_trace_lib_event_eth_tx_adapter_stop, + lib.eventdev.tx.adapter.stop); + + RTE_TRACE_POINT_REGISTER(rte_trace_lib_event_eth_tx_adapter_enqueue, + lib.eventdev.tx.adapter.enq); + + + /* Eventdev Timer adapter trace points */ + RTE_TRACE_POINT_REGISTER(rte_trace_lib_event_timer_adapter_create, + lib.eventdev.timer.create); + + RTE_TRACE_POINT_REGISTER(rte_trace_lib_event_timer_adapter_start, + lib.eventdev.timer.start); + + RTE_TRACE_POINT_REGISTER(rte_trace_lib_event_timer_adapter_stop, + lib.eventdev.timer.stop); + + RTE_TRACE_POINT_REGISTER(rte_trace_lib_event_timer_adapter_free, + lib.eventdev.timer.free); + + RTE_TRACE_POINT_REGISTER(rte_trace_lib_event_timer_arm_burst, + lib.eventdev.timer.burst); + + RTE_TRACE_POINT_REGISTER(rte_trace_lib_event_timer_arm_tmo_tick_burst, + lib.eventdev.timer.tick.burst); + + RTE_TRACE_POINT_REGISTER(rte_trace_lib_event_timer_cancel_burst, + lib.eventdev.timer.cancel); + + /* Eventdev Crypto adapter trace points */ + RTE_TRACE_POINT_REGISTER(rte_trace_lib_event_crypto_adapter_create, + lib.eventdev.crypto.create); + + RTE_TRACE_POINT_REGISTER(rte_trace_lib_event_crypto_adapter_free, + lib.eventdev.crypto.free); + + RTE_TRACE_POINT_REGISTER( + rte_trace_lib_event_crypto_adapter_queue_pair_add, + lib.eventdev.crypto.queue.add); + + RTE_TRACE_POINT_REGISTER( + rte_trace_lib_event_crypto_adapter_queue_pair_del, + lib.eventdev.crypto.queue.del); + + RTE_TRACE_POINT_REGISTER(rte_trace_lib_event_crypto_adapter_start, + lib.eventdev.crypto.start); + + RTE_TRACE_POINT_REGISTER(rte_trace_lib_event_crypto_adapter_stop, + lib.eventdev.crypto.stop); +} diff --git a/lib/librte_eventdev/meson.build b/lib/librte_eventdev/meson.build index 16d8240e9..a74c45d13 100644 --- a/lib/librte_eventdev/meson.build +++ b/lib/librte_eventdev/meson.build @@ -9,12 +9,15 @@ endif sources = files('rte_eventdev.c', 'rte_event_ring.c', + 'eventdev_trace_points.c', 'rte_event_eth_rx_adapter.c', 'rte_event_timer_adapter.c', 'rte_event_crypto_adapter.c', 'rte_event_eth_tx_adapter.c') headers = files('rte_eventdev.h', 'rte_eventdev_pmd.h', + 'rte_trace_eventdev.h', + 'rte_trace_eventdev_fp.h', 'rte_eventdev_pmd_pci.h', 'rte_eventdev_pmd_vdev.h', 'rte_event_ring.h', diff --git a/lib/librte_eventdev/rte_event_crypto_adapter.c b/lib/librte_eventdev/rte_event_crypto_adapter.c index 22d910816..5fbc75093 100644 --- a/lib/librte_eventdev/rte_event_crypto_adapter.c +++ b/lib/librte_eventdev/rte_event_crypto_adapter.c @@ -16,6 +16,7 @@ #include "rte_eventdev.h" #include "rte_eventdev_pmd.h" +#include "rte_trace_eventdev.h" #include "rte_event_crypto_adapter.h" #define BATCH_SIZE 32 @@ -267,6 +268,8 @@ rte_event_crypto_adapter_create_ext(uint8_t id, uint8_t dev_id, event_crypto_adapter[id] = adapter; + rte_trace_lib_event_crypto_adapter_create(id, dev_id, adapter, conf_arg, + mode); return 0; } @@ -314,6 +317,7 @@ rte_event_crypto_adapter_free(uint8_t id) return -EBUSY; } + rte_trace_lib_event_crypto_adapter_free(id, adapter); if (adapter->default_cb_arg) rte_free(adapter->conf_arg); rte_free(adapter->cdevs); @@ -874,6 +878,8 @@ rte_event_crypto_adapter_queue_pair_add(uint8_t id, rte_service_component_runstate_set(adapter->service_id, 1); } + rte_trace_lib_event_crypto_adapter_queue_pair_add(id, cdev_id, event, + queue_pair_id); return 0; } @@ -959,6 +965,8 @@ rte_event_crypto_adapter_queue_pair_del(uint8_t id, uint8_t cdev_id, adapter->nb_qps); } + rte_trace_lib_event_crypto_adapter_queue_pair_del(id, cdev_id, + queue_pair_id, ret); return ret; } @@ -1014,12 +1022,14 @@ rte_event_crypto_adapter_start(uint8_t id) if (adapter == NULL) return -EINVAL; + rte_trace_lib_event_crypto_adapter_start(id, adapter); return eca_adapter_ctrl(id, 1); } int rte_event_crypto_adapter_stop(uint8_t id) { + rte_trace_lib_event_crypto_adapter_stop(id); return eca_adapter_ctrl(id, 0); } diff --git a/lib/librte_eventdev/rte_event_eth_rx_adapter.c b/lib/librte_eventdev/rte_event_eth_rx_adapter.c index 95dd47820..aca4f9d8a 100644 --- a/lib/librte_eventdev/rte_event_eth_rx_adapter.c +++ b/lib/librte_eventdev/rte_event_eth_rx_adapter.c @@ -20,6 +20,7 @@ #include "rte_eventdev.h" #include "rte_eventdev_pmd.h" +#include "rte_trace_eventdev.h" #include "rte_event_eth_rx_adapter.h" #define BATCH_SIZE 32 @@ -1998,6 +1999,8 @@ rte_event_eth_rx_adapter_create_ext(uint8_t id, uint8_t dev_id, event_eth_rx_adapter[id] = rx_adapter; if (conf_cb == rxa_default_conf_cb) rx_adapter->default_cb_arg = 1; + rte_trace_lib_event_eth_rx_adapter_create(id, dev_id, conf_cb, + conf_arg); return 0; } @@ -2047,6 +2050,7 @@ rte_event_eth_rx_adapter_free(uint8_t id) rte_free(rx_adapter); event_eth_rx_adapter[id] = NULL; + rte_trace_lib_event_eth_rx_adapter_free(id); return 0; } @@ -2142,6 +2146,9 @@ rte_event_eth_rx_adapter_queue_add(uint8_t id, rte_spinlock_unlock(&rx_adapter->rx_lock); } + rte_trace_lib_event_eth_rx_adapter_queue_add(id, eth_dev_id, + rx_queue_id, queue_conf, + ret); if (ret) return ret; @@ -2263,18 +2270,22 @@ rte_event_eth_rx_adapter_queue_del(uint8_t id, uint16_t eth_dev_id, rxa_sw_adapter_queue_count(rx_adapter)); } + rte_trace_lib_event_eth_rx_adapter_queue_del(id, eth_dev_id, + rx_queue_id, ret); return ret; } int rte_event_eth_rx_adapter_start(uint8_t id) { + rte_trace_lib_event_eth_rx_adapter_start(id); return rxa_ctrl(id, 1); } int rte_event_eth_rx_adapter_stop(uint8_t id) { + rte_trace_lib_event_eth_rx_adapter_stop(id); return rxa_ctrl(id, 0); } diff --git a/lib/librte_eventdev/rte_event_eth_tx_adapter.c b/lib/librte_eventdev/rte_event_eth_tx_adapter.c index d02ef57f4..a6dbc655e 100644 --- a/lib/librte_eventdev/rte_event_eth_tx_adapter.c +++ b/lib/librte_eventdev/rte_event_eth_tx_adapter.c @@ -6,6 +6,7 @@ #include #include "rte_eventdev_pmd.h" +#include "rte_trace_eventdev.h" #include "rte_event_eth_tx_adapter.h" #define TXA_BATCH_SIZE 32 @@ -942,7 +943,8 @@ rte_event_eth_tx_adapter_create(uint8_t id, uint8_t dev_id, txa_dev_id_array[id] = TXA_INVALID_DEV_ID; return ret; } - + rte_trace_lib_event_eth_tx_adapter_create(id, dev_id, NULL, port_conf, + ret); txa_dev_id_array[id] = dev_id; return 0; } @@ -984,6 +986,8 @@ rte_event_eth_tx_adapter_create_ext(uint8_t id, uint8_t dev_id, return ret; } + rte_trace_lib_event_eth_tx_adapter_create(id, dev_id, conf_cb, conf_arg, + ret); txa_dev_id_array[id] = dev_id; return 0; } @@ -1012,6 +1016,7 @@ rte_event_eth_tx_adapter_free(uint8_t id) ret = txa_service_adapter_free(id); txa_dev_id_array[id] = TXA_INVALID_DEV_ID; + rte_trace_lib_event_eth_tx_adapter_free(id, ret); return ret; } @@ -1043,6 +1048,8 @@ rte_event_eth_tx_adapter_queue_add(uint8_t id, else ret = txa_service_queue_add(id, txa_evdev(id), eth_dev, queue); + rte_trace_lib_event_eth_tx_adapter_queue_add(id, eth_dev_id, queue, + ret); return ret; } @@ -1073,6 +1080,8 @@ rte_event_eth_tx_adapter_queue_del(uint8_t id, else ret = txa_service_queue_del(id, eth_dev, queue); + rte_trace_lib_event_eth_tx_adapter_queue_del(id, eth_dev_id, queue, + ret); return ret; } @@ -1094,6 +1103,7 @@ rte_event_eth_tx_adapter_start(uint8_t id) ret = txa_dev_start(id) ? txa_dev_start(id)(id, txa_evdev(id)) : 0; if (ret == 0) ret = txa_service_start(id); + rte_trace_lib_event_eth_tx_adapter_start(id, ret); return ret; } @@ -1154,5 +1164,6 @@ rte_event_eth_tx_adapter_stop(uint8_t id) ret = txa_dev_stop(id) ? txa_dev_stop(id)(id, txa_evdev(id)) : 0; if (ret == 0) ret = txa_service_stop(id); + rte_trace_lib_event_eth_tx_adapter_stop(id, ret); return ret; } diff --git a/lib/librte_eventdev/rte_event_eth_tx_adapter.h b/lib/librte_eventdev/rte_event_eth_tx_adapter.h index 93b717af9..f2154c01a 100644 --- a/lib/librte_eventdev/rte_event_eth_tx_adapter.h +++ b/lib/librte_eventdev/rte_event_eth_tx_adapter.h @@ -369,6 +369,8 @@ rte_event_eth_tx_adapter_enqueue(uint8_t dev_id, return 0; } #endif + rte_trace_lib_event_eth_tx_adapter_enqueue(dev_id, port_id, ev, + nb_events, flags); if (flags) return dev->txa_enqueue_same_dest(dev->data->ports[port_id], ev, nb_events); diff --git a/lib/librte_eventdev/rte_event_timer_adapter.c b/lib/librte_eventdev/rte_event_timer_adapter.c index 161e21a68..700e10afd 100644 --- a/lib/librte_eventdev/rte_event_timer_adapter.c +++ b/lib/librte_eventdev/rte_event_timer_adapter.c @@ -22,6 +22,7 @@ #include "rte_eventdev.h" #include "rte_eventdev_pmd.h" +#include "rte_trace_eventdev.h" #include "rte_event_timer_adapter.h" #include "rte_event_timer_adapter_pmd.h" @@ -228,6 +229,8 @@ rte_event_timer_adapter_create_ext( adapter->allocated = 1; + rte_trace_lib_event_timer_adapter_create(adapter_id, adapter, conf, + conf_cb); return adapter; free_memzone: @@ -272,7 +275,7 @@ rte_event_timer_adapter_start(const struct rte_event_timer_adapter *adapter) return ret; adapter->data->started = 1; - + rte_trace_lib_event_timer_adapter_start(adapter); return 0; } @@ -295,7 +298,7 @@ rte_event_timer_adapter_stop(const struct rte_event_timer_adapter *adapter) return ret; adapter->data->started = 0; - + rte_trace_lib_event_timer_adapter_stop(adapter); return 0; } @@ -379,6 +382,7 @@ rte_event_timer_adapter_free(struct rte_event_timer_adapter *adapter) adapter->data = NULL; adapter->allocated = 0; + rte_trace_lib_event_timer_adapter_free(adapter); return 0; } diff --git a/lib/librte_eventdev/rte_event_timer_adapter.h b/lib/librte_eventdev/rte_event_timer_adapter.h index 7f6dc5c29..d338b7738 100644 --- a/lib/librte_eventdev/rte_event_timer_adapter.h +++ b/lib/librte_eventdev/rte_event_timer_adapter.h @@ -115,6 +115,7 @@ extern "C" { #include #include "rte_eventdev.h" +#include "rte_trace_eventdev_fp.h" /** * Timer adapter clock source @@ -579,6 +580,8 @@ rte_event_timer_arm_burst(const struct rte_event_timer_adapter *adapter, ADAPTER_VALID_OR_ERR_RET(adapter, -EINVAL); FUNC_PTR_OR_ERR_RET(adapter->arm_burst, -EINVAL); #endif + rte_trace_lib_event_timer_arm_burst(adapter, (void **)evtims, + nb_evtims); return adapter->arm_burst(adapter, evtims, nb_evtims); } @@ -622,6 +625,9 @@ rte_event_timer_arm_tmo_tick_burst( ADAPTER_VALID_OR_ERR_RET(adapter, -EINVAL); FUNC_PTR_OR_ERR_RET(adapter->arm_tmo_tick_burst, -EINVAL); #endif + rte_trace_lib_event_timer_arm_tmo_tick_burst(adapter, timeout_ticks, + (void **)evtims, + nb_evtims); return adapter->arm_tmo_tick_burst(adapter, evtims, timeout_ticks, nb_evtims); } @@ -655,6 +661,8 @@ rte_event_timer_cancel_burst(const struct rte_event_timer_adapter *adapter, ADAPTER_VALID_OR_ERR_RET(adapter, -EINVAL); FUNC_PTR_OR_ERR_RET(adapter->cancel_burst, -EINVAL); #endif + rte_trace_lib_event_timer_cancel_burst(adapter, (void **)evtims, + nb_evtims); return adapter->cancel_burst(adapter, evtims, nb_evtims); } diff --git a/lib/librte_eventdev/rte_eventdev.c b/lib/librte_eventdev/rte_eventdev.c index b987e0745..d0a3bdd7f 100644 --- a/lib/librte_eventdev/rte_eventdev.c +++ b/lib/librte_eventdev/rte_eventdev.c @@ -35,6 +35,7 @@ #include "rte_eventdev.h" #include "rte_eventdev_pmd.h" +#include "rte_trace_eventdev.h" static struct rte_eventdev rte_event_devices[RTE_EVENT_MAX_DEVS]; @@ -524,6 +525,7 @@ rte_event_dev_configure(uint8_t dev_id, } dev->data->event_dev_cap = info.event_dev_cap; + rte_trace_lib_eventdev_configure(dev_id, dev_conf, diag); return diag; } @@ -650,6 +652,7 @@ rte_event_queue_setup(uint8_t dev_id, uint8_t queue_id, } dev->data->queues_cfg[queue_id] = *queue_conf; + rte_trace_lib_event_queue_setup(dev_id, queue_id, queue_conf); return (*dev->dev_ops->queue_setup)(dev, queue_id, queue_conf); } @@ -766,6 +769,7 @@ rte_event_port_setup(uint8_t dev_id, uint8_t port_id, if (!diag) diag = rte_event_port_unlink(dev_id, port_id, NULL, 0); + rte_trace_lib_event_port_setup(dev_id, port_id, port_conf, diag); if (diag < 0) return diag; @@ -936,6 +940,7 @@ rte_event_port_link(uint8_t dev_id, uint8_t port_id, for (i = 0; i < diag; i++) links_map[queues[i]] = (uint8_t)priorities[i]; + rte_trace_lib_event_port_link(dev_id, port_id, nb_links, diag); return diag; } @@ -1001,6 +1006,7 @@ rte_event_port_unlink(uint8_t dev_id, uint8_t port_id, for (i = 0; i < diag; i++) links_map[queues[i]] = EVENT_QUEUE_SERVICE_PRIORITY_INVALID; + rte_trace_lib_event_port_unlink(dev_id, port_id, nb_unlinks, diag); return diag; } @@ -1213,6 +1219,7 @@ rte_event_dev_start(uint8_t dev_id) } diag = (*dev->dev_ops->dev_start)(dev); + rte_trace_lib_eventdev_start(dev_id, diag); if (diag == 0) dev->data->dev_started = 1; else @@ -1257,6 +1264,7 @@ rte_event_dev_stop(uint8_t dev_id) dev->data->dev_started = 0; (*dev->dev_ops->dev_stop)(dev); + rte_trace_lib_eventdev_stop(dev_id); } int @@ -1275,6 +1283,7 @@ rte_event_dev_close(uint8_t dev_id) return -EBUSY; } + rte_trace_lib_eventdev_close(dev_id); return (*dev->dev_ops->dev_close)(dev); } diff --git a/lib/librte_eventdev/rte_eventdev.h b/lib/librte_eventdev/rte_eventdev.h index 226f352ad..71d4fa6f1 100644 --- a/lib/librte_eventdev/rte_eventdev.h +++ b/lib/librte_eventdev/rte_eventdev.h @@ -215,6 +215,8 @@ extern "C" { #include #include +#include "rte_trace_eventdev_fp.h" + struct rte_mbuf; /* we just use mbuf pointers; no need to include rte_mbuf.h */ struct rte_event; @@ -1343,6 +1345,7 @@ __rte_event_enqueue_burst(uint8_t dev_id, uint8_t port_id, return 0; } #endif + rte_trace_lib_event_enq_burst(dev_id, port_id, ev, nb_events, fn); /* * Allow zero cost non burst mode routine invocation if application * requests nb_events as const one @@ -1620,7 +1623,7 @@ rte_event_dequeue_burst(uint8_t dev_id, uint8_t port_id, struct rte_event ev[], return 0; } #endif - + rte_trace_lib_event_deq_burst(dev_id, port_id, ev, nb_events); /* * Allow zero cost non burst mode routine invocation if application * requests nb_events as const one diff --git a/lib/librte_eventdev/rte_eventdev_version.map b/lib/librte_eventdev/rte_eventdev_version.map index edfc15282..25023d9c2 100644 --- a/lib/librte_eventdev/rte_eventdev_version.map +++ b/lib/librte_eventdev/rte_eventdev_version.map @@ -93,3 +93,45 @@ DPDK_20.0 { local: *; }; + +EXPERIMENTAL { + global: + + # added in 20.05 + __rte_trace_lib_eventdev_configure; + __rte_trace_lib_event_queue_setup; + __rte_trace_lib_event_port_setup; + __rte_trace_lib_event_port_link; + __rte_trace_lib_event_port_unlink; + __rte_trace_lib_eventdev_start; + __rte_trace_lib_eventdev_stop; + __rte_trace_lib_eventdev_close; + __rte_trace_lib_event_deq_burst; + __rte_trace_lib_event_enq_burst; + __rte_trace_lib_event_eth_rx_adapter_create; + __rte_trace_lib_event_eth_rx_adapter_free; + __rte_trace_lib_event_eth_rx_adapter_queue_add; + __rte_trace_lib_event_eth_rx_adapter_queue_del; + __rte_trace_lib_event_eth_rx_adapter_start; + __rte_trace_lib_event_eth_rx_adapter_stop; + __rte_trace_lib_event_eth_tx_adapter_create; + __rte_trace_lib_event_eth_tx_adapter_free; + __rte_trace_lib_event_eth_tx_adapter_queue_add; + __rte_trace_lib_event_eth_tx_adapter_queue_del; + __rte_trace_lib_event_eth_tx_adapter_start; + __rte_trace_lib_event_eth_tx_adapter_stop; + __rte_trace_lib_event_eth_tx_adapter_enqueue; + __rte_trace_lib_event_timer_adapter_create; + __rte_trace_lib_event_timer_adapter_start; + __rte_trace_lib_event_timer_adapter_stop; + __rte_trace_lib_event_timer_adapter_free; + __rte_trace_lib_event_timer_arm_burst; + __rte_trace_lib_event_timer_arm_tmo_tick_burst; + __rte_trace_lib_event_timer_cancel_burst; + __rte_trace_lib_event_crypto_adapter_create; + __rte_trace_lib_event_crypto_adapter_free; + __rte_trace_lib_event_crypto_adapter_queue_pair_add; + __rte_trace_lib_event_crypto_adapter_queue_pair_del; + __rte_trace_lib_event_crypto_adapter_start; + __rte_trace_lib_event_crypto_adapter_stop; +}; diff --git a/lib/librte_eventdev/rte_trace_eventdev.h b/lib/librte_eventdev/rte_trace_eventdev.h new file mode 100644 index 000000000..f5e5c2513 --- /dev/null +++ b/lib/librte_eventdev/rte_trace_eventdev.h @@ -0,0 +1,311 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(C) 2020 Marvell International Ltd. + */ + +#ifndef _RTE_TRACE_EVENTDEV_H_ +#define _RTE_TRACE_EVENTDEV_H_ + +/** + * @file + * + * API for ethdev trace support + */ + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +#include "rte_eventdev.h" +#include "rte_event_eth_rx_adapter.h" +#include "rte_event_timer_adapter.h" + +RTE_TRACE_POINT( + rte_trace_lib_eventdev_configure, + RTE_TRACE_POINT_ARGS(uint8_t dev_id, + const struct rte_event_dev_config *dev_conf, + int rc), + rte_trace_point_emit_u8(dev_id); + rte_trace_point_emit_u32(dev_conf->dequeue_timeout_ns); + rte_trace_point_emit_i32(dev_conf->nb_events_limit); + rte_trace_point_emit_u8(dev_conf->nb_event_queues); + rte_trace_point_emit_u8(dev_conf->nb_event_ports); + rte_trace_point_emit_u32(dev_conf->nb_event_queue_flows); + rte_trace_point_emit_u32(dev_conf->nb_event_port_dequeue_depth); + rte_trace_point_emit_u32(dev_conf->nb_event_port_enqueue_depth); + rte_trace_point_emit_u32(dev_conf->event_dev_cfg); + rte_trace_point_emit_int(rc); +) + +RTE_TRACE_POINT( + rte_trace_lib_event_queue_setup, + RTE_TRACE_POINT_ARGS(uint8_t dev_id, uint8_t queue_id, + const struct rte_event_queue_conf *queue_conf), + rte_trace_point_emit_u8(dev_id); + rte_trace_point_emit_u8(queue_id); + rte_trace_point_emit_u32(queue_conf->nb_atomic_flows); + rte_trace_point_emit_u32(queue_conf->nb_atomic_order_sequences); + rte_trace_point_emit_u32(queue_conf->event_queue_cfg); + rte_trace_point_emit_u8(queue_conf->schedule_type); + rte_trace_point_emit_u8(queue_conf->priority); +) + +RTE_TRACE_POINT( + rte_trace_lib_event_port_setup, + RTE_TRACE_POINT_ARGS(uint8_t dev_id, uint8_t port_id, + const struct rte_event_port_conf *port_conf, + int rc), + rte_trace_point_emit_u8(dev_id); + rte_trace_point_emit_u8(port_id); + rte_trace_point_emit_i32(port_conf->new_event_threshold); + rte_trace_point_emit_u16(port_conf->dequeue_depth); + rte_trace_point_emit_u16(port_conf->enqueue_depth); + rte_trace_point_emit_u8(port_conf->disable_implicit_release); + rte_trace_point_emit_int(rc); +) + +RTE_TRACE_POINT( + rte_trace_lib_event_port_link, + RTE_TRACE_POINT_ARGS(uint8_t dev_id, uint8_t port_id, + uint16_t nb_links, int rc), + rte_trace_point_emit_u8(dev_id); + rte_trace_point_emit_u8(port_id); + rte_trace_point_emit_u16(nb_links); + rte_trace_point_emit_int(rc); +) + +RTE_TRACE_POINT( + rte_trace_lib_event_port_unlink, + RTE_TRACE_POINT_ARGS(uint8_t dev_id, uint8_t port_id, + uint16_t nb_unlinks, int rc), + rte_trace_point_emit_u8(dev_id); + rte_trace_point_emit_u8(port_id); + rte_trace_point_emit_u16(nb_unlinks); + rte_trace_point_emit_int(rc); +) + +RTE_TRACE_POINT( + rte_trace_lib_eventdev_start, + RTE_TRACE_POINT_ARGS(uint8_t dev_id, int rc), + rte_trace_point_emit_u8(dev_id); + rte_trace_point_emit_int(rc); +) + +RTE_TRACE_POINT( + rte_trace_lib_eventdev_stop, + RTE_TRACE_POINT_ARGS(uint8_t dev_id), + rte_trace_point_emit_u8(dev_id); +) + +RTE_TRACE_POINT( + rte_trace_lib_eventdev_close, + RTE_TRACE_POINT_ARGS(uint8_t dev_id), + rte_trace_point_emit_u8(dev_id); +) + +RTE_TRACE_POINT( + rte_trace_lib_event_eth_rx_adapter_create, + RTE_TRACE_POINT_ARGS(uint8_t adptr_id, uint8_t dev_id, + void *conf_cb, void *conf_arg), + rte_trace_point_emit_u8(adptr_id); + rte_trace_point_emit_u8(dev_id); + rte_trace_point_emit_ptr(conf_cb); + rte_trace_point_emit_ptr(conf_arg); +) + +RTE_TRACE_POINT( + rte_trace_lib_event_eth_rx_adapter_free, + RTE_TRACE_POINT_ARGS(uint8_t adptr_id), + rte_trace_point_emit_u8(adptr_id); +) + +RTE_TRACE_POINT( + rte_trace_lib_event_eth_rx_adapter_queue_add, + RTE_TRACE_POINT_ARGS(uint8_t adptr_id, uint16_t eth_dev_id, + int32_t rx_queue_id, + const struct rte_event_eth_rx_adapter_queue_conf + *queue_conf, int rc), + rte_trace_point_emit_u8(adptr_id); + rte_trace_point_emit_u16(eth_dev_id); + rte_trace_point_emit_i32(rx_queue_id); + rte_trace_point_emit_u32(queue_conf->rx_queue_flags); + rte_trace_point_emit_u16(queue_conf->servicing_weight); + rte_trace_point_emit_u8(queue_conf->ev.queue_id); + rte_trace_point_emit_u8(queue_conf->ev.priority); + rte_trace_point_emit_int(rc); +) + +RTE_TRACE_POINT( + rte_trace_lib_event_eth_rx_adapter_queue_del, + RTE_TRACE_POINT_ARGS(uint8_t adptr_id, uint16_t eth_dev_id, + int32_t rx_queue_id, int rc), + rte_trace_point_emit_u8(adptr_id); + rte_trace_point_emit_u16(eth_dev_id); + rte_trace_point_emit_i32(rx_queue_id); + rte_trace_point_emit_int(rc); +) + +RTE_TRACE_POINT( + rte_trace_lib_event_eth_rx_adapter_start, + RTE_TRACE_POINT_ARGS(uint8_t adptr_id), + rte_trace_point_emit_u8(adptr_id); +) + +RTE_TRACE_POINT( + rte_trace_lib_event_eth_rx_adapter_stop, + RTE_TRACE_POINT_ARGS(uint8_t adptr_id), + rte_trace_point_emit_u8(adptr_id); +) + +RTE_TRACE_POINT( + rte_trace_lib_event_eth_tx_adapter_create, + RTE_TRACE_POINT_ARGS(uint8_t adptr_id, uint8_t dev_id, void *conf_cb, + struct rte_event_port_conf *port_conf, + int rc), + rte_trace_point_emit_u8(adptr_id); + rte_trace_point_emit_u8(dev_id); + rte_trace_point_emit_i32(port_conf->new_event_threshold); + rte_trace_point_emit_u16(port_conf->dequeue_depth); + rte_trace_point_emit_u16(port_conf->enqueue_depth); + rte_trace_point_emit_u8(port_conf->disable_implicit_release); + rte_trace_point_emit_ptr(conf_cb); + rte_trace_point_emit_int(rc); +) + +RTE_TRACE_POINT( + rte_trace_lib_event_eth_tx_adapter_free, + RTE_TRACE_POINT_ARGS(uint8_t adptr_id, int rc), + rte_trace_point_emit_u8(adptr_id); + rte_trace_point_emit_int(rc); +) + +RTE_TRACE_POINT( + rte_trace_lib_event_eth_tx_adapter_queue_add, + RTE_TRACE_POINT_ARGS(uint8_t adptr_id, uint16_t eth_dev_id, + int32_t queue, int rc), + rte_trace_point_emit_u8(adptr_id); + rte_trace_point_emit_u16(eth_dev_id); + rte_trace_point_emit_i32(queue); + rte_trace_point_emit_int(rc); +) + +RTE_TRACE_POINT( + rte_trace_lib_event_eth_tx_adapter_queue_del, + RTE_TRACE_POINT_ARGS(uint8_t adptr_id, uint16_t eth_dev_id, + int32_t queue, int rc), + rte_trace_point_emit_u8(adptr_id); + rte_trace_point_emit_u16(eth_dev_id); + rte_trace_point_emit_i32(queue); + rte_trace_point_emit_int(rc); +) + +RTE_TRACE_POINT( + rte_trace_lib_event_eth_tx_adapter_start, + RTE_TRACE_POINT_ARGS(uint8_t adptr_id, int rc), + rte_trace_point_emit_u8(adptr_id); + rte_trace_point_emit_int(rc); +) + +RTE_TRACE_POINT( + rte_trace_lib_event_eth_tx_adapter_stop, + RTE_TRACE_POINT_ARGS(uint8_t adptr_id, int rc), + rte_trace_point_emit_u8(adptr_id); + rte_trace_point_emit_int(rc); +) + +RTE_TRACE_POINT( + rte_trace_lib_event_timer_adapter_create, + RTE_TRACE_POINT_ARGS(uint16_t adapter_id, void *adapter, + const struct rte_event_timer_adapter_conf *conf, + void *conf_cb), + rte_trace_point_emit_u16(adapter_id); + rte_trace_point_emit_ptr(adapter); + rte_trace_point_emit_ptr(conf); + rte_trace_point_emit_u8(conf->event_dev_id); + rte_trace_point_emit_u16(conf->timer_adapter_id); + rte_trace_point_emit_u64(conf->timer_tick_ns); + rte_trace_point_emit_u64(conf->max_tmo_ns); + rte_trace_point_emit_u64(conf->nb_timers); + rte_trace_point_emit_u64(conf->flags); + rte_trace_point_emit_ptr(conf_cb); +) + +RTE_TRACE_POINT( + rte_trace_lib_event_timer_adapter_start, + RTE_TRACE_POINT_ARGS(const void *adapter), + rte_trace_point_emit_ptr(adapter); +) + +RTE_TRACE_POINT( + rte_trace_lib_event_timer_adapter_stop, + RTE_TRACE_POINT_ARGS(const void *adapter), + rte_trace_point_emit_ptr(adapter); +) + +RTE_TRACE_POINT( + rte_trace_lib_event_timer_adapter_free, + RTE_TRACE_POINT_ARGS(void *adapter), + rte_trace_point_emit_ptr(adapter); +) + +RTE_TRACE_POINT( + rte_trace_lib_event_crypto_adapter_create, + RTE_TRACE_POINT_ARGS(uint8_t adptr_id, uint8_t dev_id, void *adapter, + struct rte_event_port_conf *port_conf, + uint8_t mode), + rte_trace_point_emit_u8(adptr_id); + rte_trace_point_emit_u8(dev_id); + rte_trace_point_emit_ptr(adapter); + rte_trace_point_emit_u8(mode); + rte_trace_point_emit_i32(port_conf->new_event_threshold); + rte_trace_point_emit_u16(port_conf->dequeue_depth); + rte_trace_point_emit_u16(port_conf->enqueue_depth); + rte_trace_point_emit_u8(port_conf->disable_implicit_release); +) + +RTE_TRACE_POINT( + rte_trace_lib_event_crypto_adapter_free, + RTE_TRACE_POINT_ARGS(uint8_t adptr_id, void *adapter), + rte_trace_point_emit_u8(adptr_id); + rte_trace_point_emit_ptr(adapter); +) + +RTE_TRACE_POINT( + rte_trace_lib_event_crypto_adapter_queue_pair_add, + RTE_TRACE_POINT_ARGS(uint8_t adptr_id, uint8_t cdev_id, + const void *event, int32_t queue_pair_id), + rte_trace_point_emit_u8(adptr_id); + rte_trace_point_emit_u8(cdev_id); + rte_trace_point_emit_i32(queue_pair_id); + rte_trace_point_emit_ptr(event); +) + +RTE_TRACE_POINT( + rte_trace_lib_event_crypto_adapter_queue_pair_del, + RTE_TRACE_POINT_ARGS(uint8_t adptr_id, uint8_t cdev_id, + int32_t queue_pair_id, int rc), + rte_trace_point_emit_u8(adptr_id); + rte_trace_point_emit_u8(cdev_id); + rte_trace_point_emit_i32(queue_pair_id); + rte_trace_point_emit_int(rc); +) + +RTE_TRACE_POINT( + rte_trace_lib_event_crypto_adapter_start, + RTE_TRACE_POINT_ARGS(uint8_t adptr_id, void *adapter), + rte_trace_point_emit_u8(adptr_id); + rte_trace_point_emit_ptr(adapter); +) + +RTE_TRACE_POINT( + rte_trace_lib_event_crypto_adapter_stop, + RTE_TRACE_POINT_ARGS(uint8_t adptr_id), + rte_trace_point_emit_u8(adptr_id); +) + +#ifdef __cplusplus +} +#endif + +#endif /* _RTE_TRACE_EVENTDEV_H_ */ diff --git a/lib/librte_eventdev/rte_trace_eventdev_fp.h b/lib/librte_eventdev/rte_trace_eventdev_fp.h new file mode 100644 index 000000000..8c3612298 --- /dev/null +++ b/lib/librte_eventdev/rte_trace_eventdev_fp.h @@ -0,0 +1,85 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(C) 2020 Marvell International Ltd. + */ + +#ifndef _RTE_TRACE_EVENTDEV_FP_H_ +#define _RTE_TRACE_EVENTDEV_FP_H_ + +/** + * @file + * + * API for ethdev trace support + */ + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +RTE_TRACE_POINT_FP( + rte_trace_lib_event_deq_burst, + RTE_TRACE_POINT_ARGS(uint8_t dev_id, uint8_t port_id, void *ev_table, + uint16_t nb_events), + rte_trace_point_emit_u8(dev_id); + rte_trace_point_emit_u8(port_id); + rte_trace_point_emit_ptr(ev_table); + rte_trace_point_emit_u16(nb_events); +) + +RTE_TRACE_POINT_FP( + rte_trace_lib_event_enq_burst, + RTE_TRACE_POINT_ARGS(uint8_t dev_id, uint8_t port_id, + const void *ev_table, uint16_t nb_events, + void *enq_mode_cb), + rte_trace_point_emit_u8(dev_id); + rte_trace_point_emit_u8(port_id); + rte_trace_point_emit_ptr(ev_table); + rte_trace_point_emit_u16(nb_events); + rte_trace_point_emit_ptr(enq_mode_cb); +) + +RTE_TRACE_POINT_FP( + rte_trace_lib_event_eth_tx_adapter_enqueue, + RTE_TRACE_POINT_ARGS(uint8_t dev_id, uint8_t port_id, void *ev_table, + uint16_t nb_events, const uint8_t flags), + rte_trace_point_emit_u8(dev_id); + rte_trace_point_emit_u8(port_id); + rte_trace_point_emit_ptr(ev_table); + rte_trace_point_emit_u16(nb_events); + rte_trace_point_emit_u8(flags); +) + +RTE_TRACE_POINT_FP( + rte_trace_lib_event_timer_arm_burst, + RTE_TRACE_POINT_ARGS(const void *adapter, void **evtims_table, + uint16_t nb_evtims), + rte_trace_point_emit_ptr(adapter); + rte_trace_point_emit_ptr(evtims_table); + rte_trace_point_emit_u16(nb_evtims); +) + +RTE_TRACE_POINT_FP( + rte_trace_lib_event_timer_arm_tmo_tick_burst, + RTE_TRACE_POINT_ARGS(const void *adapter, const uint64_t timeout_ticks, + void **evtims_table, const uint16_t nb_evtims), + rte_trace_point_emit_ptr(adapter); + rte_trace_point_emit_u64(timeout_ticks); + rte_trace_point_emit_ptr(evtims_table); + rte_trace_point_emit_u16(nb_evtims); +) + +RTE_TRACE_POINT_FP( + rte_trace_lib_event_timer_cancel_burst, + RTE_TRACE_POINT_ARGS(const void *adapter, void **evtims_table, + uint16_t nb_evtims), + rte_trace_point_emit_ptr(adapter); + rte_trace_point_emit_ptr(evtims_table); + rte_trace_point_emit_u16(nb_evtims); +) + +#ifdef __cplusplus +} +#endif + +#endif /* _RTE_TRACE_EVENTDEV_FP_H_ */ From patchwork Sun Apr 19 10:01:31 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: 68902 X-Patchwork-Delegate: david.marchand@redhat.com 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 3C5A3A0561; Sun, 19 Apr 2020 12:11:05 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id E56A31D6A0; Sun, 19 Apr 2020 12:03:56 +0200 (CEST) Received: from mx0b-0016f401.pphosted.com (mx0b-0016f401.pphosted.com [67.231.156.173]) by dpdk.org (Postfix) with ESMTP id 648461D63F for ; Sun, 19 Apr 2020 12:03:42 +0200 (CEST) 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 03JA18hl020147; Sun, 19 Apr 2020 03:03:41 -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=wM2nD7zD29g+W6TgXKryvdYlj1OAD7SCy7nJsCLmnrs=; b=r50ReZFgrrW0uxi80NuJUyHRCW1ZNINfHxAsZlgP4PF5A1L00vAs7YZmeXeVnwmoylRE iYfNLKuXn1agPIxcUiUK4Zfk2nraP4trwG/nzxUgXlzdwL83/fT6OeeTdj7LfupOaO2l RyvbfVfu4GJoYFCEvXj5nUZxiI+XUwv/+r0JESIcxSyJR4Ey6nE4LvDwkMhvUlaklp6Y dmfRyrOGcsktDvbg7nzy3gyjVXUZAeuimJyQG549f/kWjW0I8iYoqVnqlA3lObB1XMEe 6WcdH9p9YD3JFChwGcCljheTc8egx8MSY4e06megsxU4RrRjdfP2A3XWtLjjeo9fH9eQ Tg== Received: from sc-exch01.marvell.com ([199.233.58.181]) by mx0b-0016f401.pphosted.com with ESMTP id 30g12njxg9-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT); Sun, 19 Apr 2020 03:03:41 -0700 Received: from DC5-EXCH01.marvell.com (10.69.176.38) by SC-EXCH01.marvell.com (10.93.176.81) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Sun, 19 Apr 2020 03:03:39 -0700 Received: from DC5-EXCH02.marvell.com (10.69.176.39) by DC5-EXCH01.marvell.com (10.69.176.38) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Sun, 19 Apr 2020 03:03:38 -0700 Received: from maili.marvell.com (10.69.176.80) by DC5-EXCH02.marvell.com (10.69.176.39) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Sun, 19 Apr 2020 03:03:38 -0700 Received: from jerin-lab.marvell.com (jerin-lab.marvell.com [10.28.34.14]) by maili.marvell.com (Postfix) with ESMTP id 57E483F703F; Sun, 19 Apr 2020 03:03:36 -0700 (PDT) From: To: Declan Doherty CC: , , , , , Date: Sun, 19 Apr 2020 15:31:31 +0530 Message-ID: <20200419100133.3232316-32-jerinj@marvell.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200419100133.3232316-1-jerinj@marvell.com> References: <20200413150116.734047-1-jerinj@marvell.com> <20200419100133.3232316-1-jerinj@marvell.com> MIME-Version: 1.0 X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:6.0.138, 18.0.676 definitions=2020-04-19_02:2020-04-17, 2020-04-19 signatures=0 Subject: [dpdk-dev] [PATCH v6 31/33] cryptodev: add tracepoints 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: Sunil Kumar Kori Add tracepoints at important and mandatory APIs for tracing support. Signed-off-by: Sunil Kumar Kori --- lib/librte_cryptodev/Makefile | 4 +- lib/librte_cryptodev/cryptodev_trace_points.c | 70 +++++++++ lib/librte_cryptodev/meson.build | 6 +- lib/librte_cryptodev/rte_cryptodev.c | 18 +++ lib/librte_cryptodev/rte_cryptodev.h | 6 + .../rte_cryptodev_version.map | 18 +++ lib/librte_cryptodev/rte_trace_cryptodev.h | 148 ++++++++++++++++++ lib/librte_cryptodev/rte_trace_cryptodev_fp.h | 38 +++++ 8 files changed, 305 insertions(+), 3 deletions(-) create mode 100644 lib/librte_cryptodev/cryptodev_trace_points.c create mode 100644 lib/librte_cryptodev/rte_trace_cryptodev.h create mode 100644 lib/librte_cryptodev/rte_trace_cryptodev_fp.h diff --git a/lib/librte_cryptodev/Makefile b/lib/librte_cryptodev/Makefile index 2ba0dbeec..10b993260 100644 --- a/lib/librte_cryptodev/Makefile +++ b/lib/librte_cryptodev/Makefile @@ -13,7 +13,7 @@ LDLIBS += -lrte_eal -lrte_mempool -lrte_ring -lrte_mbuf LDLIBS += -lrte_kvargs # library source files -SRCS-y += rte_cryptodev.c rte_cryptodev_pmd.c +SRCS-y += rte_cryptodev.c rte_cryptodev_pmd.c cryptodev_trace_points.c # export include files SYMLINK-y-include += rte_crypto.h @@ -21,6 +21,8 @@ SYMLINK-y-include += rte_crypto_sym.h SYMLINK-y-include += rte_cryptodev.h SYMLINK-y-include += rte_cryptodev_pmd.h SYMLINK-y-include += rte_crypto_asym.h +SYMLINK-y-include += rte_trace_cryptodev.h +SYMLINK-y-include += rte_trace_cryptodev_fp.h # versioning export map EXPORT_MAP := rte_cryptodev_version.map diff --git a/lib/librte_cryptodev/cryptodev_trace_points.c b/lib/librte_cryptodev/cryptodev_trace_points.c new file mode 100644 index 000000000..2ee457401 --- /dev/null +++ b/lib/librte_cryptodev/cryptodev_trace_points.c @@ -0,0 +1,70 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(C) 2020 Marvell International Ltd. + */ + +#define RTE_TRACE_POINT_REGISTER_SELECT /* Select trace point register macros */ + +#include "rte_trace_cryptodev.h" + +RTE_TRACE_POINT_DEFINE(rte_trace_lib_cryptodev_configure); +RTE_TRACE_POINT_DEFINE(rte_trace_lib_cryptodev_start); +RTE_TRACE_POINT_DEFINE(rte_trace_lib_cryptodev_stop); +RTE_TRACE_POINT_DEFINE(rte_trace_lib_cryptodev_close); +RTE_TRACE_POINT_DEFINE(rte_trace_lib_cryptodev_queue_pair_setup); +RTE_TRACE_POINT_DEFINE(rte_trace_lib_cryptodev_sym_session_pool_create); +RTE_TRACE_POINT_DEFINE(rte_trace_lib_cryptodev_sym_session_create); +RTE_TRACE_POINT_DEFINE(rte_trace_lib_cryptodev_asym_session_create); +RTE_TRACE_POINT_DEFINE(rte_trace_lib_cryptodev_sym_session_free); +RTE_TRACE_POINT_DEFINE(rte_trace_lib_cryptodev_asym_session_free); +RTE_TRACE_POINT_DEFINE(rte_trace_lib_cryptodev_sym_session_init); +RTE_TRACE_POINT_DEFINE(rte_trace_lib_cryptodev_asym_session_init); +RTE_TRACE_POINT_DEFINE(rte_trace_lib_cryptodev_sym_session_clear); +RTE_TRACE_POINT_DEFINE(rte_trace_lib_cryptodev_asym_session_clear); +RTE_TRACE_POINT_DEFINE(rte_trace_lib_cryptodev_enqueue_burst); +RTE_TRACE_POINT_DEFINE(rte_trace_lib_cryptodev_dequeue_burst); + +RTE_INIT(cryptodev_trace_init) +{ + RTE_TRACE_POINT_REGISTER(rte_trace_lib_cryptodev_configure, + lib.cryptodev.configure); + + RTE_TRACE_POINT_REGISTER(rte_trace_lib_cryptodev_start, + lib.cryptodev.start); + + RTE_TRACE_POINT_REGISTER(rte_trace_lib_cryptodev_stop, + lib.cryptodev.stop); + + RTE_TRACE_POINT_REGISTER(rte_trace_lib_cryptodev_close, + lib.cryptodev.close); + + RTE_TRACE_POINT_REGISTER(rte_trace_lib_cryptodev_queue_pair_setup, + lib.cryptodev.queue.pair.setup); + + RTE_TRACE_POINT_REGISTER( + rte_trace_lib_cryptodev_sym_session_pool_create, + lib.cryptodev.sym.pool.create); + + RTE_TRACE_POINT_REGISTER(rte_trace_lib_cryptodev_sym_session_create, + lib.cryptodev.sym.create); + + RTE_TRACE_POINT_REGISTER(rte_trace_lib_cryptodev_asym_session_create, + lib.cryptodev.asym.create); + + RTE_TRACE_POINT_REGISTER(rte_trace_lib_cryptodev_sym_session_free, + lib.cryptodev.sym.free); + + RTE_TRACE_POINT_REGISTER(rte_trace_lib_cryptodev_asym_session_free, + lib.cryptodev.asym.free); + + RTE_TRACE_POINT_REGISTER(rte_trace_lib_cryptodev_sym_session_init, + lib.cryptodev.sym.init); + + RTE_TRACE_POINT_REGISTER(rte_trace_lib_cryptodev_asym_session_init, + lib.cryptodev.asym.init); + + RTE_TRACE_POINT_REGISTER(rte_trace_lib_cryptodev_enqueue_burst, + lib.cryptodev.enq.burst); + + RTE_TRACE_POINT_REGISTER(rte_trace_lib_cryptodev_dequeue_burst, + lib.cryptodev.deq.burst); +} diff --git a/lib/librte_cryptodev/meson.build b/lib/librte_cryptodev/meson.build index 42825a810..9358b2811 100644 --- a/lib/librte_cryptodev/meson.build +++ b/lib/librte_cryptodev/meson.build @@ -1,10 +1,12 @@ # SPDX-License-Identifier: BSD-3-Clause # Copyright(c) 2017-2019 Intel Corporation -sources = files('rte_cryptodev.c', 'rte_cryptodev_pmd.c') +sources = files('rte_cryptodev.c', 'rte_cryptodev_pmd.c', 'cryptodev_trace_points.c') headers = files('rte_cryptodev.h', 'rte_cryptodev_pmd.h', 'rte_crypto.h', 'rte_crypto_sym.h', - 'rte_crypto_asym.h') + 'rte_crypto_asym.h', + 'rte_trace_cryptodev.h', + 'rte_trace_cryptodev_fp.h') deps += ['kvargs', 'mbuf'] diff --git a/lib/librte_cryptodev/rte_cryptodev.c b/lib/librte_cryptodev/rte_cryptodev.c index 65d61a3ef..2ed91eee7 100644 --- a/lib/librte_cryptodev/rte_cryptodev.c +++ b/lib/librte_cryptodev/rte_cryptodev.c @@ -40,6 +40,7 @@ #include "rte_crypto.h" #include "rte_cryptodev.h" #include "rte_cryptodev_pmd.h" +#include "rte_trace_cryptodev.h" static uint8_t nb_drivers; @@ -912,6 +913,7 @@ rte_cryptodev_configure(uint8_t dev_id, struct rte_cryptodev_config *config) return diag; } + rte_trace_lib_cryptodev_configure(dev_id, config); return (*dev->dev_ops->dev_configure)(dev, config); } @@ -940,6 +942,7 @@ rte_cryptodev_start(uint8_t dev_id) } diag = (*dev->dev_ops->dev_start)(dev); + rte_trace_lib_cryptodev_start(dev_id, diag); if (diag == 0) dev->data->dev_started = 1; else @@ -969,6 +972,7 @@ rte_cryptodev_stop(uint8_t dev_id) } (*dev->dev_ops->dev_stop)(dev); + rte_trace_lib_cryptodev_stop(dev_id); dev->data->dev_started = 0; } @@ -1005,6 +1009,7 @@ rte_cryptodev_close(uint8_t dev_id) RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->dev_close, -ENOTSUP); retval = (*dev->dev_ops->dev_close)(dev); + rte_trace_lib_cryptodev_close(dev_id, retval); if (retval < 0) return retval; @@ -1074,6 +1079,8 @@ rte_cryptodev_queue_pair_setup(uint8_t dev_id, uint16_t queue_pair_id, RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->queue_pair_setup, -ENOTSUP); + rte_trace_lib_cryptodev_queue_pair_setup(dev_id, queue_pair_id, + qp_conf); return (*dev->dev_ops->queue_pair_setup)(dev, queue_pair_id, qp_conf, socket_id); } @@ -1295,6 +1302,7 @@ rte_cryptodev_sym_session_init(uint8_t dev_id, } } + rte_trace_lib_cryptodev_sym_session_init(dev_id, sess, xforms, mp); sess->sess_data[index].refcnt++; return 0; } @@ -1336,6 +1344,7 @@ rte_cryptodev_asym_session_init(uint8_t dev_id, } } + rte_trace_lib_cryptodev_asym_session_init(dev_id, sess, xforms, mp); return 0; } @@ -1376,6 +1385,9 @@ rte_cryptodev_sym_session_pool_create(const char *name, uint32_t nb_elts, pool_priv->nb_drivers = nb_drivers; pool_priv->user_data_sz = user_data_size; + rte_trace_lib_cryptodev_sym_session_pool_create(name, nb_elts, + elt_size, cache_size, + user_data_size, mp); return mp; } @@ -1420,6 +1432,7 @@ rte_cryptodev_sym_session_create(struct rte_mempool *mp) memset(sess->sess_data, 0, rte_cryptodev_sym_session_data_size(sess)); + rte_trace_lib_cryptodev_sym_session_create(mp, sess); return sess; } @@ -1439,6 +1452,7 @@ rte_cryptodev_asym_session_create(struct rte_mempool *mp) */ memset(sess, 0, (sizeof(void *) * nb_drivers) + sizeof(uint8_t)); + rte_trace_lib_cryptodev_asym_session_create(mp, sess); return sess; } @@ -1469,6 +1483,7 @@ rte_cryptodev_sym_session_clear(uint8_t dev_id, dev->dev_ops->sym_session_clear(dev, sess); + rte_trace_lib_cryptodev_sym_session_clear(dev_id, sess); return 0; } @@ -1492,6 +1507,7 @@ rte_cryptodev_asym_session_clear(uint8_t dev_id, dev->dev_ops->asym_session_clear(dev, sess); + rte_trace_lib_cryptodev_sym_session_clear(dev_id, sess); return 0; } @@ -1514,6 +1530,7 @@ rte_cryptodev_sym_session_free(struct rte_cryptodev_sym_session *sess) sess_mp = rte_mempool_from_obj(sess); rte_mempool_put(sess_mp, sess); + rte_trace_lib_cryptodev_sym_session_free(sess); return 0; } @@ -1538,6 +1555,7 @@ rte_cryptodev_asym_session_free(struct rte_cryptodev_asym_session *sess) sess_mp = rte_mempool_from_obj(sess); rte_mempool_put(sess_mp, sess); + rte_trace_lib_cryptodev_asym_session_free(sess); return 0; } diff --git a/lib/librte_cryptodev/rte_cryptodev.h b/lib/librte_cryptodev/rte_cryptodev.h index 437b8a9b3..9008b70b6 100644 --- a/lib/librte_cryptodev/rte_cryptodev.h +++ b/lib/librte_cryptodev/rte_cryptodev.h @@ -24,6 +24,8 @@ extern "C" { #include #include +#include "rte_trace_cryptodev_fp.h" + extern const char **rte_cyptodev_names; /* Logging Macros */ @@ -924,6 +926,8 @@ rte_cryptodev_dequeue_burst(uint8_t dev_id, uint16_t qp_id, nb_ops = (*dev->dequeue_burst) (dev->data->queue_pairs[qp_id], ops, nb_ops); + rte_trace_lib_cryptodev_dequeue_burst(dev_id, qp_id, (void **)ops, + nb_ops); return nb_ops; } @@ -964,6 +968,8 @@ rte_cryptodev_enqueue_burst(uint8_t dev_id, uint16_t qp_id, { struct rte_cryptodev *dev = &rte_cryptodevs[dev_id]; + rte_trace_lib_cryptodev_enqueue_burst(dev_id, qp_id, (void **)ops, + nb_ops); return (*dev->enqueue_burst)( dev->data->queue_pairs[qp_id], ops, nb_ops); } diff --git a/lib/librte_cryptodev/rte_cryptodev_version.map b/lib/librte_cryptodev/rte_cryptodev_version.map index 6e41b4be5..d023de7aa 100644 --- a/lib/librte_cryptodev/rte_cryptodev_version.map +++ b/lib/librte_cryptodev/rte_cryptodev_version.map @@ -78,4 +78,22 @@ EXPERIMENTAL { rte_cryptodev_sym_session_set_user_data; rte_crypto_asym_op_strings; rte_crypto_asym_xform_strings; + + # added in 20.05 + __rte_trace_lib_cryptodev_configure; + __rte_trace_lib_cryptodev_start; + __rte_trace_lib_cryptodev_stop; + __rte_trace_lib_cryptodev_close; + __rte_trace_lib_cryptodev_queue_pair_setup; + __rte_trace_lib_cryptodev_sym_session_pool_create; + __rte_trace_lib_cryptodev_sym_session_create; + __rte_trace_lib_cryptodev_asym_session_create; + __rte_trace_lib_cryptodev_sym_session_free; + __rte_trace_lib_cryptodev_asym_session_free; + __rte_trace_lib_cryptodev_sym_session_init; + __rte_trace_lib_cryptodev_asym_session_init; + __rte_trace_lib_cryptodev_sym_session_clear; + __rte_trace_lib_cryptodev_asym_session_clear; + __rte_trace_lib_cryptodev_dequeue_burst; + __rte_trace_lib_cryptodev_enqueue_burst; }; diff --git a/lib/librte_cryptodev/rte_trace_cryptodev.h b/lib/librte_cryptodev/rte_trace_cryptodev.h new file mode 100644 index 000000000..d9b896fe0 --- /dev/null +++ b/lib/librte_cryptodev/rte_trace_cryptodev.h @@ -0,0 +1,148 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(C) 2020 Marvell International Ltd. + */ + +#ifndef _RTE_TRACE_CRYPTODEV_H_ +#define _RTE_TRACE_CRYPTODEV_H_ + +/** + * @file + * + * API for cryptodev trace support + */ + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +#include "rte_cryptodev.h" + +RTE_TRACE_POINT( + rte_trace_lib_cryptodev_configure, + RTE_TRACE_POINT_ARGS(uint8_t dev_id, struct rte_cryptodev_config *conf), + rte_trace_point_emit_u8(dev_id); + rte_trace_point_emit_u16(conf->nb_queue_pairs); + rte_trace_point_emit_i64(conf->ff_disable); +) + +RTE_TRACE_POINT( + rte_trace_lib_cryptodev_start, + RTE_TRACE_POINT_ARGS(uint8_t dev_id, int rc), + rte_trace_point_emit_u8(dev_id); + rte_trace_point_emit_int(rc); +) + +RTE_TRACE_POINT( + rte_trace_lib_cryptodev_stop, + RTE_TRACE_POINT_ARGS(uint8_t dev_id), + rte_trace_point_emit_u8(dev_id); +) + +RTE_TRACE_POINT( + rte_trace_lib_cryptodev_close, + RTE_TRACE_POINT_ARGS(uint8_t dev_id, int rc), + rte_trace_point_emit_u8(dev_id); + rte_trace_point_emit_int(rc); +) + +RTE_TRACE_POINT( + rte_trace_lib_cryptodev_queue_pair_setup, + RTE_TRACE_POINT_ARGS(uint8_t dev_id, uint16_t queue_pair_id, + const struct rte_cryptodev_qp_conf *conf), + rte_trace_point_emit_u8(dev_id); + rte_trace_point_emit_u16(queue_pair_id); + rte_trace_point_emit_u32(conf->nb_descriptors); + rte_trace_point_emit_ptr(conf->mp_session); + rte_trace_point_emit_ptr(conf->mp_session_private); +) + +RTE_TRACE_POINT( + rte_trace_lib_cryptodev_sym_session_pool_create, + RTE_TRACE_POINT_ARGS(const char *name, uint32_t nb_elts, + uint32_t elt_size, uint32_t cache_size, + uint16_t user_data_size, void *mempool), + rte_trace_point_emit_string(name); + rte_trace_point_emit_u32(nb_elts); + rte_trace_point_emit_u32(elt_size); + rte_trace_point_emit_u32(cache_size); + rte_trace_point_emit_u16(user_data_size); + rte_trace_point_emit_ptr(mempool); +) + +RTE_TRACE_POINT( + rte_trace_lib_cryptodev_sym_session_create, + RTE_TRACE_POINT_ARGS(void *mempool, + struct rte_cryptodev_sym_session *sess), + rte_trace_point_emit_ptr(mempool); + rte_trace_point_emit_ptr(sess); + rte_trace_point_emit_u64(sess->opaque_data); + rte_trace_point_emit_u16(sess->nb_drivers); + rte_trace_point_emit_u16(sess->user_data_sz); +) + +RTE_TRACE_POINT( + rte_trace_lib_cryptodev_asym_session_create, + RTE_TRACE_POINT_ARGS(void *mempool, + struct rte_cryptodev_asym_session *sess), + rte_trace_point_emit_ptr(mempool); + rte_trace_point_emit_ptr(sess); +) + +RTE_TRACE_POINT( + rte_trace_lib_cryptodev_sym_session_free, + RTE_TRACE_POINT_ARGS(struct rte_cryptodev_sym_session *sess), + rte_trace_point_emit_ptr(sess); +) + +RTE_TRACE_POINT( + rte_trace_lib_cryptodev_asym_session_free, + RTE_TRACE_POINT_ARGS(struct rte_cryptodev_asym_session *sess), + rte_trace_point_emit_ptr(sess); +) + +RTE_TRACE_POINT( + rte_trace_lib_cryptodev_sym_session_init, + RTE_TRACE_POINT_ARGS(uint8_t dev_id, + struct rte_cryptodev_sym_session *sess, + void *xforms, void *mempool), + rte_trace_point_emit_u8(dev_id); + rte_trace_point_emit_ptr(sess); + rte_trace_point_emit_u64(sess->opaque_data); + rte_trace_point_emit_u16(sess->nb_drivers); + rte_trace_point_emit_u16(sess->user_data_sz); + rte_trace_point_emit_ptr(xforms); + rte_trace_point_emit_ptr(mempool); +) + +RTE_TRACE_POINT( + rte_trace_lib_cryptodev_asym_session_init, + RTE_TRACE_POINT_ARGS(uint8_t dev_id, + struct rte_cryptodev_asym_session *sess, + void *xforms, void *mempool), + rte_trace_point_emit_u8(dev_id); + rte_trace_point_emit_ptr(sess); + rte_trace_point_emit_ptr(xforms); + rte_trace_point_emit_ptr(mempool); +) + +RTE_TRACE_POINT( + rte_trace_lib_cryptodev_sym_session_clear, + RTE_TRACE_POINT_ARGS(uint8_t dev_id, void *sess), + rte_trace_point_emit_u8(dev_id); + rte_trace_point_emit_ptr(sess); +) + +RTE_TRACE_POINT( + rte_trace_lib_cryptodev_asym_session_clear, + RTE_TRACE_POINT_ARGS(uint8_t dev_id, void *sess), + rte_trace_point_emit_u8(dev_id); + rte_trace_point_emit_ptr(sess); +) + +#ifdef __cplusplus +} +#endif + +#endif /* _RTE_TRACE_CRYPTODEV_H_ */ diff --git a/lib/librte_cryptodev/rte_trace_cryptodev_fp.h b/lib/librte_cryptodev/rte_trace_cryptodev_fp.h new file mode 100644 index 000000000..ccbf71f69 --- /dev/null +++ b/lib/librte_cryptodev/rte_trace_cryptodev_fp.h @@ -0,0 +1,38 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(C) 2020 Marvell International Ltd. + */ + +#ifndef _RTE_TRACE_CRYPTODEV_FP_H_ +#define _RTE_TRACE_CRYPTODEV_FP_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +RTE_TRACE_POINT_FP( + rte_trace_lib_cryptodev_enqueue_burst, + RTE_TRACE_POINT_ARGS(uint8_t dev_id, uint16_t qp_id, void **ops, + uint16_t nb_ops), + rte_trace_point_emit_u8(dev_id); + rte_trace_point_emit_u16(qp_id); + rte_trace_point_emit_ptr(ops); + rte_trace_point_emit_u16(nb_ops); +) + +RTE_TRACE_POINT_FP( + rte_trace_lib_cryptodev_dequeue_burst, + RTE_TRACE_POINT_ARGS(uint8_t dev_id, uint16_t qp_id, void **ops, + uint16_t nb_ops), + rte_trace_point_emit_u8(dev_id); + rte_trace_point_emit_u16(qp_id); + rte_trace_point_emit_ptr(ops); + rte_trace_point_emit_u16(nb_ops); +) + +#ifdef __cplusplus +} +#endif + +#endif /* _RTE_TRACE_CRYPTODEV_FP_H_ */ From patchwork Sun Apr 19 10:01:32 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: 68905 X-Patchwork-Delegate: david.marchand@redhat.com 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 3A8D3A0561; Sun, 19 Apr 2020 12:11:45 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 74E1F1D6B1; Sun, 19 Apr 2020 12:04:00 +0200 (CEST) Received: from mx0b-0016f401.pphosted.com (mx0a-0016f401.pphosted.com [67.231.148.174]) by dpdk.org (Postfix) with ESMTP id D71F71D61B for ; Sun, 19 Apr 2020 12:03:45 +0200 (CEST) Received: from pps.filterd (m0045849.ppops.net [127.0.0.1]) by mx0a-0016f401.pphosted.com (8.16.0.42/8.16.0.42) with SMTP id 03J9wmhJ032573; Sun, 19 Apr 2020 03:03:44 -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=0fTQTjtLn1u9bupc7P3sQC3cgl3fjmcc3FyIklZsdUU=; b=lmuvoB85K38MX/I2fq00Mdvjsu1oGQ8OpLSRxd5K7d1iztU9TmXhMeObP9vYyUlQDvT4 gc8uVWbI4y08hS09tF6mhKzCwbJq1yg8hu4yYzvQ9bleJukc8Rd/goqpcaDhpLuW0hm6 WY+HTqHirxPCS5teEwWvHRybP3Vjamt0ClyUoDTvhq/SVwZgodJSuMND4evfgEKXHNYV UElZ+Swr0U43P1Q6Not/IOulVuzRcz3Fyh4yLVi1/qGOHu7QkXKVB+2psRMMbgFAX+zP Ol0/3IWY8CE2IsdFXlCd29T+Yww53dJqNFRS4SiiPuZ2cvPbgRCPdc3YPAcUXgz2JH+5 9A== Received: from sc-exch01.marvell.com ([199.233.58.181]) by mx0a-0016f401.pphosted.com with ESMTP id 30fxwp3d9c-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT); Sun, 19 Apr 2020 03:03:44 -0700 Received: from DC5-EXCH02.marvell.com (10.69.176.39) by SC-EXCH01.marvell.com (10.93.176.81) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Sun, 19 Apr 2020 03:03:42 -0700 Received: from maili.marvell.com (10.69.176.80) by DC5-EXCH02.marvell.com (10.69.176.39) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Sun, 19 Apr 2020 03:03:42 -0700 Received: from jerin-lab.marvell.com (jerin-lab.marvell.com [10.28.34.14]) by maili.marvell.com (Postfix) with ESMTP id 1138E3F703F; Sun, 19 Apr 2020 03:03:39 -0700 (PDT) From: To: Olivier Matz , Andrew Rybchenko CC: , , , , , Date: Sun, 19 Apr 2020 15:31:32 +0530 Message-ID: <20200419100133.3232316-33-jerinj@marvell.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200419100133.3232316-1-jerinj@marvell.com> References: <20200413150116.734047-1-jerinj@marvell.com> <20200419100133.3232316-1-jerinj@marvell.com> MIME-Version: 1.0 X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:6.0.138, 18.0.676 definitions=2020-04-19_02:2020-04-17, 2020-04-19 signatures=0 Subject: [dpdk-dev] [PATCH v6 32/33] mempool: add tracepoints 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: Sunil Kumar Kori Add tracepoints at important and mandatory APIs for tracing support. Signed-off-by: Sunil Kumar Kori --- lib/librte_mempool/Makefile | 3 + lib/librte_mempool/mempool_trace_points.c | 108 +++++++++++++ lib/librte_mempool/meson.build | 5 +- lib/librte_mempool/rte_mempool.c | 16 ++ lib/librte_mempool/rte_mempool.h | 13 ++ lib/librte_mempool/rte_mempool_ops.c | 7 + lib/librte_mempool/rte_mempool_version.map | 26 +++ lib/librte_mempool/rte_trace_mempool.h | 178 +++++++++++++++++++++ lib/librte_mempool/rte_trace_mempool_fp.h | 116 ++++++++++++++ 9 files changed, 470 insertions(+), 2 deletions(-) create mode 100644 lib/librte_mempool/mempool_trace_points.c create mode 100644 lib/librte_mempool/rte_trace_mempool.h create mode 100644 lib/librte_mempool/rte_trace_mempool_fp.h diff --git a/lib/librte_mempool/Makefile b/lib/librte_mempool/Makefile index 84aae6604..172e7bf50 100644 --- a/lib/librte_mempool/Makefile +++ b/lib/librte_mempool/Makefile @@ -15,7 +15,10 @@ EXPORT_MAP := rte_mempool_version.map SRCS-$(CONFIG_RTE_LIBRTE_MEMPOOL) += rte_mempool.c SRCS-$(CONFIG_RTE_LIBRTE_MEMPOOL) += rte_mempool_ops.c SRCS-$(CONFIG_RTE_LIBRTE_MEMPOOL) += rte_mempool_ops_default.c +SRCS-$(CONFIG_RTE_LIBRTE_MEMPOOL) += mempool_trace_points.c # install includes SYMLINK-$(CONFIG_RTE_LIBRTE_MEMPOOL)-include := rte_mempool.h +SYMLINK-$(CONFIG_RTE_LIBRTE_MEMPOOL)-include += rte_trace_mempool.h +SYMLINK-$(CONFIG_RTE_LIBRTE_MEMPOOL)-include += rte_trace_mempool_fp.h include $(RTE_SDK)/mk/rte.lib.mk diff --git a/lib/librte_mempool/mempool_trace_points.c b/lib/librte_mempool/mempool_trace_points.c new file mode 100644 index 000000000..fb327a7ea --- /dev/null +++ b/lib/librte_mempool/mempool_trace_points.c @@ -0,0 +1,108 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(C) 2020 Marvell International Ltd. + */ + +#define RTE_TRACE_POINT_REGISTER_SELECT /* Select trace point register macros */ + +#include "rte_trace_mempool.h" + +RTE_TRACE_POINT_DEFINE(rte_trace_lib_mempool_ops_dequeue_bulk); +RTE_TRACE_POINT_DEFINE(rte_trace_lib_mempool_ops_dequeue_contig_blocks); +RTE_TRACE_POINT_DEFINE(rte_trace_lib_mempool_ops_enqueue_bulk); +RTE_TRACE_POINT_DEFINE(rte_trace_lib_mempool_generic_put); +RTE_TRACE_POINT_DEFINE(rte_trace_lib_mempool_put_bulk); +RTE_TRACE_POINT_DEFINE(rte_trace_lib_mempool_generic_get); +RTE_TRACE_POINT_DEFINE(rte_trace_lib_mempool_get_bulk); +RTE_TRACE_POINT_DEFINE(rte_trace_lib_mempool_get_contig_blocks); +RTE_TRACE_POINT_DEFINE(rte_trace_lib_mempool_create); +RTE_TRACE_POINT_DEFINE(rte_trace_lib_mempool_create_empty); +RTE_TRACE_POINT_DEFINE(rte_trace_lib_mempool_free); +RTE_TRACE_POINT_DEFINE(rte_trace_lib_mempool_populate_iova); +RTE_TRACE_POINT_DEFINE(rte_trace_lib_mempool_populate_virt); +RTE_TRACE_POINT_DEFINE(rte_trace_lib_mempool_populate_default); +RTE_TRACE_POINT_DEFINE(rte_trace_lib_mempool_populate_anon); +RTE_TRACE_POINT_DEFINE(rte_trace_lib_mempool_cache_create); +RTE_TRACE_POINT_DEFINE(rte_trace_lib_mempool_cache_free); +RTE_TRACE_POINT_DEFINE(rte_trace_lib_mempool_default_cache); +RTE_TRACE_POINT_DEFINE(rte_trace_lib_mempool_get_page_size); +RTE_TRACE_POINT_DEFINE(rte_trace_lib_mempool_cache_flush); +RTE_TRACE_POINT_DEFINE(rte_trace_lib_mempool_ops_populate); +RTE_TRACE_POINT_DEFINE(rte_trace_lib_mempool_ops_alloc); +RTE_TRACE_POINT_DEFINE(rte_trace_lib_mempool_ops_free); +RTE_TRACE_POINT_DEFINE(rte_trace_lib_mempool_set_ops_byname); + +RTE_INIT(mempool_trace_init) +{ + RTE_TRACE_POINT_REGISTER(rte_trace_lib_mempool_ops_dequeue_bulk, + lib.mempool.ops.deq.bulk); + + RTE_TRACE_POINT_REGISTER( + rte_trace_lib_mempool_ops_dequeue_contig_blocks, + lib.mempool.ops.deq.contig); + + RTE_TRACE_POINT_REGISTER(rte_trace_lib_mempool_ops_enqueue_bulk, + lib.mempool.ops.enq.bulk); + + RTE_TRACE_POINT_REGISTER(rte_trace_lib_mempool_generic_put, + lib.mempool.generic.put); + + RTE_TRACE_POINT_REGISTER(rte_trace_lib_mempool_put_bulk, + lib.mempool.put.bulk); + + RTE_TRACE_POINT_REGISTER(rte_trace_lib_mempool_generic_get, + lib.mempool.generic.get); + + RTE_TRACE_POINT_REGISTER(rte_trace_lib_mempool_get_bulk, + lib.mempool.get.bulk); + + RTE_TRACE_POINT_REGISTER(rte_trace_lib_mempool_get_contig_blocks, + lib.mempool.get.blocks); + + RTE_TRACE_POINT_REGISTER(rte_trace_lib_mempool_create, + lib.mempool.create); + + RTE_TRACE_POINT_REGISTER(rte_trace_lib_mempool_create_empty, + lib.mempool.create.empty); + + RTE_TRACE_POINT_REGISTER(rte_trace_lib_mempool_free, + lib.mempool.free); + + RTE_TRACE_POINT_REGISTER(rte_trace_lib_mempool_populate_iova, + lib.mempool.populate.iova); + + RTE_TRACE_POINT_REGISTER(rte_trace_lib_mempool_populate_virt, + lib.mempool.populate.virt); + + RTE_TRACE_POINT_REGISTER(rte_trace_lib_mempool_populate_default, + lib.mempool.populate.default); + + RTE_TRACE_POINT_REGISTER(rte_trace_lib_mempool_populate_anon, + lib.mempool.populate.anon); + + RTE_TRACE_POINT_REGISTER(rte_trace_lib_mempool_cache_create, + lib.mempool.cache_create); + + RTE_TRACE_POINT_REGISTER(rte_trace_lib_mempool_cache_free, + lib.mempool.cache.free); + + RTE_TRACE_POINT_REGISTER(rte_trace_lib_mempool_default_cache, + lib.mempool.default.cache); + + RTE_TRACE_POINT_REGISTER(rte_trace_lib_mempool_get_page_size, + lib.mempool.get.page.size); + + RTE_TRACE_POINT_REGISTER(rte_trace_lib_mempool_cache_flush, + lib.mempool.cache.flush); + + RTE_TRACE_POINT_REGISTER(rte_trace_lib_mempool_ops_populate, + lib.mempool.ops.populate); + + RTE_TRACE_POINT_REGISTER(rte_trace_lib_mempool_ops_alloc, + lib.mempool.ops.alloc); + + RTE_TRACE_POINT_REGISTER(rte_trace_lib_mempool_ops_free, + lib.mempool.ops.free); + + RTE_TRACE_POINT_REGISTER(rte_trace_lib_mempool_set_ops_byname, + lib.mempool.set.ops.byname); +} diff --git a/lib/librte_mempool/meson.build b/lib/librte_mempool/meson.build index 45e0cb7ea..3e8d64c51 100644 --- a/lib/librte_mempool/meson.build +++ b/lib/librte_mempool/meson.build @@ -10,6 +10,7 @@ foreach flag: extra_flags endforeach sources = files('rte_mempool.c', 'rte_mempool_ops.c', - 'rte_mempool_ops_default.c') -headers = files('rte_mempool.h') + 'rte_mempool_ops_default.c', 'mempool_trace_points.c') +headers = files('rte_mempool.h', 'rte_trace_mempool.h', + 'rte_trace_mempool_fp.h') deps += ['ring'] diff --git a/lib/librte_mempool/rte_mempool.c b/lib/librte_mempool/rte_mempool.c index 712c839a0..6cc0c7209 100644 --- a/lib/librte_mempool/rte_mempool.c +++ b/lib/librte_mempool/rte_mempool.c @@ -33,6 +33,7 @@ #include #include "rte_mempool.h" +#include "rte_trace_mempool.h" TAILQ_HEAD(rte_mempool_list, rte_tailq_entry); @@ -377,6 +378,8 @@ rte_mempool_populate_iova(struct rte_mempool *mp, char *vaddr, if (ret == 0) ret = -EINVAL; + rte_trace_lib_mempool_populate_iova(mp, vaddr, iova, len, free_cb, + opaque); return ret; } @@ -444,6 +447,8 @@ rte_mempool_populate_virt(struct rte_mempool *mp, char *addr, if (cnt == 0) return -EINVAL; + rte_trace_lib_mempool_populate_virt(mp, addr, len, pg_sz, free_cb, + opaque); return cnt; fail: @@ -473,6 +478,7 @@ rte_mempool_get_page_size(struct rte_mempool *mp, size_t *pg_sz) else *pg_sz = getpagesize(); + rte_trace_lib_mempool_get_page_size(mp, *pg_sz); return 0; } @@ -611,6 +617,7 @@ rte_mempool_populate_default(struct rte_mempool *mp) } } + rte_trace_lib_mempool_populate_default(mp); return mp->size; fail: @@ -701,6 +708,7 @@ rte_mempool_populate_anon(struct rte_mempool *mp) goto fail; } + rte_trace_lib_mempool_populate_anon(mp); return mp->populated_size; fail: @@ -732,6 +740,7 @@ rte_mempool_free(struct rte_mempool *mp) } rte_mcfg_tailq_write_unlock(); + rte_trace_lib_mempool_free(mp); rte_mempool_free_memchunks(mp); rte_mempool_ops_free(mp); rte_memzone_free(mp->mz); @@ -770,6 +779,7 @@ rte_mempool_cache_create(uint32_t size, int socket_id) mempool_cache_init(cache, size); + rte_trace_lib_mempool_cache_create(size, socket_id, cache); return cache; } @@ -781,6 +791,7 @@ rte_mempool_cache_create(uint32_t size, int socket_id) void rte_mempool_cache_free(struct rte_mempool_cache *cache) { + rte_trace_lib_mempool_cache_free(cache); rte_free(cache); } @@ -911,6 +922,8 @@ rte_mempool_create_empty(const char *name, unsigned n, unsigned elt_size, rte_mcfg_tailq_write_unlock(); rte_mcfg_mempool_write_unlock(); + rte_trace_lib_mempool_create_empty(name, n, elt_size, cache_size, + private_data_size, flags, mp); return mp; exit_unlock: @@ -963,6 +976,9 @@ rte_mempool_create(const char *name, unsigned n, unsigned elt_size, if (obj_init) rte_mempool_obj_iter(mp, obj_init, obj_init_arg); + rte_trace_lib_mempool_create(name, n, elt_size, cache_size, + private_data_size, mp_init, mp_init_arg, + obj_init, obj_init_arg, flags, mp); return mp; fail: diff --git a/lib/librte_mempool/rte_mempool.h b/lib/librte_mempool/rte_mempool.h index c90cf3146..2d0b5ad46 100644 --- a/lib/librte_mempool/rte_mempool.h +++ b/lib/librte_mempool/rte_mempool.h @@ -51,6 +51,8 @@ #include #include +#include "rte_trace_mempool_fp.h" + #ifdef __cplusplus extern "C" { #endif @@ -736,6 +738,7 @@ rte_mempool_ops_dequeue_bulk(struct rte_mempool *mp, { struct rte_mempool_ops *ops; + rte_trace_lib_mempool_ops_dequeue_bulk(mp, obj_table, n); ops = rte_mempool_get_ops(mp->ops_index); return ops->dequeue(mp, obj_table, n); } @@ -761,6 +764,7 @@ rte_mempool_ops_dequeue_contig_blocks(struct rte_mempool *mp, ops = rte_mempool_get_ops(mp->ops_index); RTE_ASSERT(ops->dequeue_contig_blocks != NULL); + rte_trace_lib_mempool_ops_dequeue_contig_blocks(mp, first_obj_table, n); return ops->dequeue_contig_blocks(mp, first_obj_table, n); } @@ -783,6 +787,7 @@ rte_mempool_ops_enqueue_bulk(struct rte_mempool *mp, void * const *obj_table, { struct rte_mempool_ops *ops; + rte_trace_lib_mempool_ops_enqueue_bulk(mp, obj_table, n); ops = rte_mempool_get_ops(mp->ops_index); return ops->enqueue(mp, obj_table, n); } @@ -1264,6 +1269,8 @@ rte_mempool_default_cache(struct rte_mempool *mp, unsigned lcore_id) if (lcore_id >= RTE_MAX_LCORE) return NULL; + rte_trace_lib_mempool_default_cache(mp, lcore_id, + &mp->local_cache[lcore_id]); return &mp->local_cache[lcore_id]; } @@ -1283,6 +1290,7 @@ rte_mempool_cache_flush(struct rte_mempool_cache *cache, cache = rte_mempool_default_cache(mp, rte_lcore_id()); if (cache == NULL || cache->len == 0) return; + rte_trace_lib_mempool_cache_flush(cache, mp); rte_mempool_ops_enqueue_bulk(mp, cache->objs, cache->len); cache->len = 0; } @@ -1362,6 +1370,7 @@ static __rte_always_inline void rte_mempool_generic_put(struct rte_mempool *mp, void * const *obj_table, unsigned int n, struct rte_mempool_cache *cache) { + rte_trace_lib_mempool_generic_put(mp, obj_table, n, cache); __mempool_check_cookies(mp, obj_table, n, 0); __mempool_generic_put(mp, obj_table, n, cache); } @@ -1386,6 +1395,7 @@ rte_mempool_put_bulk(struct rte_mempool *mp, void * const *obj_table, { struct rte_mempool_cache *cache; cache = rte_mempool_default_cache(mp, rte_lcore_id()); + rte_trace_lib_mempool_put_bulk(mp, obj_table, n, cache); rte_mempool_generic_put(mp, obj_table, n, cache); } @@ -1507,6 +1517,7 @@ rte_mempool_generic_get(struct rte_mempool *mp, void **obj_table, ret = __mempool_generic_get(mp, obj_table, n, cache); if (ret == 0) __mempool_check_cookies(mp, obj_table, n, 1); + rte_trace_lib_mempool_generic_get(mp, obj_table, n, cache); return ret; } @@ -1537,6 +1548,7 @@ rte_mempool_get_bulk(struct rte_mempool *mp, void **obj_table, unsigned int n) { struct rte_mempool_cache *cache; cache = rte_mempool_default_cache(mp, rte_lcore_id()); + rte_trace_lib_mempool_get_bulk(mp, obj_table, n, cache); return rte_mempool_generic_get(mp, obj_table, n, cache); } @@ -1606,6 +1618,7 @@ rte_mempool_get_contig_blocks(struct rte_mempool *mp, __MEMPOOL_CONTIG_BLOCKS_STAT_ADD(mp, get_fail, n); } + rte_trace_lib_mempool_get_contig_blocks(mp, first_obj_table, n); return ret; } diff --git a/lib/librte_mempool/rte_mempool_ops.c b/lib/librte_mempool/rte_mempool_ops.c index 22c5251eb..c1b24a1f3 100644 --- a/lib/librte_mempool/rte_mempool_ops.c +++ b/lib/librte_mempool/rte_mempool_ops.c @@ -11,6 +11,8 @@ #include #include +#include "rte_trace_mempool.h" + /* indirect jump table to support external memory pools. */ struct rte_mempool_ops_table rte_mempool_ops_table = { .sl = RTE_SPINLOCK_INITIALIZER, @@ -74,6 +76,7 @@ rte_mempool_ops_alloc(struct rte_mempool *mp) { struct rte_mempool_ops *ops; + rte_trace_lib_mempool_ops_alloc(mp); ops = rte_mempool_get_ops(mp->ops_index); return ops->alloc(mp); } @@ -84,6 +87,7 @@ rte_mempool_ops_free(struct rte_mempool *mp) { struct rte_mempool_ops *ops; + rte_trace_lib_mempool_ops_free(mp); ops = rte_mempool_get_ops(mp->ops_index); if (ops->free == NULL) return; @@ -130,6 +134,8 @@ rte_mempool_ops_populate(struct rte_mempool *mp, unsigned int max_objs, ops = rte_mempool_get_ops(mp->ops_index); + rte_trace_lib_mempool_ops_populate(mp, max_objs, vaddr, iova, len, + obj_cb, obj_cb_arg); if (ops->populate == NULL) return rte_mempool_op_populate_default(mp, max_objs, vaddr, iova, len, obj_cb, @@ -178,5 +184,6 @@ rte_mempool_set_ops_byname(struct rte_mempool *mp, const char *name, mp->ops_index = i; mp->pool_config = pool_config; + rte_trace_lib_mempool_set_ops_byname(mp, name, pool_config); return 0; } diff --git a/lib/librte_mempool/rte_mempool_version.map b/lib/librte_mempool/rte_mempool_version.map index d002dfc46..2d2594635 100644 --- a/lib/librte_mempool/rte_mempool_version.map +++ b/lib/librte_mempool/rte_mempool_version.map @@ -45,4 +45,30 @@ EXPERIMENTAL { rte_mempool_get_page_size; rte_mempool_op_calc_mem_size_helper; rte_mempool_op_populate_helper; + + # added in 20.05 + __rte_trace_lib_mempool_ops_dequeue_bulk; + __rte_trace_lib_mempool_ops_dequeue_contig_blocks; + __rte_trace_lib_mempool_ops_enqueue_bulk; + __rte_trace_lib_mempool_generic_put; + __rte_trace_lib_mempool_put_bulk; + __rte_trace_lib_mempool_generic_get; + __rte_trace_lib_mempool_get_bulk; + __rte_trace_lib_mempool_get_contig_blocks; + __rte_trace_lib_mempool_create; + __rte_trace_lib_mempool_create_empty; + __rte_trace_lib_mempool_free; + __rte_trace_lib_mempool_populate_iova; + __rte_trace_lib_mempool_populate_virt; + __rte_trace_lib_mempool_populate_default; + __rte_trace_lib_mempool_populate_anon; + __rte_trace_lib_mempool_cache_create; + __rte_trace_lib_mempool_cache_free; + __rte_trace_lib_mempool_default_cache; + __rte_trace_lib_mempool_get_page_size; + __rte_trace_lib_mempool_cache_flush; + __rte_trace_lib_mempool_ops_populate; + __rte_trace_lib_mempool_ops_alloc; + __rte_trace_lib_mempool_ops_free; + __rte_trace_lib_mempool_set_ops_byname; }; diff --git a/lib/librte_mempool/rte_trace_mempool.h b/lib/librte_mempool/rte_trace_mempool.h new file mode 100644 index 000000000..545af935f --- /dev/null +++ b/lib/librte_mempool/rte_trace_mempool.h @@ -0,0 +1,178 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(C) 2020 Marvell International Ltd. + */ + +#ifndef _RTE_TRACE_MEMPOOL_H_ +#define _RTE_TRACE_MEMPOOL_H_ + +/** + * @file + * + * APIs for mempool trace support + */ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "rte_mempool.h" + +#include +#include + +RTE_TRACE_POINT( + rte_trace_lib_mempool_create, + RTE_TRACE_POINT_ARGS(const char *name, uint32_t nb_elts, + uint32_t elt_size, uint32_t cache_size, + uint32_t private_data_size, void *mp_init, + void *mp_init_arg, void *obj_init, + void *obj_init_arg, uint32_t flags, + struct rte_mempool *mempool), + rte_trace_point_emit_string(name); + rte_trace_point_emit_u32(nb_elts); + rte_trace_point_emit_u32(elt_size); + rte_trace_point_emit_u32(cache_size); + rte_trace_point_emit_u32(private_data_size); + rte_trace_point_emit_ptr(mp_init); + rte_trace_point_emit_ptr(mp_init_arg); + rte_trace_point_emit_ptr(obj_init); + rte_trace_point_emit_ptr(obj_init_arg); + rte_trace_point_emit_u32(flags); + rte_trace_point_emit_ptr(mempool); + rte_trace_point_emit_i32(mempool->ops_index); +) + +RTE_TRACE_POINT( + rte_trace_lib_mempool_create_empty, + RTE_TRACE_POINT_ARGS(const char *name, uint32_t nb_elts, + uint32_t elt_size, uint32_t cache_size, + uint32_t private_data_size, uint32_t flags, + struct rte_mempool *mempool), + rte_trace_point_emit_string(name); + rte_trace_point_emit_u32(nb_elts); + rte_trace_point_emit_u32(elt_size); + rte_trace_point_emit_u32(cache_size); + rte_trace_point_emit_u32(private_data_size); + rte_trace_point_emit_u32(flags); + rte_trace_point_emit_ptr(mempool); + rte_trace_point_emit_i32(mempool->ops_index); +) + +RTE_TRACE_POINT( + rte_trace_lib_mempool_free, + RTE_TRACE_POINT_ARGS(struct rte_mempool *mempool), + rte_trace_point_emit_ptr(mempool); + rte_trace_point_emit_string(mempool->name); +) + +RTE_TRACE_POINT( + rte_trace_lib_mempool_populate_iova, + RTE_TRACE_POINT_ARGS(struct rte_mempool *mempool, void *vaddr, + rte_iova_t iova, size_t len, void *free_cb, + void *opaque), + rte_trace_point_emit_ptr(mempool); + rte_trace_point_emit_string(mempool->name); + rte_trace_point_emit_ptr(vaddr); + rte_trace_point_emit_u64(iova); + rte_trace_point_emit_long(len); + rte_trace_point_emit_ptr(free_cb); + rte_trace_point_emit_ptr(opaque); +) + +RTE_TRACE_POINT( + rte_trace_lib_mempool_populate_virt, + RTE_TRACE_POINT_ARGS(struct rte_mempool *mempool, void *addr, + size_t len, size_t pg_sz, void *free_cb, + void *opaque), + rte_trace_point_emit_ptr(mempool); + rte_trace_point_emit_string(mempool->name); + rte_trace_point_emit_ptr(addr); + rte_trace_point_emit_long(len); + rte_trace_point_emit_long(pg_sz); + rte_trace_point_emit_ptr(free_cb); + rte_trace_point_emit_ptr(opaque); +) + +RTE_TRACE_POINT( + rte_trace_lib_mempool_populate_default, + RTE_TRACE_POINT_ARGS(struct rte_mempool *mempool), + rte_trace_point_emit_ptr(mempool); + rte_trace_point_emit_string(mempool->name); +) + +RTE_TRACE_POINT( + rte_trace_lib_mempool_populate_anon, + RTE_TRACE_POINT_ARGS(struct rte_mempool *mempool), + rte_trace_point_emit_ptr(mempool); + rte_trace_point_emit_string(mempool->name); +) + +RTE_TRACE_POINT( + rte_trace_lib_mempool_cache_create, + RTE_TRACE_POINT_ARGS(uint32_t size, int socket_id, + struct rte_mempool_cache *cache), + rte_trace_point_emit_u32(size); + rte_trace_point_emit_i32(socket_id); + rte_trace_point_emit_ptr(cache); + rte_trace_point_emit_u32(cache->len); + rte_trace_point_emit_u32(cache->flushthresh); +) + +RTE_TRACE_POINT( + rte_trace_lib_mempool_cache_free, + RTE_TRACE_POINT_ARGS(void *cache), + rte_trace_point_emit_ptr(cache); +) + +RTE_TRACE_POINT( + rte_trace_lib_mempool_get_page_size, + RTE_TRACE_POINT_ARGS(struct rte_mempool *mempool, size_t pg_sz), + rte_trace_point_emit_ptr(mempool); + rte_trace_point_emit_string(mempool->name); + rte_trace_point_emit_long(pg_sz); +) + +RTE_TRACE_POINT( + rte_trace_lib_mempool_ops_populate, + RTE_TRACE_POINT_ARGS(struct rte_mempool *mempool, uint32_t max_objs, + void *vaddr, uint64_t iova, size_t len, + void *obj_cb, void *obj_cb_arg), + rte_trace_point_emit_ptr(mempool); + rte_trace_point_emit_string(mempool->name); + rte_trace_point_emit_u32(max_objs); + rte_trace_point_emit_ptr(vaddr); + rte_trace_point_emit_u64(iova); + rte_trace_point_emit_long(len); + rte_trace_point_emit_ptr(obj_cb); + rte_trace_point_emit_ptr(obj_cb_arg); +) + +RTE_TRACE_POINT( + rte_trace_lib_mempool_ops_alloc, + RTE_TRACE_POINT_ARGS(struct rte_mempool *mempool), + rte_trace_point_emit_ptr(mempool); + rte_trace_point_emit_string(mempool->name); +) + +RTE_TRACE_POINT( + rte_trace_lib_mempool_ops_free, + RTE_TRACE_POINT_ARGS(struct rte_mempool *mempool), + rte_trace_point_emit_ptr(mempool); + rte_trace_point_emit_string(mempool->name); +) + +RTE_TRACE_POINT( + rte_trace_lib_mempool_set_ops_byname, + RTE_TRACE_POINT_ARGS(struct rte_mempool *mempool, const char *name, + void *pool_config), + rte_trace_point_emit_ptr(mempool); + rte_trace_point_emit_string(mempool->name); + rte_trace_point_emit_string(name); + rte_trace_point_emit_ptr(pool_config); +) + +#ifdef __cplusplus +} +#endif + +#endif /* _RTE_TRACE_MEMPOOL_H_ */ diff --git a/lib/librte_mempool/rte_trace_mempool_fp.h b/lib/librte_mempool/rte_trace_mempool_fp.h new file mode 100644 index 000000000..bcc3159ca --- /dev/null +++ b/lib/librte_mempool/rte_trace_mempool_fp.h @@ -0,0 +1,116 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(C) 2020 Marvell International Ltd. + */ + +#ifndef _RTE_TRACE_MEMPOOL_FP_H_ +#define _RTE_TRACE_MEMPOOL_FP_H_ + +/** + * @file + * + * Mempool fast path API for trace support + */ + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +RTE_TRACE_POINT_FP( + rte_trace_lib_mempool_ops_dequeue_bulk, + RTE_TRACE_POINT_ARGS(void *mempool, void **obj_table, + uint32_t nb_objs), + rte_trace_point_emit_ptr(mempool); + rte_trace_point_emit_ptr(obj_table); + rte_trace_point_emit_u32(nb_objs); +) + +RTE_TRACE_POINT_FP( + rte_trace_lib_mempool_ops_dequeue_contig_blocks, + RTE_TRACE_POINT_ARGS(void *mempool, void **first_obj_table, + uint32_t nb_objs), + rte_trace_point_emit_ptr(mempool); + rte_trace_point_emit_ptr(first_obj_table); + rte_trace_point_emit_u32(nb_objs); +) + +RTE_TRACE_POINT_FP( + rte_trace_lib_mempool_ops_enqueue_bulk, + RTE_TRACE_POINT_ARGS(void *mempool, void * const *obj_table, + uint32_t nb_objs), + rte_trace_point_emit_ptr(mempool); + rte_trace_point_emit_ptr(obj_table); + rte_trace_point_emit_u32(nb_objs); +) + +RTE_TRACE_POINT_FP( + rte_trace_lib_mempool_generic_put, + RTE_TRACE_POINT_ARGS(void *mempool, void * const *obj_table, + uint32_t nb_objs, void *cache), + rte_trace_point_emit_ptr(mempool); + rte_trace_point_emit_ptr(obj_table); + rte_trace_point_emit_u32(nb_objs); + rte_trace_point_emit_ptr(cache); +) + +RTE_TRACE_POINT_FP( + rte_trace_lib_mempool_put_bulk, + RTE_TRACE_POINT_ARGS(void *mempool, void * const *obj_table, + uint32_t nb_objs, void *cache), + rte_trace_point_emit_ptr(mempool); + rte_trace_point_emit_ptr(obj_table); + rte_trace_point_emit_u32(nb_objs); + rte_trace_point_emit_ptr(cache); +) + +RTE_TRACE_POINT_FP( + rte_trace_lib_mempool_generic_get, + RTE_TRACE_POINT_ARGS(void *mempool, void * const *obj_table, + uint32_t nb_objs, void *cache), + rte_trace_point_emit_ptr(mempool); + rte_trace_point_emit_ptr(obj_table); + rte_trace_point_emit_u32(nb_objs); + rte_trace_point_emit_ptr(cache); +) + +RTE_TRACE_POINT_FP( + rte_trace_lib_mempool_get_bulk, + RTE_TRACE_POINT_ARGS(void *mempool, void **obj_table, + uint32_t nb_objs, void *cache), + rte_trace_point_emit_ptr(mempool); + rte_trace_point_emit_ptr(obj_table); + rte_trace_point_emit_u32(nb_objs); + rte_trace_point_emit_ptr(cache); +) + +RTE_TRACE_POINT_FP( + rte_trace_lib_mempool_get_contig_blocks, + RTE_TRACE_POINT_ARGS(void *mempool, void **first_obj_table, + uint32_t nb_objs), + rte_trace_point_emit_ptr(mempool); + rte_trace_point_emit_ptr(first_obj_table); + rte_trace_point_emit_u32(nb_objs); +) + +RTE_TRACE_POINT_FP( + rte_trace_lib_mempool_default_cache, + RTE_TRACE_POINT_ARGS(void *mempool, uint32_t lcore_id, + void *default_cache), + rte_trace_point_emit_ptr(mempool); + rte_trace_point_emit_u32(lcore_id); + rte_trace_point_emit_ptr(default_cache); +) + +RTE_TRACE_POINT_FP( + rte_trace_lib_mempool_cache_flush, + RTE_TRACE_POINT_ARGS(void *cache, void *mempool), + rte_trace_point_emit_ptr(cache); + rte_trace_point_emit_ptr(mempool); +) + +#ifdef __cplusplus +} +#endif + +#endif /* _RTE_TRACE_MEMPOOL_FP_H_ */ From patchwork Sun Apr 19 10:01:33 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: 68907 X-Patchwork-Delegate: david.marchand@redhat.com 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 D91C5A0561; Sun, 19 Apr 2020 12:12:11 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id D488A1D698; Sun, 19 Apr 2020 12:04:02 +0200 (CEST) Received: from mx0b-0016f401.pphosted.com (mx0a-0016f401.pphosted.com [67.231.148.174]) by dpdk.org (Postfix) with ESMTP id 24DC81D5C0 for ; Sun, 19 Apr 2020 12:03:50 +0200 (CEST) Received: from pps.filterd (m0045849.ppops.net [127.0.0.1]) by mx0a-0016f401.pphosted.com (8.16.0.42/8.16.0.42) with SMTP id 03J9wnD4032579; Sun, 19 Apr 2020 03:03:49 -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=xs+iEC9gohLSI3mAcEq0XqImRrSNxDW/q6PiCwpSeho=; b=QCWidgvzYO1osxNTE5XtKxHtI486KQ7ISA/GuSpqS93wkRDoW8V0kg5sKINM8wPDZaEm DyDzTnNe98UB8UO+3jtMEIdP6xGQkYx5hD7P5KuiHUmXf4C0I87KMTsvKNV3UN7EFlHL yS1GCwXqjUjuIIXD1LMKSecHxFhEjupLVEhYg7lhnF97KXJ08aifqg+V4FZfmHm5TPW2 Sv5dVPAudZLC8sCDd2niApBXiaPqUOcgTYUuX7Hi2ROqQhFGDRovA/Gp4aR7QMgbLabX 1B/8ovRMLHv+BXE3xw2MMWAwQn+SEXbx1BMc5JIdavqUWeemrBbij09nCyir8iw2vkk6 qw== Received: from sc-exch03.marvell.com ([199.233.58.183]) by mx0a-0016f401.pphosted.com with ESMTP id 30fxwp3d9p-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT); Sun, 19 Apr 2020 03:03:49 -0700 Received: from DC5-EXCH02.marvell.com (10.69.176.39) by SC-EXCH03.marvell.com (10.93.176.83) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Sun, 19 Apr 2020 03:03:47 -0700 Received: from DC5-EXCH01.marvell.com (10.69.176.38) by DC5-EXCH02.marvell.com (10.69.176.39) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Sun, 19 Apr 2020 03:03:46 -0700 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.2 via Frontend Transport; Sun, 19 Apr 2020 03:03:46 -0700 Received: from jerin-lab.marvell.com (jerin-lab.marvell.com [10.28.34.14]) by maili.marvell.com (Postfix) with ESMTP id F3C8C3F703F; Sun, 19 Apr 2020 03:03:43 -0700 (PDT) From: To: Thomas Monjalon , John McNamara , Marko Kovacevic , "Jerin Jacob" , Sunil Kumar Kori CC: , , , Date: Sun, 19 Apr 2020 15:31:33 +0530 Message-ID: <20200419100133.3232316-34-jerinj@marvell.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200419100133.3232316-1-jerinj@marvell.com> References: <20200413150116.734047-1-jerinj@marvell.com> <20200419100133.3232316-1-jerinj@marvell.com> MIME-Version: 1.0 X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:6.0.138, 18.0.676 definitions=2020-04-19_02:2020-04-17, 2020-04-19 signatures=0 Subject: [dpdk-dev] [PATCH v6 33/33] doc: add trace library guide 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 Add programmar's guide for trace library support. Signed-off-by: Jerin Jacob Signed-off-by: Sunil Kumar Kori --- MAINTAINERS | 1 + doc/guides/prog_guide/index.rst | 1 + doc/guides/prog_guide/trace_lib.rst | 346 +++++++++++++++++++++++++ doc/guides/rel_notes/release_20_05.rst | 9 + 4 files changed, 357 insertions(+) create mode 100644 doc/guides/prog_guide/trace_lib.rst diff --git a/MAINTAINERS b/MAINTAINERS index 4592abede..b08ffd482 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -200,6 +200,7 @@ M: Sunil Kumar Kori F: lib/librte_eal/include/rte_trace*.h F: lib/librte_eal/common/eal_common_trace*.c F: lib/librte_eal/common/eal_trace.h +F: doc/guides/prog_guide/trace_lib.rst Memory Allocation M: Anatoly Burakov diff --git a/doc/guides/prog_guide/index.rst b/doc/guides/prog_guide/index.rst index fb250abf5..0daa08acc 100644 --- a/doc/guides/prog_guide/index.rst +++ b/doc/guides/prog_guide/index.rst @@ -35,6 +35,7 @@ Programmer's Guide lpm_lib lpm6_lib flow_classify_lib + trace_lib packet_distrib_lib reorder_lib ip_fragment_reassembly_lib diff --git a/doc/guides/prog_guide/trace_lib.rst b/doc/guides/prog_guide/trace_lib.rst new file mode 100644 index 000000000..fe0fe2335 --- /dev/null +++ b/doc/guides/prog_guide/trace_lib.rst @@ -0,0 +1,346 @@ +.. SPDX-License-Identifier: BSD-3-Clause + Copyright(C) 2020 Marvell International Ltd. + +Trace Library +============= + +Overview +-------- + +*Tracing* is a technique used to understand what goes on in a running software +system. The software used for tracing is called a *tracer*, which is conceptually +similar to a tape recorder. When recording, specific instrumentation points +placed in the software source code generate events that are saved on a giant +tape: a trace file. The trace file then later can be opened in *trace viewers* to +visualize and analyze the trace events with timestamps and multi-core views. +Such a mechanism will be useful for resolving a wide range of problems such as +multi-core synchronization issues, latency measurements, finding out the +post analyses information like CPU idle time, etc that would otherwise be +extremely challenging. + +Tracing is often compared to *logging*. However, tracers and loggers are two +different tools, serving two different purposes. Tracers are designed to record +much lower-level events that occur much more frequently than log messages, often +in the range of thousands per second, with very little execution overhead. +Logging is more appropriate for a very high-level analysis of less frequent +events: user accesses, exceptional conditions (errors and warnings, for +example), database transactions, instant messaging communications, and such. +Simply put, logging is one of the many use cases that can be satisfied with +tracing. + +DPDK tracing library features +----------------------------- + +- A framework to add tracepoints in control and fast APIs with minimum impact on + performance. Typical trace overhead is ~20 cycles and instrumentation + overhead is 1 cycle. +- Enable and disable the tracepoints at runtime. +- Save the trace buffer to the filesystem at any point in time. +- Supports ``overwrite`` and ``discard`` trace mode operations. +- String-based tracepoint object lookup. +- Enable and disable a set of tracepoints based on regular expression and/or + globbing. +- Generate trace in ``common trace format(CTF)``. ``CTF`` is an open-source trace + format and it is compatible with ``LTTng``. + For detailed information, refer `Common Trace Format `_ + +How to add a tracepoint? +------------------------ + +This section steps you through the details of adding a simple tracepoint. + +.. _create_provider_header_file: + +Create the tracepoint provider header file +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. code-block:: c + + #include + + RTE_TRACE_POINT(app_trace_string, + RTE_TRACE_POINT_ARGS(const char *str), + rte_trace_point_emit_string(str); + ) + +The above macro creates ``app_trace_string`` tracepoint. The user can choose +any name for the tracepoint. However, when adding the tracepoint in the DPDK +library, the ``rte_trace_lib__[]_`` naming convention +must be followed. The examples are ``rte_trace_lib_eal_generic_str``, +``rte_trace_lib_mempool_create``. + +When ``RTE_TRACE_POINT`` expands for above the definition, it creates the +following function template. The consumer of this tracepoint can invoke +``app_trace_string(const char *str)`` to emit the trace event to the trace buffer. + +.. code-block:: c + + static __rte_always_inline void + app_trace_string(const char *str) + { + /* Trace subsystem hooks */ + ... + rte_trace_point_emit_string(str); + } + +Register the tracepoint +~~~~~~~~~~~~~~~~~~~~~~~ + +.. code-block:: c + + #define RTE_TRACE_POINT_REGISTER_SELECT /* Select trace point register macros */ + + #include + + RTE_TRACE_POINT_DEFINE(app_trace_string); + + RTE_INIT(eal_trace_init) + { + RTE_TRACE_POINT_REGISTER(app_trace_string, app.trace.string); + } + +The above code snippet registers the ``app_trace_string`` tracepoint to +trace library. Here, the ``tracepoint_provider_header_file.h`` is the header file +that user created in the first step :ref:`create_provider_header_file` + +The second argument for the ``RTE_TRACE_POINT_REGISTER`` is the name for the +tracepoint. This string will be used for tracepoint lookup or regular expression +and/or glob based tracepoint operations. There is no requirement for +the trace function and its name to be similar. However, it is recommended to +have a similar name for a better naming convention. + +The user must register the tracepoint before the ``rte_eal_init`` invocation. +The user can use the ``RTE_INIT`` construction scheme to achieve the same. + +.. note:: + + The ``RTE_TRACE_POINT_DEFINE`` defines the tracepoint of ``rte_trace_point_t`` + type. When the tracepoint defined in the shared library, the user must + update the ``.map`` file with ``__`` symbol. + For example, ``__app_trace_string`` will be the exported symbol in the + above example. + +Datapath tracepoint +------------------- + +In order to avoid performance impact for the datapath tracepoint, the library +introduced ``RTE_TRACE_POINT_FP``. When adding the tracepoint in datapath code, +The user must use ``RTE_TRACE_POINT_FP`` instead of ``RTE_TRACE_POINT``. + +``RTE_TRACE_POINT_FP`` is compiled out by default and it can be enabled using +``CONFIG_RTE_ENABLE_TRACE_FP`` configuration parameter. The ``enable_trace_fp`` +build option shall be used for the same for meson build .The application may use +``rte_trace_fp_is_enabled()`` to get status of ``CONFIG_RTE_ENABLE_TRACE_FP``. + +Event record mode +----------------- + +Event record mode is an attribute of trace buffers. Trace library exposes the +following modes: + +.. _table_event_record_modes: + +.. table:: Event record modes. + + +-----------+-----------------------------------------------------------------+ + | Mode | Description | + | | | + +===========+=================================================================+ + | Overwrite | When trace buffer is full, new trace events overwrites the | + | | existing captured events in the trace buffer. | + +-----------+-----------------------------------------------------------------+ + | Discard | When trace buffer is full, new trace events will be discarded. | + +-----------+-----------------------------------------------------------------+ + +The mode can be configured either using EAL command line parameters on +application boot up or use ``rte_trace_mode_set()`` API to configure at runtime. +Refer :doc:`../linux_gsg/linux_eal_parameters` for EAL command line options. + +Trace file location +------------------- + +On ``rte_trace_save()`` or ``rte_eal_cleanup()`` invocation, the library saves +the trace buffers to the filesystem. By default, library saves trace files at +``$HOME/dpdk-traces/rte-yyyy-mm-dd-[AP]M-hh-mm-ss/``. It can be overridden by +the ``--trace-dir=`` EAL command line option. + +For more information, refer :doc:`../linux_gsg/linux_eal_parameters` for trace +EAL command line options. + + +View and analyze the recorded events +------------------------------------ + +Once the trace directory is available, the user can view/inspect the recorded events. + +There are many tools you can use to read DPDK traces: + +1. ``babeltrace`` is a command-line utility that converts trace formats; it +supports the format that DPDK trace library produces, CTF, as well as a +basic text output that can be grep ed. The babeltrace command is part of the +opensource ``Babeltrace`` project. + +2. ``Trace Compass`` is a graphical user interface for viewing and analyzing any +type of logs or traces, including DPDK traces. + +Use the babeltrace command-line tool +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The simplest way to list all the recorded events of a trace is to pass its path +to babeltrace with no options:: + + babeltrace + +``babeltrace`` finds all traces recursively within the given path and prints all +their events, merging them in chronological order. + +You can pipe the output of the babeltrace into a tool like grep(1) for further +filtering. Below example grep the events for ``ethdev`` only:: + + babeltrace /tmp/my-dpdk-trace | grep ethdev + +You can pipe the output of babeltrace into a tool like wc(1) to count the +recorded events. Below example count the number of ``ethdev`` events:: + + babeltrace /tmp/my-dpdk-trace | grep ethdev | wc --lines + +Use the tracecompass GUI tool +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +``Tracecompass`` is another tool to view/analyze the DPDK traces which gives +a graphical view of events. Like ``babeltrace``, tracecompass also provides +an interface to search for a particular event. To use ``tracecompass``, +following are the minimum required steps: + +- Install ``tracecompass`` to the localhost. Variants are available for Linux, + Windows, and OS-X. +- Launch ``tracecompass`` which will open a graphical window with trace management + interfaces. +- Open a trace using ``File->Open Trace`` option and select metadata file which + is to be viewed/analyzed. + +For more details, refer `Trace Compass `_ + +Quick start +----------- + +This section steps you through the details of generating trace and viewing it. + +- Start the dpdk-test:: + + echo "quit" | ./build/app/test/dpdk-test --no-huge --trace=.* + +- View the traces with babeltrace viewer:: + + babeltrace $HOME/dpdk-traces/rte-yyyy-mm-dd-[AP]M-hh-mm-ss/ + +Implementation details +---------------------- + +As DPDK trace library is designed to generate traces that uses ``Common Trace +Format (CTF)``. ``CTF`` specification consists of the following units to create +a trace. + +- ``Stream`` Sequence of packets. +- ``Packet`` Header and one or more events. +- ``Event`` Header and payload. + +For detailed information, refer `Common Trace Format `_ + +The implementation details broadly divided into the following areas: + +Trace metadata creation +~~~~~~~~~~~~~~~~~~~~~~~ + +Based on the ``CTF`` specification, One of a CTF trace's streams is mandatory: +the metadata stream. It contains exactly what you would expect: data about the +trace itself. The metadata stream contains a textual description of the binary +layouts of all the other streams. + +This description is written using the Trace Stream Description Language (TSDL), +a declarative language that exists only in the realm of CTF. The purpose of the +metadata stream is to make CTF readers know how to parse a trace's binary +streams of events without CTF specifying any fixed layout. The only stream +layout known in advance is, in fact, the metadata stream's one. + +The internal ``trace_metadata_create()`` function generates the metadata. + +Trace memory +~~~~~~~~~~~~ + +The trace memory will be allocated through an internal function +``__rte_trace_mem_per_thread_alloc()``. The trace memory will be allocated +per thread to enable lock less trace-emit function. The memory for the +trace memory for DPDK lcores will be allocated on ``rte_eal_init()`` if the trace +is enabled through a EAL option. For non DPDK threads, on the first trace +emission, the memory will be allocated. + +Trace memory layout +~~~~~~~~~~~~~~~~~~~ + +.. _table_trace_mem_layout: + +.. table:: Trace memory layout. + + +-------------------+ + | packet.header | + +-------------------+ + | packet.context | + +-------------------+ + | trace 0 header | + +-------------------+ + | trace 0 payload | + +-------------------+ + | trace 1 header | + +-------------------+ + | trace 1 payload | + +-------------------+ + | trace N header | + +-------------------+ + | trace N payload | + +-------------------+ + +packet.header +^^^^^^^^^^^^^ + +.. _table_packet_header: + +.. table:: Packet header layout. + + +-------------------+ + | uint32_t magic | + +-------------------+ + | rte_uuid_t uuid | + +-------------------+ + +packet.context +^^^^^^^^^^^^^^ + +.. _table_packet_context: + +.. table:: Packet context layout. + + +----------------------+ + | uint32_t thread_id | + +----------------------+ + | char thread_name[32] | + +----------------------+ + +trace.header +^^^^^^^^^^^^ + +.. _table_trace_header: + +.. table:: Packet context layout. + + +----------------------+ + | event_id [63:48] | + +----------------------+ + | timestamp [47:0] | + +----------------------+ + +The trace header is 64bit, it consists of 48bit of timestamp and 16bit 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 payout +will be emitted when the trace function invoked. diff --git a/doc/guides/rel_notes/release_20_05.rst b/doc/guides/rel_notes/release_20_05.rst index 184967844..6a108b104 100644 --- a/doc/guides/rel_notes/release_20_05.rst +++ b/doc/guides/rel_notes/release_20_05.rst @@ -81,6 +81,15 @@ New Features by making use of the event device capabilities. The event mode currently supports only inline IPsec protocol offload. +* **Added Trace Library and Tracepoints** + + A native implementation of ``common trace format(CTF)`` based trace library added + to provide the ability to add tracepoints in application/library to get runtime + trace/debug information for control and fast APIs with minimum impact on + fast path performance. Typical trace overhead is ~20 cycles and instrumentation + overhead is 1 cycle. Added tracepoints in ``EAL``, ``ethdev``, ``cryptodev``, + ``eventdev`` and ``mempool`` libraries for important functions. + Removed Items -------------