From nobody Mon Sep 15 00:01:42 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 63D55C3DA78 for ; Tue, 17 Jan 2023 15:24:15 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232509AbjAQPXh (ORCPT ); Tue, 17 Jan 2023 10:23:37 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57582 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231205AbjAQPWl (ORCPT ); Tue, 17 Jan 2023 10:22:41 -0500 Received: from sin.source.kernel.org (sin.source.kernel.org [IPv6:2604:1380:40e1:4800::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A2B48303FB; Tue, 17 Jan 2023 07:22:40 -0800 (PST) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by sin.source.kernel.org (Postfix) with ESMTPS id C6F08CE157F; Tue, 17 Jan 2023 15:22:38 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id C18CAC433F0; Tue, 17 Jan 2023 15:22:36 +0000 (UTC) Received: from rostedt by gandalf.local.home with local (Exim 4.96) (envelope-from ) id 1pHnnH-001vhh-2h; Tue, 17 Jan 2023 10:22:35 -0500 Message-ID: <20230117152235.698632147@goodmis.org> User-Agent: quilt/0.66 Date: Tue, 17 Jan 2023 10:21:26 -0500 From: Steven Rostedt To: linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org Cc: Masami Hiramatsu , Andrew Morton , Tom Zanussi , Ross Zwisler , Ching-lin Yu Subject: [PATCH 1/6 v2] tracing: Simplify calculating entry size using struct_size() References: <20230117152125.268986282@goodmis.org> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: "Steven Rostedt (Google)" When tracing a dynamic string field for a synthetic event, the offset calculation for where to write the next event can use struct_size() to find what the current size of the structure is. This simplifies the code and makes it less error prone. Signed-off-by: Steven Rostedt (Google) --- kernel/trace/trace_events_synth.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/kernel/trace/trace_events_synth.c b/kernel/trace/trace_events_= synth.c index 67592eed0be8..9f79cd689b79 100644 --- a/kernel/trace/trace_events_synth.c +++ b/kernel/trace/trace_events_synth.c @@ -416,8 +416,7 @@ static unsigned int trace_string(struct synth_trace_eve= nt *entry, if (is_dynamic) { u32 data_offset; =20 - data_offset =3D offsetof(typeof(*entry), fields); - data_offset +=3D event->n_u64 * sizeof(u64); + data_offset =3D struct_size(entry, fields, event->n_u64); data_offset +=3D data_size; =20 len =3D kern_fetch_store_strlen((unsigned long)str_val); --=20 2.39.0 From nobody Mon Sep 15 00:01:42 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 2A864C677F1 for ; Tue, 17 Jan 2023 15:22:51 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231701AbjAQPWs (ORCPT ); Tue, 17 Jan 2023 10:22:48 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57500 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229880AbjAQPWj (ORCPT ); Tue, 17 Jan 2023 10:22:39 -0500 Received: from dfw.source.kernel.org (dfw.source.kernel.org [139.178.84.217]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id EF60C212B; Tue, 17 Jan 2023 07:22:37 -0800 (PST) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id 7740F61478; Tue, 17 Jan 2023 15:22:37 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id D6B9CC433D2; Tue, 17 Jan 2023 15:22:36 +0000 (UTC) Received: from rostedt by gandalf.local.home with local (Exim 4.96) (envelope-from ) id 1pHnnH-001viB-3C; Tue, 17 Jan 2023 10:22:35 -0500 Message-ID: <20230117152235.856323729@goodmis.org> User-Agent: quilt/0.66 Date: Tue, 17 Jan 2023 10:21:27 -0500 From: Steven Rostedt To: linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org Cc: Masami Hiramatsu , Andrew Morton , Tom Zanussi , Ross Zwisler , Ching-lin Yu Subject: [PATCH 2/6 v2] tracing: Allow stacktraces to be saved as histogram variables References: <20230117152125.268986282@goodmis.org> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: "Steven Rostedt (Google)" Allow to save stacktraces into a histogram variable. This will be used by synthetic events to allow a stacktrace from one event to be passed and displayed by another event. The special keyword "stacktrace" is to be used to trigger a stack trace for the event that the histogram trigger is attached to. echo 'hist:keys=3Dpid:st=3Dstacktrace" > events/sched/sched_waking/trigger Currently nothing can get access to the "$st" variable above that contains the stack trace, but that will soon change. Signed-off-by: Steven Rostedt (Google) --- kernel/trace/trace_events_hist.c | 52 ++++++++++++++++++++++++++------ 1 file changed, 42 insertions(+), 10 deletions(-) diff --git a/kernel/trace/trace_events_hist.c b/kernel/trace/trace_events_h= ist.c index fcaf226b7744..bd67e7c3f258 100644 --- a/kernel/trace/trace_events_hist.c +++ b/kernel/trace/trace_events_hist.c @@ -1360,6 +1360,8 @@ static const char *hist_field_name(struct hist_field = *field, field_name =3D field->name; } else if (field->flags & HIST_FIELD_FL_TIMESTAMP) field_name =3D "common_timestamp"; + else if (field->flags & HIST_FIELD_FL_STACKTRACE) + field_name =3D "stacktrace"; else if (field->flags & HIST_FIELD_FL_HITCOUNT) field_name =3D "hitcount"; =20 @@ -1980,6 +1982,10 @@ static struct hist_field *create_hist_field(struct h= ist_trigger_data *hist_data, =20 if (flags & HIST_FIELD_FL_STACKTRACE) { hist_field->fn_num =3D HIST_FIELD_FN_NOP; + hist_field->size =3D HIST_STACKTRACE_SIZE; + hist_field->type =3D kstrdup_const("unsigned long[]", GFP_KERNEL); + if (!hist_field->type) + goto free; goto out; } =20 @@ -2349,6 +2355,8 @@ parse_field(struct hist_trigger_data *hist_data, stru= ct trace_event_file *file, hist_data->enable_timestamps =3D true; if (*flags & HIST_FIELD_FL_TIMESTAMP_USECS) hist_data->attrs->ts_in_usecs =3D true; + } else if (strcmp(field_name, "stacktrace") =3D=3D 0) { + *flags |=3D HIST_FIELD_FL_STACKTRACE; } else if (strcmp(field_name, "common_cpu") =3D=3D 0) *flags |=3D HIST_FIELD_FL_CPU; else if (strcmp(field_name, "hitcount") =3D=3D 0) @@ -3117,13 +3125,24 @@ static inline void __update_field_vars(struct traci= ng_map_elt *elt, var_val =3D hist_fn_call(val, elt, buffer, rbe, rec); var_idx =3D var->var.idx; =20 - if (val->flags & HIST_FIELD_FL_STRING) { + if (val->flags & (HIST_FIELD_FL_STRING | + HIST_FIELD_FL_STACKTRACE)) { char *str =3D elt_data->field_var_str[j++]; char *val_str =3D (char *)(uintptr_t)var_val; unsigned int size; =20 - size =3D min(val->size, STR_VAR_LEN_MAX); - strscpy(str, val_str, size); + if (val->flags & HIST_FIELD_FL_STRING) { + size =3D min(val->size, STR_VAR_LEN_MAX); + strscpy(str, val_str, size); + } else { + int e; + + e =3D stack_trace_save((void *)str, + HIST_STACKTRACE_DEPTH, + HIST_STACKTRACE_SKIP); + if (e < HIST_STACKTRACE_DEPTH - 1) + ((unsigned long *)str)[e] =3D 0; + } var_val =3D (u64)(uintptr_t)str; } tracing_map_set_var(elt, var_idx, var_val); @@ -3822,7 +3841,8 @@ static void save_field_var(struct hist_trigger_data *= hist_data, { hist_data->field_vars[hist_data->n_field_vars++] =3D field_var; =20 - if (field_var->val->flags & HIST_FIELD_FL_STRING) + /* Stack traces are saved in the string storage too */ + if (field_var->val->flags & (HIST_FIELD_FL_STRING | HIST_FIELD_FL_STACKTR= ACE)) hist_data->n_field_var_str++; } =20 @@ -4101,7 +4121,8 @@ static int action_create(struct hist_trigger_data *hi= st_data, } =20 hist_data->save_vars[hist_data->n_save_vars++] =3D field_var; - if (field_var->val->flags & HIST_FIELD_FL_STRING) + if (field_var->val->flags & + (HIST_FIELD_FL_STRING | HIST_FIELD_FL_STACKTRACE)) hist_data->n_save_var_str++; kfree(param); } @@ -4349,7 +4370,8 @@ static int create_var_field(struct hist_trigger_data = *hist_data, if (!ret && hist_data->fields[val_idx]->flags & HIST_FIELD_FL_EXECNAME) update_var_execname(hist_data->fields[val_idx]); =20 - if (!ret && hist_data->fields[val_idx]->flags & HIST_FIELD_FL_STRING) + if (!ret && hist_data->fields[val_idx]->flags & + (HIST_FIELD_FL_STRING | HIST_FIELD_FL_STACKTRACE)) hist_data->fields[val_idx]->var_str_idx =3D hist_data->n_var_str++; =20 return ret; @@ -5090,7 +5112,8 @@ static void hist_trigger_elt_update(struct hist_trigg= er_data *hist_data, if (hist_field->flags & HIST_FIELD_FL_VAR) { var_idx =3D hist_field->var.idx; =20 - if (hist_field->flags & HIST_FIELD_FL_STRING) { + if (hist_field->flags & + (HIST_FIELD_FL_STRING | HIST_FIELD_FL_STACKTRACE)) { unsigned int str_start, var_str_idx, idx; char *str, *val_str; unsigned int size; @@ -5103,9 +5126,18 @@ static void hist_trigger_elt_update(struct hist_trig= ger_data *hist_data, str =3D elt_data->field_var_str[idx]; val_str =3D (char *)(uintptr_t)hist_val; =20 - size =3D min(hist_field->size, STR_VAR_LEN_MAX); - strscpy(str, val_str, size); - + if (hist_field->flags & HIST_FIELD_FL_STRING) { + size =3D min(hist_field->size, STR_VAR_LEN_MAX); + strscpy(str, val_str, size); + } else { + int e; + + e =3D stack_trace_save((void *)str, + HIST_STACKTRACE_DEPTH, + HIST_STACKTRACE_SKIP); + if (e < HIST_STACKTRACE_DEPTH - 1) + ((unsigned long *)str)[e] =3D 0; + } hist_val =3D (u64)(uintptr_t)str; } tracing_map_set_var(elt, var_idx, hist_val); --=20 2.39.0 From nobody Mon Sep 15 00:01:42 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id BA62AC3DA78 for ; Tue, 17 Jan 2023 15:22:55 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229477AbjAQPWw (ORCPT ); Tue, 17 Jan 2023 10:22:52 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57516 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230079AbjAQPWj (ORCPT ); Tue, 17 Jan 2023 10:22:39 -0500 Received: from dfw.source.kernel.org (dfw.source.kernel.org [139.178.84.217]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 379F02DE6D; Tue, 17 Jan 2023 07:22:38 -0800 (PST) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id C93CA61485; Tue, 17 Jan 2023 15:22:37 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 2DFC5C4339B; Tue, 17 Jan 2023 15:22:37 +0000 (UTC) Received: from rostedt by gandalf.local.home with local (Exim 4.96) (envelope-from ) id 1pHnnI-001vif-0T; Tue, 17 Jan 2023 10:22:36 -0500 Message-ID: <20230117152236.010941267@goodmis.org> User-Agent: quilt/0.66 Date: Tue, 17 Jan 2023 10:21:28 -0500 From: Steven Rostedt To: linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org Cc: Masami Hiramatsu , Andrew Morton , Tom Zanussi , Ross Zwisler , Ching-lin Yu Subject: [PATCH 3/6 v2] tracing: Allow synthetic events to pass around stacktraces References: <20230117152125.268986282@goodmis.org> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: "Steven Rostedt (Google)" Allow a stacktrace from one event to be displayed by the end event of a synthetic event. This is very useful when looking for the longest latency of a sleep or something blocked on I/O. # cd /sys/kernel/tracing/ # echo 's:block_lat pid_t pid; u64 delta; unsigned long[] stack;' > dynami= c_events # echo 'hist:keys=3Dnext_pid:ts=3Dcommon_timestamp.usecs,st=3Dstacktrace = if prev_state =3D=3D 1||prev_state =3D=3D 2' > events/sched/sched_switch/tr= igger # echo 'hist:keys=3Dprev_pid:delta=3Dcommon_timestamp.usecs-$ts,s=3D$st:on= max($delta).trace(block_lat,prev_pid,$delta,$s)' >> events/sched/sched_swit= ch/trigger The above creates a "block_lat" synthetic event that take the stacktrace of when a task schedules out in either the interruptible or uninterruptible states, and on a new per process max $delta (the time it was scheduled out), will print the process id and the stacktrace. # echo 1 > events/synthetic/block_lat/enable # cat trace # TASK-PID CPU# ||||| TIMESTAMP FUNCTION # | | | ||||| | | kworker/u16:0-767 [006] d..4. 560.645045: block_lat: pid=3D767 de= lta=3D66 stack=3DSTACK: =3D> __schedule =3D> schedule =3D> pipe_read =3D> vfs_read =3D> ksys_read =3D> do_syscall_64 =3D> 0x966000aa -0 [003] d..4. 561.132117: block_lat: pid=3D0 delt= a=3D413787 stack=3DSTACK: =3D> __schedule =3D> schedule =3D> schedule_hrtimeout_range_clock =3D> do_sys_poll =3D> __x64_sys_poll =3D> do_syscall_64 =3D> 0x966000aa <...>-153 [006] d..4. 562.068407: block_lat: pid=3D153 de= lta=3D54 stack=3DSTACK: =3D> __schedule =3D> schedule =3D> io_schedule =3D> rq_qos_wait =3D> wbt_wait =3D> __rq_qos_throttle =3D> blk_mq_submit_bio =3D> submit_bio_noacct_nocheck =3D> ext4_bio_write_page =3D> mpage_submit_page =3D> mpage_process_page_bufs =3D> mpage_prepare_extent_to_map =3D> ext4_do_writepages =3D> ext4_writepages =3D> do_writepages =3D> __writeback_single_inode Signed-off-by: Steven Rostedt (Google) --- kernel/trace/trace.h | 4 ++ kernel/trace/trace_events_hist.c | 7 ++- kernel/trace/trace_events_synth.c | 80 ++++++++++++++++++++++++++++++- kernel/trace/trace_synth.h | 1 + 4 files changed, 87 insertions(+), 5 deletions(-) diff --git a/kernel/trace/trace.h b/kernel/trace/trace.h index a56b0b7d23ef..28294f6e15b9 100644 --- a/kernel/trace/trace.h +++ b/kernel/trace/trace.h @@ -113,6 +113,10 @@ enum trace_type { #define MEM_FAIL(condition, fmt, ...) \ DO_ONCE_LITE_IF(condition, pr_err, "ERROR: " fmt, ##__VA_ARGS__) =20 +#define HIST_STACKTRACE_DEPTH 16 +#define HIST_STACKTRACE_SIZE (HIST_STACKTRACE_DEPTH * sizeof(unsigned long= )) +#define HIST_STACKTRACE_SKIP 5 + /* * syscalls are special, and need special handling, this is why * they are not included in trace_entries.h diff --git a/kernel/trace/trace_events_hist.c b/kernel/trace/trace_events_h= ist.c index bd67e7c3f258..599c056b6048 100644 --- a/kernel/trace/trace_events_hist.c +++ b/kernel/trace/trace_events_hist.c @@ -480,10 +480,6 @@ DEFINE_HIST_FIELD_FN(u8); #define for_each_hist_key_field(i, hist_data) \ for ((i) =3D (hist_data)->n_vals; (i) < (hist_data)->n_fields; (i)++) =20 -#define HIST_STACKTRACE_DEPTH 16 -#define HIST_STACKTRACE_SIZE (HIST_STACKTRACE_DEPTH * sizeof(unsigned long= )) -#define HIST_STACKTRACE_SKIP 5 - #define HITCOUNT_IDX 0 #define HIST_KEY_SIZE_MAX (MAX_FILTER_STR_VAL + HIST_STACKTRACE_SIZE) =20 @@ -3867,6 +3863,9 @@ static int check_synth_field(struct synth_event *even= t, && field->is_dynamic) return 0; =20 + if (strstr(hist_field->type, "long[") && field->is_stack) + return 0; + if (strcmp(field->type, hist_field->type) !=3D 0) { if (field->size !=3D hist_field->size || (!field->is_string && field->is_signed !=3D hist_field->is_signed)) diff --git a/kernel/trace/trace_events_synth.c b/kernel/trace/trace_events_= synth.c index 9f79cd689b79..1cfba626ea1e 100644 --- a/kernel/trace/trace_events_synth.c +++ b/kernel/trace/trace_events_synth.c @@ -173,6 +173,14 @@ static int synth_field_is_string(char *type) return false; } =20 +static int synth_field_is_stack(char *type) +{ + if (strstr(type, "long[") !=3D NULL) + return true; + + return false; +} + static int synth_field_string_size(char *type) { char buf[4], *end, *start; @@ -248,6 +256,8 @@ static int synth_field_size(char *type) size =3D sizeof(gfp_t); else if (synth_field_is_string(type)) size =3D synth_field_string_size(type); + else if (synth_field_is_stack(type)) + size =3D 0; =20 return size; } @@ -292,6 +302,8 @@ static const char *synth_field_fmt(char *type) fmt =3D "%x"; else if (synth_field_is_string(type)) fmt =3D "%.*s"; + else if (synth_field_is_stack(type)) + fmt =3D "%s"; =20 return fmt; } @@ -371,6 +383,23 @@ static enum print_line_t print_synth_event(struct trac= e_iterator *iter, i =3D=3D se->n_fields - 1 ? "" : " "); n_u64 +=3D STR_VAR_LEN_MAX / sizeof(u64); } + } else if (se->fields[i]->is_stack) { + u32 offset, data_offset, len; + unsigned long *p, *end; + + offset =3D (u32)entry->fields[n_u64]; + data_offset =3D offset & 0xffff; + len =3D offset >> 16; + + p =3D (void *)entry + data_offset; + end =3D (void *)p + len - (sizeof(long) - 1); + + trace_seq_printf(s, "%s=3DSTACK:\n", se->fields[i]->name); + + for (; *p && p < end; p++) + trace_seq_printf(s, "=3D> %pS\n", (void *)*p); + n_u64++; + } else { struct trace_print_flags __flags[] =3D { __def_gfpflag_names, {-1, NULL} }; @@ -446,6 +475,43 @@ static unsigned int trace_string(struct synth_trace_ev= ent *entry, return len; } =20 +static unsigned int trace_stack(struct synth_trace_event *entry, + struct synth_event *event, + long *stack, + unsigned int data_size, + unsigned int *n_u64) +{ + unsigned int len; + u32 data_offset; + void *data_loc; + + data_offset =3D struct_size(entry, fields, event->n_u64); + data_offset +=3D data_size; + + for (len =3D 0; len < HIST_STACKTRACE_DEPTH; len++) { + if (!stack[len]) + break; + } + + /* Include the zero'd element if it fits */ + if (len < HIST_STACKTRACE_DEPTH) + len++; + + len *=3D sizeof(long); + + /* Find the dynamic section to copy the stack into. */ + data_loc =3D (void *)entry + data_offset; + memcpy(data_loc, stack, len); + + /* Fill in the field that holds the offset/len combo */ + data_offset |=3D len << 16; + *(u32 *)&entry->fields[*n_u64] =3D data_offset; + + (*n_u64)++; + + return len; +} + static notrace void trace_event_raw_event_synth(void *__data, u64 *var_ref_vals, unsigned int *var_ref_idx) @@ -498,6 +564,12 @@ static notrace void trace_event_raw_event_synth(void *= __data, event->fields[i]->is_dynamic, data_size, &n_u64); data_size +=3D len; /* only dynamic string increments */ + } if (event->fields[i]->is_stack) { + long *stack =3D (long *)var_ref_vals[val_idx]; + + len =3D trace_stack(entry, event, stack, + data_size, &n_u64); + data_size +=3D len; } else { struct synth_field *field =3D event->fields[i]; u64 val =3D var_ref_vals[val_idx]; @@ -560,6 +632,9 @@ static int __set_synth_event_print_fmt(struct synth_eve= nt *event, event->fields[i]->is_dynamic) pos +=3D snprintf(buf + pos, LEN_OR_ZERO, ", __get_str(%s)", event->fields[i]->name); + else if (event->fields[i]->is_stack) + pos +=3D snprintf(buf + pos, LEN_OR_ZERO, + ", __get_stacktrace(%s)", event->fields[i]->name); else pos +=3D snprintf(buf + pos, LEN_OR_ZERO, ", REC->%s", event->fields[i]->name); @@ -696,7 +771,8 @@ static struct synth_field *parse_synth_field(int argc, = char **argv, ret =3D -EINVAL; goto free; } else if (size =3D=3D 0) { - if (synth_field_is_string(field->type)) { + if (synth_field_is_string(field->type) || + synth_field_is_stack(field->type)) { char *type; =20 len =3D sizeof("__data_loc ") + strlen(field->type) + 1; @@ -727,6 +803,8 @@ static struct synth_field *parse_synth_field(int argc, = char **argv, =20 if (synth_field_is_string(field->type)) field->is_string =3D true; + else if (synth_field_is_stack(field->type)) + field->is_stack =3D true; =20 field->is_signed =3D synth_field_signed(field->type); out: diff --git a/kernel/trace/trace_synth.h b/kernel/trace/trace_synth.h index b29595fe3ac5..43f6fb6078db 100644 --- a/kernel/trace/trace_synth.h +++ b/kernel/trace/trace_synth.h @@ -18,6 +18,7 @@ struct synth_field { bool is_signed; bool is_string; bool is_dynamic; + bool is_stack; }; =20 struct synth_event { --=20 2.39.0 From nobody Mon Sep 15 00:01:42 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 0AE46C63797 for ; Tue, 17 Jan 2023 15:23:05 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230091AbjAQPW7 (ORCPT ); Tue, 17 Jan 2023 10:22:59 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57514 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230134AbjAQPWj (ORCPT ); Tue, 17 Jan 2023 10:22:39 -0500 Received: from dfw.source.kernel.org (dfw.source.kernel.org [139.178.84.217]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 51A9B3C39; Tue, 17 Jan 2023 07:22:38 -0800 (PST) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id C606D61484; Tue, 17 Jan 2023 15:22:37 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 363BBC4339E; Tue, 17 Jan 2023 15:22:37 +0000 (UTC) Received: from rostedt by gandalf.local.home with local (Exim 4.96) (envelope-from ) id 1pHnnI-001vj9-0y; Tue, 17 Jan 2023 10:22:36 -0500 Message-ID: <20230117152236.167046397@goodmis.org> User-Agent: quilt/0.66 Date: Tue, 17 Jan 2023 10:21:29 -0500 From: Steven Rostedt To: linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org Cc: Masami Hiramatsu , Andrew Morton , Tom Zanussi , Ross Zwisler , Ching-lin Yu Subject: [PATCH 4/6 v2] tracing/histogram: Add stacktrace type References: <20230117152125.268986282@goodmis.org> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: "Steven Rostedt (Google)" Now that stacktraces can be part of synthetic events, allow a key to be typed as a stacktrace. # cd /sys/kernel/tracing # echo 's:block_lat u64 delta; unsigned long stack[];' >> dynamic_events # echo 'hist:keys=3Dnext_pid:ts=3Dcommon_timestamp.usecs,st=3Dstacktrace = if prev_state =3D=3D 2' >> events/sched/sched_switch/trigger # echo 'hist:keys=3Dprev_pid:delta=3Dcommon_timestamp.usecs-$ts,st2=3D$st= :onmatch(sched.sched_switch).trace(block_lat,$delta,$st2)' >> events/sched/= sched_switch/trigger # echo 'hist:keys=3Ddelta.buckets=3D100,stack.stacktrace:sort=3Ddelta' > = events/synthetic/block_lat/trigger # cat events/synthetic/block_lat/hist # event histogram # # trigger info: hist:keys=3Ddelta.buckets=3D100,stacktrace:vals=3Dhitcoun= t:sort=3Ddelta.buckets=3D100:size=3D2048 [active] # { delta: ~ 0-99, stacktrace: event_hist_trigger+0x464/0x480 event_triggers_call+0x52/0xe0 trace_event_buffer_commit+0x193/0x250 trace_event_raw_event_sched_switch+0xfc/0x150 __traceiter_sched_switch+0x41/0x60 __schedule+0x448/0x7b0 schedule_idle+0x26/0x40 cpu_startup_entry+0x19/0x20 start_secondary+0xed/0xf0 secondary_startup_64_no_verify+0xe0/0xeb } hitcount: 6 { delta: ~ 0-99, stacktrace: event_hist_trigger+0x464/0x480 event_triggers_call+0x52/0xe0 trace_event_buffer_commit+0x193/0x250 trace_event_raw_event_sched_switch+0xfc/0x150 __traceiter_sched_switch+0x41/0x60 __schedule+0x448/0x7b0 schedule_idle+0x26/0x40 cpu_startup_entry+0x19/0x20 __pfx_kernel_init+0x0/0x10 arch_call_rest_init+0xa/0x24 start_kernel+0x964/0x98d secondary_startup_64_no_verify+0xe0/0xeb } hitcount: 3 { delta: ~ 0-99, stacktrace: event_hist_trigger+0x464/0x480 event_triggers_call+0x52/0xe0 trace_event_buffer_commit+0x193/0x250 trace_event_raw_event_sched_switch+0xfc/0x150 __traceiter_sched_switch+0x41/0x60 __schedule+0x448/0x7b0 schedule+0x5a/0xb0 worker_thread+0xaf/0x380 kthread+0xe9/0x110 ret_from_fork+0x2c/0x50 } hitcount: 1 { delta: ~ 100-199, stacktrace: event_hist_trigger+0x464/0x480 event_triggers_call+0x52/0xe0 trace_event_buffer_commit+0x193/0x250 trace_event_raw_event_sched_switch+0xfc/0x150 __traceiter_sched_switch+0x41/0x60 __schedule+0x448/0x7b0 schedule_idle+0x26/0x40 cpu_startup_entry+0x19/0x20 start_secondary+0xed/0xf0 secondary_startup_64_no_verify+0xe0/0xeb } hitcount: 15 [..] { delta: ~ 8500-8599, stacktrace: event_hist_trigger+0x464/0x480 event_triggers_call+0x52/0xe0 trace_event_buffer_commit+0x193/0x250 trace_event_raw_event_sched_switch+0xfc/0x150 __traceiter_sched_switch+0x41/0x60 __schedule+0x448/0x7b0 schedule_idle+0x26/0x40 cpu_startup_entry+0x19/0x20 start_secondary+0xed/0xf0 secondary_startup_64_no_verify+0xe0/0xeb } hitcount: 1 Totals: Hits: 89 Entries: 11 Dropped: 0 Signed-off-by: Steven Rostedt (Google) --- kernel/trace/trace_events_hist.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/kernel/trace/trace_events_hist.c b/kernel/trace/trace_events_h= ist.c index 599c056b6048..888b7a394ce5 100644 --- a/kernel/trace/trace_events_hist.c +++ b/kernel/trace/trace_events_hist.c @@ -1716,6 +1716,8 @@ static const char *get_hist_field_flags(struct hist_f= ield *hist_field) flags_str =3D "percent"; else if (hist_field->flags & HIST_FIELD_FL_GRAPH) flags_str =3D "graph"; + else if (hist_field->flags & HIST_FIELD_FL_STACKTRACE) + flags_str =3D "stacktrace"; =20 return flags_str; } @@ -2312,6 +2314,8 @@ parse_field(struct hist_trigger_data *hist_data, stru= ct trace_event_file *file, *flags |=3D HIST_FIELD_FL_EXECNAME; else if (strcmp(modifier, "syscall") =3D=3D 0) *flags |=3D HIST_FIELD_FL_SYSCALL; + else if (strcmp(modifier, "stacktrace") =3D=3D 0) + *flags |=3D HIST_FIELD_FL_STACKTRACE; else if (strcmp(modifier, "log2") =3D=3D 0) *flags |=3D HIST_FIELD_FL_LOG2; else if (strcmp(modifier, "usecs") =3D=3D 0) --=20 2.39.0 From nobody Mon Sep 15 00:01:42 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 7F673C63797 for ; Tue, 17 Jan 2023 15:23:32 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231821AbjAQPXV (ORCPT ); Tue, 17 Jan 2023 10:23:21 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57514 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231159AbjAQPWl (ORCPT ); Tue, 17 Jan 2023 10:22:41 -0500 Received: from ams.source.kernel.org (ams.source.kernel.org [145.40.68.75]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 29143212B; Tue, 17 Jan 2023 07:22:40 -0800 (PST) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ams.source.kernel.org (Postfix) with ESMTPS id CD9DAB8165B; Tue, 17 Jan 2023 15:22:38 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 6A6C8C433A8; Tue, 17 Jan 2023 15:22:37 +0000 (UTC) Received: from rostedt by gandalf.local.home with local (Exim 4.96) (envelope-from ) id 1pHnnI-001vjd-1T; Tue, 17 Jan 2023 10:22:36 -0500 Message-ID: <20230117152236.320181354@goodmis.org> User-Agent: quilt/0.66 Date: Tue, 17 Jan 2023 10:21:30 -0500 From: Steven Rostedt To: linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org Cc: Masami Hiramatsu , Andrew Morton , Tom Zanussi , Ross Zwisler , Ching-lin Yu Subject: [PATCH 5/6 v2] tracing/histogram: Document variable stacktrace References: <20230117152125.268986282@goodmis.org> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: "Steven Rostedt (Google)" Add a little documentation (and a useful example) of how a stacktrace can be used within a histogram variable and synthetic event. Signed-off-by: Steven Rostedt (Google) --- Documentation/trace/histogram.rst | 129 ++++++++++++++++++++++++++++++ 1 file changed, 129 insertions(+) diff --git a/Documentation/trace/histogram.rst b/Documentation/trace/histog= ram.rst index f95459aa984f..5c391328b9bb 100644 --- a/Documentation/trace/histogram.rst +++ b/Documentation/trace/histogram.rst @@ -81,6 +81,7 @@ Documentation written by Tom Zanussi .usecs display a common_timestamp in microseconds .percent display a number of percentage value .graph display a bar-graph of a value + .stacktrace display as a stacktrace (must by a long[] type) =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D =20 Note that in general the semantics of a given field aren't @@ -1786,6 +1787,8 @@ or assigned to a variable and referenced in a subsequ= ent expression:: # echo 'hist:keys=3Dnext_pid:us_per_sec=3D1000000 ...' >> event/trigger # echo 'hist:keys=3Dnext_pid:timestamp_secs=3Dcommon_timestamp/$us_per_s= ec ...' >> event/trigger =20 +Variables can even hold stacktraces, which are useful with synthetic event= s. + 2.2.2 Synthetic Events ---------------------- =20 @@ -1940,6 +1943,132 @@ the ".buckets" modifier and specify a size (in this= case groups of 10). Entries: 16 Dropped: 0 =20 +To save stacktraces, create a synthetic event with a field of type "unsign= ed long[]" +or even just "long[]". For example, to see how long a task is blocked in an +uninterruptible state: + + # cd /sys/kernel/tracing + # echo 's:block_lat pid_t pid; u64 delta; unsigned long[] stack;' > dyna= mic_events + # echo 'hist:keys=3Dnext_pid:ts=3Dcommon_timestamp.usecs,st=3Dstacktrace= if prev_state =3D=3D 2' >> events/sched/sched_switch/trigger + # echo 'hist:keys=3Dprev_pid:delta=3Dcommon_timestamp.usecs-$ts,s=3D$st:= onmax($delta).trace(block_lat,prev_pid,$delta,$s)' >> events/sched/sched_sw= itch/trigger + # echo 1 > events/synthetic/block_lat/enable + # cat trace + + # tracer: nop + # + # entries-in-buffer/entries-written: 2/2 #P:8 + # + # _-----=3D> irqs-off/BH-disabled + # / _----=3D> need-resched + # | / _---=3D> hardirq/softirq + # || / _--=3D> preempt-depth + # ||| / _-=3D> migrate-disable + # |||| / delay + # TASK-PID CPU# ||||| TIMESTAMP FUNCTION + # | | | ||||| | | + -0 [005] d..4. 521.164922: block_lat: pid=3D0 de= lta=3D8322 stack=3DSTACK: + =3D> __schedule+0x448/0x7b0 + =3D> schedule+0x5a/0xb0 + =3D> io_schedule+0x42/0x70 + =3D> bit_wait_io+0xd/0x60 + =3D> __wait_on_bit+0x4b/0x140 + =3D> out_of_line_wait_on_bit+0x91/0xb0 + =3D> jbd2_journal_commit_transaction+0x1679/0x1a70 + =3D> kjournald2+0xa9/0x280 + =3D> kthread+0xe9/0x110 + =3D> ret_from_fork+0x2c/0x50 + + <...>-2 [004] d..4. 525.184257: block_lat: pid=3D2 de= lta=3D76 stack=3DSTACK: + =3D> __schedule+0x448/0x7b0 + =3D> schedule+0x5a/0xb0 + =3D> schedule_timeout+0x11a/0x150 + =3D> wait_for_completion_killable+0x144/0x1f0 + =3D> __kthread_create_on_node+0xe7/0x1e0 + =3D> kthread_create_on_node+0x51/0x70 + =3D> create_worker+0xcc/0x1a0 + =3D> worker_thread+0x2ad/0x380 + =3D> kthread+0xe9/0x110 + =3D> ret_from_fork+0x2c/0x50 + +A synthetic event that has a stacktrace field may use it as a key in histo= gram: + + # echo 'hist:delta.buckets=3D100,stack.stacktrace:sort=3Ddelta' > events= /synthetic/block_lat/trigger + # cat events/synthetic/block_lat/hist + + # event histogram + # + # trigger info: hist:keys=3Ddelta.buckets=3D100,stacktrace:vals=3Dhitcou= nt:sort=3Ddelta.buckets=3D100:size=3D2048 [active] + # + + { delta: ~ 0-99, stacktrace: + event_hist_trigger+0x464/0x480 + event_triggers_call+0x52/0xe0 + trace_event_buffer_commit+0x193/0x250 + trace_event_raw_event_sched_switch+0xfc/0x150 + __traceiter_sched_switch+0x41/0x60 + __schedule+0x448/0x7b0 + schedule_idle+0x26/0x40 + cpu_startup_entry+0x19/0x20 + start_secondary+0xed/0xf0 + secondary_startup_64_no_verify+0xe0/0xeb + } hitcount: 6 + { delta: ~ 0-99, stacktrace: + event_hist_trigger+0x464/0x480 + event_triggers_call+0x52/0xe0 + trace_event_buffer_commit+0x193/0x250 + trace_event_raw_event_sched_switch+0xfc/0x150 + __traceiter_sched_switch+0x41/0x60 + __schedule+0x448/0x7b0 + schedule_idle+0x26/0x40 + cpu_startup_entry+0x19/0x20 + __pfx_kernel_init+0x0/0x10 + arch_call_rest_init+0xa/0x24 + start_kernel+0x964/0x98d + secondary_startup_64_no_verify+0xe0/0xeb + } hitcount: 3 + { delta: ~ 0-99, stacktrace: + event_hist_trigger+0x464/0x480 + event_triggers_call+0x52/0xe0 + trace_event_buffer_commit+0x193/0x250 + trace_event_raw_event_sched_switch+0xfc/0x150 + __traceiter_sched_switch+0x41/0x60 + __schedule+0x448/0x7b0 + schedule+0x5a/0xb0 + worker_thread+0xaf/0x380 + kthread+0xe9/0x110 + ret_from_fork+0x2c/0x50 + } hitcount: 1 + { delta: ~ 100-199, stacktrace: + event_hist_trigger+0x464/0x480 + event_triggers_call+0x52/0xe0 + trace_event_buffer_commit+0x193/0x250 + trace_event_raw_event_sched_switch+0xfc/0x150 + __traceiter_sched_switch+0x41/0x60 + __schedule+0x448/0x7b0 + schedule_idle+0x26/0x40 + cpu_startup_entry+0x19/0x20 + start_secondary+0xed/0xf0 + secondary_startup_64_no_verify+0xe0/0xeb + } hitcount: 15 + [..] + { delta: ~ 8500-8599, stacktrace: + event_hist_trigger+0x464/0x480 + event_triggers_call+0x52/0xe0 + trace_event_buffer_commit+0x193/0x250 + trace_event_raw_event_sched_switch+0xfc/0x150 + __traceiter_sched_switch+0x41/0x60 + __schedule+0x448/0x7b0 + schedule_idle+0x26/0x40 + cpu_startup_entry+0x19/0x20 + start_secondary+0xed/0xf0 + secondary_startup_64_no_verify+0xe0/0xeb + } hitcount: 1 + + Totals: + Hits: 89 + Entries: 11 + Dropped: 0 + 2.2.3 Hist trigger 'handlers' and 'actions' ------------------------------------------- =20 --=20 2.39.0 From nobody Mon Sep 15 00:01:42 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 2F390C3DA78 for ; Tue, 17 Jan 2023 15:23:15 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232332AbjAQPXN (ORCPT ); Tue, 17 Jan 2023 10:23:13 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57516 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230495AbjAQPWl (ORCPT ); Tue, 17 Jan 2023 10:22:41 -0500 Received: from ams.source.kernel.org (ams.source.kernel.org [145.40.68.75]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 45C27303E6; Tue, 17 Jan 2023 07:22:40 -0800 (PST) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ams.source.kernel.org (Postfix) with ESMTPS id E6291B8163C; Tue, 17 Jan 2023 15:22:38 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 82DE3C433F1; Tue, 17 Jan 2023 15:22:37 +0000 (UTC) Received: from rostedt by gandalf.local.home with local (Exim 4.96) (envelope-from ) id 1pHnnI-001vk7-1y; Tue, 17 Jan 2023 10:22:36 -0500 Message-ID: <20230117152236.475439286@goodmis.org> User-Agent: quilt/0.66 Date: Tue, 17 Jan 2023 10:21:31 -0500 From: Steven Rostedt To: linux-kernel@vger.kernel.org, linux-trace-kernel@vger.kernel.org Cc: Masami Hiramatsu , Andrew Morton , Tom Zanussi , Ross Zwisler , Ching-lin Yu Subject: [PATCH 6/6 v2] tracing/histogram: Add simple tests for stacktrace usage of synthetic events References: <20230117152125.268986282@goodmis.org> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: "Steven Rostedt (Google)" Update the selftests to include a test of passing a stacktrace between the events of a synthetic event. Signed-off-by: Steven Rostedt (Google) --- kernel/trace/trace.c | 2 +- .../trigger-synthetic-event-stack.tc | 24 +++++++++++++++++++ .../trigger-synthetic-event-syntax.tc | 6 +++++ 3 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 tools/testing/selftests/ftrace/test.d/trigger/inter-eve= nt/trigger-synthetic-event-stack.tc diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c index d445789dc247..beb7b0e77874 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c @@ -5803,7 +5803,7 @@ static const char readme_msg[] =3D #ifdef CONFIG_SYNTH_EVENTS " events/synthetic_events\t- Create/append/remove/show synthetic events\= n" "\t Write into this file to define/undefine new synthetic events.\n" - "\t example: echo 'myevent u64 lat; char name[]' >> synthetic_events\= n" + "\t example: echo 'myevent u64 lat; char name[]; long[] stack' >> syn= thetic_events\n" #endif #endif ; diff --git a/tools/testing/selftests/ftrace/test.d/trigger/inter-event/trig= ger-synthetic-event-stack.tc b/tools/testing/selftests/ftrace/test.d/trigge= r/inter-event/trigger-synthetic-event-stack.tc new file mode 100644 index 000000000000..755dbe94ccf4 --- /dev/null +++ b/tools/testing/selftests/ftrace/test.d/trigger/inter-event/trigger-syn= thetic-event-stack.tc @@ -0,0 +1,24 @@ +#!/bin/sh +# SPDX-License-Identifier: GPL-2.0 +# description: event trigger - test inter-event histogram trigger trace ac= tion with dynamic string param +# requires: set_event synthetic_events events/sched/sched_process_exec/his= t "long[]' >> synthetic_events":README + +fail() { #msg + echo $1 + exit_fail +} + +echo "Test create synthetic event with stack" + + +echo 's:wake_lat pid_t pid; u64 delta; unsigned long[] stack;' > dynamic_e= vents +echo 'hist:keys=3Dnext_pid:ts=3Dcommon_timestamp.usecs,st=3Dstacktrace if= prev_state =3D=3D 1||prev_state =3D=3D 2' >> events/sched/sched_switch/tri= gger +echo 'hist:keys=3Dprev_pid:delta=3Dcommon_timestamp.usecs-$ts,s=3D$st:onma= x($delta).trace(wake_lat,prev_pid,$delta,$s)' >> events/sched/sched_switch/= trigger +echo 1 > events/synthetic/wake_lat/enable +sleep 1 + +if ! grep -q "=3D>.*sched" trace; then + fail "Failed to create synthetic event with stack" +fi + +exit 0 diff --git a/tools/testing/selftests/ftrace/test.d/trigger/inter-event/trig= ger-synthetic-event-syntax.tc b/tools/testing/selftests/ftrace/test.d/trigg= er/inter-event/trigger-synthetic-event-syntax.tc index 2968cdc7df30..366f1f3ad906 100644 --- a/tools/testing/selftests/ftrace/test.d/trigger/inter-event/trigger-syn= thetic-event-syntax.tc +++ b/tools/testing/selftests/ftrace/test.d/trigger/inter-event/trigger-syn= thetic-event-syntax.tc @@ -70,6 +70,12 @@ grep "myevent[[:space:]]unsigned long var" synthetic_eve= nts echo "myevent char var[10]" > synthetic_events grep "myevent[[:space:]]char\[10\] var" synthetic_events =20 +if grep -q 'long\[\]' README; then + # test stacktrace type + echo "myevent unsigned long[] var" > synthetic_events + grep "myevent[[:space:]]unsigned long\[\] var" synthetic_events +fi + do_reset =20 exit 0 --=20 2.39.0