wake_up_new_task
=>int cpu __maybe_unused = get_cpu();
=>#define get_cpu() ({ preempt_disable(); smp_processor_id(); })
=>cpu = select_task_rq(p, SD_BALANCE_FORK, 0);//根据负载选择一个合适的CPU
=>set_task_cpu(p, cpu);//讲p进程绑定到该cpu
=>rq = cpu_rq(cpu);//取该CPU的运行队列
=>raw_spin_lock_irqsave(&rq->lock, flags);
=>p->state = TASK_RUNNING;//进程进入运行态
=>update_rq_clock(rq);
=>activate_task(rq, p, 0);//新进程入队列
=>enqueue_task(rq, p, wakeup, false);
=>p->sched_class->enqueue_task(rq, p, wakeup, head);//Sched_fair.c (kernel): .enqueue_task = enqueue_task_fair,
=>for_each_sched_entity(se) {
if (se->on_rq)
break;
cfs_rq = cfs_rq_of(se);
enqueue_entity(cfs_rq, se, flags);
=>if (!(flags & ENQUEUE_WAKEUP) || (flags & ENQUEUE_MIGRATE))
se->vruntime += cfs_rq->min_vruntime;
=>update_curr(cfs_rq);
account_entity_enqueue(cfs_rq, se);
=>if (flags & ENQUEUE_WAKEUP) {
place_entity(cfs_rq, se, 0);
enqueue_sleeper(cfs_rq, se);
=>update_stats_enqueue(cfs_rq, se);
=>check_spread(cfs_rq, se);
=>if (se != cfs_rq->curr)
__enqueue_entity(cfs_rq, se);//进红黑树
}
flags = ENQUEUE_WAKEUP;
}
=>p->se.on_rq = 1;
=>inc_nr_running(rq);
=>check_preempt_curr(rq, p, WF_FORK);
=>p->sched_class->task_woken(rq, p);
=>task_rq_unlock(rq, &flags);
=>put_cpu();
=>#define put_cpu() preempt_enable()