From patchwork Mon Apr 24 15:24:12 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Arnaud Fiorini X-Patchwork-Id: 126494 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 38830429DC; Mon, 24 Apr 2023 17:24:23 +0200 (CEST) Received: from mails.dpdk.org (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id EBABE410EC; Mon, 24 Apr 2023 17:24:22 +0200 (CEST) Received: from smtp.polymtl.ca (smtp.polymtl.ca [132.207.4.11]) by mails.dpdk.org (Postfix) with ESMTP id 9E57840DF8 for ; Mon, 24 Apr 2023 17:24:21 +0200 (CEST) Received: from octosquare.dorsal.polymtl.ca (octosquare.dorsal.polymtl.ca [132.207.72.20]) (authenticated bits=0) by smtp.polymtl.ca (8.14.7/8.14.7) with ESMTP id 33OFOD9X022604 (version=TLSv1/SSLv3 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Mon, 24 Apr 2023 11:24:19 -0400 DKIM-Filter: OpenDKIM Filter v2.11.0 smtp.polymtl.ca 33OFOD9X022604 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=polymtl.ca; s=default; t=1682349860; bh=t8etHidE8UJWl5JMnD2QvNMY/B1f5X+pXAa+24OgWxU=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=pDwqvGIkP0Giy7u24nnW63ke74YdMh/RWTp9FGe7SCGg1UWJLpOc2fH9IYDQNILNA 3Vt06YFykHkTZQC5GpO4mO8rY5vKGzYM1BBTUjhG4dlajcD7kQ9lAyWkX7U5ImYNkp Ude5KiEMc3/h/f+p++CVmKmlIOoO95g5pTc4mB9c= From: Arnaud Fiorini To: Thomas Monjalon , Jerin Jacob , Sunil Kumar Kori , Harry van Haaren Cc: dev@dpdk.org, Arnaud Fiorini Subject: [PATCH 1/1] eal: add tracepoints to track lcores and services Date: Mon, 24 Apr 2023 15:24:12 +0000 Message-Id: <20230424152412.3784016-2-arnaud.fiorini@polymtl.ca> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20230424152412.3784016-1-arnaud.fiorini@polymtl.ca> References: <20230424152412.3784016-1-arnaud.fiorini@polymtl.ca> MIME-Version: 1.0 X-Poly-FromMTA: (octosquare.dorsal.polymtl.ca [132.207.72.20]) at Mon, 24 Apr 2023 15:24:13 +0000 X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org The tracepoints added are used to track lcore role and status, as well as service mapping and service runstates. These tracepoints are then used in analyses in Trace Compass. Signed-off-by: Arnaud Fiorini --- .mailmap | 1 + lib/eal/common/eal_common_thread.c | 4 ++ lib/eal/common/eal_common_trace_points.c | 21 +++++++++ lib/eal/common/rte_service.c | 18 ++++++- lib/eal/include/eal_trace_internal.h | 60 ++++++++++++++++++++++++ 5 files changed, 103 insertions(+), 1 deletion(-) diff --git a/.mailmap b/.mailmap index dc30369117..2a0b132572 100644 --- a/.mailmap +++ b/.mailmap @@ -120,6 +120,7 @@ Archana Muniganti Archit Pandey Arkadiusz Kubalewski Arkadiusz Kusztal +Arnaud Fiorini Arnon Warshavsky Arshdeep Kaur Artem V. Andreev diff --git a/lib/eal/common/eal_common_thread.c b/lib/eal/common/eal_common_thread.c index 079a385630..25dbdd68e3 100644 --- a/lib/eal/common/eal_common_thread.c +++ b/lib/eal/common/eal_common_thread.c @@ -205,6 +205,8 @@ eal_thread_loop(void *arg) __ATOMIC_ACQUIRE)) == NULL) rte_pause(); + rte_eal_trace_thread_lcore_running(lcore_id, f); + /* call the function and store the return value */ fct_arg = lcore_config[lcore_id].arg; ret = f(fct_arg); @@ -219,6 +221,8 @@ eal_thread_loop(void *arg) */ __atomic_store_n(&lcore_config[lcore_id].state, WAIT, __ATOMIC_RELEASE); + + rte_eal_trace_thread_lcore_stopped(lcore_id); } /* never reached */ diff --git a/lib/eal/common/eal_common_trace_points.c b/lib/eal/common/eal_common_trace_points.c index 3f5bf5c55c..0f1240ea3a 100644 --- a/lib/eal/common/eal_common_trace_points.c +++ b/lib/eal/common/eal_common_trace_points.c @@ -70,6 +70,27 @@ RTE_TRACE_POINT_REGISTER(rte_eal_trace_thread_remote_launch, lib.eal.thread.remote.launch) RTE_TRACE_POINT_REGISTER(rte_eal_trace_thread_lcore_ready, lib.eal.thread.lcore.ready) +RTE_TRACE_POINT_REGISTER(rte_eal_trace_thread_lcore_running, + lib.eal.thread.lcore.running) +RTE_TRACE_POINT_REGISTER(rte_eal_trace_thread_lcore_stopped, + lib.eal.thread.lcore.stopped) + +RTE_TRACE_POINT_REGISTER(rte_eal_trace_service_map_lcore, + lib.eal.service.map.lcore) +RTE_TRACE_POINT_REGISTER(rte_eal_trace_service_lcore_state_change, + lib.eal.service.lcore.state.change) +RTE_TRACE_POINT_REGISTER(rte_eal_trace_service_lcore_start, + lib.eal.service.lcore.start) +RTE_TRACE_POINT_REGISTER(rte_eal_trace_service_lcore_stop, + lib.eal.service.lcore.stop) +RTE_TRACE_POINT_REGISTER(rte_eal_trace_service_run_begin, + lib.eal.service.run.begin) +RTE_TRACE_POINT_REGISTER(rte_eal_trace_service_runstate_set, + lib.eal.service.run.state.set) +RTE_TRACE_POINT_REGISTER(rte_eal_trace_service_run_end, + lib.eal.service.run.end) +RTE_TRACE_POINT_REGISTER(rte_eal_trace_service_component_register, + lib.eal.service.component.register) RTE_TRACE_POINT_REGISTER(rte_eal_trace_intr_callback_register, lib.eal.intr.register) diff --git a/lib/eal/common/rte_service.c b/lib/eal/common/rte_service.c index 42ca1d001d..5daec007aa 100644 --- a/lib/eal/common/rte_service.c +++ b/lib/eal/common/rte_service.c @@ -9,6 +9,7 @@ #include #include +#include #include #include #include @@ -16,6 +17,7 @@ #include #include #include +#include #include "eal_private.h" @@ -276,6 +278,8 @@ rte_service_component_register(const struct rte_service_spec *spec, if (id_ptr) *id_ptr = free_slot; + rte_eal_trace_service_component_register(free_slot, spec->name); + return 0; } @@ -336,6 +340,7 @@ rte_service_runstate_set(uint32_t id, uint32_t runstate) __atomic_store_n(&s->app_runstate, RUNSTATE_STOPPED, __ATOMIC_RELEASE); + rte_eal_trace_service_runstate_set(id, runstate); return 0; } @@ -427,11 +432,15 @@ service_run(uint32_t i, struct core_state *cs, uint64_t service_mask, if (!rte_spinlock_trylock(&s->execute_lock)) return -EBUSY; + rte_eal_trace_service_run_begin(i, rte_lcore_id()); service_runner_do_callback(s, cs, i); rte_spinlock_unlock(&s->execute_lock); - } else + } else { + rte_eal_trace_service_run_begin(i, rte_lcore_id()); service_runner_do_callback(s, cs, i); + } + rte_eal_trace_service_run_end(i, rte_lcore_id()); return 0; } @@ -658,6 +667,7 @@ int32_t rte_service_map_lcore_set(uint32_t id, uint32_t lcore, uint32_t enabled) { uint32_t on = enabled > 0; + rte_eal_trace_service_map_lcore(id, lcore, enabled); return service_update(id, lcore, &on, 0); } @@ -683,6 +693,8 @@ set_lcore_state(uint32_t lcore, int32_t state) /* update per-lcore optimized state tracking */ lcore_states[lcore].is_service_core = (state == ROLE_SERVICE); + + rte_eal_trace_service_lcore_state_change(lcore, state); } int32_t @@ -780,6 +792,8 @@ rte_service_lcore_start(uint32_t lcore) */ __atomic_store_n(&cs->runstate, RUNSTATE_RUNNING, __ATOMIC_RELEASE); + rte_eal_trace_service_lcore_start(lcore); + int ret = rte_eal_remote_launch(service_runner_func, 0, lcore); /* returns -EBUSY if the core is already launched, 0 on success */ return ret; @@ -824,6 +838,8 @@ rte_service_lcore_stop(uint32_t lcore) __atomic_store_n(&lcore_states[lcore].runstate, RUNSTATE_STOPPED, __ATOMIC_RELEASE); + rte_eal_trace_service_lcore_stop(lcore); + return 0; } diff --git a/lib/eal/include/eal_trace_internal.h b/lib/eal/include/eal_trace_internal.h index 57d6de2535..9a37a08567 100644 --- a/lib/eal/include/eal_trace_internal.h +++ b/lib/eal/include/eal_trace_internal.h @@ -174,6 +174,66 @@ RTE_TRACE_POINT( rte_trace_point_emit_u32(lcore_id); rte_trace_point_emit_string(cpuset); ) +RTE_TRACE_POINT_FP( + rte_eal_trace_thread_lcore_running, + RTE_TRACE_POINT_ARGS(unsigned int lcore_id, void *f), + rte_trace_point_emit_u32(lcore_id); + rte_trace_point_emit_ptr(f); +) +RTE_TRACE_POINT_FP( + rte_eal_trace_thread_lcore_stopped, + RTE_TRACE_POINT_ARGS(unsigned int lcore_id), + rte_trace_point_emit_u32(lcore_id); +) + +/* Service */ +RTE_TRACE_POINT( + rte_eal_trace_service_map_lcore, + RTE_TRACE_POINT_ARGS(unsigned int id, unsigned int lcore_id, unsigned int enabled), + rte_trace_point_emit_u32(id); + rte_trace_point_emit_u32(lcore_id); + rte_trace_point_emit_u32(enabled); +) +RTE_TRACE_POINT( + rte_eal_trace_service_lcore_state_change, + RTE_TRACE_POINT_ARGS(unsigned int lcore_id, int lcore_state), + rte_trace_point_emit_u32(lcore_id); + rte_trace_point_emit_i32(lcore_state); +) +RTE_TRACE_POINT( + rte_eal_trace_service_lcore_start, + RTE_TRACE_POINT_ARGS(unsigned int lcore_id), + rte_trace_point_emit_u32(lcore_id); +) +RTE_TRACE_POINT( + rte_eal_trace_service_lcore_stop, + RTE_TRACE_POINT_ARGS(unsigned int lcore_id), + rte_trace_point_emit_u32(lcore_id); +) +RTE_TRACE_POINT_FP( + rte_eal_trace_service_run_begin, + RTE_TRACE_POINT_ARGS(unsigned int id, unsigned int lcore_id), + rte_trace_point_emit_u32(id); + rte_trace_point_emit_u32(lcore_id); +) +RTE_TRACE_POINT( + rte_eal_trace_service_runstate_set, + RTE_TRACE_POINT_ARGS(unsigned int id, unsigned int run_state), + rte_trace_point_emit_u32(id); + rte_trace_point_emit_u32(run_state); +) +RTE_TRACE_POINT( + rte_eal_trace_service_run_end, + RTE_TRACE_POINT_ARGS(unsigned int id, unsigned int lcore_id), + rte_trace_point_emit_u32(id); + rte_trace_point_emit_u32(lcore_id); +) +RTE_TRACE_POINT( + rte_eal_trace_service_component_register, + RTE_TRACE_POINT_ARGS(int id, const char *service_name), + rte_trace_point_emit_i32(id); + rte_trace_point_emit_string(service_name); +) #ifdef __cplusplus }