本文共 2302 字,大约阅读时间需要 7 分钟。
以下代码来自 pick_next_task_fair
6739 /* 6740 * Because of the set_next_buddy() in dequeue_task_fair() it is rather 6741 * likely that a next task is from the same cgroup as the current. 6742 * 6743 * Therefore attempt to avoid putting and setting the entire cgroup 6744 * hierarchy, only change the part that actually changes. 6745 */ 6746 6747 do { 6748 struct sched_entity *curr = cfs_rq->curr; 6749 6750 /* 6751 * Since we got here without doing put_prev_entity() we also 6752 * have to consider cfs_rq->curr. If it is still a runnable 6753 * entity, update_curr() will update its vruntime, otherwise 6754 * forget we've ever seen it. 6755 */ 6756 if (curr) { 6757 if (curr->on_rq) 6758 update_curr(cfs_rq); 6759 else 6760 curr = NULL; 6761 6762 /* 6763 * This call to check_cfs_rq_runtime() will do the 6764 * throttle and dequeue its entity in the parent(s). 6765 * Therefore the nr_running test will indeed 6766 * be correct. 6767 */ 6768 if (unlikely(check_cfs_rq_runtime(cfs_rq))) { 6769 cfs_rq = &rq->cfs; 6770 6771 if (!cfs_rq->nr_running) 6772 goto idle; 6773 6774 goto simple; 6775 } 6776 } 6777 6778 **se = pick_next_entity(cfs_rq, curr);** 6779 **cfs_rq = group_cfs_rq(se);** 6780 } while (cfs_rq);
279 /* runqueue "owned" by this group */ 280 static inline struct cfs_rq *group_cfs_rq(struct sched_entity *grp) 281 { 282 return grp->my_q; 283 }
1) 如果cpu 原始rq pick_next_entity选择的是非cgoup节点, 那么6779行返回空,即 my_q为空
2) 如果6778行选择的cgroup的根节点的sched_entity,那么会根据cgroup层次结构遍历一次遍历, 到最后的一层节点选出的sched_entity的my_q为空,则为真正的task entity4.19 calc_group_shares
转载地址:http://zploi.baihongyu.com/