From patchwork Mon Apr 13 15:00:44 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: 68280 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 CC00DA0577; Mon, 13 Apr 2020 17:01:49 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 5D5EC2B86; Mon, 13 Apr 2020 17:01:44 +0200 (CEST) Received: from mx0b-0016f401.pphosted.com (mx0a-0016f401.pphosted.com [67.231.148.174]) by dpdk.org (Postfix) with ESMTP id 42A522B84 for ; Mon, 13 Apr 2020 17:01:43 +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 03DF085S014952; Mon, 13 Apr 2020 08:01:39 -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=n3AsSg13PuiZJn5DAgbjp5ytum0WXsI+mHB4mgvSt9pQxs/+FtC42JckAYYO3dAZrdu1 A7PWCiWPL0FInPrUSB7Mnpz47EGHkN+XvKHB8Ab7ibTm9ELXxYR/zlKBvcbKnFmnosk7 5KgIB2v2KpzIwFstCUiozyfiSZHBN7hpY9CEmO4M/jEQr1fZ3OSEak8KoVND4x6j9eAB 6iLQGKHZKguS6oJKisDgqbENll08kl17XtM0IM5JNva0oubMT9Kg/datyqdq9TWRXHiC tM7xMe53c8Q8xH6BWbr1DGj5rI4sCQitKxWsmskCCYQOhKcpvF0AqbpZZr+Cn/dO8j0F ng== Received: from sc-exch02.marvell.com ([199.233.58.182]) by mx0a-0016f401.pphosted.com with ESMTP id 30bb8qexrx-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT); Mon, 13 Apr 2020 08:01:39 -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; Mon, 13 Apr 2020 08:01:38 -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; Mon, 13 Apr 2020 08:01:37 -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; Mon, 13 Apr 2020 08:01:37 -0700 Received: from jerin-lab.marvell.com (jerin-lab.marvell.com [10.28.34.14]) by maili.marvell.com (Postfix) with ESMTP id D5F523F7062; Mon, 13 Apr 2020 08:01:15 -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: Mon, 13 Apr 2020 20:30:44 +0530 Message-ID: <20200413150116.734047-2-jerinj@marvell.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200413150116.734047-1-jerinj@marvell.com> References: <20200403153709.3703448-1-jerinj@marvell.com> <20200413150116.734047-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-13_07:2020-04-13, 2020-04-13 signatures=0 Subject: [dpdk-dev] [PATCH v5 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 Mon Apr 13 15:00:45 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: 68281 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 B8095A0577; Mon, 13 Apr 2020 17:02:03 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 3666D1BE99; Mon, 13 Apr 2020 17:01:47 +0200 (CEST) Received: from mx0b-0016f401.pphosted.com (mx0b-0016f401.pphosted.com [67.231.156.173]) by dpdk.org (Postfix) with ESMTP id 621271BEA6 for ; Mon, 13 Apr 2020 17:01:46 +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 03DF1KhH023057; Mon, 13 Apr 2020 08:01: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=EGzmaV/uLWEbBKcX7OxvkQ5PEZybO9oPslfBjwQryqk=; b=skf+xM+IL+jQ2TUQqATubgAdN5NPHBXGRnE9nb0rKlwKWD1Ci+dwc37FMm6YLaPuLWeI THzmjzy4xOPslZgaE3zi/9ZoGeun4gqV3DaRXyfjNvwAEZZxeZAmpg0ypKOpDBAC/rue KCzy+NTUMAKQtnb5iwJ53ezQs5vb82OtENeexbTPJPNX9MWqgrxP03Lrps43dkrQhpJF An5TWegDEU8Q9vE7KWDkcZtkMPEoK+zRbfe1+vv4+K7tZIrNlII5hovznqoIZ71rPnsq VPXe/xQz5gCZfwlngXnisYfHR3gHZQMMIBkMwr55rKePGF+TQGD+rue2L0AANt0SbUAm og== Received: from sc-exch02.marvell.com ([199.233.58.182]) by mx0b-0016f401.pphosted.com with ESMTP id 30bddkpf37-2 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT); Mon, 13 Apr 2020 08:01:45 -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; Mon, 13 Apr 2020 08:01:43 -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; Mon, 13 Apr 2020 08:01:43 -0700 Received: from jerin-lab.marvell.com (jerin-lab.marvell.com [10.28.34.14]) by maili.marvell.com (Postfix) with ESMTP id 1B8293F7041; Mon, 13 Apr 2020 08:01:23 -0700 (PDT) From: To: Bruce Richardson CC: , , , , , Jerin Jacob Date: Mon, 13 Apr 2020 20:30:45 +0530 Message-ID: <20200413150116.734047-3-jerinj@marvell.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200413150116.734047-1-jerinj@marvell.com> References: <20200403153709.3703448-1-jerinj@marvell.com> <20200413150116.734047-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-13_07:2020-04-13, 2020-04-13 signatures=0 Subject: [dpdk-dev] [PATCH v5 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 309b58726..ae7b57672 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 379773b68..3f82b286c 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 Mon Apr 13 15:00:46 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: 68282 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 D25C1A0577; Mon, 13 Apr 2020 17:02:16 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 714E41BEE1; Mon, 13 Apr 2020 17:01:51 +0200 (CEST) Received: from mx0b-0016f401.pphosted.com (mx0b-0016f401.pphosted.com [67.231.156.173]) by dpdk.org (Postfix) with ESMTP id DDB961BEA6 for ; Mon, 13 Apr 2020 17:01:46 +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 03DF1KId023060; Mon, 13 Apr 2020 08: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=jdrQFfonS6pwE9nbMsNym9edPUJSrTEsV0Ook+fI094=; b=BZ+Z/XqgsdJHwa8+byMgyPdP1DOpNS3HCf++3QVcYQLLhWtiTr1zKxGPoIe6gAxgOhTs AtwZLdAMTRy1wyt/Tuxh1AfSpZpPPLLaPLEBF5V04+azTnGAqkGr5ddf/YnxjSD9ODkt 4Ut1M3lB3AnwsbLLI3kLiI7kLdjmOOkqhY/u69IwJPaSKYGq+v0P9AvKMYweG3996pXk +1TxKH+stgus0Ac8oYDmIQ4H3ML8tJUxivLiJOhzWi49y1Q/u2VTs4ZMsBOrWuUJsCFj 7EQrL3QBYG4h1Uw7od9pWa771B5ihgc/Fqia31UF6JQh1XV+SI3QkjTtFYwMPnD2Bx1a Kg== Received: from sc-exch04.marvell.com ([199.233.58.184]) by mx0b-0016f401.pphosted.com with ESMTP id 30bddkpf3b-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT); Mon, 13 Apr 2020 08:01:46 -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; Mon, 13 Apr 2020 08: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; Mon, 13 Apr 2020 08: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 7A6EC3F7054; Mon, 13 Apr 2020 08:01:34 -0700 (PDT) From: To: Thomas Monjalon , John McNamara , Marko Kovacevic , "Jerin Jacob" , Sunil Kumar Kori , "Bruce Richardson" CC: , , Date: Mon, 13 Apr 2020 20:30:46 +0530 Message-ID: <20200413150116.734047-4-jerinj@marvell.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200413150116.734047-1-jerinj@marvell.com> References: <20200403153709.3703448-1-jerinj@marvell.com> <20200413150116.734047-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-13_07:2020-04-13, 2020-04-13 signatures=0 Subject: [dpdk-dev] [PATCH v5 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. 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 | 3 +- doc/guides/prog_guide/build-sdk-meson.rst | 5 + lib/librte_eal/common/eal_common_trace.c | 6 + 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.h | 366 ++++++++++++++++++++++ lib/librte_eal/linux/Makefile | 1 + meson_options.txt | 2 + 12 files changed, 393 insertions(+), 1 deletion(-) create mode 100644 lib/librte_eal/common/eal_common_trace.c create mode 100644 lib/librte_eal/include/rte_trace.h diff --git a/MAINTAINERS b/MAINTAINERS index 4800f6884..b71a8c99a 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..190f0ccc2 100644 --- a/doc/api/doxy-api-index.md +++ b/doc/api/doxy-api-index.md @@ -174,7 +174,8 @@ 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) - **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..e18ba1c95 --- /dev/null +++ b/lib/librte_eal/common/eal_common_trace.c @@ -0,0 +1,6 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(C) 2020 Marvell International Ltd. + */ + +#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..37dcb02fa 100644 --- a/lib/librte_eal/include/meson.build +++ b/lib/librte_eal/include/meson.build @@ -40,6 +40,7 @@ headers += files( 'rte_string_fns.h', 'rte_tailq.h', 'rte_time.h', + 'rte_trace.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..83105c980 --- /dev/null +++ b/lib/librte_eal/include/rte_trace.h @@ -0,0 +1,366 @@ +/* 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 + +/** The trace object. The trace APIs are based on this opaque object. */ +typedef uint64_t rte_trace_t; + +/** + * 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 globally. + * + * @return + * true if trace is enabled globally, false otherwise. + */ +__rte_experimental +bool rte_trace_global_is_enabled(void); + +/** + * Test if trace is disabled globally. + * + * @return + * true if trace is disabled globally, false otherwise. + */ +__rte_experimental +bool rte_trace_global_is_disabled(void); + +/** + * Test if a given trace is invalid. + * + * @param trace + * The trace object. + * @return + * true if trace is invalid, false otherwise. + */ +__rte_experimental +bool rte_trace_id_is_invalid(rte_trace_t *trace); + +/** + * 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 recording of the given tracepoint in the trace buffer. + * + * @param trace + * The tracepoint object to enable. + * @return + * - 0: Success. + * - (-ERANGE): Trace object is not registered. + */ +__rte_experimental +int rte_trace_enable(rte_trace_t *trace); + +/** + * Disable recording of the given tracepoint in the trace buffer. + * + * @param trace + * The tracepoint object to disable. + * @return + * - 0: Success. + * - (-ERANGE): Trace object is not registered. + */ +__rte_experimental +int rte_trace_disable(rte_trace_t *trace); + +/** + * Test if given trace is enabled. + * + * @param trace + * The trace object. + * @return + * true if trace is enabled, false otherwise. + */ +__rte_experimental +bool rte_trace_is_enabled(rte_trace_t *trace); + +/** + * Test if given trace is disabled. + * + * @param trace + * The trace object. + * @return + * true if trace is disabled, false otherwise. + */ +__rte_experimental +bool rte_trace_is_disabled(rte_trace_t *trace); + +/** + * 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): Trace 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): Trace 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); + +/** + * Search a trace object from its name. + * + * @param name + * The name of the tracepoint. + * @return + * The tracepoint object or NULL if not found. + */ +__rte_experimental +rte_trace_t *rte_trace_by_name(const char *name); + +/** + * 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); + +/** + * Test if the trace datapath compile-time option is enabled. + * + * @return + * true if trace datapath enabled, false otherwise. + */ +__rte_experimental +static __rte_always_inline bool +rte_trace_fp_is_enabled(void) +{ +#ifdef RTE_ENABLE_TRACE_FP + return true; +#else + return false; +#endif +} + +/** Macro to define the tracepoint. */ +#define RTE_TRACE_POINT_DEFINE(tp)\ +rte_trace_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_t __##_tp;\ +static __rte_always_inline void \ +_tp _args \ +{\ + __rte_trace_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_ctf_* 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_ctf_* macros, Use ";" delimiter between two payloads. + * + * @see RTE_TRACE_POINT_ARGS, RTE_TRACE_POINT_DEFINE, rte_trace_ctf_* + */ +#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_ctf_* macros, Use ";" delimiter between two payloads. + * + * @see rte_trace_fp_is_enabled, 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_ctf_* definition for trace register function. + * + * rte_trace_ctf_* emits different definitions for trace function. + * Application must define RTE_TRACE_POINT_REGISTER_SELECT before including + * rte_trace.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_ctf_u64(val) +/** Tracepoint function payload for int64_t datatype */ +#define rte_trace_ctf_i64(val) +/** Tracepoint function payload for uint32_t datatype */ +#define rte_trace_ctf_u32(val) +/** Tracepoint function payload for int32_t datatype */ +#define rte_trace_ctf_i32(val) +/** Tracepoint function payload for uint16_t datatype */ +#define rte_trace_ctf_u16(val) +/** Tracepoint function payload for int16_t datatype */ +#define rte_trace_ctf_i16(val) +/** Tracepoint function payload for uint8_t datatype */ +#define rte_trace_ctf_u8(val) +/** Tracepoint function payload for int8_t datatype */ +#define rte_trace_ctf_i8(val) +/** Tracepoint function payload for int datatype */ +#define rte_trace_ctf_int(val) +/** Tracepoint function payload for long datatype */ +#define rte_trace_ctf_long(val) +/** Tracepoint function payload for float datatype */ +#define rte_trace_ctf_float(val) +/** Tracepoint function payload for double datatype */ +#define rte_trace_ctf_double(val) +/** Tracepoint function payload for pointer datatype */ +#define rte_trace_ctf_ptr(val) +/** Tracepoint function payload for string datatype */ +#define rte_trace_ctf_string(val) + +#endif /* __DOXYGEN__ */ + +#ifdef __cplusplus +} +#endif + +#endif /* _RTE_TRACE_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 Mon Apr 13 15:00:47 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: 68284 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 5EA6AA0577; Mon, 13 Apr 2020 17:02:46 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 0D86B1BEE0; Mon, 13 Apr 2020 17: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 CAA051BEE0 for ; Mon, 13 Apr 2020 17:01:49 +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 03DF1gi8023220; Mon, 13 Apr 2020 08:01: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=c2aYXzkSUxBVHIaRZ/N8ZtyNT2lBW3PMPqCHFjPHAbE=; b=IyaOImndQZuDMUqU0Zy8l3NxtcLBpwIWjDL056j5faHTfIMOap2kjqvoyADrWJASJR48 2KDXoq+/dBGxdhpB9clhsnw8t63B50AAndCST/9Lp9Ebvarrk1UXf08tEgzcBBAZ83gT xKha9SIFbBEjv1nBGe/7FZMGQ+lhqtPcji4gF7UXV75lkwL1QS6viF6banoTB20WIHaB a5x+QVSmXKIW5R+C3qEKq6stBkNWVNvZw7PRmWujawU+iwAI+UQanEOBJvpkyaqCwYf2 Q9l+Gn4ohKXGoYp7gBe8RS7m/3nLLtkZPqjjfEGhOeooR8ilfdRM0LnH9vcQWeY0drFb pw== Received: from sc-exch03.marvell.com ([199.233.58.183]) by mx0b-0016f401.pphosted.com with ESMTP id 30bddkpf3j-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT); Mon, 13 Apr 2020 08:01:49 -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; Mon, 13 Apr 2020 08:01:47 -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; Mon, 13 Apr 2020 08:01:47 -0700 Received: from jerin-lab.marvell.com (jerin-lab.marvell.com [10.28.34.14]) by maili.marvell.com (Postfix) with ESMTP id 328FD3F706A; Mon, 13 Apr 2020 08:01:38 -0700 (PDT) From: To: Thomas Monjalon , Jerin Jacob , Sunil Kumar Kori CC: , , , Date: Mon, 13 Apr 2020 20:30:47 +0530 Message-ID: <20200413150116.734047-5-jerinj@marvell.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200413150116.734047-1-jerinj@marvell.com> References: <20200403153709.3703448-1-jerinj@marvell.com> <20200413150116.734047-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-13_07:2020-04-13, 2020-04-13 signatures=0 Subject: [dpdk-dev] [PATCH v5 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 | 99 ++++++++++++++++++++- lib/librte_eal/common/eal_trace.h | 36 ++++++++ lib/librte_eal/include/meson.build | 2 + lib/librte_eal/include/rte_trace.h | 26 ++++++ lib/librte_eal/include/rte_trace_provider.h | 22 +++++ lib/librte_eal/include/rte_trace_register.h | 20 +++++ lib/librte_eal/rte_eal_version.map | 1 + 8 files changed, 206 insertions(+), 1 deletion(-) create mode 100644 lib/librte_eal/common/eal_trace.h create mode 100644 lib/librte_eal/include/rte_trace_provider.h create mode 100644 lib/librte_eal/include/rte_trace_register.h diff --git a/MAINTAINERS b/MAINTAINERS index b71a8c99a..49a97e592 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 e18ba1c95..abb656838 100644 --- a/lib/librte_eal/common/eal_common_trace.c +++ b/lib/librte_eal/common/eal_common_trace.c @@ -2,5 +2,102 @@ * Copyright(C) 2020 Marvell International Ltd. */ -#include +#include +#include +#include +#include +#include +#include +#include + +#include "eal_trace.h" + +RTE_DEFINE_PER_LCORE(volatile int, trace_point_sz); +RTE_DEFINE_PER_LCORE(char, ctf_field[TRACE_CTF_FIELD_SIZE]); +RTE_DEFINE_PER_LCORE(int, ctf_count); + +static struct trace_point_head tp_list = STAILQ_HEAD_INITIALIZER(tp_list); +static struct trace trace; + +int +__rte_trace_point_register(rte_trace_t *handle, const char *name, + 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..7665bd6be --- /dev/null +++ b/lib/librte_eal/common/eal_trace.h @@ -0,0 +1,36 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(C) 2020 Marvell International Ltd. + */ + +#ifndef __EAL_TRACE_H +#define __EAL_TRACE_H + +#include + +#define trace_err(fmt, args...)\ + RTE_LOG(ERR, EAL, "%s():%u " fmt "\n",\ + __func__, __LINE__, ## args) + +#define trace_crit(fmt, args...)\ + RTE_LOG(CRIT, EAL, "%s():%u " fmt "\n",\ + __func__, __LINE__, ## args) + +#define TRACE_CTF_FIELD_SIZE 384 +#define TRACE_POINT_NAME_SIZE 64 + +struct trace_point { + STAILQ_ENTRY(trace_point) next; + rte_trace_t *handle; + char name[TRACE_POINT_NAME_SIZE]; + char ctf_field[TRACE_CTF_FIELD_SIZE]; +}; + +struct trace { + int register_errno; + uint32_t nb_trace_points; +}; + +/* Trace point list functions */ +STAILQ_HEAD(trace_point_head, trace_point); + +#endif /* __EAL_TRACE_H */ diff --git a/lib/librte_eal/include/meson.build b/lib/librte_eal/include/meson.build index 37dcb02fa..037a4ae63 100644 --- a/lib/librte_eal/include/meson.build +++ b/lib/librte_eal/include/meson.build @@ -41,6 +41,8 @@ headers += files( 'rte_tailq.h', 'rte_time.h', 'rte_trace.h', + 'rte_trace_provider.h', + 'rte_trace_register.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 index 83105c980..1c8010f08 100644 --- a/lib/librte_eal/include/rte_trace.h +++ b/lib/librte_eal/include/rte_trace.h @@ -359,6 +359,32 @@ _tp _args \ #endif /* __DOXYGEN__ */ +/** + * @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_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_provider.h b/lib/librte_eal/include/rte_trace_provider.h new file mode 100644 index 000000000..d1b45a4c7 --- /dev/null +++ b/lib/librte_eal/include/rte_trace_provider.h @@ -0,0 +1,22 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(C) 2020 Marvell International Ltd. + */ + +#ifndef _RTE_TRACE_H_ +#error do not include this file directly, use instead +#endif + +#ifndef _RTE_TRACE_PROVIDER_H_ +#define _RTE_TRACE_PROVIDER_H_ + +#define __RTE_TRACE_EVENT_HEADER_ID_SHIFT (48) + +#define __RTE_TRACE_FIELD_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_PROVIDER_H_ */ diff --git a/lib/librte_eal/include/rte_trace_register.h b/lib/librte_eal/include/rte_trace_register.h new file mode 100644 index 000000000..b36c00827 --- /dev/null +++ b/lib/librte_eal/include/rte_trace_register.h @@ -0,0 +1,20 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(C) 2020 Marvell International Ltd. + */ + +#ifndef _RTE_TRACE_H_ +#error do not include this file directly, use instead +#endif + +#ifndef _RTE_TRACE_REGISTER_H_ +#define _RTE_TRACE_REGISTER_H_ + +#include + +RTE_DECLARE_PER_LCORE(volatile int, trace_point_sz); + +#define RTE_TRACE_POINT_REGISTER(trace, name)\ + __rte_trace_point_register(&__##trace, RTE_STR(name),\ + (void (*)(void)) trace) + +#endif /* _RTE_TRACE_REGISTER_H_ */ diff --git a/lib/librte_eal/rte_eal_version.map b/lib/librte_eal/rte_eal_version.map index 71098581f..3a1be3e3f 100644 --- a/lib/librte_eal/rte_eal_version.map +++ b/lib/librte_eal/rte_eal_version.map @@ -339,4 +339,5 @@ EXPERIMENTAL { # added in 20.05 rte_log_can_log; rte_thread_getname; + __rte_trace_point_register; }; From patchwork Mon Apr 13 15:00:48 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: 68283 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 AD25CA0577; Mon, 13 Apr 2020 17:02:32 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id BC06A1BF02; Mon, 13 Apr 2020 17:01:54 +0200 (CEST) Received: from mx0b-0016f401.pphosted.com (mx0b-0016f401.pphosted.com [67.231.156.173]) by dpdk.org (Postfix) with ESMTP id 651FA1BEE0 for ; Mon, 13 Apr 2020 17:01:50 +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 03DF1gi9023220; Mon, 13 Apr 2020 08:01: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=RGWeQccSBI9Aqlnjp2SDv0q0e0VjgdFEKItQB9rURQE=; b=PMQ3nQYG08TE8Ct1h8WAb90XOoW/wuDGWYbKUUOTnrxnmIR2AjHXXGE9WOWv2Bsbw5/L +1JfSWop6NHI2jreQ8SxdVO1ysJgJsnJAJGK0gfCN78eHC6CkA4Ujio/JRHg0u69UONy 529Vboal1a5yJWWEiWT9W5nZ1OqX1Tfk+lLpglTOppAM8sLO3nlpJ2rF9mQMxKlt2AaW PODIi67N9508NoTAUubk/P0zCNR+NJcnwEfXe/9uaX7iBMkqcndk/2sCpwP8GSE3yjD+ llVLr8GwKYMHRXGnllVqqls0EvfLv79WUF323mcUD/LAELOMY/N5y6O9ESG0SqILhWMM Ew== Received: from sc-exch03.marvell.com ([199.233.58.183]) by mx0b-0016f401.pphosted.com with ESMTP id 30bddkpf3j-2 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT); Mon, 13 Apr 2020 08:01:49 -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; Mon, 13 Apr 2020 08:01:48 -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; Mon, 13 Apr 2020 08: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 223E03F705F; Mon, 13 Apr 2020 08:01:43 -0700 (PDT) From: To: Jerin Jacob , Sunil Kumar Kori CC: , , , , Date: Mon, 13 Apr 2020 20:30:48 +0530 Message-ID: <20200413150116.734047-6-jerinj@marvell.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200413150116.734047-1-jerinj@marvell.com> References: <20200403153709.3703448-1-jerinj@marvell.com> <20200413150116.734047-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-13_07:2020-04-13, 2020-04-13 signatures=0 Subject: [dpdk-dev] [PATCH v5 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_global_is_enabled() - rte_trace_global_is_disabled() - rte_trace_id_is_invalid() - rte_trace_enable() - rte_trace_disable() - rte_trace_is_enabled() - rte_trace_is_disabled() - rte_trace_mode_set() - rte_trace_mode_get() - rte_trace_pattern() - rte_trace_regexp() - rte_trace_by_name() Signed-off-by: Jerin Jacob Signed-off-by: Sunil Kumar Kori --- lib/librte_eal/common/eal_common_trace.c | 165 +++++++++++++++++++++++ lib/librte_eal/common/eal_trace.h | 10 ++ lib/librte_eal/rte_eal_version.map | 12 ++ 3 files changed, 187 insertions(+) diff --git a/lib/librte_eal/common/eal_common_trace.c b/lib/librte_eal/common/eal_common_trace.c index abb656838..12e11bf69 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,169 @@ 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_global_is_enabled(void) +{ + return trace.global_status; +} + +bool +rte_trace_global_is_disabled(void) +{ + return !trace.global_status; +} + +static void +trace_mode_set(rte_trace_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_global_is_disabled()) + 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; +} + +bool +rte_trace_id_is_invalid(rte_trace_t *t) +{ + if (t == NULL) + return false; + + if (trace_id_get(t) >= trace.nb_trace_points) + return true; + + return false; +} + +bool +rte_trace_is_enabled(rte_trace_t *trace) +{ + uint64_t val; + + if (rte_trace_id_is_invalid(trace)) + return false; + + val = __atomic_load_n(trace, __ATOMIC_ACQUIRE); + return val & __RTE_TRACE_FIELD_ENABLE_MASK; +} + +bool +rte_trace_is_disabled(rte_trace_t *trace) +{ + uint64_t val; + + if (rte_trace_id_is_invalid(trace)) + return true; + + val = __atomic_load_n(trace, __ATOMIC_ACQUIRE); + return !(val & __RTE_TRACE_FIELD_ENABLE_MASK); +} + +int +rte_trace_enable(rte_trace_t *trace) +{ + if (rte_trace_id_is_invalid(trace)) + return -ERANGE; + + __atomic_or_fetch(trace, __RTE_TRACE_FIELD_ENABLE_MASK, + __ATOMIC_RELEASE); + return 0; +} + +int +rte_trace_disable(rte_trace_t *trace) +{ + if (rte_trace_id_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_enable(tp->handle); + else + rc = rte_trace_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_enable(tp->handle); + else + rc = rte_trace_disable(tp->handle); + found = 1; + } + if (rc < 0) + return rc; + } + regfree(&r); + + return rc | found; +} + +rte_trace_t * +rte_trace_by_name(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_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 7665bd6be..dcaf9e7f7 100644 --- a/lib/librte_eal/common/eal_trace.h +++ b/lib/librte_eal/common/eal_trace.h @@ -27,9 +27,19 @@ struct trace_point { struct trace { int register_errno; + bool global_status; + enum rte_trace_mode mode; uint32_t nb_trace_points; }; +/* Helper functions */ +static inline uint16_t +trace_id_get(rte_trace_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 3a1be3e3f..546371e72 100644 --- a/lib/librte_eal/rte_eal_version.map +++ b/lib/librte_eal/rte_eal_version.map @@ -340,4 +340,16 @@ EXPERIMENTAL { rte_log_can_log; rte_thread_getname; __rte_trace_point_register; + rte_trace_global_is_enabled; + rte_trace_global_is_disabled; + rte_trace_id_is_invalid; + rte_trace_enable; + rte_trace_disable; + rte_trace_is_enabled; + rte_trace_is_disabled; + rte_trace_mode_set; + rte_trace_mode_get; + rte_trace_pattern; + rte_trace_regexp; + rte_trace_by_name; }; From patchwork Mon Apr 13 15:00:49 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: 68285 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 BC9C0A0577; Mon, 13 Apr 2020 17:03:03 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 1B2A81BF60; Mon, 13 Apr 2020 17:02:00 +0200 (CEST) Received: from mx0b-0016f401.pphosted.com (mx0a-0016f401.pphosted.com [67.231.148.174]) by dpdk.org (Postfix) with ESMTP id 9B726F12 for ; Mon, 13 Apr 2020 17:01:54 +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 03DExs51014648; Mon, 13 Apr 2020 08:01:53 -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=o6LFJVLJicGFfhJjfaJ/fWRilMEUdeRXCeCRhisDOH8=; b=kRuPoPgRmoFzcjwVbe28XvfISufp1zfilJYodUtqD6mv2LzpYpMCcyaQuz3iV0EDLjwh QtSsoaMKdlLZLU1ta9r+jQ93fVgd1h+87c+RfjTxS3FsXALPBFJw3bJQah9L4zT1OII+ gxkPDpDMgjUspwK0k/saY2s3K6bH4fK3ddg3t5uIHzFGqiZ1KeVRK4oQGh9XhEgmpA8s Q8E+acF4NS0DtRmBDAtxgNJurZ6KAbFDn2JwExU8Vr6MjpdtWCZOpLYud9Nz4Ej1KU04 9zySuCRZyrws5FlMSghG8RgV2Kskb9GWp1lGXV7TJdShGMlJM9TYUtWHajXZQV7I79p1 bw== Received: from sc-exch02.marvell.com ([199.233.58.182]) by mx0a-0016f401.pphosted.com with ESMTP id 30bb8qextn-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT); Mon, 13 Apr 2020 08:01:53 -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; Mon, 13 Apr 2020 08:01:52 -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; Mon, 13 Apr 2020 08: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 423B93F7048; Mon, 13 Apr 2020 08:01:48 -0700 (PDT) From: To: Jerin Jacob , Sunil Kumar Kori , Bruce Richardson CC: , , , Date: Mon, 13 Apr 2020 20:30:49 +0530 Message-ID: <20200413150116.734047-7-jerinj@marvell.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200413150116.734047-1-jerinj@marvell.com> References: <20200403153709.3703448-1-jerinj@marvell.com> <20200413150116.734047-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-13_07:2020-04-13, 2020-04-13 signatures=0 Subject: [dpdk-dev] [PATCH v5 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 12e11bf69..501f939ea 100644 --- a/lib/librte_eal/common/eal_common_trace.c +++ b/lib/librte_eal/common/eal_common_trace.c @@ -22,6 +22,60 @@ 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_global_is_disabled()) + 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_global_is_disabled()) + return; +} + bool rte_trace_global_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 dcaf9e7f7..9e0cd7ce3 100644 --- a/lib/librte_eal/common/eal_trace.h +++ b/lib/librte_eal/common/eal_trace.h @@ -5,7 +5,9 @@ #ifndef __EAL_TRACE_H #define __EAL_TRACE_H +#include #include +#include #define trace_err(fmt, args...)\ RTE_LOG(ERR, EAL, "%s():%u " fmt "\n",\ @@ -15,6 +17,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 @@ -26,10 +30,15 @@ struct trace_point { }; struct trace { + char dir[PATH_MAX]; + int dir_offset; int register_errno; bool global_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 */ @@ -40,7 +49,20 @@ trace_id_get(rte_trace_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 Mon Apr 13 15:00:50 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: 68286 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 4C055A0577; Mon, 13 Apr 2020 17:03:22 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 7925F1BF46; Mon, 13 Apr 2020 17:02:03 +0200 (CEST) Received: from mx0b-0016f401.pphosted.com (mx0b-0016f401.pphosted.com [67.231.156.173]) by dpdk.org (Postfix) with ESMTP id CCD831BF92 for ; Mon, 13 Apr 2020 17:02: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 03DF1giD023220; Mon, 13 Apr 2020 08:02:00 -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=7jCs+GlkcLai1EjHucjvTXdQd44wZUbc4YMwJ6itYvE=; b=ZEj286muKjM+YN3Z+Xce5P74FciWHyd+tw8gxLYtzTfcxpG2deyyoimfrtDzBwXovwJ3 hkPIgsBrto90IKYOlERIDdLk39i5C9bl8rH4EPns0BzA7StG1iss4ymZyoJ8UfZn75dd GERPVlFxamTK2W8p72469zJWu8cySVWeHmGvh/hWE9J3e05Nv6yigmqE+V1QimD4zRrj OqVZK4EH4vb/R2bqfYLmLevQjW3XLqd6Rz4K9p+rcclih+Rm8m53HkqOMCbmlgpT/Gpd xsvO0I8d8KVVSKCGvvD/pwOOZiu2THdnUPGZZKnQkMEDFony0IxUUaVuvRxOFbQCJB49 rA== Received: from sc-exch04.marvell.com ([199.233.58.184]) by mx0b-0016f401.pphosted.com with ESMTP id 30bddkpf4w-2 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT); Mon, 13 Apr 2020 08:02:00 -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; Mon, 13 Apr 2020 08:01:58 -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; Mon, 13 Apr 2020 08:01:58 -0700 Received: from jerin-lab.marvell.com (jerin-lab.marvell.com [10.28.34.14]) by maili.marvell.com (Postfix) with ESMTP id 413F53F7045; Mon, 13 Apr 2020 08:01:53 -0700 (PDT) From: To: Jerin Jacob , Sunil Kumar Kori CC: , , , , Date: Mon, 13 Apr 2020 20:30:50 +0530 Message-ID: <20200413150116.734047-8-jerinj@marvell.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200413150116.734047-1-jerinj@marvell.com> References: <20200403153709.3703448-1-jerinj@marvell.com> <20200413150116.734047-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-13_07:2020-04-13, 2020-04-13 signatures=0 Subject: [dpdk-dev] [PATCH v5 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 501f939ea..c6db3002f 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 9e0cd7ce3..7819f7221 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 @@ -38,6 +39,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; }; @@ -60,6 +64,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 Mon Apr 13 15:00:51 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: 68287 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 44028A0577; Mon, 13 Apr 2020 17:03:38 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id A8BEF1BFE2; Mon, 13 Apr 2020 17:02:06 +0200 (CEST) Received: from mx0b-0016f401.pphosted.com (mx0b-0016f401.pphosted.com [67.231.156.173]) by dpdk.org (Postfix) with ESMTP id D99CC1BFD9 for ; Mon, 13 Apr 2020 17:02:05 +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 03DF1KhL023057; Mon, 13 Apr 2020 08: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=Q2gnRct2iK+yQnCbWcmTIf27zAiaRe1uMy1ft2XqAEs=; b=JKV3yqiCysYCQv4913ZcHcYahP+dbzOw5L7i+k0WTfx+8EHmyhbB8oQZHIc7vDHgDDST mURh6SNrZGNe8Eq64KjFqifarQgno1V6fNzjst/FRAr+lEv0mz8o6vldv5XyzQS45+18 mznUPiJpbrKahVIAEXlCBnjZsF1VR3xQl0BPndGkD1ivyQenvs/nUb3IGEwpJVz3EyD0 dBGPum+MYvFH2t4hJL1VkgPw85Yc7y0KjnzXcDiiOjcoQ4z2oNcPkWhxVmU9jAOs6U3F YQLtkZIwG2aostfFcQAaJeRFsbtfNhW2Mc6WI1cTivNK9CrPqwuQtxPTq5m1hXbJQOck Mg== Received: from sc-exch04.marvell.com ([199.233.58.184]) by mx0b-0016f401.pphosted.com with ESMTP id 30bddkpf5b-4 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT); Mon, 13 Apr 2020 08:02:05 -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; Mon, 13 Apr 2020 08:02:03 -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; Mon, 13 Apr 2020 08:02:02 -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; Mon, 13 Apr 2020 08:02:02 -0700 Received: from jerin-lab.marvell.com (jerin-lab.marvell.com [10.28.34.14]) by maili.marvell.com (Postfix) with ESMTP id 95CAC3F7040; Mon, 13 Apr 2020 08:01:59 -0700 (PDT) From: To: Jerin Jacob , Sunil Kumar Kori , Bruce Richardson CC: , , , Date: Mon, 13 Apr 2020 20:30:51 +0530 Message-ID: <20200413150116.734047-9-jerinj@marvell.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200413150116.734047-1-jerinj@marvell.com> References: <20200403153709.3703448-1-jerinj@marvell.com> <20200413150116.734047-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-13_07:2020-04-13, 2020-04-13 signatures=0 Subject: [dpdk-dev] [PATCH v5 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 c6db3002f..cd8539d58 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_global_is_disabled()) 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 7819f7221..0e8941d5d 100644 --- a/lib/librte_eal/common/eal_trace.h +++ b/lib/librte_eal/common/eal_trace.h @@ -42,6 +42,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; }; @@ -63,6 +68,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 Mon Apr 13 15:00:52 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: 68288 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 D9EC7A0577; Mon, 13 Apr 2020 17:03:58 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 3C0301C020; Mon, 13 Apr 2020 17:02:13 +0200 (CEST) Received: from mx0b-0016f401.pphosted.com (mx0b-0016f401.pphosted.com [67.231.156.173]) by dpdk.org (Postfix) with ESMTP id 5EBF41C01F for ; Mon, 13 Apr 2020 17:02:11 +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 03DF1TKG023125; Mon, 13 Apr 2020 08:02: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=MR5rY+KVxdgm7gNRKXaHfWSSpB14QqT2rHD/8dtUbC0=; b=SzMbmOb6fMM6kqGr6jMtAOMQr4fl9TkUQCPHn1IO48jgeZgMvgcjFff+0mS319HvFCHg JbDnjjeVSTsaIE5+DzFpZvbUYG+/6FjnsKB37u7kx7xcXsT62q4mYCVXs4OuAs5Z7AWv 0aBYD8VYUUsSAVjVBZlwVQ+i5IwQXawVOk8sZxV++kdmdbWkABlVxE2pY7wP5qyVSPNS +/rM94s642GjOlGcaBRVgWvw4tURDsmxDMzCdKlbjBpyRO7xmQs/1M7+W4fdisQpC1H9 Xd0NXzhHdw0UTlQ0G7KSwThJX/4/8hZmVzfFfjQu5pwVK60434pzKVR1+dRRPpimUtua fA== Received: from sc-exch03.marvell.com ([199.233.58.183]) by mx0b-0016f401.pphosted.com with ESMTP id 30bddkpf6k-2 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT); Mon, 13 Apr 2020 08:02: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; Mon, 13 Apr 2020 08:02:08 -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; Mon, 13 Apr 2020 08:02:08 -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; Mon, 13 Apr 2020 08:02:08 -0700 Received: from jerin-lab.marvell.com (jerin-lab.marvell.com [10.28.34.14]) by maili.marvell.com (Postfix) with ESMTP id A24663F704E; Mon, 13 Apr 2020 08:02:03 -0700 (PDT) From: To: Jerin Jacob , Sunil Kumar Kori CC: , , , , Date: Mon, 13 Apr 2020 20:30:52 +0530 Message-ID: <20200413150116.734047-10-jerinj@marvell.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200413150116.734047-1-jerinj@marvell.com> References: <20200403153709.3703448-1-jerinj@marvell.com> <20200413150116.734047-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-13_07:2020-04-13, 2020-04-13 signatures=0 Subject: [dpdk-dev] [PATCH v5 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 Mon Apr 13 15:00:53 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: 68289 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 A7413A0577; Mon, 13 Apr 2020 17:04:14 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 920174C89; Mon, 13 Apr 2020 17:02:16 +0200 (CEST) Received: from mx0b-0016f401.pphosted.com (mx0b-0016f401.pphosted.com [67.231.156.173]) by dpdk.org (Postfix) with ESMTP id C4C3F1C023 for ; Mon, 13 Apr 2020 17: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 03DF1Lx2023074; Mon, 13 Apr 2020 08:02:13 -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=mWI9Sd/JHGOM16lrpR0FNyB70hxlHuoMOo7jHiB0fdk=; b=BuB0/sjPzcF2+rNQOQgXMK47QSHYQprJU2AGzxLAbUuRoxgXlwY/kI6zT9wY3t5IHdJE ovmaryuG+K6RdWvay0dMsUP794s8OUI6HLox5sBib4tbZXadq+M8fxrAksB+ONhfGLYJ moYztC4UTa+WUn2x8XIRmN+wIF5+ocFLL4Vw2t88Pu0yBqS6of/NiTRSIOQaF0N3lMZ6 oAhjYCPzG3zqO3DC0XFVNpz2yu+FJ+UDT+tJAISFZ/54JRi1ejh2vq2zI3gPBWIHm8qW +ZDUlsJL2l7Ok5BuAJRQVKSyBu02D2KmN/wYk2h2pA0RCkWvkTJjSzL9nAy9Txl7NLDk FQ== Received: from sc-exch01.marvell.com ([199.233.58.181]) by mx0b-0016f401.pphosted.com with ESMTP id 30bddkpf6r-2 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT); Mon, 13 Apr 2020 08:02:13 -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; Mon, 13 Apr 2020 08:02:10 -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; Mon, 13 Apr 2020 08:02:10 -0700 Received: from jerin-lab.marvell.com (jerin-lab.marvell.com [10.28.34.14]) by maili.marvell.com (Postfix) with ESMTP id EE9173F703F; Mon, 13 Apr 2020 08:02:07 -0700 (PDT) From: To: Jerin Jacob , Sunil Kumar Kori CC: , , , , Date: Mon, 13 Apr 2020 20:30:53 +0530 Message-ID: <20200413150116.734047-11-jerinj@marvell.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200413150116.734047-1-jerinj@marvell.com> References: <20200403153709.3703448-1-jerinj@marvell.com> <20200413150116.734047-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-13_07:2020-04-13, 2020-04-13 signatures=0 Subject: [dpdk-dev] [PATCH v5 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.h | 12 +++ lib/librte_eal/include/rte_trace_provider.h | 19 ++++ lib/librte_eal/rte_eal_version.map | 2 + 6 files changed, 178 insertions(+) diff --git a/lib/librte_eal/common/eal_common_trace.c b/lib/librte_eal/common/eal_common_trace.c index cd8539d58..01d42f6e5 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); RTE_DEFINE_PER_LCORE(char, ctf_field[TRACE_CTF_FIELD_SIZE]); 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_global_is_disabled()) return; + trace_mem_per_thread_free(); trace_metadata_destroy(); } @@ -249,6 +254,98 @@ rte_trace_by_name(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_global_is_disabled()) + 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_global_is_disabled()) + 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_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 0e8941d5d..c284a2e0b 100644 --- a/lib/librte_eal/common/eal_trace.h +++ b/lib/librte_eal/common/eal_trace.h @@ -6,10 +6,15 @@ #define __EAL_TRACE_H #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) @@ -22,6 +27,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; @@ -30,6 +37,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; @@ -39,6 +56,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; @@ -58,6 +77,12 @@ trace_id_get(rte_trace_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); @@ -66,12 +91,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.h b/lib/librte_eal/include/rte_trace.h index 1c8010f08..cd9bf937f 100644 --- a/lib/librte_eal/include/rte_trace.h +++ b/lib/librte_eal/include/rte_trace.h @@ -359,6 +359,18 @@ _tp _args \ #endif /* __DOXYGEN__ */ +/** @internal Macro to define maximum emit length of string datatype. */ +#define __RTE_TRACE_EMIT_STRING_LEN_MAX 32 + +/** + * @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_provider.h b/lib/librte_eal/include/rte_trace_provider.h index d1b45a4c7..57906cda6 100644 --- a/lib/librte_eal/include/rte_trace_provider.h +++ b/lib/librte_eal/include/rte_trace_provider.h @@ -9,6 +9,10 @@ #ifndef _RTE_TRACE_PROVIDER_H_ #define _RTE_TRACE_PROVIDER_H_ +#include +#include +#include + #define __RTE_TRACE_EVENT_HEADER_ID_SHIFT (48) #define __RTE_TRACE_FIELD_SIZE_SHIFT 0 @@ -18,5 +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_PROVIDER_H_ */ diff --git a/lib/librte_eal/rte_eal_version.map b/lib/librte_eal/rte_eal_version.map index 546371e72..2cec94f55 100644 --- a/lib/librte_eal/rte_eal_version.map +++ b/lib/librte_eal/rte_eal_version.map @@ -339,7 +339,9 @@ EXPERIMENTAL { # added in 20.05 rte_log_can_log; rte_thread_getname; + __rte_trace_mem_per_thread_alloc; __rte_trace_point_register; + per_lcore_trace_mem; rte_trace_global_is_enabled; rte_trace_global_is_disabled; rte_trace_id_is_invalid; From patchwork Mon Apr 13 15:00:54 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: 68290 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 56E62A0577; Mon, 13 Apr 2020 17:04:31 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id E4C771C030; Mon, 13 Apr 2020 17:02:20 +0200 (CEST) Received: from mx0b-0016f401.pphosted.com (mx0a-0016f401.pphosted.com [67.231.148.174]) by dpdk.org (Postfix) with ESMTP id 249371C02A for ; Mon, 13 Apr 2020 17:02:18 +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 03DExs55014648; Mon, 13 Apr 2020 08:02:18 -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=A6LNubJhAyPjQB2Bk7bh/7Zzu5zejwXavpivzcsR+OI=; b=wkQEU23jJNKwpEtR9yIQbzFrC0WnS6FJzj/KBOASgGUHJpRT+jd+Rju4w/N0pAVuM5Vx K/cK0c9l4oFphf3y0U+ld2ej15qoqF9Tcx8wF/pKLJ7aLcvDfyiguBtRpkr5mbSZzfHN JvQmCvGkf0QLvGPmrIC2ic9RjV8LV8POmnpF1YSaTNA3FyCVVE7hGbUweQgK0+uWhyNd 5sWL6SaoqvaJ9sGerPrN8995QoyWHa4urf94oQttxZ5j5Jjyf0qXrRg64s0phgW6Z/x8 pn2x5ZMvbrKTBmbeKbJy30xh0um48RYG9gOv0c7eiqz24Oeof2VyhlR3zDPodfop4Vbo NA== Received: from sc-exch01.marvell.com ([199.233.58.181]) by mx0a-0016f401.pphosted.com with ESMTP id 30bb8qexvx-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT); Mon, 13 Apr 2020 08:02:18 -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; Mon, 13 Apr 2020 08:02:16 -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; Mon, 13 Apr 2020 08: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; Mon, 13 Apr 2020 08: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 AE43E3F704A; Mon, 13 Apr 2020 08:02:11 -0700 (PDT) From: To: Jerin Jacob , Sunil Kumar Kori CC: , , , , Date: Mon, 13 Apr 2020 20:30:54 +0530 Message-ID: <20200413150116.734047-12-jerinj@marvell.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200413150116.734047-1-jerinj@marvell.com> References: <20200403153709.3703448-1-jerinj@marvell.com> <20200413150116.734047-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-13_07:2020-04-13, 2020-04-13 signatures=0 Subject: [dpdk-dev] [PATCH v5 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 01d42f6e5..8181c0f02 100644 --- a/lib/librte_eal/common/eal_common_trace.c +++ b/lib/librte_eal/common/eal_common_trace.c @@ -254,6 +254,63 @@ rte_trace_by_name(const char *name) return NULL; } +static void +trace_point_dump(FILE *f, struct trace_point *tp) +{ + rte_trace_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_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_global_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..0dde8fe14 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_global_is_disabled()) + 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 2cec94f55..f95f90e3f 100644 --- a/lib/librte_eal/rte_eal_version.map +++ b/lib/librte_eal/rte_eal_version.map @@ -354,4 +354,6 @@ EXPERIMENTAL { rte_trace_pattern; rte_trace_regexp; rte_trace_by_name; + rte_trace_metadata_dump; + rte_trace_dump; }; From patchwork Mon Apr 13 15:00:55 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: 68291 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 EF917A0577; Mon, 13 Apr 2020 17:04:48 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 504841C032; Mon, 13 Apr 2020 17:02:24 +0200 (CEST) Received: from mx0b-0016f401.pphosted.com (mx0a-0016f401.pphosted.com [67.231.148.174]) by dpdk.org (Postfix) with ESMTP id A2A9A1C02A for ; Mon, 13 Apr 2020 17:02:20 +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 03DExulg014657; Mon, 13 Apr 2020 08: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=/WXVXYYpdL/TIQr18BGPLruDkXEzpC4In4jBRRh7r/4=; b=gJJ0kGqnGPbKB/zdw9pQ+EKuBG2eXJuTLGcKIzh3HNhHOAgCMUkVJdW3gqzBbrDg9wy4 VPRun/r0127Ja8p53HcIKpD/AbKwj6+wvx5UoyrD+wYc8buA0tBaTgtywLdzQrYES5Fn PnoNM75lgxJ2KsVVxz++DiX0r2mI76U1J3T2/pncEoy4klLBImb7p8Rh5crYxxK1Ei5W p4Y8PLa2L1+JRPSLLNG1HWxAAr7y+Fbw13mGPgnU8pc47Yzc4ru5bgJO4hWcvWHYVZRC gNh5PdQ2jmw6zNeKX3zSpt1tDzHM0pPBP2eCOBBUaHaxCkFVEzQWCd84EblAjodlhFYi Ng== Received: from sc-exch04.marvell.com ([199.233.58.184]) by mx0a-0016f401.pphosted.com with ESMTP id 30bb8qexw1-2 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT); Mon, 13 Apr 2020 08:02:19 -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; Mon, 13 Apr 2020 08:02:18 -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; Mon, 13 Apr 2020 08:02:18 -0700 Received: from jerin-lab.marvell.com (jerin-lab.marvell.com [10.28.34.14]) by maili.marvell.com (Postfix) with ESMTP id 088703F7041; Mon, 13 Apr 2020 08:02:15 -0700 (PDT) From: To: Jerin Jacob , Sunil Kumar Kori CC: , , , , Date: Mon, 13 Apr 2020 20:30:55 +0530 Message-ID: <20200413150116.734047-13-jerinj@marvell.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200413150116.734047-1-jerinj@marvell.com> References: <20200403153709.3703448-1-jerinj@marvell.com> <20200413150116.734047-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-13_07:2020-04-13, 2020-04-13 signatures=0 Subject: [dpdk-dev] [PATCH v5 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 f95f90e3f..1d478449b 100644 --- a/lib/librte_eal/rte_eal_version.map +++ b/lib/librte_eal/rte_eal_version.map @@ -354,6 +354,7 @@ EXPERIMENTAL { rte_trace_pattern; rte_trace_regexp; rte_trace_by_name; + rte_trace_save; rte_trace_metadata_dump; rte_trace_dump; }; From patchwork Mon Apr 13 15:00:56 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: 68292 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 0F402A0577; Mon, 13 Apr 2020 17:05:09 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 1C9EB1C067; Mon, 13 Apr 2020 17:02:27 +0200 (CEST) Received: from mx0b-0016f401.pphosted.com (mx0a-0016f401.pphosted.com [67.231.148.174]) by dpdk.org (Postfix) with ESMTP id 195AA1C037 for ; Mon, 13 Apr 2020 17:02:24 +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 03DExulh014657; Mon, 13 Apr 2020 08:02:24 -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=Wgm13XRUODeSWNi3pjFDRbltiRlnQzNia78n8LZaqHw=; b=CndBLP3we+jIk4l7lZGOqs65guJAuWxkRsfqrzGeXx5CYmujQSIruyjpXnssIMJY+S3u wDwZ3iZBwxC+zPSo9HqQXbBRlfpePZSBkF327k83Q9TwWYSAlwGBwnQ/3nRBK6m2nVW7 YNtacd4XVSsUq+djMXXyxXiVjFdB8rQAT8VXksCzMz01kXXBDDXi01EBIt5adJUj3Rz3 GDPoDAUMsOvtkqRR3H+hwA7f/DoBqdfNkKl2CxSIhgFh5GUD6AGCDXFa1U20kgPnN+3C yIO5SL/sGvdLF89kOh3dupsrZa7D8/vRek8egi/gsHLDSFh2HxcjdI13a5+MPELgluos Pg== Received: from sc-exch02.marvell.com ([199.233.58.182]) by mx0a-0016f401.pphosted.com with ESMTP id 30bb8qexwb-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT); Mon, 13 Apr 2020 08:02:24 -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; Mon, 13 Apr 2020 08:02:22 -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; Mon, 13 Apr 2020 08:02:23 -0700 Received: from jerin-lab.marvell.com (jerin-lab.marvell.com [10.28.34.14]) by maili.marvell.com (Postfix) with ESMTP id 2E3233F704F; Mon, 13 Apr 2020 08:02:19 -0700 (PDT) From: To: Jerin Jacob , Sunil Kumar Kori CC: , , , , Date: Mon, 13 Apr 2020 20:30:56 +0530 Message-ID: <20200413150116.734047-14-jerinj@marvell.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200413150116.734047-1-jerinj@marvell.com> References: <20200403153709.3703448-1-jerinj@marvell.com> <20200413150116.734047-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-13_07:2020-04-13, 2020-04-13 signatures=0 Subject: [dpdk-dev] [PATCH v5 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_ctf_* have dual functions. The first to emit the payload for the registration function and the second one to act as trace memory emitters. When it used as registration payload, it will do the following to fulfill the registration job. - Find out the size of the event - Generate metadata field string using __rte_trace_emit_ctf_field(). Signed-off-by: Jerin Jacob Signed-off-by: Sunil Kumar Kori --- lib/librte_eal/common/eal_common_trace.c | 19 ++++++++++++ lib/librte_eal/include/rte_trace.h | 20 +++++++++++++ lib/librte_eal/include/rte_trace_register.h | 32 +++++++++++++++++++++ lib/librte_eal/rte_eal_version.map | 2 ++ 4 files changed, 73 insertions(+) diff --git a/lib/librte_eal/common/eal_common_trace.c b/lib/librte_eal/common/eal_common_trace.c index 8181c0f02..906e2d706 100644 --- a/lib/librte_eal/common/eal_common_trace.c +++ b/lib/librte_eal/common/eal_common_trace.c @@ -403,6 +403,25 @@ trace_mem_per_thread_free(void) rte_spinlock_unlock(&trace->lock); } +void +__rte_trace_emit_ctf_field(size_t sz, const char *in, const char *datatype) +{ + char *field = RTE_PER_LCORE(ctf_field); + int count = RTE_PER_LCORE(ctf_count); + int rc; + + RTE_PER_LCORE(trace_point_sz) += sz; + rc = snprintf(RTE_PTR_ADD(field, count), + RTE_MAX(0, TRACE_CTF_FIELD_SIZE - 1 - count), + "%s %s;", datatype, in); + if (rc <= 0) { + RTE_PER_LCORE(trace_point_sz) = 0; + trace_crit("CTF field is too long"); + return; + } + RTE_PER_LCORE(ctf_count) += rc; +} + int __rte_trace_point_register(rte_trace_t *handle, const char *name, void (*register_fn)(void)) diff --git a/lib/librte_eal/include/rte_trace.h b/lib/librte_eal/include/rte_trace.h index cd9bf937f..b327ef44a 100644 --- a/lib/librte_eal/include/rte_trace.h +++ b/lib/librte_eal/include/rte_trace.h @@ -361,6 +361,8 @@ _tp _args \ /** @internal Macro to define maximum emit length of string datatype. */ #define __RTE_TRACE_EMIT_STRING_LEN_MAX 32 +/** @internal Macro to define event header size. */ +#define __RTE_TRACE_EVENT_HEADER_SZ sizeof(uint64_t) /** * @internal @@ -391,6 +393,24 @@ __rte_experimental int __rte_trace_point_register(rte_trace_t *trace, const char *name, void (*register_fn)(void)); +/** + * @internal + * + * Helper function to emit ctf field. + * + * @param sz + * The tracepoint size. + * @param field + * The name of the trace event. + * @param type + * The datatype of the trace event as string. + * @return + * - 0: Success. + * - <0: Failure. + */ +__rte_experimental +void __rte_trace_emit_ctf_field(size_t sz, const char *field, const char *type); + #ifdef RTE_TRACE_POINT_REGISTER_SELECT #include #else diff --git a/lib/librte_eal/include/rte_trace_register.h b/lib/librte_eal/include/rte_trace_register.h index b36c00827..6c55a4a9a 100644 --- a/lib/librte_eal/include/rte_trace_register.h +++ b/lib/librte_eal/include/rte_trace_register.h @@ -17,4 +17,36 @@ RTE_DECLARE_PER_LCORE(volatile int, trace_point_sz); __rte_trace_point_register(&__##trace, RTE_STR(name),\ (void (*)(void)) trace) +#define __rte_trace_emit_header_generic(t)\ + RTE_PER_LCORE(trace_point_sz) = __RTE_TRACE_EVENT_HEADER_SZ + +#define __rte_trace_emit_header_fp(t) __rte_trace_emit_header_generic(t) + +#define __rte_trace_emit_datatype(in, type)\ +do {\ + RTE_BUILD_BUG_ON(sizeof(type) != sizeof(typeof(in)));\ + __rte_trace_emit_ctf_field(sizeof(type), RTE_STR(in), RTE_STR(type));\ +} while (0) + +#define rte_trace_ctf_u64(in) __rte_trace_emit_datatype(in, uint64_t) +#define rte_trace_ctf_i64(in) __rte_trace_emit_datatype(in, int64_t) +#define rte_trace_ctf_u32(in) __rte_trace_emit_datatype(in, uint32_t) +#define rte_trace_ctf_i32(in) __rte_trace_emit_datatype(in, int32_t) +#define rte_trace_ctf_u16(in) __rte_trace_emit_datatype(in, uint16_t) +#define rte_trace_ctf_i16(in) __rte_trace_emit_datatype(in, int16_t) +#define rte_trace_ctf_u8(in) __rte_trace_emit_datatype(in, uint8_t) +#define rte_trace_ctf_i8(in) __rte_trace_emit_datatype(in, int8_t) +#define rte_trace_ctf_int(in) __rte_trace_emit_datatype(in, int32_t) +#define rte_trace_ctf_long(in) __rte_trace_emit_datatype(in, long) +#define rte_trace_ctf_float(in) __rte_trace_emit_datatype(in, float) +#define rte_trace_ctf_double(in) __rte_trace_emit_datatype(in, double) +#define rte_trace_ctf_ptr(in) __rte_trace_emit_datatype(in, uintptr_t) + +#define rte_trace_ctf_string(in)\ +do {\ + RTE_SET_USED(in);\ + __rte_trace_emit_ctf_field(__RTE_TRACE_EMIT_STRING_LEN_MAX,\ + RTE_STR(in)"[32]", "string_bounded_t");\ +} while (0) + #endif /* _RTE_TRACE_REGISTER_H_ */ diff --git a/lib/librte_eal/rte_eal_version.map b/lib/librte_eal/rte_eal_version.map index 1d478449b..155dd4e25 100644 --- a/lib/librte_eal/rte_eal_version.map +++ b/lib/librte_eal/rte_eal_version.map @@ -340,7 +340,9 @@ EXPERIMENTAL { rte_log_can_log; rte_thread_getname; __rte_trace_mem_per_thread_alloc; + __rte_trace_emit_ctf_field; __rte_trace_point_register; + per_lcore_trace_point_sz; per_lcore_trace_mem; rte_trace_global_is_enabled; rte_trace_global_is_disabled; From patchwork Mon Apr 13 15:00:57 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: 68293 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 77382A0577; Mon, 13 Apr 2020 17:05:26 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 2EB8F1C043; Mon, 13 Apr 2020 17:02:30 +0200 (CEST) Received: from mx0b-0016f401.pphosted.com (mx0a-0016f401.pphosted.com [67.231.148.174]) by dpdk.org (Postfix) with ESMTP id C74311C06C for ; Mon, 13 Apr 2020 17:02:28 +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 03DExs58014648; Mon, 13 Apr 2020 08:02:28 -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=JnG0Vd5YXtisRrg4EzaRzVkWzVkpP2owqTFfIyCFWDE=; b=b1Uq/o5MZmoNWuDNnqF9yYSWA/P2QUIIqwKupHe/jtICqheq5lj30/GMx2vsOdfwE6xe mzd5loXEkAwc4ub+EktIMkHxZNTvwOdWJI2eGQLdtt3HM0eut7VHMsd+snpTFr1ghfSu 3BbaCBC/yPBBVztOJhUmP9mji7doAcifANjIqNxEFwIsdrey9yXg7YuxxukF4ek4YHkU x/0f3c3Eej6IKaJ3aatnw3DGSdkdRT6WSuHT4Pxhkq1J/TSBThwIZNzaJphRi9VVDwvB ShCqUlSSBFm92AzE1TTxNyyo/RBwBRI4kp5dAYcHQ10r1Kz7ZaKM2IlyxJYDn1t8QIOD KQ== Received: from sc-exch04.marvell.com ([199.233.58.184]) by mx0a-0016f401.pphosted.com with ESMTP id 30bb8qexwj-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT); Mon, 13 Apr 2020 08:02:27 -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; Mon, 13 Apr 2020 08: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; Mon, 13 Apr 2020 08: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 2A5053F7045; Mon, 13 Apr 2020 08:02:23 -0700 (PDT) From: To: Jerin Jacob , Sunil Kumar Kori CC: , , , , Date: Mon, 13 Apr 2020 20:30:57 +0530 Message-ID: <20200413150116.734047-15-jerinj@marvell.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200413150116.734047-1-jerinj@marvell.com> References: <20200403153709.3703448-1-jerinj@marvell.com> <20200413150116.734047-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-13_07:2020-04-13, 2020-04-13 signatures=0 Subject: [dpdk-dev] [PATCH v5 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_ctf_* have dual functions. The first to emit the payload for the registration function and the second one to act as trace mem emitters aka 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_provider.h | 116 ++++++++++++++++++++ 1 file changed, 116 insertions(+) diff --git a/lib/librte_eal/include/rte_trace_provider.h b/lib/librte_eal/include/rte_trace_provider.h index 57906cda6..47767245e 100644 --- a/lib/librte_eal/include/rte_trace_provider.h +++ b/lib/librte_eal/include/rte_trace_provider.h @@ -9,6 +9,10 @@ #ifndef _RTE_TRACE_PROVIDER_H_ #define _RTE_TRACE_PROVIDER_H_ +#ifdef ALLOW_EXPERIMENTAL_API + +#include +#include #include #include #include @@ -38,4 +42,116 @@ 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_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_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_emit_ev_header(mem, val);\ +} while (0) + +#define __rte_trace_emit_header_fp(t)\ + if (rte_trace_fp_is_enabled() == false)\ + return;\ + __rte_trace_emit_header_generic(t); + +#define __rte_trace_emit_datatype(in)\ +do {\ + memcpy(mem, &(in), sizeof(in));\ + mem = RTE_PTR_ADD(mem, sizeof(in));\ +} while (0) + +#define rte_trace_ctf_u64(in) __rte_trace_emit_datatype(in) +#define rte_trace_ctf_i64(in) __rte_trace_emit_datatype(in) +#define rte_trace_ctf_u32(in) __rte_trace_emit_datatype(in) +#define rte_trace_ctf_i32(in) __rte_trace_emit_datatype(in) +#define rte_trace_ctf_u16(in) __rte_trace_emit_datatype(in) +#define rte_trace_ctf_i16(in) __rte_trace_emit_datatype(in) +#define rte_trace_ctf_u8(in) __rte_trace_emit_datatype(in) +#define rte_trace_ctf_i8(in) __rte_trace_emit_datatype(in) +#define rte_trace_ctf_int(in) __rte_trace_emit_datatype(in) +#define rte_trace_ctf_long(in) __rte_trace_emit_datatype(in) +#define rte_trace_ctf_float(in) __rte_trace_emit_datatype(in) +#define rte_trace_ctf_ptr(in) __rte_trace_emit_datatype(in) +#define rte_trace_ctf_double(in) __rte_trace_emit_datatype(in) + +#define rte_trace_ctf_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_emit_header_generic(t) RTE_SET_USED(t) +#define __rte_trace_emit_header_fp(t) RTE_SET_USED(t) +#define rte_trace_ctf_u64(in) RTE_SET_USED(in) +#define rte_trace_ctf_i64(in) RTE_SET_USED(in) +#define rte_trace_ctf_u32(in) RTE_SET_USED(in) +#define rte_trace_ctf_i32(in) RTE_SET_USED(in) +#define rte_trace_ctf_u16(in) RTE_SET_USED(in) +#define rte_trace_ctf_i16(in) RTE_SET_USED(in) +#define rte_trace_ctf_u8(in) RTE_SET_USED(in) +#define rte_trace_ctf_i8(in) RTE_SET_USED(in) +#define rte_trace_ctf_int(in) RTE_SET_USED(in) +#define rte_trace_ctf_long(in) RTE_SET_USED(in) +#define rte_trace_ctf_float(in) RTE_SET_USED(in) +#define rte_trace_ctf_ptr(in) RTE_SET_USED(in) +#define rte_trace_ctf_double(in) RTE_SET_USED(in) +#define rte_trace_ctf_string(in) RTE_SET_USED(in) + +#endif + #endif /* _RTE_TRACE_PROVIDER_H_ */ From patchwork Mon Apr 13 15:00:58 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: 68294 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 B4700A0577; Mon, 13 Apr 2020 17:05:42 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id BBE901C01E; Mon, 13 Apr 2020 17:02:36 +0200 (CEST) Received: from mx0b-0016f401.pphosted.com (mx0b-0016f401.pphosted.com [67.231.156.173]) by dpdk.org (Postfix) with ESMTP id 2F74B1C01E for ; Mon, 13 Apr 2020 17:02:35 +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 03DF1Lx8023074; Mon, 13 Apr 2020 08:02:34 -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=W2gYdRLVdNPbIBexrA8qhKZXlBIFzKfbLL2BqjHaNGM=; b=tUKJGotFDX+xtHj8o8Nq9ZEs9Tunr4Uj2li87NfUinoeY9b1MCyhPgVnqFFnRoGr5tCm wxnL8sAdq/BjjfwPaOdq6V47FfQGUSP9cTmSGqAWA5+liv9FIatsE7N1LD98Y4+W3J58 YzHYl+nlL04bjrPyjVsInTrdtdKKCKPHsOZJlxMokR0kCgvHfBT9dJiJD9TSsCE+xcsM oBXLe2Ii3YUWVRKMo0EZHMWOj7Jpm7c2ZgmBqeIheE6VstjEKnDU1h9eSHkzTBuz8SW4 oIsHJODQh6kv40j8UKFYfUJHyUxz9eYynIGYoZcqAB8AIoyYyHS11SmSbZ4TWWzhDd6B +A== Received: from sc-exch03.marvell.com ([199.233.58.183]) by mx0b-0016f401.pphosted.com with ESMTP id 30bddkpf8f-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT); Mon, 13 Apr 2020 08:02:34 -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; Mon, 13 Apr 2020 08:02:32 -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; Mon, 13 Apr 2020 08:02:32 -0700 Received: from jerin-lab.marvell.com (jerin-lab.marvell.com [10.28.34.14]) by maili.marvell.com (Postfix) with ESMTP id 6BF2D3F7043; Mon, 13 Apr 2020 08:02:28 -0700 (PDT) From: To: CC: , , , , , , Jerin Jacob Date: Mon, 13 Apr 2020 20:30:58 +0530 Message-ID: <20200413150116.734047-16-jerinj@marvell.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200413150116.734047-1-jerinj@marvell.com> References: <20200403153709.3703448-1-jerinj@marvell.com> <20200413150116.734047-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-13_07:2020-04-13, 2020-04-13 signatures=0 Subject: [dpdk-dev] [PATCH v5 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 | 3 ++- lib/librte_eal/linux/eal.c | 9 +++++++++ lib/librte_eal/linux/eal_thread.c | 3 +++ 3 files changed, 14 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..bc9732d88 100644 --- a/lib/librte_eal/common/eal_common_thread.c +++ b/lib/librte_eal/common/eal_common_thread.c @@ -15,6 +15,7 @@ #include #include #include +#include #include "eal_internal_cfg.h" #include "eal_private.h" @@ -165,7 +166,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 9530ee55f..ee777b0cd 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 3f82b286c..45f4dce44 100644 --- a/lib/librte_eal/linux/eal_thread.c +++ b/lib/librte_eal/linux/eal_thread.c @@ -20,6 +20,7 @@ #include #include #include +#include #include "eal_private.h" #include "eal_thread.h" @@ -124,6 +125,8 @@ eal_thread_loop(__attribute__((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 Mon Apr 13 15:00:59 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: 68295 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 A3C63A0577; Mon, 13 Apr 2020 17:05:58 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id EC9761C06A; Mon, 13 Apr 2020 17:02:40 +0200 (CEST) Received: from mx0b-0016f401.pphosted.com (mx0b-0016f401.pphosted.com [67.231.156.173]) by dpdk.org (Postfix) with ESMTP id 7E3EB1C00D for ; Mon, 13 Apr 2020 17:02:39 +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 03DF1LHY023067; Mon, 13 Apr 2020 08:02:39 -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=LcuSdHTl8FutLczKqqylgJIs4055cpXFHEzv1UcP/zw=; b=A6NWgQmtVerRjYXcMseA4K27qODfL/KchPAiRmHKWZvnS/BMTD9oUTCZHPO7+vF9cP6R mcLQ5vqKiMgMFmPzjsGcojeREVxT4ofoDOadscwT/Rg4Xp0dZf5O/jXUADPMHvlmu/q8 TUYuG1l6j2jxAc2VZEVYap1TAsjFn3Nu9wnXQauuMo6/uJbLMaiLTB6qXU6dsA66hQta 0GW6ZK5HpnBm5wpRts1F3GRie2SOtBASnOcvFCT9Yp5xrMjPB6CeE3ucuR09A/IWfs9A 0kYOrLV0M5sxlsW/2o/qIMgclhqAl8g3m+xM7COa09FnGgbbQ9E7UKROfvXVAcwmXbVa kA== Received: from sc-exch03.marvell.com ([199.233.58.183]) by mx0b-0016f401.pphosted.com with ESMTP id 30bddkpf90-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT); Mon, 13 Apr 2020 08: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; Mon, 13 Apr 2020 08: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; Mon, 13 Apr 2020 08:02:37 -0700 Received: from jerin-lab.marvell.com (jerin-lab.marvell.com [10.28.34.14]) by maili.marvell.com (Postfix) with ESMTP id 14E673F704A; Mon, 13 Apr 2020 08:02:32 -0700 (PDT) From: To: Bruce Richardson CC: , , , , , Jerin Jacob Date: Mon, 13 Apr 2020 20:30:59 +0530 Message-ID: <20200413150116.734047-17-jerinj@marvell.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200413150116.734047-1-jerinj@marvell.com> References: <20200403153709.3703448-1-jerinj@marvell.com> <20200413150116.734047-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-13_07:2020-04-13, 2020-04-13 signatures=0 Subject: [dpdk-dev] [PATCH v5 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 | 3 +++ 2 files changed, 13 insertions(+) diff --git a/lib/librte_eal/freebsd/eal.c b/lib/librte_eal/freebsd/eal.c index 6ae37e7e6..c453e11f2 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 ae7b57672..aaccb4926 100644 --- a/lib/librte_eal/freebsd/eal_thread.c +++ b/lib/librte_eal/freebsd/eal_thread.c @@ -20,6 +20,7 @@ #include #include #include +#include #include "eal_private.h" #include "eal_thread.h" @@ -124,6 +125,8 @@ eal_thread_loop(__attribute__((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 Mon Apr 13 15:01:00 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: 68296 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 B28BFA0577; Mon, 13 Apr 2020 17:06:15 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 2479D1C066; Mon, 13 Apr 2020 17:02:45 +0200 (CEST) Received: from mx0b-0016f401.pphosted.com (mx0b-0016f401.pphosted.com [67.231.156.173]) by dpdk.org (Postfix) with ESMTP id A85AD2B84 for ; Mon, 13 Apr 2020 17:02:43 +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 03DF1LxC023074; Mon, 13 Apr 2020 08:02:43 -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=FYlZnqAO2uK5mRMbRluXgu7fSvYyT3lCDd+MhG1/Cn8=; b=MrXoDe4xRScRG9nSDzgb0nNEAHHxT1awHLkOQ+bx9AzFCAYI/FHGukmJtMcpNs6rP3Xd SJL/S6Q5/47J4erRRCrOGun8pcUU8H22r4u3ne/pdkosq636NeWfXJYgJypPuayuIvhA g01YiOrJDH6tGpJ57XBUrNJZ46pjnVtiZuUUNhh8+yk2tkn2BrFoyOpgYC9aQK65Zalm 36AeNas50r2qYjL+ClRyXMjW9JHmpzBNAsu5qjDBlSSt3IceRgdJ1ECZxDV33CRPf0wa BXeKwRkIeMi2Ft8MwlfnLGAEHABAjck1znZ4NFkq7C5DhLqgRLnVoYSlIRkQ6Cnt8tm0 WA== Received: from sc-exch04.marvell.com ([199.233.58.184]) by mx0b-0016f401.pphosted.com with ESMTP id 30bddkpf99-2 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT); Mon, 13 Apr 2020 08:02:43 -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; Mon, 13 Apr 2020 08:02:41 -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; Mon, 13 Apr 2020 08:02:41 -0700 Received: from jerin-lab.marvell.com (jerin-lab.marvell.com [10.28.34.14]) by maili.marvell.com (Postfix) with ESMTP id 71AB73F7044; Mon, 13 Apr 2020 08:02:38 -0700 (PDT) From: To: Jerin Jacob , Sunil Kumar Kori , Bruce Richardson CC: , , , Date: Mon, 13 Apr 2020 20:31:00 +0530 Message-ID: <20200413150116.734047-18-jerinj@marvell.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200413150116.734047-1-jerinj@marvell.com> References: <20200403153709.3703448-1-jerinj@marvell.com> <20200413150116.734047-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-13_07:2020-04-13, 2020-04-13 signatures=0 Subject: [dpdk-dev] [PATCH v5 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 037a4ae63..57b7f25c8 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_provider.h', 'rte_trace_register.h', 'rte_uuid.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..269ef7502 --- /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_ctf_u64(in); +) + +RTE_TRACE_POINT( + rte_trace_lib_eal_generic_u32, + RTE_TRACE_POINT_ARGS(uint32_t in), + rte_trace_ctf_u32(in); +) + +RTE_TRACE_POINT( + rte_trace_lib_eal_generic_u16, + RTE_TRACE_POINT_ARGS(uint16_t in), + rte_trace_ctf_u16(in); +) + +RTE_TRACE_POINT( + rte_trace_lib_eal_generic_u8, + RTE_TRACE_POINT_ARGS(uint8_t in), + rte_trace_ctf_u8(in); +) + +RTE_TRACE_POINT( + rte_trace_lib_eal_generic_i64, + RTE_TRACE_POINT_ARGS(int64_t in), + rte_trace_ctf_i64(in); +) + +RTE_TRACE_POINT( + rte_trace_lib_eal_generic_i32, + RTE_TRACE_POINT_ARGS(int32_t in), + rte_trace_ctf_i32(in); +) + +RTE_TRACE_POINT( + rte_trace_lib_eal_generic_i16, + RTE_TRACE_POINT_ARGS(int16_t in), + rte_trace_ctf_i16(in); +) + +RTE_TRACE_POINT( + rte_trace_lib_eal_generic_i8, + RTE_TRACE_POINT_ARGS(int8_t in), + rte_trace_ctf_i8(in); +) + +RTE_TRACE_POINT( + rte_trace_lib_eal_generic_int, + RTE_TRACE_POINT_ARGS(int in), + rte_trace_ctf_int(in); +) + +RTE_TRACE_POINT( + rte_trace_lib_eal_generic_long, + RTE_TRACE_POINT_ARGS(long in), + rte_trace_ctf_long(in); +) + +RTE_TRACE_POINT( + rte_trace_lib_eal_generic_float, + RTE_TRACE_POINT_ARGS(float in), + rte_trace_ctf_float(in); +) + +RTE_TRACE_POINT( + rte_trace_lib_eal_generic_double, + RTE_TRACE_POINT_ARGS(double in), + rte_trace_ctf_double(in); +) + +RTE_TRACE_POINT( + rte_trace_lib_eal_generic_ptr, + RTE_TRACE_POINT_ARGS(const void *ptr), + rte_trace_ctf_ptr(ptr); +) + +RTE_TRACE_POINT( + rte_trace_lib_eal_generic_str, + RTE_TRACE_POINT_ARGS(const char *str), + rte_trace_ctf_string(str); +) + +RTE_TRACE_POINT( + rte_trace_lib_eal_generic_func, + RTE_TRACE_POINT_ARGS(const char *func), + rte_trace_ctf_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 155dd4e25..48b02bb6a 100644 --- a/lib/librte_eal/rte_eal_version.map +++ b/lib/librte_eal/rte_eal_version.map @@ -359,4 +359,21 @@ EXPERIMENTAL { rte_trace_save; rte_trace_metadata_dump; rte_trace_dump; + + __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; + __rte_trace_lib_eal_generic_func; }; From patchwork Mon Apr 13 15: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: 68297 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 97AF1A0577; Mon, 13 Apr 2020 17:06:37 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id CDC671C0AF; Mon, 13 Apr 2020 17:02:50 +0200 (CEST) Received: from mx0b-0016f401.pphosted.com (mx0b-0016f401.pphosted.com [67.231.156.173]) by dpdk.org (Postfix) with ESMTP id EA6581C0BC for ; Mon, 13 Apr 2020 17:02:48 +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 03DF1KhT023057; Mon, 13 Apr 2020 08: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=Z2cr00u3zyvhREmoj3zjIM/AprAajnomEY6lbOPD+yE=; b=St0ENc/mBj/2643sLdgby7shHPJIMSRK7EKX2DTjGLAytlgidi/AgN+g6R3VuvIJkMtU IW3vTvEDaa9Lj30Sz1AlJ0NixmYzjS74qORRf672mycfie3AziMD1vIFH8kYgQ+eCzMN VHSyACfJ6CZasPM9guKLYJY2YjlGAjlTfNaOx5mhv92ZoMQYVbYSDk5yawFN8k0/SB78 jBovSsA4+fZjJnQis7Mn0G/Zrk4QBbXShW/4XOAmewB/n1T6CZRhIif4PEisOiwKA5ug Iraq3PKsMPBLGQv8lGaBRER6A2urSFyl/LOSN8s9JrNgkV/4Nnc7ba1Tc7DEMcq6yyWb Wg== Received: from sc-exch01.marvell.com ([199.233.58.181]) by mx0b-0016f401.pphosted.com with ESMTP id 30bddkpf9s-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT); Mon, 13 Apr 2020 08:02:48 -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; Mon, 13 Apr 2020 08:02:46 -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; Mon, 13 Apr 2020 08:02:45 -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; Mon, 13 Apr 2020 08:02:45 -0700 Received: from jerin-lab.marvell.com (jerin-lab.marvell.com [10.28.34.14]) by maili.marvell.com (Postfix) with ESMTP id E2EC03F7041; Mon, 13 Apr 2020 08:02:42 -0700 (PDT) From: To: Jerin Jacob , Sunil Kumar Kori , Bruce Richardson CC: , , , Date: Mon, 13 Apr 2020 20:31:01 +0530 Message-ID: <20200413150116.734047-19-jerinj@marvell.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200413150116.734047-1-jerinj@marvell.com> References: <20200403153709.3703448-1-jerinj@marvell.com> <20200413150116.734047-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-13_07:2020-04-13, 2020-04-13 signatures=0 Subject: [dpdk-dev] [PATCH v5 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 | 18 ++++++++++++++++++ lib/librte_eal/linux/eal_alarm.c | 4 ++++ lib/librte_eal/rte_eal_version.map | 2 ++ 5 files changed, 36 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 269ef7502..df1b3854b 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,23 @@ 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_ctf_u64(us); rte_trace_ctf_ptr(cb_fn); + rte_trace_ctf_ptr(cb_arg); rte_trace_ctf_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_ctf_ptr(cb_fn); rte_trace_ctf_ptr(cb_arg); + rte_trace_ctf_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 48b02bb6a..ad2e4ab7c 100644 --- a/lib/librte_eal/rte_eal_version.map +++ b/lib/librte_eal/rte_eal_version.map @@ -376,4 +376,6 @@ EXPERIMENTAL { __rte_trace_lib_eal_generic_ptr; __rte_trace_lib_eal_generic_str; __rte_trace_lib_eal_generic_func; + __rte_trace_lib_eal_alarm_set; + __rte_trace_lib_eal_alarm_cancel; }; From patchwork Mon Apr 13 15: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: 68298 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 50439A0577; Mon, 13 Apr 2020 17:06:54 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id E48C91C0AE; Mon, 13 Apr 2020 17:02:55 +0200 (CEST) Received: from mx0b-0016f401.pphosted.com (mx0a-0016f401.pphosted.com [67.231.148.174]) by dpdk.org (Postfix) with ESMTP id E224A1C0BD for ; Mon, 13 Apr 2020 17:02:51 +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 03DF02f9014886; Mon, 13 Apr 2020 08:02:51 -0700 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=marvell.com; h=from : to : cc : subject : date : message-id : in-reply-to : references : mime-version : content-transfer-encoding : content-type; s=pfpt0818; bh=29FadMEGxvUruSS0XgNWu5aCGzsQ6A3pFdiZn22S274=; b=aGEFoG+q4c2kVZGv4i3Sc6tl7kBIObrqR7mRbAVcCeFKJKP0PR180WsGvxg2OasZcazY wkxdO/yS/tzH0aoZ5DLLVBfxdDWn4bNB43zzUyJS7K0eMatTwzWzzNGTqZ0XnlAGSWaR AEFzuQ4ThB8sNanH+S3L0KNeWKlMPVlpNBgNbjfEIgcZtKtF/zBwPdTnV/PJQPRuRLny q6+mFb/mR63lTeTe4mV8fdglI5eaK2/pWwtUa6LKA5o2VMOLVw1+UX7SaCTBMqiX+Glk jKTDxPOCX7L3ws4A40sKdd1Nvjv2qfyNmPAmTAAqAl2W1wQlN013jvL8aOUA4T7J/ayU Rg== Received: from sc-exch02.marvell.com ([199.233.58.182]) by mx0a-0016f401.pphosted.com with ESMTP id 30bb8qey01-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT); Mon, 13 Apr 2020 08:02:51 -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; Mon, 13 Apr 2020 08:02:49 -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; Mon, 13 Apr 2020 08:02:49 -0700 Received: from jerin-lab.marvell.com (jerin-lab.marvell.com [10.28.34.14]) by maili.marvell.com (Postfix) with ESMTP id 155F03F7040; Mon, 13 Apr 2020 08:02:46 -0700 (PDT) From: To: Jerin Jacob , Sunil Kumar Kori , Anatoly Burakov CC: , , , , Date: Mon, 13 Apr 2020 20:31:02 +0530 Message-ID: <20200413150116.734047-20-jerinj@marvell.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200413150116.734047-1-jerinj@marvell.com> References: <20200403153709.3703448-1-jerinj@marvell.com> <20200413150116.734047-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-13_07:2020-04-13, 2020-04-13 signatures=0 Subject: [dpdk-dev] [PATCH v5 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 | 33 ++++++++++ lib/librte_eal/rte_eal_version.map | 4 ++ 6 files changed, 109 insertions(+), 11 deletions(-) diff --git a/lib/librte_eal/common/eal_common_trace.c b/lib/librte_eal/common/eal_common_trace.c index 906e2d706..903a62a98 100644 --- a/lib/librte_eal/common/eal_common_trace.c +++ b/lib/librte_eal/common/eal_common_trace.c @@ -344,7 +344,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; @@ -396,7 +396,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 ddcfbe2e4..79cf1f7be 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 df1b3854b..597cf9ca3 100644 --- a/lib/librte_eal/include/rte_trace_eal.h +++ b/lib/librte_eal/include/rte_trace_eal.h @@ -133,6 +133,39 @@ RTE_TRACE_POINT( rte_trace_ctf_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_ctf_string(type); rte_trace_ctf_long(size); + rte_trace_ctf_u32(align); rte_trace_ctf_int(socket); + rte_trace_ctf_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_ctf_string(type); rte_trace_ctf_long(size); + rte_trace_ctf_u32(align); rte_trace_ctf_int(socket); + rte_trace_ctf_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_ctf_long(size); rte_trace_ctf_u32(align); + rte_trace_ctf_int(socket); rte_trace_ctf_ptr(ptr); +) + +RTE_TRACE_POINT( + rte_trace_lib_eal_mem_free, + RTE_TRACE_POINT_ARGS(void *ptr), + rte_trace_ctf_ptr(ptr); +) + #ifdef __cplusplus } #endif diff --git a/lib/librte_eal/rte_eal_version.map b/lib/librte_eal/rte_eal_version.map index ad2e4ab7c..d1a7541f5 100644 --- a/lib/librte_eal/rte_eal_version.map +++ b/lib/librte_eal/rte_eal_version.map @@ -378,4 +378,8 @@ EXPERIMENTAL { __rte_trace_lib_eal_generic_func; __rte_trace_lib_eal_alarm_set; __rte_trace_lib_eal_alarm_cancel; + __rte_trace_lib_eal_mem_zmalloc; + __rte_trace_lib_eal_mem_malloc; + __rte_trace_lib_eal_mem_realloc; + __rte_trace_lib_eal_mem_free; }; From patchwork Mon Apr 13 15: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: 68299 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 E5C0EA0577; Mon, 13 Apr 2020 17:07:11 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 57ED61C01B; Mon, 13 Apr 2020 17:03:00 +0200 (CEST) Received: from mx0b-0016f401.pphosted.com (mx0a-0016f401.pphosted.com [67.231.148.174]) by dpdk.org (Postfix) with ESMTP id DC2DE1C0BF for ; Mon, 13 Apr 2020 17: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 03DExulr014657; Mon, 13 Apr 2020 08: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=vt/1LDEDt3e4s2eE4FFlhsVpUaYidcnLVmgb2WTaAoc=; b=KsikJzs2uXMBthzDfn8iaXi3x3o/Iq0ygwfdw19WwY6Hq4AaKzplcRYsccsu2P4KRZzr 7vcsWbn4MtWtTo/PpeeRhbKrVU19mksZsvkb0BVKQWXutxSNQOpAv2JdipBjcl/r9n9W ALhcNX4qq5ht8N6h1zuD6rfB7SvTAHL10Ue0PTUcRPIAmEibMf+IJALu3GnnWTdRc82t SpGuco1OkWt8DS9q1UyekK0sHev8NPchNgkYNoghTcyS3K7WTnN1/b+FTQ4uUsOxCqGG 0+mowy951eog4PQop0gSM3XuafMvbxWEgy95Md6f2WljzHyzEc8ksXmRRpofJBCUOnxz 1Q== Received: from sc-exch04.marvell.com ([199.233.58.184]) by mx0a-0016f401.pphosted.com with ESMTP id 30bb8qey0g-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT); Mon, 13 Apr 2020 08:02:56 -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; Mon, 13 Apr 2020 08:02:54 -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; Mon, 13 Apr 2020 08:02:54 -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; Mon, 13 Apr 2020 08:02:54 -0700 Received: from jerin-lab.marvell.com (jerin-lab.marvell.com [10.28.34.14]) by maili.marvell.com (Postfix) with ESMTP id 04FD23F7040; Mon, 13 Apr 2020 08:02:50 -0700 (PDT) From: To: Anatoly Burakov , Jerin Jacob , Sunil Kumar Kori CC: , , , , Date: Mon, 13 Apr 2020 20:31:03 +0530 Message-ID: <20200413150116.734047-21-jerinj@marvell.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200413150116.734047-1-jerinj@marvell.com> References: <20200403153709.3703448-1-jerinj@marvell.com> <20200413150116.734047-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-13_07:2020-04-13, 2020-04-13 signatures=0 Subject: [dpdk-dev] [PATCH v5 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 | 26 +++++++++++++++++++ lib/librte_eal/rte_eal_version.map | 3 +++ 4 files changed, 48 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 597cf9ca3..abbaea5e0 100644 --- a/lib/librte_eal/include/rte_trace_eal.h +++ b/lib/librte_eal/include/rte_trace_eal.h @@ -166,6 +166,32 @@ RTE_TRACE_POINT( rte_trace_ctf_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_ctf_string(name); rte_trace_ctf_long(len); + rte_trace_ctf_int(socket_id); rte_trace_ctf_u32(flags); + rte_trace_ctf_u32(align); rte_trace_ctf_u32(bound); + rte_trace_ctf_ptr(mz); +) + +RTE_TRACE_POINT( + rte_trace_lib_eal_memzone_lookup, + RTE_TRACE_POINT_ARGS(const char *name, const void *memzone), + rte_trace_ctf_string(name); rte_trace_ctf_ptr(memzone); +) + +RTE_TRACE_POINT( + rte_trace_lib_eal_memzone_free, + RTE_TRACE_POINT_ARGS(const char *name, void *addr, int rc), + rte_trace_ctf_string(name); rte_trace_ctf_ptr(addr); + rte_trace_ctf_int(rc); +) + + #ifdef __cplusplus } #endif diff --git a/lib/librte_eal/rte_eal_version.map b/lib/librte_eal/rte_eal_version.map index d1a7541f5..c3b7172ba 100644 --- a/lib/librte_eal/rte_eal_version.map +++ b/lib/librte_eal/rte_eal_version.map @@ -382,4 +382,7 @@ EXPERIMENTAL { __rte_trace_lib_eal_mem_malloc; __rte_trace_lib_eal_mem_realloc; __rte_trace_lib_eal_mem_free; + __rte_trace_lib_eal_memzone_reserve; + __rte_trace_lib_eal_memzone_lookup; + __rte_trace_lib_eal_memzone_free; }; From patchwork Mon Apr 13 15: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: 68300 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 67708A0577; Mon, 13 Apr 2020 17:07:30 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 9B0AF1C0C5; Mon, 13 Apr 2020 17:03:03 +0200 (CEST) Received: from mx0b-0016f401.pphosted.com (mx0a-0016f401.pphosted.com [67.231.148.174]) by dpdk.org (Postfix) with ESMTP id AE0681C0C1 for ; Mon, 13 Apr 2020 17:02: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 03DF0NUH015130; Mon, 13 Apr 2020 08: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=DsHLo6gOXIg8H05DcrBoTajnBSQenKBF4rwLvq+u+ys=; b=YWAUXjdiD382vtJkFhfLn0cw08byOd7JPJqPbyOBqqRn4pgHMM1/DlK3p71CLAzDEwDA XILJ9n+zRVY/f7/acRG10n6eB6mU/ExQibwpagsswYyDFiwCJfRQ8g/ysBoPFWkLnIJh cUW1xH5ukn8/r3p/LKOvYqNRB+Xaeteh7ct3T1vo3rxoz4UaOIp83Gbhch8mCZeKSmzG FzyM/gC2nuicWkl7YInQbD+loUjrffu/gEyE4DypcrQPJ/0WEdHbX9Yv/CNC+hVJ2C5f r1FbXkgf6+vez0lXR7p5HJlnDjtI3wGT6x6V1RCZaK3+K6xFOA5H9yvPv8cAEJGScgHu Aw== Received: from sc-exch02.marvell.com ([199.233.58.182]) by mx0a-0016f401.pphosted.com with ESMTP id 30bb8qey0m-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT); Mon, 13 Apr 2020 08:02:58 -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; Mon, 13 Apr 2020 08:02:57 -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; Mon, 13 Apr 2020 08: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 39B4B3F703F; Mon, 13 Apr 2020 08:02:54 -0700 (PDT) From: To: Jerin Jacob , Sunil Kumar Kori , Bruce Richardson CC: , , , Date: Mon, 13 Apr 2020 20:31:04 +0530 Message-ID: <20200413150116.734047-22-jerinj@marvell.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200413150116.734047-1-jerinj@marvell.com> References: <20200403153709.3703448-1-jerinj@marvell.com> <20200413150116.734047-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-13_07:2020-04-13, 2020-04-13 signatures=0 Subject: [dpdk-dev] [PATCH v5 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 | 11 ++++++++--- lib/librte_eal/include/rte_trace_eal.h | 14 ++++++++++++++ lib/librte_eal/linux/eal_thread.c | 11 ++++++++--- lib/librte_eal/rte_eal_version.map | 2 ++ 6 files changed, 41 insertions(+), 7 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 aaccb4926..66b0765cf 100644 --- a/lib/librte_eal/freebsd/eal_thread.c +++ b/lib/librte_eal/freebsd/eal_thread.c @@ -20,7 +20,7 @@ #include #include #include -#include +#include #include "eal_private.h" #include "eal_thread.h" @@ -41,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; @@ -63,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 */ @@ -126,6 +130,7 @@ eal_thread_loop(__attribute__((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 abbaea5e0..8197e198a 100644 --- a/lib/librte_eal/include/rte_trace_eal.h +++ b/lib/librte_eal/include/rte_trace_eal.h @@ -191,6 +191,20 @@ RTE_TRACE_POINT( rte_trace_ctf_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_ctf_ptr(f); rte_trace_ctf_ptr(arg); + rte_trace_ctf_u32(slave_id); rte_trace_ctf_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_ctf_u32(lcore_id); rte_trace_ctf_string(cpuset); +) + #ifdef __cplusplus } diff --git a/lib/librte_eal/linux/eal_thread.c b/lib/librte_eal/linux/eal_thread.c index 45f4dce44..afadbcbd7 100644 --- a/lib/librte_eal/linux/eal_thread.c +++ b/lib/librte_eal/linux/eal_thread.c @@ -20,7 +20,7 @@ #include #include #include -#include +#include #include "eal_private.h" #include "eal_thread.h" @@ -41,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; @@ -63,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 */ @@ -126,6 +130,7 @@ eal_thread_loop(__attribute__((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 c3b7172ba..0ee4f29b2 100644 --- a/lib/librte_eal/rte_eal_version.map +++ b/lib/librte_eal/rte_eal_version.map @@ -385,4 +385,6 @@ EXPERIMENTAL { __rte_trace_lib_eal_memzone_reserve; __rte_trace_lib_eal_memzone_lookup; __rte_trace_lib_eal_memzone_free; + __rte_trace_lib_eal_thread_remote_launch; + __rte_trace_lib_eal_thread_lcore_ready; }; From patchwork Mon Apr 13 15: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: 68301 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 B5F0AA0577; Mon, 13 Apr 2020 17:07:50 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 534F31C0D5; Mon, 13 Apr 2020 17:03:07 +0200 (CEST) Received: from mx0b-0016f401.pphosted.com (mx0b-0016f401.pphosted.com [67.231.156.173]) by dpdk.org (Postfix) with ESMTP id B99F31C0CC for ; Mon, 13 Apr 2020 17:03:05 +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 03DF1LxF023074; Mon, 13 Apr 2020 08:03: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=q8pafWKpDk3iccHQXOBYLn+GHoIQb0rexQLWnYI2RWM=; b=DNS2FIaRoLay/DZ8xS0YoJRAZGI7HIMsQm7Q06/AjJ+MXNpAnEBbTVKdTgYgwyxTYylC Taewo9kLY7aRHCkL+SmPu29HMb1TxLgDEJTLbCjkkbiiojssDKgYt7DQA0Cj9byx4q/h 91lI189IrKb7axwC6dGuA10BbZbnOtcFcZAgxabO6NvRi5xFV9G2au90FadBjP1eliRD Bmkri+Rrg+fID5OFqp1G3XmXg0688kRi90zMADrJ3dkgJKVbqKmnQrXjOAcpIUXsHUyP H/GLPOQJsEywwtKhACwEMYV2Fm4ZJVr+n55ZQPefH079uv3tFDYFvijjNd6oJciYQFnJ Sw== Received: from sc-exch03.marvell.com ([199.233.58.183]) by mx0b-0016f401.pphosted.com with ESMTP id 30bddkpfat-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT); Mon, 13 Apr 2020 08:03:04 -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; Mon, 13 Apr 2020 08:03:02 -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; Mon, 13 Apr 2020 08:03:03 -0700 Received: from jerin-lab.marvell.com (jerin-lab.marvell.com [10.28.34.14]) by maili.marvell.com (Postfix) with ESMTP id ED70F3F703F; Mon, 13 Apr 2020 08:02:58 -0700 (PDT) From: To: Jerin Jacob , Sunil Kumar Kori , Bruce Richardson CC: , , , Date: Mon, 13 Apr 2020 20:31:05 +0530 Message-ID: <20200413150116.734047-23-jerinj@marvell.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200413150116.734047-1-jerinj@marvell.com> References: <20200403153709.3703448-1-jerinj@marvell.com> <20200413150116.734047-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-13_07:2020-04-13, 2020-04-13 signatures=0 Subject: [dpdk-dev] [PATCH v5 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 | 34 ++++++++ lib/librte_eal/linux/eal_interrupts.c | 84 ++++++++++++------- lib/librte_eal/rte_eal_version.map | 4 + 5 files changed, 140 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 8197e198a..7ab7b9659 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 */ @@ -205,6 +206,39 @@ RTE_TRACE_POINT( rte_trace_ctf_u32(lcore_id); rte_trace_ctf_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_ctf_int(rc); rte_trace_ctf_int(handle->vfio_dev_fd); + rte_trace_ctf_int(handle->fd); rte_trace_ctf_int(handle->type); + rte_trace_ctf_u32(handle->max_intr); rte_trace_ctf_u32(handle->nb_efd); + rte_trace_ctf_ptr(cb); rte_trace_ctf_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_ctf_int(rc); rte_trace_ctf_int(handle->vfio_dev_fd); + rte_trace_ctf_int(handle->fd); rte_trace_ctf_int(handle->type); + rte_trace_ctf_u32(handle->max_intr); rte_trace_ctf_u32(handle->nb_efd); + rte_trace_ctf_ptr(cb); rte_trace_ctf_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_ctf_int(rc); rte_trace_ctf_int(handle->vfio_dev_fd); + rte_trace_ctf_int(handle->fd); rte_trace_ctf_int(handle->type); + rte_trace_ctf_u32(handle->max_intr); rte_trace_ctf_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_ctf_int(rc); rte_trace_ctf_int(handle->vfio_dev_fd); + rte_trace_ctf_int(handle->fd); rte_trace_ctf_int(handle->type); + rte_trace_ctf_u32(handle->max_intr); rte_trace_ctf_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 cb8e10709..20e9cb35e 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 0ee4f29b2..0c0039780 100644 --- a/lib/librte_eal/rte_eal_version.map +++ b/lib/librte_eal/rte_eal_version.map @@ -387,4 +387,8 @@ EXPERIMENTAL { __rte_trace_lib_eal_memzone_free; __rte_trace_lib_eal_thread_remote_launch; __rte_trace_lib_eal_thread_lcore_ready; + __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; }; From patchwork Mon Apr 13 15: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: 68302 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 BEF00A0577; Mon, 13 Apr 2020 17:08:07 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 6171F1C0B8; Mon, 13 Apr 2020 17:03:11 +0200 (CEST) Received: from mx0b-0016f401.pphosted.com (mx0a-0016f401.pphosted.com [67.231.148.174]) by dpdk.org (Postfix) with ESMTP id C0B6B1C0CD for ; Mon, 13 Apr 2020 17:03:09 +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 03DExsM0014653; Mon, 13 Apr 2020 08:03: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=guqRDPggQhZNAgoZho8EC5HNMvABOY+mDnj3HjoEi2w=; b=uR0bBA8wHE+L25kDbTuZsuV0V5U1Rq7FyFh2UPxhBXTXG3kZ8l+DDLDJASpXunnC+kr1 sAZb/xthdGJjSaednHrXq4LnpxTvkDA86gEXRfwlxHW1Zf1lWbZ+YdCng5m7RLaS8Bsr OjD4tCY+bsFubLWKDu6j9Jx7oeb5nLYjQpKBYRzDEAIITc/2UYsSN4t22VQLfVyYdA9h JpMbJ8d+lY/EZyXzj2UEhTuB/Yw5UuWsaVbiBKllHhDui4QTkm11h7MqNb+bSkT7B1yK WbotyXMttJygz4QGKOCjTRTuszLkYV+5GuCRglE9HGvOi6qVrL0X6goW/s7EpuNAo/CD Mw== Received: from sc-exch02.marvell.com ([199.233.58.182]) by mx0a-0016f401.pphosted.com with ESMTP id 30bb8qey1e-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT); Mon, 13 Apr 2020 08:03:08 -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; Mon, 13 Apr 2020 08:03:07 -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; Mon, 13 Apr 2020 08:03:06 -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; Mon, 13 Apr 2020 08:03:06 -0700 Received: from jerin-lab.marvell.com (jerin-lab.marvell.com [10.28.34.14]) by maili.marvell.com (Postfix) with ESMTP id A4CE73F704B; Mon, 13 Apr 2020 08:03:02 -0700 (PDT) From: To: John McNamara , Marko Kovacevic , Jerin Jacob , "Sunil Kumar Kori" CC: , , , , Date: Mon, 13 Apr 2020 20:31:06 +0530 Message-ID: <20200413150116.734047-24-jerinj@marvell.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200413150116.734047-1-jerinj@marvell.com> References: <20200403153709.3703448-1-jerinj@marvell.com> <20200413150116.734047-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-13_07:2020-04-13, 2020-04-13 signatures=0 Subject: [dpdk-dev] [PATCH v5 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 525e51e7d..b2b2624e6 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 903a62a98..dd8086b88 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.global_status = true; + if (rte_trace_global_is_disabled()) 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 c284a2e0b..95ab3614a 100644 --- a/lib/librte_eal/common/eal_trace.h +++ b/lib/librte_eal/common/eal_trace.h @@ -28,7 +28,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; @@ -47,6 +47,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; @@ -55,6 +60,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; @@ -93,6 +99,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); @@ -104,5 +111,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 Mon Apr 13 15: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: 68303 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 758CCA0577; Mon, 13 Apr 2020 17:08:24 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 8ABA01C044; Mon, 13 Apr 2020 17:03:15 +0200 (CEST) Received: from mx0b-0016f401.pphosted.com (mx0b-0016f401.pphosted.com [67.231.156.173]) by dpdk.org (Postfix) with ESMTP id 726611C0B2 for ; Mon, 13 Apr 2020 17: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 03DF1K3H023054; Mon, 13 Apr 2020 08:03:13 -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=JtIxzHD7ieZhiOYIrKGTldiycPJ7HnLKZ5kDke6MvFk=; b=mnC11YQu7Xsgk3Kc5qRyk3JuXWVoGYW+nW5GKCZyDVIYm1EykUmwTRY0kltd6CHmzv5e qOXxyrQLdMmgR6xBtFryvh3P0SUXyD0Kr1dtb/2RHOeMjD0x5vln3K9OGwqzaJIzVKhO 3dgolturjVDP24x9uPy0PuIVW2vOtKISwOKIeRBPUHFeR28p8ItlyEl3LYe8JqGUma8K yqn1RZfOQqB49PtpVRarVRpIlGNPvZFqB4We4FuM+PL4covaYUQChkwY/fQm1a6Y9/Eh Q4isuNEBtnmmdb8NLk19Bphwkb/xH2m3VS8uhTM/UjODd9paE1FLcVNv6O+XRj2SsdfW Nw== Received: from sc-exch01.marvell.com ([199.233.58.181]) by mx0b-0016f401.pphosted.com with ESMTP id 30bddkpfbm-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT); Mon, 13 Apr 2020 08:03:13 -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; Mon, 13 Apr 2020 08:03:11 -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; Mon, 13 Apr 2020 08:03:10 -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; Mon, 13 Apr 2020 08:03:10 -0700 Received: from jerin-lab.marvell.com (jerin-lab.marvell.com [10.28.34.14]) by maili.marvell.com (Postfix) with ESMTP id E6A713F7040; Mon, 13 Apr 2020 08:03:07 -0700 (PDT) From: To: John McNamara , Marko Kovacevic , Jerin Jacob , "Sunil Kumar Kori" CC: , , , , Date: Mon, 13 Apr 2020 20:31:07 +0530 Message-ID: <20200413150116.734047-25-jerinj@marvell.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200413150116.734047-1-jerinj@marvell.com> References: <20200403153709.3703448-1-jerinj@marvell.com> <20200413150116.734047-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-13_07:2020-04-13, 2020-04-13 signatures=0 Subject: [dpdk-dev] [PATCH v5 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 b2b2624e6..d6b3ea5ca 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 95ab3614a..ce4e90b8d 100644 --- a/lib/librte_eal/common/eal_trace.h +++ b/lib/librte_eal/common/eal_trace.h @@ -113,5 +113,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 Mon Apr 13 15: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: 68304 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 1983EA0577; Mon, 13 Apr 2020 17:08:43 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 1715C1C114; Mon, 13 Apr 2020 17:03:20 +0200 (CEST) Received: from mx0b-0016f401.pphosted.com (mx0b-0016f401.pphosted.com [67.231.156.173]) by dpdk.org (Postfix) with ESMTP id 8D6871C0CE for ; Mon, 13 Apr 2020 17:03:18 +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 03DF1LxI023074; Mon, 13 Apr 2020 08:03:18 -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=t6hNzJFbzvYRq3ahtHFCTwRHCpAECwEvpDwxvIxPFCc=; b=l2Uk5F8BZZzlFmnkHmnMAxZkLS1CYrm+vftJy7v9d0apelLsww3IkYw8GFxe3RT/wfJN KX0RbNw/vT8f+x+ADNuXYpGsSeTjZVGZsVEEifmD0RsCfkYeZQSnFqz2okWnMlhiSs7l 4nDr1zIvy7/fmf+6uEdvDagJhwfuBwgwnKBZGH4fFX23TgxtyHSyr9mNff1MX7JjfEDr Tpcpr42cWEJLQQWd979oX/o1V2jkhk6YUcEVM2dLV5/hnqmvSzwVaDemj3PeTj4MZYmM BYYFrPoH2UaBOSvqqqZ7h8uwanLtfKxYsvinKhVhfUFNqg9lpECqHcb5t3g8SNK1sfic +A== Received: from sc-exch04.marvell.com ([199.233.58.184]) by mx0b-0016f401.pphosted.com with ESMTP id 30bddkpfc4-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT); Mon, 13 Apr 2020 08:03:17 -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; Mon, 13 Apr 2020 08:03:15 -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; Mon, 13 Apr 2020 08:03:15 -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; Mon, 13 Apr 2020 08:03:15 -0700 Received: from jerin-lab.marvell.com (jerin-lab.marvell.com [10.28.34.14]) by maili.marvell.com (Postfix) with ESMTP id EB2E83F7041; Mon, 13 Apr 2020 08:03:11 -0700 (PDT) From: To: John McNamara , Marko Kovacevic , Jerin Jacob , "Sunil Kumar Kori" CC: , , , , Date: Mon, 13 Apr 2020 20:31:08 +0530 Message-ID: <20200413150116.734047-26-jerinj@marvell.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200413150116.734047-1-jerinj@marvell.com> References: <20200403153709.3703448-1-jerinj@marvell.com> <20200413150116.734047-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-13_07:2020-04-13, 2020-04-13 signatures=0 Subject: [dpdk-dev] [PATCH v5 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 d6b3ea5ca..aea743e6f 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 dd8086b88..9e76d90fb 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 ce4e90b8d..890d1d1ee 100644 --- a/lib/librte_eal/common/eal_trace.h +++ b/lib/librte_eal/common/eal_trace.h @@ -100,6 +100,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); @@ -114,5 +115,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 Mon Apr 13 15: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: 68305 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 8C987A0577; Mon, 13 Apr 2020 17:08:57 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 1BB1A1C11B; Mon, 13 Apr 2020 17:03:24 +0200 (CEST) Received: from mx0b-0016f401.pphosted.com (mx0b-0016f401.pphosted.com [67.231.156.173]) by dpdk.org (Postfix) with ESMTP id 1B1591BEE7 for ; Mon, 13 Apr 2020 17:03:23 +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 03DF1giO023220; Mon, 13 Apr 2020 08: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=2O7a0qKi8wCJO6efUve7SRBRN5aUrDA5UJIqAhNFFvE=; b=e0+CHWgpNiOqf8J2EP97a1a7pV1qpVrTP44o3Gnt0k4QU4coBsjXewSqNhQtNoH2JZTq 3dWAsL9FSpjFLvI6xKuZQNW9iq+yffycYuWWRTYYu3RTOuSFjtj4OPGgN8ezWmTUF6CL deGUqBXzQ5FlKIDB63xDORCCmJejspvCmFYXDkOAyU1bMKU5jy1tb3OnxNK5YkqCO7QA VKT1YeR9J2BpBIouB3I0LA0SJqPtWsQaxVGmkFtPAoZaNP9IvsYLrF/ngdealcza7gfI wLalvpJk/baxRHsPIYTp58mehRcknJ77kOj+tpGfbRL32la8XB2sB0AWouoaousrZ53X sA== Received: from sc-exch03.marvell.com ([199.233.58.183]) by mx0b-0016f401.pphosted.com with ESMTP id 30bddkpfcd-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT); Mon, 13 Apr 2020 08:03:22 -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; Mon, 13 Apr 2020 08:03:20 -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; Mon, 13 Apr 2020 08:03:20 -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; Mon, 13 Apr 2020 08:03:19 -0700 Received: from jerin-lab.marvell.com (jerin-lab.marvell.com [10.28.34.14]) by maili.marvell.com (Postfix) with ESMTP id 513793F7045; Mon, 13 Apr 2020 08:03:16 -0700 (PDT) From: To: John McNamara , Marko Kovacevic , Jerin Jacob , "Sunil Kumar Kori" CC: , , , , Date: Mon, 13 Apr 2020 20:31:09 +0530 Message-ID: <20200413150116.734047-27-jerinj@marvell.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200413150116.734047-1-jerinj@marvell.com> References: <20200403153709.3703448-1-jerinj@marvell.com> <20200413150116.734047-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-13_07:2020-04-13, 2020-04-13 signatures=0 Subject: [dpdk-dev] [PATCH v5 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 aea743e6f..6999cabc4 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 890d1d1ee..25401ad84 100644 --- a/lib/librte_eal/common/eal_trace.h +++ b/lib/librte_eal/common/eal_trace.h @@ -115,6 +115,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 Mon Apr 13 15: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: 68306 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 A737CA0577; Mon, 13 Apr 2020 17:09:10 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 58AC41BEE7; Mon, 13 Apr 2020 17:03:27 +0200 (CEST) Received: from mx0b-0016f401.pphosted.com (mx0a-0016f401.pphosted.com [67.231.148.174]) by dpdk.org (Postfix) with ESMTP id 4C9481C120 for ; Mon, 13 Apr 2020 17: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 03DF02LO014895; Mon, 13 Apr 2020 08:03:24 -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=5+R7gEUajnXZCtiZGIZ0vyG4FK8L1ZvFQyQVGv0XaVA=; b=i6HeWHBm1700pM0tozI/0pQrfIA91cZIJvtbtNwF3pk+vHAfwXv5vGOiM92oZkjEhCwq 9BofCBUukdRIuuom7xVgeHG8Ky19FuSyLkEkGek4dVg3OyirfxjL3RJf5iHjzqW+6MGq r+l1Mnd6T9CIxSHkflNroK5qCIJgUyiW/ViQOT72lVITImXC2Hin7MXE88hv/rt7pxx+ qTgJjBPjMJm/MNptpoAfNSeJXb2vGZhCRGQgh4rI7fU90QeiXksYqUWCesvv55kteunm 2h54CuLkRhuSkBUEy5YB23sCyvgen0o84bYPi/XxwBrVLwU7pqbO0PpEDNuTCyEB6kgr kw== Received: from sc-exch02.marvell.com ([199.233.58.182]) by mx0a-0016f401.pphosted.com with ESMTP id 30bb8qey2x-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT); Mon, 13 Apr 2020 08:03:24 -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; Mon, 13 Apr 2020 08:03:23 -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; Mon, 13 Apr 2020 08:03:22 -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; Mon, 13 Apr 2020 08:03:22 -0700 Received: from jerin-lab.marvell.com (jerin-lab.marvell.com [10.28.34.14]) by maili.marvell.com (Postfix) with ESMTP id 618103F7040; Mon, 13 Apr 2020 08:03:20 -0700 (PDT) From: To: CC: , , , , , Date: Mon, 13 Apr 2020 20:31:10 +0530 Message-ID: <20200413150116.734047-28-jerinj@marvell.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200413150116.734047-1-jerinj@marvell.com> References: <20200403153709.3703448-1-jerinj@marvell.com> <20200413150116.734047-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-13_07:2020-04-13, 2020-04-13 signatures=0 Subject: [dpdk-dev] [PATCH v5 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 | 258 +++++++++++++++++++++++++++++++++ app/test/test_trace.h | 15 ++ app/test/test_trace_register.c | 19 +++ 5 files changed, 296 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 351d29cb6..4966236e8 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..1f69e4142 --- /dev/null +++ b/app/test/test_trace.c @@ -0,0 +1,258 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(C) 2020 Marvell International Ltd. + */ + +#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_is_disabled(&__app_dpdk_test_tp); + if (val == false) + goto failed; + + rc = rte_trace_pattern("app.dpdk.test*", true); + if (rc != 1) + goto failed; + + val = rte_trace_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_is_disabled(&__app_dpdk_test_tp); + if (val == false) + goto failed; + + rc = rte_trace_regexp("app.dpdk.test*", true); + if (rc != 1) + goto failed; + + val = rte_trace_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_disable(&__app_dpdk_test_tp); + if (rc < 0) + goto failed; + + val = rte_trace_is_disabled(&__app_dpdk_test_tp); + if (val == false) + goto failed; + + rc = rte_trace_enable(&__app_dpdk_test_tp); + if (rc < 0) + goto failed; + + val = rte_trace_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 int32_t +test_trace_validity(void) +{ + rte_trace_t invalid_trace = (int64_t)-1; /* Invalid trace */ + bool rc; + + rc = rte_trace_id_is_invalid(&__app_dpdk_test_tp); + if (rc == true) + goto failed; + + rc = rte_trace_id_is_invalid(&invalid_trace); + if (rc == false) + goto failed; + + return TEST_SUCCESS; + +failed: + return TEST_FAILED; +} + +static int +test_trace_global_status(void) +{ + bool enabled, disabled; + + enabled = rte_trace_global_is_enabled(); + disabled = rte_trace_global_is_disabled(); + + if (enabled != disabled) + return TEST_SUCCESS; + + return TEST_FAILED; +} + +static int +test_trace_mode(void) +{ + enum rte_trace_mode current; + + current = rte_trace_mode_get(); + + if (rte_trace_global_is_disabled()) + 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_t *trace; + + trace = rte_trace_by_name("app.dpdk.test.tp"); + if (trace == NULL) + goto fail; + trace = rte_trace_by_name("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_global_status), + 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_CASE(test_trace_validity), + 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..18dd573f3 --- /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_ctf_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..074b4f4bb --- /dev/null +++ b/app/test/test_trace_register.c @@ -0,0 +1,19 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(C) 2020 Marvell International Ltd. + */ +#define RTE_TRACE_POINT_REGISTER_SELECT /* Select trace point register macros */ + +#include + +#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 Mon Apr 13 15: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: 68307 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 58DCAA0577; Mon, 13 Apr 2020 17:09:25 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 868031C120; Mon, 13 Apr 2020 17:03:30 +0200 (CEST) Received: from mx0b-0016f401.pphosted.com (mx0a-0016f401.pphosted.com [67.231.148.174]) by dpdk.org (Postfix) with ESMTP id C95881C120 for ; Mon, 13 Apr 2020 17: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 03DExsM5014653; Mon, 13 Apr 2020 08:03: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=900NTWfva5KHQlOnE34b9tPTV6xotAe9R6ZwHfLIwAQ=; b=kzK9sSzWV9K4vUGZkBd6R/OWiKADznP7AhGNh0CvXVZkSGW2MJ1etrZ33aOY88UUs+WR efJBaFiLcp/VEIs5Mm027jwi7bYNXcBkGm+9ZF5Mp2fyd+tZUwOT4bfccTjkBILnGr3U 5sGegK09UgLRWQNy2wFbtU/bmxrJEJkteOccbuOAP6z34xJd/pak9HFUj6Y2D3moNPfk q1aFmsuurNMEGGTAQxTUTDzgn3+6O+5Pf6yzdW7TusSbqk2l4JtGsAS2Ij6xmcl+uidR jEMShRVBOr3SjWIHN3hYMUrSAaGFYGJspC9Bpef3J9LcR5sRCUKxJSttPFAoMp1uKQhL 1A== Received: from sc-exch02.marvell.com ([199.233.58.182]) by mx0a-0016f401.pphosted.com with ESMTP id 30bb8qey38-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT); Mon, 13 Apr 2020 08:03:27 -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; Mon, 13 Apr 2020 08:03:25 -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; Mon, 13 Apr 2020 08:03:25 -0700 Received: from jerin-lab.marvell.com (jerin-lab.marvell.com [10.28.34.14]) by maili.marvell.com (Postfix) with ESMTP id 8356A3F703F; Mon, 13 Apr 2020 08:03:23 -0700 (PDT) From: To: CC: , , , , , , Jerin Jacob Date: Mon, 13 Apr 2020 20:31:11 +0530 Message-ID: <20200413150116.734047-29-jerinj@marvell.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200413150116.734047-1-jerinj@marvell.com> References: <20200403153709.3703448-1-jerinj@marvell.com> <20200413150116.734047-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-13_07:2020-04-13, 2020-04-13 signatures=0 Subject: [dpdk-dev] [PATCH v5 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 4966236e8..efe8536c1 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 Mon Apr 13 15: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: 68308 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 91CB4A0577; Mon, 13 Apr 2020 17:09:45 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 2E3261C0B4; Mon, 13 Apr 2020 17:03:42 +0200 (CEST) Received: from mx0b-0016f401.pphosted.com (mx0b-0016f401.pphosted.com [67.231.156.173]) by dpdk.org (Postfix) with ESMTP id 140E21C0DA for ; Mon, 13 Apr 2020 17:03:40 +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 03DF1K3M023054; Mon, 13 Apr 2020 08:03:39 -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=jxIREiEIvaS+CD0xeqtg7bCKx9oVxU7SJkdh969htfo=; b=HXgYq90zPVFAAxhAbh/69MDh8uEYxOjPUhsqJSaS2aWJe3TASY2Ol24L8lb+0vtxABrr 2wStgaL7ht+Yffq90TIySL3KUhQ9AtAVJNj67DN/JB5HteSf+rkVz5oLmxm8Qc//aDy7 OJ5m7fx1GecXK0ZC0o4uu9vScVkYozIEOBpOgv9XOBcDR8Nsobl++u8JrUqH3Jd8OoXi +xWpC31ypz2HdJNBGDTs3AFqHhJFBLx3D0DXlnNCUYAU5TcxplH8bwZC6JgUwmf4kuSy hKL+VxbYJYe59rIWUY8CkRBgGKteSeHga7X5SMKkHqeZg78i8kS0goqn1SAWBs0ScRaG Mg== Received: from sc-exch03.marvell.com ([199.233.58.183]) by mx0b-0016f401.pphosted.com with ESMTP id 30bddkpfd8-2 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT); Mon, 13 Apr 2020 08:03: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; Mon, 13 Apr 2020 08:03:37 -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; Mon, 13 Apr 2020 08:03:36 -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; Mon, 13 Apr 2020 08:03:36 -0700 Received: from jerin-lab.marvell.com (jerin-lab.marvell.com [10.28.34.14]) by maili.marvell.com (Postfix) with ESMTP id 8D0A33F703F; Mon, 13 Apr 2020 08:03:27 -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: Mon, 13 Apr 2020 20:31:12 +0530 Message-ID: <20200413150116.734047-30-jerinj@marvell.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200413150116.734047-1-jerinj@marvell.com> References: <20200403153709.3703448-1-jerinj@marvell.com> <20200413150116.734047-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-13_07:2020-04-13, 2020-04-13 signatures=0 Subject: [dpdk-dev] [PATCH v5 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 | 90 +++++++++++++++++++ lib/librte_ethdev/rte_trace_ethdev_fp.h | 40 +++++++++ 80 files changed, 280 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 d1a593ad1..17cd1dda3 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..060779a1d --- /dev/null +++ b/lib/librte_ethdev/rte_trace_ethdev.h @@ -0,0 +1,90 @@ +/* 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 "rte_ethdev.h" + +#include + +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_ctf_u16(port_id); rte_trace_ctf_u16(nb_rx_q); + rte_trace_ctf_u16(nb_tx_q); rte_trace_ctf_u32(dev_conf->link_speeds); + rte_trace_ctf_u32(dev_conf->rxmode.mq_mode); + rte_trace_ctf_u32(dev_conf->rxmode.max_rx_pkt_len); + rte_trace_ctf_u64(dev_conf->rxmode.offloads); + rte_trace_ctf_u32(dev_conf->txmode.mq_mode); + rte_trace_ctf_u64(dev_conf->txmode.offloads); + rte_trace_ctf_u32(dev_conf->lpbk_mode); rte_trace_ctf_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_ctf_u16(port_id); rte_trace_ctf_u16(rx_queue_id); + rte_trace_ctf_u16(nb_rx_desc); rte_trace_ctf_ptr(mp); + rte_trace_ctf_u8(rx_conf->rx_thresh.pthresh); + rte_trace_ctf_u8(rx_conf->rx_thresh.hthresh); + rte_trace_ctf_u8(rx_conf->rx_thresh.wthresh); + rte_trace_ctf_u8(rx_conf->rx_drop_en); + rte_trace_ctf_u8(rx_conf->rx_deferred_start); + rte_trace_ctf_u64(rx_conf->offloads); rte_trace_ctf_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_ctf_u16(port_id); rte_trace_ctf_u16(tx_queue_id); + rte_trace_ctf_u16(nb_tx_desc); + rte_trace_ctf_u8(tx_conf->tx_thresh.pthresh); + rte_trace_ctf_u8(tx_conf->tx_thresh.hthresh); + rte_trace_ctf_u8(tx_conf->tx_thresh.wthresh); + rte_trace_ctf_u8(tx_conf->tx_deferred_start); + rte_trace_ctf_u16(tx_conf->tx_free_thresh); + rte_trace_ctf_u64(tx_conf->offloads); +) + +RTE_TRACE_POINT( + rte_trace_lib_ethdev_start, + RTE_TRACE_POINT_ARGS(uint16_t port_id), + rte_trace_ctf_u16(port_id); +) + +RTE_TRACE_POINT( + rte_trace_lib_ethdev_stop, + RTE_TRACE_POINT_ARGS(uint16_t port_id), + rte_trace_ctf_u16(port_id); +) + +RTE_TRACE_POINT( + rte_trace_lib_ethdev_close, + RTE_TRACE_POINT_ARGS(uint16_t port_id), + rte_trace_ctf_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..0f08f99df --- /dev/null +++ b/lib/librte_ethdev/rte_trace_ethdev_fp.h @@ -0,0 +1,40 @@ +/* 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_ctf_u16(port_id); rte_trace_ctf_u16(queue_id); + rte_trace_ctf_ptr(pkt_tbl); rte_trace_ctf_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_ctf_u16(port_id); rte_trace_ctf_u16(queue_id); + rte_trace_ctf_ptr(pkts_tbl); rte_trace_ctf_u16(nb_pkts); +) + +#ifdef __cplusplus +} +#endif + +#endif /* _RTE_TRACE_ETHDEV_FP_H_ */ From patchwork Mon Apr 13 15: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: 68309 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 30105A0577; Mon, 13 Apr 2020 17:10:07 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id B5E641C132; Mon, 13 Apr 2020 17:03:47 +0200 (CEST) Received: from mx0b-0016f401.pphosted.com (mx0b-0016f401.pphosted.com [67.231.156.173]) by dpdk.org (Postfix) with ESMTP id BF3391BF60 for ; Mon, 13 Apr 2020 17:03:45 +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 03DF1LxP023074; Mon, 13 Apr 2020 08:03: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=2pZq6whu1Mn7DMkJCeGAUQOc4L8LwYCHnwQxbpKve3A=; b=g5XvEfBnmrobh+kJcVPXL+U2OD16+e14TSKeLmPyNqDORa0z47cXWCVgTSQEb5fe20Ht OTvTVr83Fu85YnxhhTaV+1XG10KplXtzUUNq4IvD+aoOyfYxhHiBKQnc5T7mPBbcMesA bn2jdmq4r0qLHqzfQQ1HO2UETwMBZ9+wVZhYM+ppOt6LJaUfM0KchPYsfVazTNWqQbRG n7+jSyPaWZrc+TAWIrxXEddFvJLjevV62ga65IPFMgkO/RzyYARkS4KhHPH6Yl2t9BDk ORPH/MoJPeEnQYmlz27D7L9GKIOSKIQ2mz1UeKDzqwzP2nlUT7x2nhk1MNEk/aCDfXb6 wQ== Received: from sc-exch01.marvell.com ([199.233.58.181]) by mx0b-0016f401.pphosted.com with ESMTP id 30bddkpfe8-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT); Mon, 13 Apr 2020 08:03:44 -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; Mon, 13 Apr 2020 08:03:42 -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; Mon, 13 Apr 2020 08:03:41 -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; Mon, 13 Apr 2020 08:03:41 -0700 Received: from jerin-lab.marvell.com (jerin-lab.marvell.com [10.28.34.14]) by maili.marvell.com (Postfix) with ESMTP id 1143A3F703F; Mon, 13 Apr 2020 08:03:37 -0700 (PDT) From: To: Jerin Jacob , Abhinandan Gujjar , Nikhil Rao , "Erik Gabriel Carrillo" CC: , , , , , Date: Mon, 13 Apr 2020 20:31:13 +0530 Message-ID: <20200413150116.734047-31-jerinj@marvell.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200413150116.734047-1-jerinj@marvell.com> References: <20200403153709.3703448-1-jerinj@marvell.com> <20200413150116.734047-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-13_07:2020-04-13, 2020-04-13 signatures=0 Subject: [dpdk-dev] [PATCH v5 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 | 278 ++++++++++++++++++ lib/librte_eventdev/rte_trace_eventdev_fp.h | 75 +++++ 14 files changed, 636 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..f5b0fb158 --- /dev/null +++ b/lib/librte_eventdev/rte_trace_eventdev.h @@ -0,0 +1,278 @@ +/* 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 "rte_eventdev.h" +#include "rte_event_eth_rx_adapter.h" +#include "rte_event_timer_adapter.h" + +#include + +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_ctf_u8(dev_id); + rte_trace_ctf_u32(dev_conf->dequeue_timeout_ns); + rte_trace_ctf_i32(dev_conf->nb_events_limit); + rte_trace_ctf_u8(dev_conf->nb_event_queues); + rte_trace_ctf_u8(dev_conf->nb_event_ports); + rte_trace_ctf_u32(dev_conf->nb_event_queue_flows); + rte_trace_ctf_u32(dev_conf->nb_event_port_dequeue_depth); + rte_trace_ctf_u32(dev_conf->nb_event_port_enqueue_depth); + rte_trace_ctf_u32(dev_conf->event_dev_cfg); + rte_trace_ctf_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_ctf_u8(dev_id); rte_trace_ctf_u8(queue_id); + rte_trace_ctf_u32(queue_conf->nb_atomic_flows); + rte_trace_ctf_u32(queue_conf->nb_atomic_order_sequences); + rte_trace_ctf_u32(queue_conf->event_queue_cfg); + rte_trace_ctf_u8(queue_conf->schedule_type); + rte_trace_ctf_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_ctf_u8(dev_id); rte_trace_ctf_u8(port_id); + rte_trace_ctf_i32(port_conf->new_event_threshold); + rte_trace_ctf_u16(port_conf->dequeue_depth); + rte_trace_ctf_u16(port_conf->enqueue_depth); + rte_trace_ctf_u8(port_conf->disable_implicit_release); + rte_trace_ctf_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_ctf_u8(dev_id); rte_trace_ctf_u8(port_id); + rte_trace_ctf_u16(nb_links); rte_trace_ctf_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_ctf_u8(dev_id); rte_trace_ctf_u8(port_id); + rte_trace_ctf_u16(nb_unlinks); rte_trace_ctf_int(rc); +) + +RTE_TRACE_POINT( + rte_trace_lib_eventdev_start, + RTE_TRACE_POINT_ARGS(uint8_t dev_id, int rc), + rte_trace_ctf_u8(dev_id); rte_trace_ctf_int(rc); +) + +RTE_TRACE_POINT( + rte_trace_lib_eventdev_stop, + RTE_TRACE_POINT_ARGS(uint8_t dev_id), + rte_trace_ctf_u8(dev_id); +) + +RTE_TRACE_POINT( + rte_trace_lib_eventdev_close, + RTE_TRACE_POINT_ARGS(uint8_t dev_id), + rte_trace_ctf_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_ctf_u8(adptr_id); rte_trace_ctf_u8(dev_id); + rte_trace_ctf_ptr(conf_cb); rte_trace_ctf_ptr(conf_arg); +) + +RTE_TRACE_POINT( + rte_trace_lib_event_eth_rx_adapter_free, + RTE_TRACE_POINT_ARGS(uint8_t adptr_id), + rte_trace_ctf_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_ctf_u8(adptr_id); rte_trace_ctf_u16(eth_dev_id); + rte_trace_ctf_i32(rx_queue_id); + rte_trace_ctf_u32(queue_conf->rx_queue_flags); + rte_trace_ctf_u16(queue_conf->servicing_weight); + rte_trace_ctf_u8(queue_conf->ev.queue_id); + rte_trace_ctf_u8(queue_conf->ev.priority); + rte_trace_ctf_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_ctf_u8(adptr_id); rte_trace_ctf_u16(eth_dev_id); + rte_trace_ctf_i32(rx_queue_id); rte_trace_ctf_int(rc); +) + +RTE_TRACE_POINT( + rte_trace_lib_event_eth_rx_adapter_start, + RTE_TRACE_POINT_ARGS(uint8_t adptr_id), + rte_trace_ctf_u8(adptr_id); +) + +RTE_TRACE_POINT( + rte_trace_lib_event_eth_rx_adapter_stop, + RTE_TRACE_POINT_ARGS(uint8_t adptr_id), + rte_trace_ctf_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_ctf_u8(adptr_id); rte_trace_ctf_u8(dev_id); + rte_trace_ctf_i32(port_conf->new_event_threshold); + rte_trace_ctf_u16(port_conf->dequeue_depth); + rte_trace_ctf_u16(port_conf->enqueue_depth); + rte_trace_ctf_u8(port_conf->disable_implicit_release); + rte_trace_ctf_ptr(conf_cb); rte_trace_ctf_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_ctf_u8(adptr_id); rte_trace_ctf_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_ctf_u8(adptr_id); rte_trace_ctf_u16(eth_dev_id); + rte_trace_ctf_i32(queue); rte_trace_ctf_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_ctf_u8(adptr_id); rte_trace_ctf_u16(eth_dev_id); + rte_trace_ctf_i32(queue); rte_trace_ctf_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_ctf_u8(adptr_id); rte_trace_ctf_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_ctf_u8(adptr_id); rte_trace_ctf_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_ctf_u16(adapter_id); rte_trace_ctf_ptr(adapter); + rte_trace_ctf_ptr(conf); rte_trace_ctf_u8(conf->event_dev_id); + rte_trace_ctf_u16(conf->timer_adapter_id); + rte_trace_ctf_u64(conf->timer_tick_ns); + rte_trace_ctf_u64(conf->max_tmo_ns); rte_trace_ctf_u64(conf->nb_timers); + rte_trace_ctf_u64(conf->flags); rte_trace_ctf_ptr(conf_cb); +) + +RTE_TRACE_POINT( + rte_trace_lib_event_timer_adapter_start, + RTE_TRACE_POINT_ARGS(const void *adapter), + rte_trace_ctf_ptr(adapter); +) + +RTE_TRACE_POINT( + rte_trace_lib_event_timer_adapter_stop, + RTE_TRACE_POINT_ARGS(const void *adapter), + rte_trace_ctf_ptr(adapter); +) + +RTE_TRACE_POINT( + rte_trace_lib_event_timer_adapter_free, + RTE_TRACE_POINT_ARGS(void *adapter), + rte_trace_ctf_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_ctf_u8(adptr_id); rte_trace_ctf_u8(dev_id); + rte_trace_ctf_ptr(adapter); rte_trace_ctf_u8(mode); + rte_trace_ctf_i32(port_conf->new_event_threshold); + rte_trace_ctf_u16(port_conf->dequeue_depth); + rte_trace_ctf_u16(port_conf->enqueue_depth); + rte_trace_ctf_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_ctf_u8(adptr_id); rte_trace_ctf_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_ctf_u8(adptr_id); rte_trace_ctf_u8(cdev_id); + rte_trace_ctf_i32(queue_pair_id); rte_trace_ctf_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_ctf_u8(adptr_id); rte_trace_ctf_u8(cdev_id); + rte_trace_ctf_i32(queue_pair_id); rte_trace_ctf_int(rc); +) + +RTE_TRACE_POINT( + rte_trace_lib_event_crypto_adapter_start, + RTE_TRACE_POINT_ARGS(uint8_t adptr_id, void *adapter), + rte_trace_ctf_u8(adptr_id); rte_trace_ctf_ptr(adapter); +) + +RTE_TRACE_POINT( + rte_trace_lib_event_crypto_adapter_stop, + RTE_TRACE_POINT_ARGS(uint8_t adptr_id), + rte_trace_ctf_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..d8cb23eb4 --- /dev/null +++ b/lib/librte_eventdev/rte_trace_eventdev_fp.h @@ -0,0 +1,75 @@ +/* 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_ctf_u8(dev_id); rte_trace_ctf_u8(port_id); + rte_trace_ctf_ptr(ev_table); rte_trace_ctf_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_ctf_u8(dev_id); rte_trace_ctf_u8(port_id); + rte_trace_ctf_ptr(ev_table); rte_trace_ctf_u16(nb_events); + rte_trace_ctf_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_ctf_u8(dev_id); rte_trace_ctf_u8(port_id); + rte_trace_ctf_ptr(ev_table); rte_trace_ctf_u16(nb_events); + rte_trace_ctf_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_ctf_ptr(adapter); rte_trace_ctf_ptr(evtims_table); + rte_trace_ctf_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_ctf_ptr(adapter); rte_trace_ctf_u64(timeout_ticks); + rte_trace_ctf_ptr(evtims_table); rte_trace_ctf_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_ctf_ptr(adapter); rte_trace_ctf_ptr(evtims_table); + rte_trace_ctf_u16(nb_evtims); +) + +#ifdef __cplusplus +} +#endif + +#endif /* _RTE_TRACE_EVENTDEV_FP_H_ */ From patchwork Mon Apr 13 15: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: 68310 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 1F3A4A0577; Mon, 13 Apr 2020 17:10:27 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 4FBF11C18E; Mon, 13 Apr 2020 17:03:51 +0200 (CEST) Received: from mx0b-0016f401.pphosted.com (mx0a-0016f401.pphosted.com [67.231.148.174]) by dpdk.org (Postfix) with ESMTP id CF5A31C134 for ; Mon, 13 Apr 2020 17:03:47 +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 03DExum0014657; Mon, 13 Apr 2020 08:03:47 -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=PmkM0fJbbw4CsaNei5PTF65DgpNTcJuRQvb3lCD0Qog=; b=JgZx3i/z1fEa8fr5sMYKoUidnBc4JPLgHpTQuXh51D2lwL980CMQDJVXZFY0/BVaOgsl Io6G1eO7ffXo1hgKkts99Fcv0x6CgwmtAqovcsMdjTJt3Aty5sVuW59mGtxs/PNdzBr3 F0pISH6X6CsYNGF00C9Y+DZf3Y0ySmHN2dVpl9d8X1uXk3EATrKrZVUNtYv4zmmcK60p PXIiOIQ6A1MGmi844YdmsCgvBdcWGREyAHQUkXH5zf8im2RpFp4yJa618o6HF2s1UF+T 6pE5V3WSKTQrx1jAyA4GIWN4GbIg3zzBiZ2gUEC6j6yICdXLxgQnfz5JtOEG8PELx9d1 Ig== Received: from sc-exch02.marvell.com ([199.233.58.182]) by mx0a-0016f401.pphosted.com with ESMTP id 30bb8qey4d-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT); Mon, 13 Apr 2020 08:03:46 -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; Mon, 13 Apr 2020 08:03:45 -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; Mon, 13 Apr 2020 08:03:45 -0700 Received: from jerin-lab.marvell.com (jerin-lab.marvell.com [10.28.34.14]) by maili.marvell.com (Postfix) with ESMTP id 084A73F703F; Mon, 13 Apr 2020 08:03:42 -0700 (PDT) From: To: Declan Doherty CC: , , , , , Date: Mon, 13 Apr 2020 20:31:14 +0530 Message-ID: <20200413150116.734047-32-jerinj@marvell.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200413150116.734047-1-jerinj@marvell.com> References: <20200403153709.3703448-1-jerinj@marvell.com> <20200413150116.734047-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-13_07:2020-04-13, 2020-04-13 signatures=0 Subject: [dpdk-dev] [PATCH v5 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 | 133 ++++++++++++++++++ lib/librte_cryptodev/rte_trace_cryptodev_fp.h | 34 +++++ 8 files changed, 286 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 6d1d0e9d3..66ab7a694 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; @@ -905,6 +906,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); } @@ -933,6 +935,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 @@ -962,6 +965,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; } @@ -998,6 +1002,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; @@ -1067,6 +1072,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); } @@ -1283,6 +1290,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; } @@ -1319,6 +1327,7 @@ rte_cryptodev_asym_session_init(uint8_t dev_id, } } + rte_trace_lib_cryptodev_asym_session_init(dev_id, sess, xforms, mp); return 0; } @@ -1359,6 +1368,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; } @@ -1403,6 +1415,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; } @@ -1422,6 +1435,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; } @@ -1447,6 +1461,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; } @@ -1465,6 +1480,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; } @@ -1487,6 +1503,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; } @@ -1511,6 +1528,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..fd031b63f --- /dev/null +++ b/lib/librte_cryptodev/rte_trace_cryptodev.h @@ -0,0 +1,133 @@ +/* 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 "rte_cryptodev.h" + +#include + +RTE_TRACE_POINT( + rte_trace_lib_cryptodev_configure, + RTE_TRACE_POINT_ARGS(uint8_t dev_id, struct rte_cryptodev_config *conf), + rte_trace_ctf_u8(dev_id); rte_trace_ctf_u16(conf->nb_queue_pairs); + rte_trace_ctf_i64(conf->ff_disable); +) + +RTE_TRACE_POINT( + rte_trace_lib_cryptodev_start, + RTE_TRACE_POINT_ARGS(uint8_t dev_id, int rc), + rte_trace_ctf_u8(dev_id); rte_trace_ctf_int(rc); +) + +RTE_TRACE_POINT( + rte_trace_lib_cryptodev_stop, + RTE_TRACE_POINT_ARGS(uint8_t dev_id), + rte_trace_ctf_u8(dev_id); +) + +RTE_TRACE_POINT( + rte_trace_lib_cryptodev_close, + RTE_TRACE_POINT_ARGS(uint8_t dev_id, int rc), + rte_trace_ctf_u8(dev_id); rte_trace_ctf_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_ctf_u8(dev_id); rte_trace_ctf_u16(queue_pair_id); + rte_trace_ctf_u32(conf->nb_descriptors); + rte_trace_ctf_ptr(conf->mp_session); + rte_trace_ctf_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_ctf_string(name); rte_trace_ctf_u32(nb_elts); + rte_trace_ctf_u32(elt_size); rte_trace_ctf_u32(cache_size); + rte_trace_ctf_u16(user_data_size); rte_trace_ctf_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_ctf_ptr(mempool); rte_trace_ctf_ptr(sess); + rte_trace_ctf_u64(sess->opaque_data); + rte_trace_ctf_u16(sess->nb_drivers); + rte_trace_ctf_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_ctf_ptr(mempool); rte_trace_ctf_ptr(sess); +) + +RTE_TRACE_POINT( + rte_trace_lib_cryptodev_sym_session_free, + RTE_TRACE_POINT_ARGS(struct rte_cryptodev_sym_session *sess), + rte_trace_ctf_ptr(sess); +) + +RTE_TRACE_POINT( + rte_trace_lib_cryptodev_asym_session_free, + RTE_TRACE_POINT_ARGS(struct rte_cryptodev_asym_session *sess), + rte_trace_ctf_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_ctf_u8(dev_id); rte_trace_ctf_ptr(sess); + rte_trace_ctf_u64(sess->opaque_data); + rte_trace_ctf_u16(sess->nb_drivers); + rte_trace_ctf_u16(sess->user_data_sz); + rte_trace_ctf_ptr(xforms); rte_trace_ctf_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_ctf_u8(dev_id); rte_trace_ctf_ptr(sess); + rte_trace_ctf_ptr(xforms); rte_trace_ctf_ptr(mempool); +) + +RTE_TRACE_POINT( + rte_trace_lib_cryptodev_sym_session_clear, + RTE_TRACE_POINT_ARGS(uint8_t dev_id, void *sess), + rte_trace_ctf_u8(dev_id); rte_trace_ctf_ptr(sess); +) + +RTE_TRACE_POINT( + rte_trace_lib_cryptodev_asym_session_clear, + RTE_TRACE_POINT_ARGS(uint8_t dev_id, void *sess), + rte_trace_ctf_u8(dev_id); rte_trace_ctf_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..6fc7b24b0 --- /dev/null +++ b/lib/librte_cryptodev/rte_trace_cryptodev_fp.h @@ -0,0 +1,34 @@ +/* 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_ctf_u8(dev_id); rte_trace_ctf_u16(qp_id); + rte_trace_ctf_ptr(ops); rte_trace_ctf_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_ctf_u8(dev_id); rte_trace_ctf_u16(qp_id); + rte_trace_ctf_ptr(ops); rte_trace_ctf_u16(nb_ops); +) + +#ifdef __cplusplus +} +#endif + +#endif /* _RTE_TRACE_CRYPTODEV_FP_H_ */ From patchwork Mon Apr 13 15: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: 68311 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 093D3A0577; Mon, 13 Apr 2020 17:10:44 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 691551C137; Mon, 13 Apr 2020 17:03:55 +0200 (CEST) Received: from mx0b-0016f401.pphosted.com (mx0b-0016f401.pphosted.com [67.231.156.173]) by dpdk.org (Postfix) with ESMTP id 8805A1BF67 for ; Mon, 13 Apr 2020 17:03: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 03DF1KhZ023057; Mon, 13 Apr 2020 08:03: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=9ooHrr8DOPVNSm0Qa/dDpCG9WzcXv7AWPougPNl73Qw=; b=LLtkAWdwJvrX61Dg0wpm/5i/7AIzfQpnjOeVrfc61UtlwCGTQwgDZuF0v6Nbv91XzV6m 662EQg6cLUeUDV1KKX7bEVsxJkelV3dIcAFd3wiU5cf50NyVzzvKx/eclnFWVLu57kDA i7W+NxKtRaPM8S7q8ae+xesExB73Qwe+t2id4bL0rY9YlwuUvGkwbqVEF2g3rOFxkdUo TRgx/yTh7LJn5MO2MaiDvTTH/9PZVl5YPgLljbayKULqIudhU/C7b9mTnHzFadWKBd4/ nxhZZZFraVZt72wi6VRocBasKLZOt5UEEM7jLjpbE15gqcauyweMbQTX+Ge6GPngswrr Rw== Received: from sc-exch04.marvell.com ([199.233.58.184]) by mx0b-0016f401.pphosted.com with ESMTP id 30bddkpfey-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT); Mon, 13 Apr 2020 08:03:52 -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; Mon, 13 Apr 2020 08:03:50 -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; Mon, 13 Apr 2020 08:03:50 -0700 Received: from jerin-lab.marvell.com (jerin-lab.marvell.com [10.28.34.14]) by maili.marvell.com (Postfix) with ESMTP id 8B4043F703F; Mon, 13 Apr 2020 08:03:47 -0700 (PDT) From: To: Olivier Matz , Andrew Rybchenko CC: , , , , , Date: Mon, 13 Apr 2020 20:31:15 +0530 Message-ID: <20200413150116.734047-33-jerinj@marvell.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200413150116.734047-1-jerinj@marvell.com> References: <20200403153709.3703448-1-jerinj@marvell.com> <20200413150116.734047-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-13_07:2020-04-13, 2020-04-13 signatures=0 Subject: [dpdk-dev] [PATCH v5 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 | 148 +++++++++++++++++++++ lib/librte_mempool/rte_trace_mempool_fp.h | 102 ++++++++++++++ 9 files changed, 426 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..12af2e301 --- /dev/null +++ b/lib/librte_mempool/rte_trace_mempool.h @@ -0,0 +1,148 @@ +/* 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_ctf_string(name); rte_trace_ctf_u32(nb_elts); + rte_trace_ctf_u32(elt_size); rte_trace_ctf_u32(cache_size); + rte_trace_ctf_u32(private_data_size); rte_trace_ctf_ptr(mp_init); + rte_trace_ctf_ptr(mp_init_arg); rte_trace_ctf_ptr(obj_init); + rte_trace_ctf_ptr(obj_init_arg); rte_trace_ctf_u32(flags); + rte_trace_ctf_ptr(mempool); rte_trace_ctf_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_ctf_string(name); rte_trace_ctf_u32(nb_elts); + rte_trace_ctf_u32(elt_size); rte_trace_ctf_u32(cache_size); + rte_trace_ctf_u32(private_data_size); rte_trace_ctf_u32(flags); + rte_trace_ctf_ptr(mempool); rte_trace_ctf_i32(mempool->ops_index); +) + +RTE_TRACE_POINT( + rte_trace_lib_mempool_free, + RTE_TRACE_POINT_ARGS(struct rte_mempool *mempool), + rte_trace_ctf_ptr(mempool); rte_trace_ctf_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_ctf_ptr(mempool); rte_trace_ctf_string(mempool->name); + rte_trace_ctf_ptr(vaddr); rte_trace_ctf_u64(iova); + rte_trace_ctf_long(len); rte_trace_ctf_ptr(free_cb); + rte_trace_ctf_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_ctf_ptr(mempool); rte_trace_ctf_string(mempool->name); + rte_trace_ctf_ptr(addr); rte_trace_ctf_long(len); + rte_trace_ctf_long(pg_sz); rte_trace_ctf_ptr(free_cb); + rte_trace_ctf_ptr(opaque); +) + +RTE_TRACE_POINT( + rte_trace_lib_mempool_populate_default, + RTE_TRACE_POINT_ARGS(struct rte_mempool *mempool), + rte_trace_ctf_ptr(mempool); rte_trace_ctf_string(mempool->name); +) + +RTE_TRACE_POINT( + rte_trace_lib_mempool_populate_anon, + RTE_TRACE_POINT_ARGS(struct rte_mempool *mempool), + rte_trace_ctf_ptr(mempool); rte_trace_ctf_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_ctf_u32(size); rte_trace_ctf_i32(socket_id); + rte_trace_ctf_ptr(cache); rte_trace_ctf_u32(cache->len); + rte_trace_ctf_u32(cache->flushthresh); +) + +RTE_TRACE_POINT( + rte_trace_lib_mempool_cache_free, + RTE_TRACE_POINT_ARGS(void *cache), + rte_trace_ctf_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_ctf_ptr(mempool); rte_trace_ctf_string(mempool->name); + rte_trace_ctf_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_ctf_ptr(mempool); rte_trace_ctf_string(mempool->name); + rte_trace_ctf_u32(max_objs); rte_trace_ctf_ptr(vaddr); + rte_trace_ctf_u64(iova); rte_trace_ctf_long(len); + rte_trace_ctf_ptr(obj_cb); rte_trace_ctf_ptr(obj_cb_arg); +) + +RTE_TRACE_POINT( + rte_trace_lib_mempool_ops_alloc, + RTE_TRACE_POINT_ARGS(struct rte_mempool *mempool), + rte_trace_ctf_ptr(mempool); rte_trace_ctf_string(mempool->name); +) + +RTE_TRACE_POINT( + rte_trace_lib_mempool_ops_free, + RTE_TRACE_POINT_ARGS(struct rte_mempool *mempool), + rte_trace_ctf_ptr(mempool); rte_trace_ctf_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_ctf_ptr(mempool); rte_trace_ctf_string(mempool->name); + rte_trace_ctf_string(name); rte_trace_ctf_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..e6a9ab972 --- /dev/null +++ b/lib/librte_mempool/rte_trace_mempool_fp.h @@ -0,0 +1,102 @@ +/* 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_ctf_ptr(mempool); rte_trace_ctf_ptr(obj_table); + rte_trace_ctf_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_ctf_ptr(mempool); rte_trace_ctf_ptr(first_obj_table); + rte_trace_ctf_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_ctf_ptr(mempool); rte_trace_ctf_ptr(obj_table); + rte_trace_ctf_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_ctf_ptr(mempool); rte_trace_ctf_ptr(obj_table); + rte_trace_ctf_u32(nb_objs); rte_trace_ctf_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_ctf_ptr(mempool); rte_trace_ctf_ptr(obj_table); + rte_trace_ctf_u32(nb_objs); rte_trace_ctf_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_ctf_ptr(mempool); rte_trace_ctf_ptr(obj_table); + rte_trace_ctf_u32(nb_objs); rte_trace_ctf_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_ctf_ptr(mempool); rte_trace_ctf_ptr(obj_table); + rte_trace_ctf_u32(nb_objs); rte_trace_ctf_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_ctf_ptr(mempool); rte_trace_ctf_ptr(first_obj_table); + rte_trace_ctf_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_ctf_ptr(mempool); rte_trace_ctf_u32(lcore_id); + rte_trace_ctf_ptr(default_cache); +) + +RTE_TRACE_POINT_FP( + rte_trace_lib_mempool_cache_flush, + RTE_TRACE_POINT_ARGS(void *cache, void *mempool), + rte_trace_ctf_ptr(cache); rte_trace_ctf_ptr(mempool); +) + +#ifdef __cplusplus +} +#endif + +#endif /* _RTE_TRACE_MEMPOOL_FP_H_ */ From patchwork Mon Apr 13 15: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: 68312 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 53452A0577; Mon, 13 Apr 2020 17:11:01 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 057BA1BF60; Mon, 13 Apr 2020 17: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 50A6D2B83 for ; Mon, 13 Apr 2020 17:03:58 +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 03DF0NUQ015130; Mon, 13 Apr 2020 08:03:57 -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=+HT2tACp9uuGAOksRV1j1hgKSlX0SkYQVKOTSHgppVY=; b=y/+iyFpBYsRc9mvqiRgmqdUL3cEGUiCRKToRdgMp6Kiy9CnldX1RMIPzSeT6XJXtQ3Ae zfuov3auTLNtQ6Djh1rDR2od+EGhwgvpXEBAtEPXY27M1M0YIwZwuO1LHWNM6nie1Hf6 HlFUU7ue/cshgSHWc95vGJjZ7xbIw16YtVcR6DRCGCbqhyJlT+MJpG9hKNY5XiGq4ihA UI3PAQdLOdNRrrOFam/VohknnI+/HNps1kV3sGsN3QVcGyc+MT1prdFW7wH1DmGnj4HT KF60VH9651g2OSOIAFzOuLg/oPw6CqPdTM5/0tqkqVPZRHeiPJNYRctdbUIRQCiFcpWB oQ== Received: from sc-exch02.marvell.com ([199.233.58.182]) by mx0a-0016f401.pphosted.com with ESMTP id 30bb8qey5f-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-SHA384 bits=256 verify=NOT); Mon, 13 Apr 2020 08:03:57 -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; Mon, 13 Apr 2020 08:03:56 -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; Mon, 13 Apr 2020 08:03:55 -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; Mon, 13 Apr 2020 08:03:55 -0700 Received: from jerin-lab.marvell.com (jerin-lab.marvell.com [10.28.34.14]) by maili.marvell.com (Postfix) with ESMTP id F190A3F703F; Mon, 13 Apr 2020 08:03:51 -0700 (PDT) From: To: Thomas Monjalon , John McNamara , Marko Kovacevic , "Jerin Jacob" , Sunil Kumar Kori CC: , , , Date: Mon, 13 Apr 2020 20:31:16 +0530 Message-ID: <20200413150116.734047-34-jerinj@marvell.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200413150116.734047-1-jerinj@marvell.com> References: <20200403153709.3703448-1-jerinj@marvell.com> <20200413150116.734047-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-13_07:2020-04-13, 2020-04-13 signatures=0 Subject: [dpdk-dev] [PATCH v5 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 | 334 +++++++++++++++++++++++++ doc/guides/rel_notes/release_20_05.rst | 9 + 4 files changed, 345 insertions(+) create mode 100644 doc/guides/prog_guide/trace_lib.rst diff --git a/MAINTAINERS b/MAINTAINERS index 49a97e592..b15062270 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..17f927584 --- /dev/null +++ b/doc/guides/prog_guide/trace_lib.rst @@ -0,0 +1,334 @@ +.. 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_ctf_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_ctf_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_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 9059f9563..9af0eaaed 100644 --- a/doc/guides/rel_notes/release_20_05.rst +++ b/doc/guides/rel_notes/release_20_05.rst @@ -68,6 +68,15 @@ New Features meson.build in app, lib and drivers instead enable ALLOW_EXPERIMENTAL_API flag globally. +* **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 -------------