Skip to content

Commit 2002c69

Browse files
Peter ZijlstraIngo Molnar
authored andcommitted
sched: release buddies on yield
Clear buddies on yield, so that the buddy rules don't schedule them despite them being placed right-most. This fixed a performance regression with yield-happy binary JVMs. Signed-off-by: Peter Zijlstra <[email protected]> Signed-off-by: Ingo Molnar <[email protected]> Tested-by: Lin Ming <[email protected]>
1 parent ad474ca commit 2002c69

File tree

1 file changed

+12
-5
lines changed

1 file changed

+12
-5
lines changed

kernel/sched_fair.c

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -716,6 +716,15 @@ enqueue_entity(struct cfs_rq *cfs_rq, struct sched_entity *se, int wakeup)
716716
__enqueue_entity(cfs_rq, se);
717717
}
718718

719+
static void clear_buddies(struct cfs_rq *cfs_rq, struct sched_entity *se)
720+
{
721+
if (cfs_rq->last == se)
722+
cfs_rq->last = NULL;
723+
724+
if (cfs_rq->next == se)
725+
cfs_rq->next = NULL;
726+
}
727+
719728
static void
720729
dequeue_entity(struct cfs_rq *cfs_rq, struct sched_entity *se, int sleep)
721730
{
@@ -738,11 +747,7 @@ dequeue_entity(struct cfs_rq *cfs_rq, struct sched_entity *se, int sleep)
738747
#endif
739748
}
740749

741-
if (cfs_rq->last == se)
742-
cfs_rq->last = NULL;
743-
744-
if (cfs_rq->next == se)
745-
cfs_rq->next = NULL;
750+
clear_buddies(cfs_rq, se);
746751

747752
if (se != cfs_rq->curr)
748753
__dequeue_entity(cfs_rq, se);
@@ -977,6 +982,8 @@ static void yield_task_fair(struct rq *rq)
977982
if (unlikely(cfs_rq->nr_running == 1))
978983
return;
979984

985+
clear_buddies(cfs_rq, se);
986+
980987
if (likely(!sysctl_sched_compat_yield) && curr->policy != SCHED_BATCH) {
981988
update_rq_clock(rq);
982989
/*

0 commit comments

Comments
 (0)