From: Scott Wood <[email protected]>

commit adfa969d4cfcc995a9d866020124e50f1827d2d1 in linux-rt-devel.

migrate_enable() currently open-codes a variant of select_fallback_rq().
However, it does not have the "No more Mr. Nice Guy" fallback and thus
it will pass an invalid CPU to the migration thread if cpus_mask only
contains a CPU that is !active.

Signed-off-by: Scott Wood <[email protected]>
Signed-off-by: Sebastian Andrzej Siewior <[email protected]>
Signed-off-by: Paul Gortmaker <[email protected]>

diff --git a/kernel/sched/core.c b/kernel/sched/core.c
index fb4e86e6ff20..af1a51cbcf65 100644
--- a/kernel/sched/core.c
+++ b/kernel/sched/core.c
@@ -7416,6 +7416,7 @@ void migrate_enable(void)
        if (p->migrate_disable_update) {
                struct rq *rq;
                struct rq_flags rf;
+               int cpu = task_cpu(p);
 
                rq = task_rq_lock(p, &rf);
                update_rq_clock(rq);
@@ -7425,21 +7426,15 @@ void migrate_enable(void)
 
                p->migrate_disable_update = 0;
 
-               WARN_ON(smp_processor_id() != task_cpu(p));
-               if (!cpumask_test_cpu(task_cpu(p), &p->cpus_mask)) {
-                       const struct cpumask *cpu_valid_mask = cpu_active_mask;
-                       struct migration_arg arg;
-                       unsigned int dest_cpu;
-
-                       if (p->flags & PF_KTHREAD) {
-                               /*
-                                * Kernel threads are allowed on online && 
!active CPUs
-                                */
-                               cpu_valid_mask = cpu_online_mask;
-                       }
-                       dest_cpu = cpumask_any_and(cpu_valid_mask, 
&p->cpus_mask);
-                       arg.task = p;
-                       arg.dest_cpu = dest_cpu;
+               WARN_ON(smp_processor_id() != cpu);
+               if (!cpumask_test_cpu(cpu, &p->cpus_mask)) {
+                       struct migration_arg arg = { p };
+                       struct rq_flags rf;
+
+                       rq = task_rq_lock(p, &rf);
+                       update_rq_clock(rq);
+                       arg.dest_cpu = select_fallback_rq(cpu, p);
+                       task_rq_unlock(rq, p, &rf);
 
                        unpin_current_cpu();
                        preempt_lazy_enable();
-- 
2.7.4

-=-=-=-=-=-=-=-=-=-=-=-
Links: You receive all messages sent to this group.

View/Reply Online (#8676): 
https://lists.yoctoproject.org/g/linux-yocto/message/8676
Mute This Topic: https://lists.yoctoproject.org/mt/74330070/21656
Group Owner: [email protected]
Unsubscribe: https://lists.yoctoproject.org/g/linux-yocto/unsub  
[[email protected]]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to