14
14
#include "osnoise.h"
15
15
#include "utils.h"
16
16
17
+ enum osnoise_mode {
18
+ MODE_OSNOISE = 0 ,
19
+ MODE_HWNOISE
20
+ };
21
+
17
22
/*
18
23
* osnoise top parameters
19
24
*/
@@ -32,6 +37,7 @@ struct osnoise_top_params {
32
37
int set_sched ;
33
38
struct sched_attr sched_param ;
34
39
struct trace_events * events ;
40
+ enum osnoise_mode mode ;
35
41
};
36
42
37
43
struct osnoise_top_cpu {
@@ -143,15 +149,23 @@ osnoise_top_handler(struct trace_seq *s, struct tep_record *record,
143
149
*/
144
150
static void osnoise_top_header (struct osnoise_tool * top )
145
151
{
152
+ struct osnoise_top_params * params = top -> params ;
146
153
struct trace_seq * s = top -> trace .seq ;
147
154
char duration [26 ];
148
155
149
156
get_duration (top -> start_time , duration , sizeof (duration ));
150
157
151
158
trace_seq_printf (s , "\033[2;37;40m" );
152
- trace_seq_printf (s , " Operating System Noise" );
153
- trace_seq_printf (s , " " );
154
- trace_seq_printf (s , " " );
159
+ trace_seq_printf (s , " " );
160
+
161
+ if (params -> mode == MODE_OSNOISE ) {
162
+ trace_seq_printf (s , "Operating System Noise" );
163
+ trace_seq_printf (s , " " );
164
+ } else if (params -> mode == MODE_HWNOISE ) {
165
+ trace_seq_printf (s , "Hardware-related Noise" );
166
+ }
167
+
168
+ trace_seq_printf (s , " " );
155
169
trace_seq_printf (s , "\033[0;0;0m" );
156
170
trace_seq_printf (s , "\n" );
157
171
@@ -162,7 +176,14 @@ static void osnoise_top_header(struct osnoise_tool *top)
162
176
trace_seq_printf (s , " Noise " );
163
177
trace_seq_printf (s , " %% CPU Aval " );
164
178
trace_seq_printf (s , " Max Noise Max Single " );
165
- trace_seq_printf (s , " HW NMI IRQ Softirq Thread" );
179
+ trace_seq_printf (s , " HW NMI" );
180
+
181
+ if (params -> mode == MODE_HWNOISE )
182
+ goto eol ;
183
+
184
+ trace_seq_printf (s , " IRQ Softirq Thread" );
185
+
186
+ eol :
166
187
trace_seq_printf (s , "\033[0;0;0m" );
167
188
trace_seq_printf (s , "\n" );
168
189
}
@@ -181,6 +202,7 @@ static void clear_terminal(struct trace_seq *seq)
181
202
*/
182
203
static void osnoise_top_print (struct osnoise_tool * tool , int cpu )
183
204
{
205
+ struct osnoise_top_params * params = tool -> params ;
184
206
struct trace_seq * s = tool -> trace .seq ;
185
207
struct osnoise_top_cpu * cpu_data ;
186
208
struct osnoise_top_data * data ;
@@ -205,6 +227,12 @@ static void osnoise_top_print(struct osnoise_tool *tool, int cpu)
205
227
206
228
trace_seq_printf (s , "%12llu " , cpu_data -> hw_count );
207
229
trace_seq_printf (s , "%12llu " , cpu_data -> nmi_count );
230
+
231
+ if (params -> mode == MODE_HWNOISE ) {
232
+ trace_seq_printf (s , "\n" );
233
+ return ;
234
+ }
235
+
208
236
trace_seq_printf (s , "%12llu " , cpu_data -> irq_count );
209
237
trace_seq_printf (s , "%12llu " , cpu_data -> softirq_count );
210
238
trace_seq_printf (s , "%12llu\n" , cpu_data -> thread_count );
@@ -241,12 +269,12 @@ osnoise_print_stats(struct osnoise_top_params *params, struct osnoise_tool *top)
241
269
/*
242
270
* osnoise_top_usage - prints osnoise top usage message
243
271
*/
244
- void osnoise_top_usage (char * usage )
272
+ static void osnoise_top_usage (struct osnoise_top_params * params , char * usage )
245
273
{
246
274
int i ;
247
275
248
276
static const char * const msg [] = {
249
- " usage: rtla osnoise [top] [-h] [-q] [-D] [-d s] [-a us] [-p us] [-r us] [-s us] [-S us] \\" ,
277
+ " [-h] [-q] [-D] [-d s] [-a us] [-p us] [-r us] [-s us] [-S us] \\" ,
250
278
" [-T us] [-t[=file]] [-e sys[:event]] [--filter <filter>] [--trigger <trigger>] \\" ,
251
279
" [-c cpu-list] [-P priority]" ,
252
280
"" ,
@@ -277,9 +305,22 @@ void osnoise_top_usage(char *usage)
277
305
if (usage )
278
306
fprintf (stderr , "%s\n" , usage );
279
307
280
- fprintf (stderr , "rtla osnoise top: a per-cpu summary of the OS noise (version %s)\n" ,
308
+ if (params -> mode == MODE_OSNOISE ) {
309
+ fprintf (stderr ,
310
+ "rtla osnoise top: a per-cpu summary of the OS noise (version %s)\n" ,
281
311
VERSION );
282
312
313
+ fprintf (stderr , " usage: rtla osnoise [top]" );
314
+ }
315
+
316
+ if (params -> mode == MODE_HWNOISE ) {
317
+ fprintf (stderr ,
318
+ "rtla hwnoise: a summary of hardware-related noise (version %s)\n" ,
319
+ VERSION );
320
+
321
+ fprintf (stderr , " usage: rtla hwnoise" );
322
+ }
323
+
283
324
for (i = 0 ; msg [i ]; i ++ )
284
325
fprintf (stderr , "%s\n" , msg [i ]);
285
326
exit (1 );
@@ -299,6 +340,9 @@ struct osnoise_top_params *osnoise_top_parse_args(int argc, char **argv)
299
340
if (!params )
300
341
exit (1 );
301
342
343
+ if (strcmp (argv [0 ], "hwnoise" ) == 0 )
344
+ params -> mode = MODE_HWNOISE ;
345
+
302
346
while (1 ) {
303
347
static struct option long_options [] = {
304
348
{"auto" , required_argument , 0 , 'a' },
@@ -345,7 +389,7 @@ struct osnoise_top_params *osnoise_top_parse_args(int argc, char **argv)
345
389
case 'c' :
346
390
retval = parse_cpu_list (optarg , & params -> monitored_cpus );
347
391
if (retval )
348
- osnoise_top_usage ("\nInvalid -c cpu list\n" );
392
+ osnoise_top_usage (params , "\nInvalid -c cpu list\n" );
349
393
params -> cpus = optarg ;
350
394
break ;
351
395
case 'D' :
@@ -354,7 +398,7 @@ struct osnoise_top_params *osnoise_top_parse_args(int argc, char **argv)
354
398
case 'd' :
355
399
params -> duration = parse_seconds_duration (optarg );
356
400
if (!params -> duration )
357
- osnoise_top_usage ("Invalid -D duration\n" );
401
+ osnoise_top_usage (params , "Invalid -D duration\n" );
358
402
break ;
359
403
case 'e' :
360
404
tevent = trace_event_alloc (optarg );
@@ -370,17 +414,17 @@ struct osnoise_top_params *osnoise_top_parse_args(int argc, char **argv)
370
414
break ;
371
415
case 'h' :
372
416
case '?' :
373
- osnoise_top_usage (NULL );
417
+ osnoise_top_usage (params , NULL );
374
418
break ;
375
419
case 'p' :
376
420
params -> period = get_llong_from_str (optarg );
377
421
if (params -> period > 10000000 )
378
- osnoise_top_usage ("Period longer than 10 s\n" );
422
+ osnoise_top_usage (params , "Period longer than 10 s\n" );
379
423
break ;
380
424
case 'P' :
381
425
retval = parse_prio (optarg , & params -> sched_param );
382
426
if (retval == -1 )
383
- osnoise_top_usage ("Invalid -P priority" );
427
+ osnoise_top_usage (params , "Invalid -P priority" );
384
428
params -> set_sched = 1 ;
385
429
break ;
386
430
case 'q' :
@@ -389,7 +433,7 @@ struct osnoise_top_params *osnoise_top_parse_args(int argc, char **argv)
389
433
case 'r' :
390
434
params -> runtime = get_llong_from_str (optarg );
391
435
if (params -> runtime < 100 )
392
- osnoise_top_usage ("Runtime shorter than 100 us\n" );
436
+ osnoise_top_usage (params , "Runtime shorter than 100 us\n" );
393
437
break ;
394
438
case 's' :
395
439
params -> stop_us = get_llong_from_str (optarg );
@@ -415,7 +459,7 @@ struct osnoise_top_params *osnoise_top_parse_args(int argc, char **argv)
415
459
exit (EXIT_FAILURE );
416
460
}
417
461
} else {
418
- osnoise_top_usage ("--trigger requires a previous -e\n" );
462
+ osnoise_top_usage (params , "--trigger requires a previous -e\n" );
419
463
}
420
464
break ;
421
465
case '1' : /* filter */
@@ -426,11 +470,11 @@ struct osnoise_top_params *osnoise_top_parse_args(int argc, char **argv)
426
470
exit (EXIT_FAILURE );
427
471
}
428
472
} else {
429
- osnoise_top_usage ("--filter requires a previous -e\n" );
473
+ osnoise_top_usage (params , "--filter requires a previous -e\n" );
430
474
}
431
475
break ;
432
476
default :
433
- osnoise_top_usage ("Invalid option" );
477
+ osnoise_top_usage (params , "Invalid option" );
434
478
}
435
479
}
436
480
@@ -495,6 +539,14 @@ osnoise_top_apply_config(struct osnoise_tool *tool, struct osnoise_top_params *p
495
539
}
496
540
}
497
541
542
+ if (params -> mode == MODE_HWNOISE ) {
543
+ retval = osnoise_set_irq_disable (tool -> context , 1 );
544
+ if (retval ) {
545
+ err_msg ("Failed to set OSNOISE_IRQ_DISABLE option\n" );
546
+ goto out_err ;
547
+ }
548
+ }
549
+
498
550
return 0 ;
499
551
500
552
out_err :
0 commit comments