This is an automated email from the ASF dual-hosted git repository.

xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git

commit f88afa5825b50431966ce2deb9cf35ccc1c018a8
Author: yinshengkai <[email protected]>
AuthorDate: Thu Jan 18 22:37:29 2024 +0800

    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 <[email protected]>
---
 sched/sched/sched_critmonitor.c | 53 +++++++++++++++++++++++++++++++++++++++++
 1 file changed, 53 insertions(+)

diff --git a/sched/sched/sched_critmonitor.c b/sched/sched/sched_critmonitor.c
index 69b32a2af6..15a5d479c8 100644
--- a/sched/sched/sched_critmonitor.c
+++ b/sched/sched/sched_critmonitor.c
@@ -153,6 +153,59 @@ static void nxsched_critmon_cpuload(FAR struct tcb_s *tcb, 
clock_t current,
 }
 #endif
 
+/****************************************************************************
+ * 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
  ****************************************************************************/

Reply via email to