]> Pileus Git - ~andy/linux/blobdiff - kernel/sched/core.c
sched: Fix race in migrate_swap_stop()
[~andy/linux] / kernel / sched / core.c
index 89c5ae836f66627d584535863ce167c93e97e8ec..a972acd468b0838e2d08a4103db2c7e5476a2d6c 100644 (file)
@@ -1049,6 +1049,8 @@ static int migrate_swap_stop(void *data)
        src_rq = cpu_rq(arg->src_cpu);
        dst_rq = cpu_rq(arg->dst_cpu);
 
+       double_raw_lock(&arg->src_task->pi_lock,
+                       &arg->dst_task->pi_lock);
        double_rq_lock(src_rq, dst_rq);
        if (task_cpu(arg->dst_task) != arg->dst_cpu)
                goto unlock;
@@ -1069,6 +1071,8 @@ static int migrate_swap_stop(void *data)
 
 unlock:
        double_rq_unlock(src_rq, dst_rq);
+       raw_spin_unlock(&arg->dst_task->pi_lock);
+       raw_spin_unlock(&arg->src_task->pi_lock);
 
        return ret;
 }
@@ -1731,7 +1735,6 @@ static void __sched_fork(unsigned long clone_flags, struct task_struct *p)
 
        p->node_stamp = 0ULL;
        p->numa_scan_seq = p->mm ? p->mm->numa_scan_seq : 0;
-       p->numa_migrate_seq = 1;
        p->numa_scan_period = sysctl_numa_balancing_scan_delay;
        p->numa_work.next = &p->numa_work;
        p->numa_faults = NULL;
@@ -4488,7 +4491,6 @@ void sched_setnuma(struct task_struct *p, int nid)
                p->sched_class->put_prev_task(rq, p);
 
        p->numa_preferred_nid = nid;
-       p->numa_migrate_seq = 1;
 
        if (running)
                p->sched_class->set_curr_task(rq);