On Mon, 24 Jan 2022 15:24:06 +0100 Daniel Bristot de Oliveira <bristot@xxxxxxxxxx> wrote: > rtla osnoise top is causing a segmentation fault when running with > the --trace option on a kernel that does not support multiple > instances. For example: > > [root@f34 rtla]# rtla osnoise top -t > failed to enable the tracer osnoise > Could not enable osnoiser tracer for tracing > Failed to enable the trace instance > Segmentation fault (core dumped) > > This error happens because the exit code of the tools is trying > to destroy the trace instance that failed to be created. > > Rearrange the order in which trace instances are destroyed to avoid > this problem. > > Fixes: 1eceb2fc2ca5 ("rtla/osnoise: Add osnoise top mode") > Cc: Daniel Bristot de Oliveira <bristot@xxxxxxxxxx> > Cc: Steven Rostedt <rostedt@xxxxxxxxxxx> > Cc: linux-kernel@xxxxxxxxxxxxxxx > Cc: linux-trace-devel@xxxxxxxxxxxxxxx > Signed-off-by: Daniel Bristot de Oliveira <bristot@xxxxxxxxxx> > --- > tools/tracing/rtla/src/osnoise_top.c | 7 ++++--- > 1 file changed, 4 insertions(+), 3 deletions(-) > > diff --git a/tools/tracing/rtla/src/osnoise_top.c b/tools/tracing/rtla/src/osnoise_top.c > index 332b2ac205fc..546769bc7ff7 100644 > --- a/tools/tracing/rtla/src/osnoise_top.c > +++ b/tools/tracing/rtla/src/osnoise_top.c > @@ -546,7 +546,7 @@ int osnoise_top_main(int argc, char **argv) > trace); > if (retval < 0) { > err_msg("Error iterating on events\n"); > - goto out_top; > + goto out_trace; > } > > if (!params->quiet) > @@ -569,11 +569,12 @@ int osnoise_top_main(int argc, char **argv) > } > } > > +out_trace: > + if (params->trace_output) > + osnoise_destroy_tool(record); > out_top: > osnoise_free_top(tool->data); > osnoise_destroy_tool(tool); > - if (params->trace_output) > - osnoise_destroy_tool(record); Wouldn't these four patches be more robust if you just initialized record (and tool) to NULL, and change osnoise_destroy_tool() to: void osnoise_destroy_tool(struct osnoise_tool *top) { if (!top) return; trace_instance_destroy(&top->trace); if (top->context) osnoise_put_context(top->context); free(top); } Then you don't need these extra labels and if statements in the main code. -- Steve > out_exit: > exit(return_value); > }