sched/cpuload: fix SMP situation CPULOAD statistics are inaccurate

When statistics when sched_cpuload_critMonitor, thread switching only
calculates the current CPU's running time. Other CPU running threads
are updated for updates

Signed-off-by: yinshengkai <yinshengkai@xiaomi.com>
This commit is contained in:
yinshengkai 2024-01-18 22:37:29 +08:00 committed by Xiang Xiao
parent f95b73f9a8
commit 6b07284c61

View File

@ -118,6 +118,59 @@ static clock_t g_crit_start[CONFIG_SMP_NCPUS];
clock_t g_premp_max[CONFIG_SMP_NCPUS];
clock_t g_crit_max[CONFIG_SMP_NCPUS];
/****************************************************************************
* Private Functions
****************************************************************************/
/****************************************************************************
* Name: nxsched_critmon_cpuload
*
* Description:
* Update the running time of all running threads when switching threads
*
* Input Parameters:
* tcb - The task that we are performing the load operations on.
* current - The current time
* tick - The ticks that we process in this cpuload.
*
* Returned Value:
* None
*
****************************************************************************/
#ifdef CONFIG_SCHED_CPULOAD_CRITMONITOR
static void nxsched_critmon_cpuload(FAR struct tcb_s *tcb, clock_t current,
clock_t tick)
{
int i;
UNUSED(i);
/* Update the cpuload of the thread ready to be suspended */
nxsched_process_taskload_ticks(tcb, tick);
/* Update the cpuload of threads running on other CPUs */
# ifdef CONFIG_SMP
for (i = 0; i < CONFIG_SMP_NCPUS; i++)
{
FAR struct tcb_s *rtcb = current_task(i);
if (tcb->cpu == rtcb->cpu)
{
continue;
}
nxsched_process_taskload_ticks(rtcb, tick);
/* Update start time, avoid repeated statistics when the next call */
rtcb->run_start = current;
}
# endif
}
#endif
/****************************************************************************
* Public Functions
****************************************************************************/
@ -302,7 +355,7 @@ void nxsched_suspend_critmon(FAR struct tcb_s *tcb)
#ifdef CONFIG_SCHED_CPULOAD_CRITMONITOR
clock_t tick = elapsed * CLOCKS_PER_SEC / perf_getfreq();
nxsched_process_taskload_ticks(tcb, tick);
nxsched_critmon_cpuload(tcb, current, tick);
#endif
tcb->run_time += elapsed;