mirror of
https://github.com/apache/nuttx.git
synced 2026-06-01 07:45:16 +08:00
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:
@@ -118,6 +118,59 @@ static clock_t g_crit_start[CONFIG_SMP_NCPUS];
|
|||||||
clock_t g_premp_max[CONFIG_SMP_NCPUS];
|
clock_t g_premp_max[CONFIG_SMP_NCPUS];
|
||||||
clock_t g_crit_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
|
* Public Functions
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
@@ -302,7 +355,7 @@ void nxsched_suspend_critmon(FAR struct tcb_s *tcb)
|
|||||||
|
|
||||||
#ifdef CONFIG_SCHED_CPULOAD_CRITMONITOR
|
#ifdef CONFIG_SCHED_CPULOAD_CRITMONITOR
|
||||||
clock_t tick = elapsed * CLOCKS_PER_SEC / perf_getfreq();
|
clock_t tick = elapsed * CLOCKS_PER_SEC / perf_getfreq();
|
||||||
nxsched_process_taskload_ticks(tcb, tick);
|
nxsched_critmon_cpuload(tcb, current, tick);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
tcb->run_time += elapsed;
|
tcb->run_time += elapsed;
|
||||||
|
|||||||
Reference in New Issue
Block a user