Linux内核如何在多核间迁移进程?

How does Linux kernel migrate the process among multiple cores?

上下文:

进程 1 正在核心 0 上执行。 Core-1 空闲。

现在,process-1 使用 sched_setaffinity() 将其 CPU affinity 更改为 core-1。

问题:

哪些内核函数将 process-1 迁移到 core-1 上执行?

这里是从内核中的sched_setaffinity系统调用入口点开始的调用顺序:

  1. sys_sched_setaffinity.
  2. sched_setaffinity.
  3. __set_cpus_allowed_ptr.

在最后一个函数中,有两种情况,如line 1101处的代码所示:

if (task_running(rq, p) || p->state == TASK_WAKING) {
    // ...
    stop_one_cpu(cpu_of(rq), migration_cpu_stop, &arg);
    // ...
} else if (task_on_rq_queued(p)) {
    rq = move_queued_task(rq, &rf, p, dest_cpu);
}

如果要迁移的任务当前运行或正在唤醒,则通过调用stop_one_cpu进行迁移,依次调用以下函数:

  1. migration_cpu_stop.
  2. __migrate_task.
  3. move_queued_task.

最后一个函数 move_queued_task 是实际将任务从当前运行队列移动到目标运行队列的函数。请注意,这与从 __set_cpus_allowed_ptr 的另一个分支调用的函数相同。该分支处理任务处于任何其他状态的情况。