You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by ma...@apache.org on 2021/09/29 07:23:23 UTC

[incubator-nuttx] 01/02: sched/sched_setpriority.c: Fix CPU affinity issues in SMP

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

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

commit cb38060db2540fec59459ca7f85e857f82e4f709
Author: chenhonglin <ch...@xiaomi.com>
AuthorDate: Tue Sep 28 11:23:06 2021 +0800

    sched/sched_setpriority.c: Fix CPU affinity issues in SMP
    
    In "nxsched_nexttcb": the task may not running on this_cpu,
    and rtrtcb->affinity(the affinity of the task in g_readytorun)
    may not include the current cpu which should be the tcb->cpu.
    
    Signed-off-by: chenhonglin <ch...@xiaomi.com>
---
 sched/sched/sched_setpriority.c | 9 ++++-----
 1 file changed, 4 insertions(+), 5 deletions(-)

diff --git a/sched/sched/sched_setpriority.c b/sched/sched/sched_setpriority.c
index 842926f..e07cbad 100644
--- a/sched/sched/sched_setpriority.c
+++ b/sched/sched/sched_setpriority.c
@@ -58,23 +58,22 @@ static FAR struct tcb_s *nxsched_nexttcb(FAR struct tcb_s *tcb)
 {
   FAR struct tcb_s *nxttcb = (FAR struct tcb_s *)tcb->flink;
   FAR struct tcb_s *rtrtcb;
-  int cpu = this_cpu();
 
   /* Which task should run next?  It will be either the next tcb in the
    * assigned task list (nxttcb) or a TCB in the g_readytorun list.  We can
    * only select a task from that list if the affinity mask includes the
-   * current CPU.
+   * tcb->cpu.
    *
    * If pre-emption is locked or another CPU is in a critical section,
    * then use the 'nxttcb' which will probably be the IDLE thread.
    */
 
-  if (!nxsched_islocked_global() && !irq_cpu_locked(cpu))
+  if (!nxsched_islocked_global() && !irq_cpu_locked(this_cpu()))
     {
-      /* Search for the highest priority task that can run on this CPU. */
+      /* Search for the highest priority task that can run on tcb->cpu. */
 
       for (rtrtcb = (FAR struct tcb_s *)g_readytorun.head;
-           rtrtcb != NULL && !CPU_ISSET(cpu, &rtrtcb->affinity);
+           rtrtcb != NULL && !CPU_ISSET(tcb->cpu, &rtrtcb->affinity);
            rtrtcb = (FAR struct tcb_s *)rtrtcb->flink);
 
       /* Return the TCB from the readyt-to-run list if it is the next