From patchwork Tue Mar 18 18:08:10 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Douglas Raillard X-Patchwork-Id: 14021392 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 79A7220B807; Tue, 18 Mar 2025 18:08:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=217.140.110.172 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1742321306; cv=none; b=M2+Kc8VYuqvR+RkqJWnhO0D0Rx5C65ktxAILfcMzyCw9YedekblS0NiLJ1iFrIPgCESwFav5Q16HSUOH59a8R0sBrSBdSn2adcb4VexvAig1KXt2PUfhePT/u6TCMUl7ZDYa9rurVIl24ksnut1mdVL8h3pS2pzNr83b09KGPRc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1742321306; c=relaxed/simple; bh=V+vhLflQe8SoONzGndBpNmZuBsHX7Q94126ykNZwbL8=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=k6OUmwDarWKGPX17nHyU8OBMo+ilBJM/CEB2Z+qdCPWyHi9OJolLocIQkd0nvTD8BSJbwAfu3EEZCx+YmvdIubehUq0xcpwi17GmU39ZqYnyyOk/RJnHj/U6Xk5tRsJb7aNQyjE6wcL6Yj6gR3YG/2oZ9wpWRPhFKRullNzsQoY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=arm.com; spf=pass smtp.mailfrom=arm.com; arc=none smtp.client-ip=217.140.110.172 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=arm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=arm.com Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 28E1F13D5; Tue, 18 Mar 2025 11:08:31 -0700 (PDT) Received: from e132430.arm.com (unknown [10.57.85.21]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id 14F6E3F694; Tue, 18 Mar 2025 11:08:20 -0700 (PDT) From: Douglas RAILLARD To: rostedt@goodmis.org Cc: douglas.raillard@arm.com, Masami Hiramatsu , Mathieu Desnoyers , linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org Subject: [PATCH 1/3] tracing: Expose functions to trace a synth event Date: Tue, 18 Mar 2025 18:08:10 +0000 Message-ID: <20250318180814.226644-1-douglas.raillard@arm.com> X-Mailer: git-send-email 2.43.0 Precedence: bulk X-Mailing-List: linux-trace-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Douglas Raillard The current API for synth event only allow tracing by getting a "struct trace_event_file *", which is associated with a specific ftrace instance that has to be looked up ahead of time. In order to be able to emit such synth event in all instances where the event has been enabled by a user, another function is required, using a "struct synth_event *" that then uses the underlying tracepoint system that the tracefs interface manipulates. Such function already exists for the histogram feature, so simply move it to the common trace_events_synth.c code. Signed-off-by: Douglas Raillard --- include/linux/trace_events.h | 7 +++++++ kernel/trace/trace_events_hist.c | 27 --------------------------- kernel/trace/trace_events_synth.c | 29 +++++++++++++++++++++++++++++ kernel/trace/trace_synth.h | 2 -- 4 files changed, 36 insertions(+), 29 deletions(-) diff --git a/include/linux/trace_events.h b/include/linux/trace_events.h index 5caea596fef0..cbe389d0e144 100644 --- a/include/linux/trace_events.h +++ b/include/linux/trace_events.h @@ -517,6 +517,13 @@ struct dynevent_cmd { extern int dynevent_create(struct dynevent_cmd *cmd); +struct synth_event; + +extern struct synth_event *find_synth_event(const char *name); + +extern void trace_synth(struct synth_event *event, u64 *var_ref_vals, + unsigned int *var_ref_idx); + extern int synth_event_delete(const char *name); extern void synth_event_cmd_init(struct dynevent_cmd *cmd, diff --git a/kernel/trace/trace_events_hist.c b/kernel/trace/trace_events_hist.c index 53dc6719181e..a2bc7a972763 100644 --- a/kernel/trace/trace_events_hist.c +++ b/kernel/trace/trace_events_hist.c @@ -814,33 +814,6 @@ static void hist_err_clear(void) last_cmd_loc[0] = '\0'; } -typedef void (*synth_probe_func_t) (void *__data, u64 *var_ref_vals, - unsigned int *var_ref_idx); - -static inline void trace_synth(struct synth_event *event, u64 *var_ref_vals, - unsigned int *var_ref_idx) -{ - struct tracepoint *tp = event->tp; - - if (unlikely(static_key_enabled(&tp->key))) { - struct tracepoint_func *probe_func_ptr; - synth_probe_func_t probe_func; - void *__data; - - if (!(cpu_online(raw_smp_processor_id()))) - return; - - probe_func_ptr = rcu_dereference_sched((tp)->funcs); - if (probe_func_ptr) { - do { - probe_func = probe_func_ptr->func; - __data = probe_func_ptr->data; - probe_func(__data, var_ref_vals, var_ref_idx); - } while ((++probe_func_ptr)->func); - } - } -} - static void action_trace(struct hist_trigger_data *hist_data, struct tracing_map_elt *elt, struct trace_buffer *buffer, void *rec, diff --git a/kernel/trace/trace_events_synth.c b/kernel/trace/trace_events_synth.c index e3f7d09e5512..9f0817eec3c2 100644 --- a/kernel/trace/trace_events_synth.c +++ b/kernel/trace/trace_events_synth.c @@ -845,6 +845,35 @@ struct synth_event *find_synth_event(const char *name) return NULL; } +EXPORT_SYMBOL_GPL(find_synth_event); + +typedef void (*synth_probe_func_t) (void *__data, u64 *var_ref_vals, + unsigned int *var_ref_idx); + +void trace_synth(struct synth_event *event, u64 *var_ref_vals, + unsigned int *var_ref_idx) +{ + struct tracepoint *tp = event->tp; + + if (unlikely(static_key_enabled(&tp->key))) { + struct tracepoint_func *probe_func_ptr; + synth_probe_func_t probe_func; + void *__data; + + if (!(cpu_online(raw_smp_processor_id()))) + return; + + probe_func_ptr = rcu_dereference_sched((tp)->funcs); + if (probe_func_ptr) { + do { + probe_func = probe_func_ptr->func; + __data = probe_func_ptr->data; + probe_func(__data, var_ref_vals, var_ref_idx); + } while ((++probe_func_ptr)->func); + } + } +} +EXPORT_SYMBOL_GPL(trace_synth); static struct trace_event_fields synth_event_fields_array[] = { { .type = TRACE_FUNCTION_TYPE, diff --git a/kernel/trace/trace_synth.h b/kernel/trace/trace_synth.h index 43f6fb6078db..425a0ec7c773 100644 --- a/kernel/trace/trace_synth.h +++ b/kernel/trace/trace_synth.h @@ -36,6 +36,4 @@ struct synth_event { struct module *mod; }; -extern struct synth_event *find_synth_event(const char *name); - #endif /* __TRACE_SYNTH_H */ From patchwork Tue Mar 18 18:08:11 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Douglas Raillard X-Patchwork-Id: 14021393 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 69642EACD; Tue, 18 Mar 2025 18:08:29 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=217.140.110.172 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1742321311; cv=none; b=GMxHRP9Kn4F5mHOgMP5/1y5FdtHOwrvUElE9zvBbygR5F8+Z8bRmg74sXwb/iqwcT3Xgx1g0hMzSyWZWzUdWHTac/XirIxTVgeUOSARl1pFZ+OD01FeY6ZheHMoOo8zK8UjUaBxLJiQrmz1nZWpdVnxmW+QPVbQ67bj2sTzvGAs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1742321311; c=relaxed/simple; bh=9SfPkEWR1QuzPEhnOt8KPm0O/gheR8nP1GV+FI2TWlI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=LxPx3qHxePsaUe0gzxS4aYtnk1AswhnG2aKlrmy00MMzD/SS9juJ/DiLUdjYWDNo00E+kSsv4poCtx+aWUetT4rtdkxx6c2bziKGvhThWNchkRbJtReGid9xF1UHPmvb/hS0pJtf5mrioQASCZwr5CBKlVNFDLD7Eo6NcCL7gmY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=arm.com; spf=pass smtp.mailfrom=arm.com; arc=none smtp.client-ip=217.140.110.172 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=arm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=arm.com Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 0DFB61516; Tue, 18 Mar 2025 11:08:37 -0700 (PDT) Received: from e132430.arm.com (unknown [10.57.85.21]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id 05C6D3F694; Tue, 18 Mar 2025 11:08:26 -0700 (PDT) From: Douglas RAILLARD To: rostedt@goodmis.org Cc: douglas.raillard@arm.com, Masami Hiramatsu , Mathieu Desnoyers , linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org Subject: [PATCH 2/3] tracing: Rename find_synth_event() into synth_event_find() Date: Tue, 18 Mar 2025 18:08:11 +0000 Message-ID: <20250318180814.226644-2-douglas.raillard@arm.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250318180814.226644-1-douglas.raillard@arm.com> References: <20250318180814.226644-1-douglas.raillard@arm.com> Precedence: bulk X-Mailing-List: linux-trace-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Douglas Raillard Rename the freshly exposed function to comply with the existing naming convention for synth event public API. Signed-off-by: Douglas Raillard --- include/linux/trace_events.h | 2 +- kernel/trace/trace_events_hist.c | 8 ++++---- kernel/trace/trace_events_synth.c | 10 +++++----- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/include/linux/trace_events.h b/include/linux/trace_events.h index cbe389d0e144..e069d84a73f0 100644 --- a/include/linux/trace_events.h +++ b/include/linux/trace_events.h @@ -519,7 +519,7 @@ extern int dynevent_create(struct dynevent_cmd *cmd); struct synth_event; -extern struct synth_event *find_synth_event(const char *name); +extern struct synth_event *synth_event_find(const char *name); extern void trace_synth(struct synth_event *event, u64 *var_ref_vals, unsigned int *var_ref_idx); diff --git a/kernel/trace/trace_events_hist.c b/kernel/trace/trace_events_hist.c index a2bc7a972763..7067f6fedb1a 100644 --- a/kernel/trace/trace_events_hist.c +++ b/kernel/trace/trace_events_hist.c @@ -3964,7 +3964,7 @@ static int trace_action_create(struct hist_trigger_data *hist_data, else synth_event_name = data->action_name; - event = find_synth_event(synth_event_name); + event = synth_event_find(synth_event_name); if (!event) { hist_err(tr, HIST_ERR_SYNTH_EVENT_NOT_FOUND, errpos(synth_event_name)); return -EINVAL; @@ -6580,7 +6580,7 @@ static void hist_unreg_all(struct trace_event_file *file) trace_event_trigger_enable_disable(file, 0); se_name = trace_event_name(file->event_call); - se = find_synth_event(se_name); + se = synth_event_find(se_name); if (se) se->ref--; @@ -6699,7 +6699,7 @@ static int event_hist_trigger_parse(struct event_command *cmd_ops, event_trigger_unregister(cmd_ops, file, glob+1, trigger_data); se_name = trace_event_name(file->event_call); - se = find_synth_event(se_name); + se = synth_event_find(se_name); if (se) se->ref--; ret = 0; @@ -6735,7 +6735,7 @@ static int event_hist_trigger_parse(struct event_command *cmd_ops, goto out_unreg; se_name = trace_event_name(file->event_call); - se = find_synth_event(se_name); + se = synth_event_find(se_name); if (se) se->ref++; out: diff --git a/kernel/trace/trace_events_synth.c b/kernel/trace/trace_events_synth.c index 9f0817eec3c2..4a9a44d37ffc 100644 --- a/kernel/trace/trace_events_synth.c +++ b/kernel/trace/trace_events_synth.c @@ -830,7 +830,7 @@ static struct tracepoint *alloc_synth_tracepoint(char *name) return tp; } -struct synth_event *find_synth_event(const char *name) +struct synth_event *synth_event_find(const char *name) { struct dyn_event *pos; struct synth_event *event; @@ -845,7 +845,7 @@ struct synth_event *find_synth_event(const char *name) return NULL; } -EXPORT_SYMBOL_GPL(find_synth_event); +EXPORT_SYMBOL_GPL(synth_event_find); typedef void (*synth_probe_func_t) (void *__data, u64 *var_ref_vals, unsigned int *var_ref_idx); @@ -1317,7 +1317,7 @@ static int __create_synth_event(const char *name, const char *raw_fields) mutex_lock(&event_mutex); - event = find_synth_event(name); + event = synth_event_find(name); if (event) { synth_err(SYNTH_ERR_EVENT_EXISTS, errpos(name)); ret = -EEXIST; @@ -1513,7 +1513,7 @@ int synth_event_delete(const char *event_name) int ret = -ENOENT; mutex_lock(&event_mutex); - se = find_synth_event(event_name); + se = synth_event_find(event_name); if (se) { mod = se->mod; ret = destroy_synth_event(se); @@ -1622,7 +1622,7 @@ static int synth_event_run_command(struct dynevent_cmd *cmd) if (ret) return ret; - se = find_synth_event(cmd->event_name); + se = synth_event_find(cmd->event_name); if (WARN_ON(!se)) return -ENOENT; From patchwork Tue Mar 18 18:08:12 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Douglas Raillard X-Patchwork-Id: 14021394 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 5EB5CEACD; Tue, 18 Mar 2025 18:08:33 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=217.140.110.172 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1742321314; cv=none; b=KPqb6pyrQ5qTM69IijIihYPFxt8E6xrP9yb76DltdAHMnW8LSh+moRNGiQNrZStCXKNKjVTym/KYzt9VvP/HAvva4tPI+jnbhwpMvopFzXQ5fjGAl0RNQOPZOibqMZ3+ihJZaFjnHVbFiI1D8SB/zfMzyTCjsNKW9piF0TuEVjI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1742321314; c=relaxed/simple; bh=l4jSwPvmdVV590gyMwUYY4yYKxyZXT6p5HLrbNkZW70=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=fa3hd4aIq41x/W+yHNZmwniyq7F22fbAWXUlvLYQSqwd/ETDJ+2rsXz4Cr+HtmpuhqLg5fcVBfE7ynuntJY0W36Dye3ss6TbuUR/DoYnCpDpbpgBWtR923SXstWyZILFG6w3crWPzvBuWwWn2agns+i/Y4Bhdx5rARfsmnUVM5k= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=arm.com; spf=pass smtp.mailfrom=arm.com; arc=none smtp.client-ip=217.140.110.172 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=arm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=arm.com Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 2F33313D5; Tue, 18 Mar 2025 11:08:41 -0700 (PDT) Received: from e132430.arm.com (unknown [10.57.85.21]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id 1D17E3F694; Tue, 18 Mar 2025 11:08:30 -0700 (PDT) From: Douglas RAILLARD To: rostedt@goodmis.org Cc: douglas.raillard@arm.com, Masami Hiramatsu , Mathieu Desnoyers , linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org Subject: [PATCH 3/3] tracing: Rename trace_synth() to synth_event_trace2() Date: Tue, 18 Mar 2025 18:08:12 +0000 Message-ID: <20250318180814.226644-3-douglas.raillard@arm.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250318180814.226644-1-douglas.raillard@arm.com> References: <20250318180814.226644-1-douglas.raillard@arm.com> Precedence: bulk X-Mailing-List: linux-trace-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 From: Douglas Raillard Rename the frehsly exposed trace_synth() to synth_event_trace2() to comply with the existing naming convention. Since synth_event_trace() already exists (and operates on a "struct trace_event_file *"), use a new name for it. Signed-off-by: Douglas Raillard --- include/linux/trace_events.h | 2 +- kernel/trace/trace_events_hist.c | 2 +- kernel/trace/trace_events_synth.c | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/include/linux/trace_events.h b/include/linux/trace_events.h index e069d84a73f0..753ce8aecfe4 100644 --- a/include/linux/trace_events.h +++ b/include/linux/trace_events.h @@ -521,7 +521,7 @@ struct synth_event; extern struct synth_event *synth_event_find(const char *name); -extern void trace_synth(struct synth_event *event, u64 *var_ref_vals, +extern void synth_event_trace2(struct synth_event *event, u64 *var_ref_vals, unsigned int *var_ref_idx); extern int synth_event_delete(const char *name); diff --git a/kernel/trace/trace_events_hist.c b/kernel/trace/trace_events_hist.c index 7067f6fedb1a..ee0fee123c91 100644 --- a/kernel/trace/trace_events_hist.c +++ b/kernel/trace/trace_events_hist.c @@ -822,7 +822,7 @@ static void action_trace(struct hist_trigger_data *hist_data, { struct synth_event *event = data->synth_event; - trace_synth(event, var_ref_vals, data->var_ref_idx); + synth_event_trace2(event, var_ref_vals, data->var_ref_idx); } struct hist_var_data { diff --git a/kernel/trace/trace_events_synth.c b/kernel/trace/trace_events_synth.c index 4a9a44d37ffc..8837aa258479 100644 --- a/kernel/trace/trace_events_synth.c +++ b/kernel/trace/trace_events_synth.c @@ -850,7 +850,7 @@ EXPORT_SYMBOL_GPL(synth_event_find); typedef void (*synth_probe_func_t) (void *__data, u64 *var_ref_vals, unsigned int *var_ref_idx); -void trace_synth(struct synth_event *event, u64 *var_ref_vals, +void synth_event_trace2(struct synth_event *event, u64 *var_ref_vals, unsigned int *var_ref_idx) { struct tracepoint *tp = event->tp; @@ -873,7 +873,7 @@ void trace_synth(struct synth_event *event, u64 *var_ref_vals, } } } -EXPORT_SYMBOL_GPL(trace_synth); +EXPORT_SYMBOL_GPL(synth_event_trace2); static struct trace_event_fields synth_event_fields_array[] = { { .type = TRACE_FUNCTION_TYPE,