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