* [PATCH v3 0/3] few fixes for synthetic trace events
@ 2023-08-10 6:05 Sven Schnelle
2023-08-10 6:05 ` [PATCH v3 1/3] tracing/synthetic: use union instead of casts Sven Schnelle
` (3 more replies)
0 siblings, 4 replies; 7+ messages in thread
From: Sven Schnelle @ 2023-08-10 6:05 UTC (permalink / raw)
To: Steven Rostedt; +Cc: linux-kernel
Hi Steven,
I'm now sending these patches in one patchset, because the second patch
has a dependeny on the union vs. cast fix.
Changes in v3:
- remove superfluous struct around union trace_synth_field
Changes in v2:
- cosmetic changes
- add struct trace_dynamic_info to include/linux/trace_events.h
Sven Schnelle (3):
tracing/synthetic: use union instead of casts
tracing/synthetic: skip first entry for stack traces
tracing/synthetic: allocate one additional element for size
include/linux/trace_events.h | 11 ++++
kernel/trace/trace.h | 8 +++
kernel/trace/trace_events_synth.c | 103 ++++++++++++------------------
3 files changed, 60 insertions(+), 62 deletions(-)
--
2.39.2
^ permalink raw reply [flat|nested] 7+ messages in thread* [PATCH v3 1/3] tracing/synthetic: use union instead of casts 2023-08-10 6:05 [PATCH v3 0/3] few fixes for synthetic trace events Sven Schnelle @ 2023-08-10 6:05 ` Sven Schnelle 2023-09-08 19:44 ` Steven Rostedt 2023-08-10 6:05 ` [PATCH v3 2/3] tracing/synthetic: skip first entry for stack traces Sven Schnelle ` (2 subsequent siblings) 3 siblings, 1 reply; 7+ messages in thread From: Sven Schnelle @ 2023-08-10 6:05 UTC (permalink / raw) To: Steven Rostedt; +Cc: linux-kernel The current code uses a lot of casts to access the fields member in struct synth_trace_events with different sizes. This makes the code hard to read, and had already introduced an endianness bug. Use a union and struct instead. Signed-off-by: Sven Schnelle <svens@linux.ibm.com> --- include/linux/trace_events.h | 11 ++++ kernel/trace/trace.h | 8 +++ kernel/trace/trace_events_synth.c | 87 +++++++++++++------------------ 3 files changed, 56 insertions(+), 50 deletions(-) diff --git a/include/linux/trace_events.h b/include/linux/trace_events.h index 3930e676436c..1e8bbdb8da90 100644 --- a/include/linux/trace_events.h +++ b/include/linux/trace_events.h @@ -59,6 +59,17 @@ int trace_raw_output_prep(struct trace_iterator *iter, extern __printf(2, 3) void trace_event_printf(struct trace_iterator *iter, const char *fmt, ...); +/* Used to find the offset and length of dynamic fields in trace events */ +struct trace_dynamic_info { +#ifdef CONFIG_CPU_BIG_ENDIAN + u16 offset; + u16 len; +#else + u16 len; + u16 offset; +#endif +}; + /* * The trace entry - the most basic unit of tracing. This is what * is printed in the end as a single line in the trace output, such as: diff --git a/kernel/trace/trace.h b/kernel/trace/trace.h index e1edc2197fc8..95956f75bea5 100644 --- a/kernel/trace/trace.h +++ b/kernel/trace/trace.h @@ -1295,6 +1295,14 @@ static inline void trace_branch_disable(void) /* set ring buffers to default size if not already done so */ int tracing_update_buffers(void); +union trace_synth_field { + u8 as_u8; + u16 as_u16; + u32 as_u32; + u64 as_u64; + struct trace_dynamic_info as_dynamic; +}; + struct ftrace_event_field { struct list_head link; const char *name; diff --git a/kernel/trace/trace_events_synth.c b/kernel/trace/trace_events_synth.c index dd398afc8e25..7fff8235075f 100644 --- a/kernel/trace/trace_events_synth.c +++ b/kernel/trace/trace_events_synth.c @@ -127,7 +127,7 @@ static bool synth_event_match(const char *system, const char *event, struct synth_trace_event { struct trace_entry ent; - u64 fields[]; + union trace_synth_field fields[]; }; static int synth_event_define_fields(struct trace_event_call *call) @@ -321,19 +321,19 @@ static const char *synth_field_fmt(char *type) static void print_synth_event_num_val(struct trace_seq *s, char *print_fmt, char *name, - int size, u64 val, char *space) + int size, union trace_synth_field *val, char *space) { switch (size) { case 1: - trace_seq_printf(s, print_fmt, name, (u8)val, space); + trace_seq_printf(s, print_fmt, name, val->as_u8, space); break; case 2: - trace_seq_printf(s, print_fmt, name, (u16)val, space); + trace_seq_printf(s, print_fmt, name, val->as_u16, space); break; case 4: - trace_seq_printf(s, print_fmt, name, (u32)val, space); + trace_seq_printf(s, print_fmt, name, val->as_u32, space); break; default: @@ -374,36 +374,26 @@ static enum print_line_t print_synth_event(struct trace_iterator *iter, /* parameter values */ if (se->fields[i]->is_string) { if (se->fields[i]->is_dynamic) { - u32 offset, data_offset; - char *str_field; - - offset = (u32)entry->fields[n_u64]; - data_offset = offset & 0xffff; - - str_field = (char *)entry + data_offset; + union trace_synth_field *data = &entry->fields[n_u64]; trace_seq_printf(s, print_fmt, se->fields[i]->name, STR_VAR_LEN_MAX, - str_field, + (char *)entry + data->as_dynamic.offset, i == se->n_fields - 1 ? "" : " "); n_u64++; } else { trace_seq_printf(s, print_fmt, se->fields[i]->name, STR_VAR_LEN_MAX, - (char *)&entry->fields[n_u64], + (char *)&entry->fields[n_u64].as_u64, i == se->n_fields - 1 ? "" : " "); n_u64 += STR_VAR_LEN_MAX / sizeof(u64); } } else if (se->fields[i]->is_stack) { - u32 offset, data_offset, len; unsigned long *p, *end; + union trace_synth_field *data = &entry->fields[n_u64]; - offset = (u32)entry->fields[n_u64]; - data_offset = offset & 0xffff; - len = offset >> 16; - - p = (void *)entry + data_offset; - end = (void *)p + len - (sizeof(long) - 1); + p = (void *)entry + data->as_dynamic.offset; + end = (void *)p + data->as_dynamic.len - (sizeof(long) - 1); trace_seq_printf(s, "%s=STACK:\n", se->fields[i]->name); @@ -419,13 +409,13 @@ static enum print_line_t print_synth_event(struct trace_iterator *iter, print_synth_event_num_val(s, print_fmt, se->fields[i]->name, se->fields[i]->size, - entry->fields[n_u64], + &entry->fields[n_u64], space); if (strcmp(se->fields[i]->type, "gfp_t") == 0) { trace_seq_puts(s, " ("); trace_print_flags_seq(s, "|", - entry->fields[n_u64], + entry->fields[n_u64].as_u64, __flags); trace_seq_putc(s, ')'); } @@ -454,21 +444,16 @@ static unsigned int trace_string(struct synth_trace_event *entry, int ret; if (is_dynamic) { - u32 data_offset; + union trace_synth_field *data = &entry->fields[*n_u64]; - data_offset = struct_size(entry, fields, event->n_u64); - data_offset += data_size; - - len = fetch_store_strlen((unsigned long)str_val); - - data_offset |= len << 16; - *(u32 *)&entry->fields[*n_u64] = data_offset; + data->as_dynamic.offset = struct_size(entry, fields, event->n_u64) + data_size; + data->as_dynamic.len = fetch_store_strlen((unsigned long)str_val); ret = fetch_store_string((unsigned long)str_val, &entry->fields[*n_u64], entry); (*n_u64)++; } else { - str_field = (char *)&entry->fields[*n_u64]; + str_field = (char *)&entry->fields[*n_u64].as_u64; #ifdef CONFIG_ARCH_HAS_NON_OVERLAPPING_ADDRESS_SPACE if ((unsigned long)str_val < TASK_SIZE) @@ -492,6 +477,7 @@ static unsigned int trace_stack(struct synth_trace_event *entry, unsigned int data_size, unsigned int *n_u64) { + union trace_synth_field *data = &entry->fields[*n_u64]; unsigned int len; u32 data_offset; void *data_loc; @@ -515,8 +501,9 @@ static unsigned int trace_stack(struct synth_trace_event *entry, memcpy(data_loc, stack, len); /* Fill in the field that holds the offset/len combo */ - data_offset |= len << 16; - *(u32 *)&entry->fields[*n_u64] = data_offset; + + data->as_dynamic.offset = data_offset; + data->as_dynamic.len = len; (*n_u64)++; @@ -592,19 +579,19 @@ static notrace void trace_event_raw_event_synth(void *__data, switch (field->size) { case 1: - *(u8 *)&entry->fields[n_u64] = (u8)val; + entry->fields[n_u64].as_u8 = (u8)val; break; case 2: - *(u16 *)&entry->fields[n_u64] = (u16)val; + entry->fields[n_u64].as_u16 = (u16)val; break; case 4: - *(u32 *)&entry->fields[n_u64] = (u32)val; + entry->fields[n_u64].as_u32 = (u32)val; break; default: - entry->fields[n_u64] = val; + entry->fields[n_u64].as_u64 = val; break; } n_u64++; @@ -1791,19 +1778,19 @@ int synth_event_trace(struct trace_event_file *file, unsigned int n_vals, ...) switch (field->size) { case 1: - *(u8 *)&state.entry->fields[n_u64] = (u8)val; + state.entry->fields[n_u64].as_u8 = (u8)val; break; case 2: - *(u16 *)&state.entry->fields[n_u64] = (u16)val; + state.entry->fields[n_u64].as_u16 = (u16)val; break; case 4: - *(u32 *)&state.entry->fields[n_u64] = (u32)val; + state.entry->fields[n_u64].as_u32 = (u32)val; break; default: - state.entry->fields[n_u64] = val; + state.entry->fields[n_u64].as_u64 = val; break; } n_u64++; @@ -1884,19 +1871,19 @@ int synth_event_trace_array(struct trace_event_file *file, u64 *vals, switch (field->size) { case 1: - *(u8 *)&state.entry->fields[n_u64] = (u8)val; + state.entry->fields[n_u64].as_u8 = (u8)val; break; case 2: - *(u16 *)&state.entry->fields[n_u64] = (u16)val; + state.entry->fields[n_u64].as_u16 = (u16)val; break; case 4: - *(u32 *)&state.entry->fields[n_u64] = (u32)val; + state.entry->fields[n_u64].as_u32 = (u32)val; break; default: - state.entry->fields[n_u64] = val; + state.entry->fields[n_u64].as_u64 = val; break; } n_u64++; @@ -2031,19 +2018,19 @@ static int __synth_event_add_val(const char *field_name, u64 val, } else { switch (field->size) { case 1: - *(u8 *)&trace_state->entry->fields[field->offset] = (u8)val; + trace_state->entry->fields[field->offset].as_u8 = (u8)val; break; case 2: - *(u16 *)&trace_state->entry->fields[field->offset] = (u16)val; + trace_state->entry->fields[field->offset].as_u16 = (u16)val; break; case 4: - *(u32 *)&trace_state->entry->fields[field->offset] = (u32)val; + trace_state->entry->fields[field->offset].as_u32 = (u32)val; break; default: - trace_state->entry->fields[field->offset] = val; + trace_state->entry->fields[field->offset].as_u64 = val; break; } } -- 2.39.2 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH v3 1/3] tracing/synthetic: use union instead of casts 2023-08-10 6:05 ` [PATCH v3 1/3] tracing/synthetic: use union instead of casts Sven Schnelle @ 2023-09-08 19:44 ` Steven Rostedt 0 siblings, 0 replies; 7+ messages in thread From: Steven Rostedt @ 2023-09-08 19:44 UTC (permalink / raw) To: Sven Schnelle; +Cc: linux-kernel On Thu, 10 Aug 2023 08:05:36 +0200 Sven Schnelle <svens@linux.ibm.com> wrote: > --- a/include/linux/trace_events.h > +++ b/include/linux/trace_events.h > @@ -59,6 +59,17 @@ int trace_raw_output_prep(struct trace_iterator *iter, > extern __printf(2, 3) > void trace_event_printf(struct trace_iterator *iter, const char *fmt, ...); > > +/* Used to find the offset and length of dynamic fields in trace events */ > +struct trace_dynamic_info { > +#ifdef CONFIG_CPU_BIG_ENDIAN > + u16 offset; > + u16 len; > +#else > + u16 len; > + u16 offset; > +#endif > +}; > + So this patch broke synthetic events. I found that it works with: diff --git a/include/linux/trace_events.h b/include/linux/trace_events.h index 12f875e9e69a..4a98e23b0e77 100644 --- a/include/linux/trace_events.h +++ b/include/linux/trace_events.h @@ -65,10 +65,10 @@ struct trace_dynamic_info { u16 offset; u16 len; #else - u16 len; u16 offset; + u16 len; #endif -}; +} __packed; /* * The trace entry - the most basic unit of tracing. This is what That is, I had to swap the order of len vs offset, and to also be safe, I added "__packed". I'm guessing that the BIG ENDIAN is broken too? So I'm going to swap that as well. It causes the following test to fail: ./ftracetest test.d/trigger/inter-event/trigger-synthetic-event-dynstring.tc Which I didn't notice because I found that test to be broken, and needs this patch: diff --git a/tools/testing/selftests/ftrace/test.d/trigger/inter-event/trigger-synthetic-event-dynstring.tc b/tools/testing/selftests/ftrace/test.d/trigger/inter-event/trigger-synthetic-event-dynstring.tc index 213d890ed188..174376ddbc6c 100644 --- a/tools/testing/selftests/ftrace/test.d/trigger/inter-event/trigger-synthetic-event-dynstring.tc +++ b/tools/testing/selftests/ftrace/test.d/trigger/inter-event/trigger-synthetic-event-dynstring.tc @@ -1,7 +1,7 @@ #!/bin/sh # SPDX-License-Identifier: GPL-2.0 # description: event trigger - test inter-event histogram trigger trace action with dynamic string param -# requires: set_event synthetic_events events/sched/sched_process_exec/hist "char name[]' >> synthetic_events":README ping:program +# requires: set_event synthetic_events events/sched/sched_process_exec/hist "' >> synthetic_events":README ping:program fail() { #msg echo $1 -- Steve ^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH v3 2/3] tracing/synthetic: skip first entry for stack traces 2023-08-10 6:05 [PATCH v3 0/3] few fixes for synthetic trace events Sven Schnelle 2023-08-10 6:05 ` [PATCH v3 1/3] tracing/synthetic: use union instead of casts Sven Schnelle @ 2023-08-10 6:05 ` Sven Schnelle 2023-08-10 6:05 ` [PATCH v3 3/3] tracing/synthetic: allocate one additional element for size Sven Schnelle 2023-08-16 9:08 ` [PATCH v3 0/3] few fixes for synthetic trace events Sven Schnelle 3 siblings, 0 replies; 7+ messages in thread From: Sven Schnelle @ 2023-08-10 6:05 UTC (permalink / raw) To: Steven Rostedt; +Cc: linux-kernel While debugging another issue i noticed that the stack trace output contains the number of entries on top: <idle>-0 [000] d..4. 203.322502: wake_lat: pid=0 delta=2268270616 stack=STACK: => 0x10 => __schedule+0xac6/0x1a98 => schedule+0x126/0x2c0 => schedule_timeout+0x242/0x2c0 => __wait_for_common+0x434/0x680 => __wait_rcu_gp+0x198/0x3e0 => synchronize_rcu+0x112/0x138 => ring_buffer_reset_online_cpus+0x140/0x2e0 => tracing_reset_online_cpus+0x15c/0x1d0 => tracing_set_clock+0x180/0x1d8 => hist_register_trigger+0x486/0x670 => event_hist_trigger_parse+0x494/0x1318 => trigger_process_regex+0x1d4/0x258 => event_trigger_write+0xb4/0x170 => vfs_write+0x210/0xad0 => ksys_write+0x122/0x208 Fix this by skipping the first element. Also replace the pointer logic with an index variable which is easier to read. Fixes: 00cf3d672a9d ("tracing: Allow synthetic events to pass around stacktraces") Signed-off-by: Sven Schnelle <svens@linux.ibm.com> --- kernel/trace/trace_events_synth.c | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) diff --git a/kernel/trace/trace_events_synth.c b/kernel/trace/trace_events_synth.c index 7fff8235075f..80a2a832f857 100644 --- a/kernel/trace/trace_events_synth.c +++ b/kernel/trace/trace_events_synth.c @@ -350,7 +350,7 @@ static enum print_line_t print_synth_event(struct trace_iterator *iter, struct trace_seq *s = &iter->seq; struct synth_trace_event *entry; struct synth_event *se; - unsigned int i, n_u64; + unsigned int i, j, n_u64; char print_fmt[32]; const char *fmt; @@ -389,18 +389,13 @@ static enum print_line_t print_synth_event(struct trace_iterator *iter, n_u64 += STR_VAR_LEN_MAX / sizeof(u64); } } else if (se->fields[i]->is_stack) { - unsigned long *p, *end; union trace_synth_field *data = &entry->fields[n_u64]; - - p = (void *)entry + data->as_dynamic.offset; - end = (void *)p + data->as_dynamic.len - (sizeof(long) - 1); + unsigned long *p = (void *)entry + data->as_dynamic.offset; trace_seq_printf(s, "%s=STACK:\n", se->fields[i]->name); - - for (; *p && p < end; p++) - trace_seq_printf(s, "=> %pS\n", (void *)*p); + for (j = 1; j < data->as_dynamic.len / sizeof(long); j++) + trace_seq_printf(s, "=> %pS\n", (void *)p[j]); n_u64++; - } else { struct trace_print_flags __flags[] = { __def_gfpflag_names, {-1, NULL} }; @@ -490,10 +485,6 @@ static unsigned int trace_stack(struct synth_trace_event *entry, break; } - /* Include the zero'd element if it fits */ - if (len < HIST_STACKTRACE_DEPTH) - len++; - len *= sizeof(long); /* Find the dynamic section to copy the stack into. */ -- 2.39.2 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH v3 3/3] tracing/synthetic: allocate one additional element for size 2023-08-10 6:05 [PATCH v3 0/3] few fixes for synthetic trace events Sven Schnelle 2023-08-10 6:05 ` [PATCH v3 1/3] tracing/synthetic: use union instead of casts Sven Schnelle 2023-08-10 6:05 ` [PATCH v3 2/3] tracing/synthetic: skip first entry for stack traces Sven Schnelle @ 2023-08-10 6:05 ` Sven Schnelle 2023-08-16 9:08 ` [PATCH v3 0/3] few fixes for synthetic trace events Sven Schnelle 3 siblings, 0 replies; 7+ messages in thread From: Sven Schnelle @ 2023-08-10 6:05 UTC (permalink / raw) To: Steven Rostedt; +Cc: linux-kernel While debugging another issue i noticed that the stack trace contains one invalid entry at the end: <idle>-0 [008] d..4. 26.484201: wake_lat: pid=0 delta=2629976084 000000009cc24024 stack=STACK: => __schedule+0xac6/0x1a98 => schedule+0x126/0x2c0 => schedule_timeout+0x150/0x2c0 => kcompactd+0x9ca/0xc20 => kthread+0x2f6/0x3d8 => __ret_from_fork+0x8a/0xe8 => 0x6b6b6b6b6b6b6b6b This is because the code failed to add the one element containing the number of entries to field_size. Fixes: 00cf3d672a9d ("tracing: Allow synthetic events to pass around stacktraces") Signed-off-by: Sven Schnelle <svens@linux.ibm.com> --- kernel/trace/trace_events_synth.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/kernel/trace/trace_events_synth.c b/kernel/trace/trace_events_synth.c index 80a2a832f857..9897d0bfcab7 100644 --- a/kernel/trace/trace_events_synth.c +++ b/kernel/trace/trace_events_synth.c @@ -528,7 +528,8 @@ static notrace void trace_event_raw_event_synth(void *__data, str_val = (char *)(long)var_ref_vals[val_idx]; if (event->dynamic_fields[i]->is_stack) { - len = *((unsigned long *)str_val); + /* reserve one extra element for size */ + len = *((unsigned long *)str_val) + 1; len *= sizeof(unsigned long); } else { len = fetch_store_strlen((unsigned long)str_val); -- 2.39.2 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH v3 0/3] few fixes for synthetic trace events 2023-08-10 6:05 [PATCH v3 0/3] few fixes for synthetic trace events Sven Schnelle ` (2 preceding siblings ...) 2023-08-10 6:05 ` [PATCH v3 3/3] tracing/synthetic: allocate one additional element for size Sven Schnelle @ 2023-08-16 9:08 ` Sven Schnelle 2023-08-16 15:11 ` Steven Rostedt 3 siblings, 1 reply; 7+ messages in thread From: Sven Schnelle @ 2023-08-16 9:08 UTC (permalink / raw) To: Steven Rostedt; +Cc: linux-kernel Sven Schnelle <svens@linux.ibm.com> writes: > Hi Steven, > > I'm now sending these patches in one patchset, because the second patch > has a dependeny on the union vs. cast fix. > > Changes in v3: > - remove superfluous struct around union trace_synth_field > > Changes in v2: > - cosmetic changes > - add struct trace_dynamic_info to include/linux/trace_events.h > > Sven Schnelle (3): > tracing/synthetic: use union instead of casts > tracing/synthetic: skip first entry for stack traces > tracing/synthetic: allocate one additional element for size > > include/linux/trace_events.h | 11 ++++ > kernel/trace/trace.h | 8 +++ > kernel/trace/trace_events_synth.c | 103 ++++++++++++------------------ > 3 files changed, 60 insertions(+), 62 deletions(-) Gentle ping? We're still seeing a lot of KASAN warnings. ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v3 0/3] few fixes for synthetic trace events 2023-08-16 9:08 ` [PATCH v3 0/3] few fixes for synthetic trace events Sven Schnelle @ 2023-08-16 15:11 ` Steven Rostedt 0 siblings, 0 replies; 7+ messages in thread From: Steven Rostedt @ 2023-08-16 15:11 UTC (permalink / raw) To: Sven Schnelle; +Cc: linux-kernel On Wed, 16 Aug 2023 11:08:52 +0200 Sven Schnelle <svens@linux.ibm.com> wrote: > Sven Schnelle <svens@linux.ibm.com> writes: > > > Hi Steven, > > > > I'm now sending these patches in one patchset, because the second patch > > has a dependeny on the union vs. cast fix. > > > > Changes in v3: > > - remove superfluous struct around union trace_synth_field > > > > Changes in v2: > > - cosmetic changes > > - add struct trace_dynamic_info to include/linux/trace_events.h > > > > Sven Schnelle (3): > > tracing/synthetic: use union instead of casts > > tracing/synthetic: skip first entry for stack traces > > tracing/synthetic: allocate one additional element for size > > > > include/linux/trace_events.h | 11 ++++ > > kernel/trace/trace.h | 8 +++ > > kernel/trace/trace_events_synth.c | 103 ++++++++++++------------------ > > 3 files changed, 60 insertions(+), 62 deletions(-) > > Gentle ping? We're still seeing a lot of KASAN warnings. Can you resend and include a Cc to linux-trace-kernel@vger.kernel.org. That will put it into patchwork: https://patchwork.kernel.org/project/linux-trace-kernel/list/ Also, include everyone in the MAINTAINERS file too please. That's what I use to know what to pull in for tracing. I have a personal patchwork on my INBOX that this did go into, but that's always considered lower priority. -- Steve ^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2023-09-08 19:48 UTC | newest] Thread overview: 7+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2023-08-10 6:05 [PATCH v3 0/3] few fixes for synthetic trace events Sven Schnelle 2023-08-10 6:05 ` [PATCH v3 1/3] tracing/synthetic: use union instead of casts Sven Schnelle 2023-09-08 19:44 ` Steven Rostedt 2023-08-10 6:05 ` [PATCH v3 2/3] tracing/synthetic: skip first entry for stack traces Sven Schnelle 2023-08-10 6:05 ` [PATCH v3 3/3] tracing/synthetic: allocate one additional element for size Sven Schnelle 2023-08-16 9:08 ` [PATCH v3 0/3] few fixes for synthetic trace events Sven Schnelle 2023-08-16 15:11 ` Steven Rostedt
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox