sched/sched_setpriority.c: Fix CPU affinity issues in SMP

THOR-208

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 <chenhonglin@xiaomi.com>
Change-Id: I2523c9431b480a3afeb29a9260804c5b37e91d4b
This commit is contained in:
chenhonglin
2021-09-24 18:10:30 +08:00
parent 1621fcb09e
commit 070ad15f14
+2 -3
View File
@@ -58,7 +58,6 @@ 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
@@ -69,12 +68,12 @@ static FAR struct tcb_s *nxsched_nexttcb(FAR struct tcb_s *tcb)
* 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. */
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