enqueue_task的作用
Linux scheduler在需要把一个task加入到某个cpu的红黑树运行队列上时,就会调用enqueue_task这个函数。我们可以看下这个函数的原型:
enqueue_task(rq, task, flags)
其中的flags就可能包含ENQUEUE_MIGRATED这个标志。
我们可能会从字面意思理解,ENQUEUE_MIGRATED表示所有跨CPU的task迁移,在入队列时都有这个标记,其实不是的。
enqueue flags
我们可以看内核代码:
#define ENQUEUE_WAKEUP 0x01
#define ENQUEUE_RESTORE 0x02
#define ENQUEUE_MOVE 0x04
#define ENQUEUE_NOCLOCK 0x08
#define ENQUEUE_HEAD 0x10
#define ENQUEUE_REPLENISH 0x20
#ifdef CONFIG_SMP
#define ENQUEUE_MIGRATED 0x40
#else
#define ENQUEUE_MIGRATED 0x00
#endif
其中的ENQUEUE_WAKEUP和ENQUEUE_MIGRATED是我们关心的,WAKEUP是指通过try_to_wake_up唤醒的task的enqueue标志,其中不包括fork。
而ENQUEUE_MIGRATED仅在ENQUEUE_WAKEUP存在的情况下才会有,表示这个wakeup的task经过了CPU迁移。
enqueue flags的作用
所以ENQUEUE_MIGRA