@@ -321,6 +321,57 @@ static struct osnoise_data {
321
321
#endif
322
322
};
323
323
324
+ #ifdef CONFIG_TIMERLAT_TRACER
325
+ static inline bool timerlat_enabled (void )
326
+ {
327
+ return osnoise_data .timerlat_tracer ;
328
+ }
329
+
330
+ static inline int timerlat_softirq_exit (struct osnoise_variables * osn_var )
331
+ {
332
+ struct timerlat_variables * tlat_var = this_cpu_tmr_var ();
333
+ /*
334
+ * If the timerlat is enabled, but the irq handler did
335
+ * not run yet enabling timerlat_tracer, do not trace.
336
+ */
337
+ if (!tlat_var -> tracing_thread ) {
338
+ osn_var -> softirq .arrival_time = 0 ;
339
+ osn_var -> softirq .delta_start = 0 ;
340
+ return 0 ;
341
+ }
342
+ return 1 ;
343
+ }
344
+
345
+ static inline int timerlat_thread_exit (struct osnoise_variables * osn_var )
346
+ {
347
+ struct timerlat_variables * tlat_var = this_cpu_tmr_var ();
348
+ /*
349
+ * If the timerlat is enabled, but the irq handler did
350
+ * not run yet enabling timerlat_tracer, do not trace.
351
+ */
352
+ if (!tlat_var -> tracing_thread ) {
353
+ osn_var -> thread .delta_start = 0 ;
354
+ osn_var -> thread .arrival_time = 0 ;
355
+ return 0 ;
356
+ }
357
+ return 1 ;
358
+ }
359
+ #else /* CONFIG_TIMERLAT_TRACER */
360
+ static inline bool timerlat_enabled (void )
361
+ {
362
+ return false;
363
+ }
364
+
365
+ static inline int timerlat_softirq_exit (struct osnoise_variables * osn_var )
366
+ {
367
+ return 1 ;
368
+ }
369
+ static inline int timerlat_thread_exit (struct osnoise_variables * osn_var )
370
+ {
371
+ return 1 ;
372
+ }
373
+ #endif
374
+
324
375
#ifdef CONFIG_PREEMPT_RT
325
376
/*
326
377
* Print the osnoise header info.
@@ -978,21 +1029,9 @@ static void trace_softirq_exit_callback(void *data, unsigned int vec_nr)
978
1029
if (!osn_var -> sampling )
979
1030
return ;
980
1031
981
- #ifdef CONFIG_TIMERLAT_TRACER
982
- /*
983
- * If the timerlat is enabled, but the irq handler did
984
- * not run yet enabling timerlat_tracer, do not trace.
985
- */
986
- if (unlikely (osnoise_data .timerlat_tracer )) {
987
- struct timerlat_variables * tlat_var ;
988
- tlat_var = this_cpu_tmr_var ();
989
- if (!tlat_var -> tracing_thread ) {
990
- osn_var -> softirq .arrival_time = 0 ;
991
- osn_var -> softirq .delta_start = 0 ;
1032
+ if (unlikely (timerlat_enabled ()))
1033
+ if (!timerlat_softirq_exit (osn_var ))
992
1034
return ;
993
- }
994
- }
995
- #endif
996
1035
997
1036
duration = get_int_safe_duration (osn_var , & osn_var -> softirq .delta_start );
998
1037
trace_softirq_noise (vec_nr , osn_var -> softirq .arrival_time , duration );
@@ -1086,17 +1125,9 @@ thread_exit(struct osnoise_variables *osn_var, struct task_struct *t)
1086
1125
if (!osn_var -> sampling )
1087
1126
return ;
1088
1127
1089
- #ifdef CONFIG_TIMERLAT_TRACER
1090
- if (osnoise_data .timerlat_tracer ) {
1091
- struct timerlat_variables * tlat_var ;
1092
- tlat_var = this_cpu_tmr_var ();
1093
- if (!tlat_var -> tracing_thread ) {
1094
- osn_var -> thread .delta_start = 0 ;
1095
- osn_var -> thread .arrival_time = 0 ;
1128
+ if (unlikely (timerlat_enabled ()))
1129
+ if (!timerlat_thread_exit (osn_var ))
1096
1130
return ;
1097
- }
1098
- }
1099
- #endif
1100
1131
1101
1132
duration = get_int_safe_duration (osn_var , & osn_var -> thread .delta_start );
1102
1133
@@ -1600,6 +1631,11 @@ static int timerlat_main(void *data)
1600
1631
hrtimer_cancel (& tlat -> timer );
1601
1632
return 0 ;
1602
1633
}
1634
+ #else /* CONFIG_TIMERLAT_TRACER */
1635
+ static int timerlat_main (void * data )
1636
+ {
1637
+ return 0 ;
1638
+ }
1603
1639
#endif /* CONFIG_TIMERLAT_TRACER */
1604
1640
1605
1641
/*
@@ -1642,16 +1678,13 @@ static int start_kthread(unsigned int cpu)
1642
1678
void * main = osnoise_main ;
1643
1679
char comm [24 ];
1644
1680
1645
- #ifdef CONFIG_TIMERLAT_TRACER
1646
- if (osnoise_data .timerlat_tracer ) {
1681
+ if (timerlat_enabled ()) {
1647
1682
snprintf (comm , 24 , "timerlat/%d" , cpu );
1648
1683
main = timerlat_main ;
1649
1684
} else {
1650
1685
snprintf (comm , 24 , "osnoise/%d" , cpu );
1651
1686
}
1652
- #else
1653
- snprintf (comm , 24 , "osnoise/%d" , cpu );
1654
- #endif
1687
+
1655
1688
kthread = kthread_create_on_cpu (main , NULL , cpu , comm );
1656
1689
1657
1690
if (IS_ERR (kthread )) {
@@ -1945,6 +1978,35 @@ static const struct file_operations cpus_fops = {
1945
1978
.llseek = generic_file_llseek ,
1946
1979
};
1947
1980
1981
+ #ifdef CONFIG_TIMERLAT_TRACER
1982
+ /*
1983
+ * init_timerlat_tracefs - A function to initialize the timerlat interface files
1984
+ */
1985
+ static int init_timerlat_tracefs (struct dentry * top_dir )
1986
+ {
1987
+ struct dentry * tmp ;
1988
+
1989
+ #ifdef CONFIG_STACKTRACE
1990
+ tmp = tracefs_create_file ("print_stack" , TRACE_MODE_WRITE , top_dir ,
1991
+ & osnoise_print_stack , & trace_min_max_fops );
1992
+ if (!tmp )
1993
+ return - ENOMEM ;
1994
+ #endif
1995
+
1996
+ tmp = tracefs_create_file ("timerlat_period_us" , TRACE_MODE_WRITE , top_dir ,
1997
+ & timerlat_period , & trace_min_max_fops );
1998
+ if (!tmp )
1999
+ return - ENOMEM ;
2000
+
2001
+ return 0 ;
2002
+ }
2003
+ #else /* CONFIG_TIMERLAT_TRACER */
2004
+ static int init_timerlat_tracefs (struct dentry * top_dir )
2005
+ {
2006
+ return 0 ;
2007
+ }
2008
+ #endif /* CONFIG_TIMERLAT_TRACER */
2009
+
1948
2010
/*
1949
2011
* init_tracefs - A function to initialize the tracefs interface files
1950
2012
*
@@ -1989,19 +2051,10 @@ static int init_tracefs(void)
1989
2051
tmp = trace_create_file ("cpus" , TRACE_MODE_WRITE , top_dir , NULL , & cpus_fops );
1990
2052
if (!tmp )
1991
2053
goto err ;
1992
- #ifdef CONFIG_TIMERLAT_TRACER
1993
- #ifdef CONFIG_STACKTRACE
1994
- tmp = tracefs_create_file ("print_stack" , TRACE_MODE_WRITE , top_dir ,
1995
- & osnoise_print_stack , & trace_min_max_fops );
1996
- if (!tmp )
1997
- goto err ;
1998
- #endif
1999
2054
2000
- tmp = tracefs_create_file ("timerlat_period_us" , TRACE_MODE_WRITE , top_dir ,
2001
- & timerlat_period , & trace_min_max_fops );
2002
- if (!tmp )
2055
+ ret = init_timerlat_tracefs (top_dir );
2056
+ if (ret )
2003
2057
goto err ;
2004
- #endif
2005
2058
2006
2059
return 0 ;
2007
2060
@@ -2207,6 +2260,16 @@ static struct tracer timerlat_tracer __read_mostly = {
2207
2260
.print_header = print_timerlat_headers ,
2208
2261
.allow_instances = true,
2209
2262
};
2263
+
2264
+ __init static int init_timerlat_tracer (void )
2265
+ {
2266
+ return register_tracer (& timerlat_tracer );
2267
+ }
2268
+ #else /* CONFIG_TIMERLAT_TRACER */
2269
+ __init static int init_timerlat_tracer (void )
2270
+ {
2271
+ return 0 ;
2272
+ }
2210
2273
#endif /* CONFIG_TIMERLAT_TRACER */
2211
2274
2212
2275
__init static int init_osnoise_tracer (void )
@@ -2223,13 +2286,12 @@ __init static int init_osnoise_tracer(void)
2223
2286
return ret ;
2224
2287
}
2225
2288
2226
- #ifdef CONFIG_TIMERLAT_TRACER
2227
- ret = register_tracer (& timerlat_tracer );
2289
+ ret = init_timerlat_tracer ();
2228
2290
if (ret ) {
2229
- pr_err (BANNER "Error registering timerlat\n" );
2291
+ pr_err (BANNER "Error registering timerlat! \n" );
2230
2292
return ret ;
2231
2293
}
2232
- #endif
2294
+
2233
2295
osnoise_init_hotplug_support ();
2234
2296
2235
2297
INIT_LIST_HEAD_RCU (& osnoise_instances );
0 commit comments