Commit a571bbea authored by Peter Zijlstra's avatar Peter Zijlstra Committed by Ingo Molnar

sched: fix buddie group latency

Similar to the previous patch, by not clearing buddies we can select entities
past their run quota, which can increase latency. This means we have to clear
group buddies as well.

Do not use the group clear for pick_next_task(), otherwise that'll get O(n^2).
Signed-off-by: default avatarPeter Zijlstra <a.p.zijlstra@chello.nl>
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
parent a9f3e2b5
...@@ -719,7 +719,7 @@ enqueue_entity(struct cfs_rq *cfs_rq, struct sched_entity *se, int wakeup) ...@@ -719,7 +719,7 @@ enqueue_entity(struct cfs_rq *cfs_rq, struct sched_entity *se, int wakeup)
__enqueue_entity(cfs_rq, se); __enqueue_entity(cfs_rq, se);
} }
static void clear_buddies(struct cfs_rq *cfs_rq, struct sched_entity *se) static void __clear_buddies(struct cfs_rq *cfs_rq, struct sched_entity *se)
{ {
if (cfs_rq->last == se) if (cfs_rq->last == se)
cfs_rq->last = NULL; cfs_rq->last = NULL;
...@@ -728,6 +728,12 @@ static void clear_buddies(struct cfs_rq *cfs_rq, struct sched_entity *se) ...@@ -728,6 +728,12 @@ static void clear_buddies(struct cfs_rq *cfs_rq, struct sched_entity *se)
cfs_rq->next = NULL; cfs_rq->next = NULL;
} }
static void clear_buddies(struct cfs_rq *cfs_rq, struct sched_entity *se)
{
for_each_sched_entity(se)
__clear_buddies(cfs_rq_of(se), se);
}
static void static void
dequeue_entity(struct cfs_rq *cfs_rq, struct sched_entity *se, int sleep) dequeue_entity(struct cfs_rq *cfs_rq, struct sched_entity *se, int sleep)
{ {
...@@ -1455,7 +1461,7 @@ static struct task_struct *pick_next_task_fair(struct rq *rq) ...@@ -1455,7 +1461,7 @@ static struct task_struct *pick_next_task_fair(struct rq *rq)
* If se was a buddy, clear it so that it will have to earn * If se was a buddy, clear it so that it will have to earn
* the favour again. * the favour again.
*/ */
clear_buddies(cfs_rq, se); __clear_buddies(cfs_rq, se);
set_next_entity(cfs_rq, se); set_next_entity(cfs_rq, se);
cfs_rq = group_cfs_rq(se); cfs_rq = group_cfs_rq(se);
} while (cfs_rq); } while (cfs_rq);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment