Opened on 11/23/17 at 06:16:22
#3253 assigned defect
Fix execution time in time partitioning environments
Reported by: | Sebastian Huber | Owned by: | Sebastian Huber |
---|---|---|---|
Priority: | normal | Milestone: | Indefinite |
Component: | score | Version: | |
Severity: | normal | Keywords: | |
Cc: | Blocked By: | ||
Blocking: |
Description
Currently, the uptime is used to measure execution times in RTEMS. This could be wrong in time partitioning environments, e.g. the RTEMS application is a hypervisor guest. Here the guest execution may take place in time slots. The _TOD_Get_uptime() is currently used for the rate-monotonic statistics and thread CPU time used. For example:
RTEMS_INLINE_ROUTINE void _Thread_Update_CPU_time_used( Thread_Control *the_thread, Per_CPU_Control *cpu ) { Timestamp_Control last; Timestamp_Control ran; last = cpu->cpu_usage_timestamp; _TOD_Get_uptime( &cpu->cpu_usage_timestamp ); _Timestamp_Subtract( &last, &cpu->cpu_usage_timestamp, &ran ); _Timestamp_Add_to( &the_thread->cpu_time_used, &ran ); }
One approach to fix this problem would be some notification through a high priority guest interrupt by the hypervisor during time slot begin. However, _Thread_Update_CPU_time_used() is called with guest interrupts disabled.
Another approach would be to introduce a _TOD_Get_system_execution_time() and define this to _TOD_Get_uptime() if RTEMS_PARAVIRT is not defined, otherwise add a new CPU port function _CPU_Get_system_execution_time() which must be provided by the hypervisor guest support.
The difference between system execution time and uptime could be displayed in system diagnostic utilities, e.g. rtems_cpu_usage_report_with_plugin().