diff options
| -rw-r--r-- | tools/tracing/rtla/src/timerlat_top.c | 12 | 
1 files changed, 11 insertions, 1 deletions
diff --git a/tools/tracing/rtla/src/timerlat_top.c b/tools/tracing/rtla/src/timerlat_top.c index 059b468981e4..d21a21053917 100644 --- a/tools/tracing/rtla/src/timerlat_top.c +++ b/tools/tracing/rtla/src/timerlat_top.c @@ -900,9 +900,12 @@ out_err:  }  static int stop_tracing; +static struct trace_instance *top_inst = NULL;  static void stop_top(int sig)  {  	stop_tracing = 1; +	if (top_inst) +		trace_instance_stop(top_inst);  }  /* @@ -950,6 +953,13 @@ int timerlat_top_main(int argc, char *argv[])  	}  	trace = &top->trace; +	/* +	* Save trace instance into global variable so that SIGINT can stop +	* the timerlat tracer. +	* Otherwise, rtla could loop indefinitely when overloaded. +	*/ +	top_inst = trace; +  	retval = enable_timerlat(trace);  	if (retval) { @@ -1131,7 +1141,7 @@ int timerlat_top_main(int argc, char *argv[])  	return_value = 0; -	if (trace_is_off(&top->trace, &record->trace)) { +	if (trace_is_off(&top->trace, &record->trace) && !stop_tracing) {  		printf("rtla timerlat hit stop tracing\n");  		if (!params->no_aa)  | 
