@@ -423,6 +423,86 @@ void osnoise_put_timerlat_period_us(struct osnoise_context *context)
423423 context -> orig_timerlat_period_us = OSNOISE_TIME_INIT_VAL ;
424424}
425425
426+ /*
427+ * osnoise_get_timerlat_align_us - read and save the original "timerlat_align_us"
428+ */
429+ static long long
430+ osnoise_get_timerlat_align_us (struct osnoise_context * context )
431+ {
432+ long long timerlat_align_us ;
433+
434+ if (context -> timerlat_align_us != OSNOISE_OPTION_INIT_VAL )
435+ return context -> timerlat_align_us ;
436+
437+ if (context -> orig_timerlat_align_us != OSNOISE_OPTION_INIT_VAL )
438+ return context -> orig_timerlat_align_us ;
439+
440+ timerlat_align_us = osnoise_read_ll_config ("osnoise/timerlat_align_us" );
441+ if (timerlat_align_us < 0 )
442+ goto out_err ;
443+
444+ context -> orig_timerlat_align_us = timerlat_align_us ;
445+ return timerlat_align_us ;
446+
447+ out_err :
448+ return OSNOISE_OPTION_INIT_VAL ;
449+ }
450+
451+ /*
452+ * osnoise_set_timerlat_align_us - set "timerlat_align_us"
453+ */
454+ int osnoise_set_timerlat_align_us (struct osnoise_context * context , long long timerlat_align_us )
455+ {
456+ long long curr_timerlat_align_us = osnoise_get_timerlat_align_us (context );
457+ int retval ;
458+
459+ if (curr_timerlat_align_us == OSNOISE_OPTION_INIT_VAL )
460+ return -1 ;
461+
462+ retval = osnoise_write_ll_config ("osnoise/timerlat_align_us" , timerlat_align_us );
463+ if (retval < 0 )
464+ return -1 ;
465+
466+ context -> timerlat_align_us = timerlat_align_us ;
467+
468+ return 0 ;
469+ }
470+
471+ /*
472+ * osnoise_restore_timerlat_align_us - restore "timerlat_align_us"
473+ */
474+ void osnoise_restore_timerlat_align_us (struct osnoise_context * context )
475+ {
476+ int retval ;
477+
478+ if (context -> orig_timerlat_align_us == OSNOISE_OPTION_INIT_VAL )
479+ return ;
480+
481+ if (context -> orig_timerlat_align_us == context -> timerlat_align_us )
482+ goto out_done ;
483+
484+ retval = osnoise_write_ll_config ("osnoise/timerlat_align_us" ,
485+ context -> orig_timerlat_align_us );
486+ if (retval < 0 )
487+ err_msg ("Could not restore original osnoise timerlat_align_us\n" );
488+
489+ out_done :
490+ context -> timerlat_align_us = OSNOISE_OPTION_INIT_VAL ;
491+ }
492+
493+ /*
494+ * osnoise_put_timerlat_align_us - restore original values and cleanup data
495+ */
496+ void osnoise_put_timerlat_align_us (struct osnoise_context * context )
497+ {
498+ osnoise_restore_timerlat_align_us (context );
499+
500+ if (context -> orig_timerlat_align_us == OSNOISE_OPTION_INIT_VAL )
501+ return ;
502+
503+ context -> orig_timerlat_align_us = OSNOISE_OPTION_INIT_VAL ;
504+ }
505+
426506/*
427507 * osnoise_get_stop_us - read and save the original "stop_tracing_us"
428508 */
@@ -908,6 +988,67 @@ static void osnoise_put_workload(struct osnoise_context *context)
908988 context -> orig_opt_workload = OSNOISE_OPTION_INIT_VAL ;
909989}
910990
991+ static int osnoise_get_timerlat_align (struct osnoise_context * context )
992+ {
993+ if (context -> opt_timerlat_align != OSNOISE_OPTION_INIT_VAL )
994+ return context -> opt_timerlat_align ;
995+
996+ if (context -> orig_opt_timerlat_align != OSNOISE_OPTION_INIT_VAL )
997+ return context -> orig_opt_timerlat_align ;
998+
999+ context -> orig_opt_timerlat_align = osnoise_options_get_option ("TIMERLAT_ALIGN" );
1000+
1001+ return context -> orig_opt_timerlat_align ;
1002+ }
1003+
1004+ int osnoise_set_timerlat_align (struct osnoise_context * context , bool onoff )
1005+ {
1006+ int opt_timerlat_align = osnoise_get_timerlat_align (context );
1007+ int retval ;
1008+
1009+ if (opt_timerlat_align == OSNOISE_OPTION_INIT_VAL )
1010+ return -1 ;
1011+
1012+ if (opt_timerlat_align == onoff )
1013+ return 0 ;
1014+
1015+ retval = osnoise_options_set_option ("TIMERLAT_ALIGN" , onoff );
1016+ if (retval < 0 )
1017+ return -2 ;
1018+
1019+ context -> opt_timerlat_align = onoff ;
1020+
1021+ return 0 ;
1022+ }
1023+
1024+ static void osnoise_restore_timerlat_align (struct osnoise_context * context )
1025+ {
1026+ int retval ;
1027+
1028+ if (context -> orig_opt_timerlat_align == OSNOISE_OPTION_INIT_VAL )
1029+ return ;
1030+
1031+ if (context -> orig_opt_timerlat_align == context -> opt_timerlat_align )
1032+ goto out_done ;
1033+
1034+ retval = osnoise_options_set_option ("TIMERLAT_ALIGN" , context -> orig_opt_timerlat_align );
1035+ if (retval < 0 )
1036+ err_msg ("Could not restore original TIMERLAT_ALIGN option\n" );
1037+
1038+ out_done :
1039+ context -> orig_opt_timerlat_align = OSNOISE_OPTION_INIT_VAL ;
1040+ }
1041+
1042+ static void osnoise_put_timerlat_align (struct osnoise_context * context )
1043+ {
1044+ osnoise_restore_timerlat_align (context );
1045+
1046+ if (context -> orig_opt_timerlat_align == OSNOISE_OPTION_INIT_VAL )
1047+ return ;
1048+
1049+ context -> orig_opt_timerlat_align = OSNOISE_OPTION_INIT_VAL ;
1050+ }
1051+
9111052enum {
9121053 FLAG_CONTEXT_NEWLY_CREATED = (1 << 0 ),
9131054 FLAG_CONTEXT_DELETED = (1 << 1 ),
@@ -960,6 +1101,12 @@ struct osnoise_context *osnoise_context_alloc(void)
9601101 context -> orig_opt_workload = OSNOISE_OPTION_INIT_VAL ;
9611102 context -> opt_workload = OSNOISE_OPTION_INIT_VAL ;
9621103
1104+ context -> orig_opt_timerlat_align = OSNOISE_OPTION_INIT_VAL ;
1105+ context -> opt_timerlat_align = OSNOISE_OPTION_INIT_VAL ;
1106+
1107+ context -> orig_timerlat_align_us = OSNOISE_OPTION_INIT_VAL ;
1108+ context -> timerlat_align_us = OSNOISE_OPTION_INIT_VAL ;
1109+
9631110 osnoise_get_context (context );
9641111
9651112 return context ;
@@ -988,6 +1135,8 @@ void osnoise_put_context(struct osnoise_context *context)
9881135 osnoise_put_tracing_thresh (context );
9891136 osnoise_put_irq_disable (context );
9901137 osnoise_put_workload (context );
1138+ osnoise_put_timerlat_align (context );
1139+ osnoise_put_timerlat_align_us (context );
9911140
9921141 free (context );
9931142}
0 commit comments