Messages in this thread Patch in this message | | | Date | Mon, 16 Jan 2012 17:37:02 +0800 | From | Michael Wang <> | Subject | [PATCH] sched: Accelerate "pick_next_entity" under special condition |
| |
From: Michael Wang <wangyun@linux.vnet.ibm.com>
We can avoid some useless operation in some special condition.
For example: If we have "cfs_rq->next" and it can be use, we just return it directly.
Signed-off-by: Michael Wang <wangyun@linux.vnet.ibm.com> --- kernel/sched/fair.c | 28 +++++++++++++++++----------- 1 files changed, 17 insertions(+), 11 deletions(-)
diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c index 84adb2d..9fc2c3c 100644 --- a/kernel/sched/fair.c +++ b/kernel/sched/fair.c @@ -1295,6 +1295,8 @@ set_next_entity(struct cfs_rq *cfs_rq, struct sched_entity *se) static int wakeup_preempt_entity(struct sched_entity *curr, struct sched_entity *se); +#define ENTITY_PREEMPT_ALLOWED(prev,next) (wakeup_preempt_entity(prev, next) < 1) + /* * Pick the next process, keeping these things in mind, in this order: * 1) keep things fair between processes/task groups @@ -1308,29 +1310,33 @@ static struct sched_entity *pick_next_entity(struct cfs_rq *cfs_rq) struct sched_entity *left = se; /* - * Avoid running the skip buddy, if running something else can - * be done without getting too unfair. + * Someone really wants this to run. If it's not unfair, run it. */ - if (cfs_rq->skip == se) { - struct sched_entity *second = __pick_next_entity(se); - if (second && wakeup_preempt_entity(second, left) < 1) - se = second; + if (cfs_rq->next && ENTITY_PREEMPT_ALLOWED(cfs_rq->next, left)) { + se = cfs_rq->next; + goto out; } /* * Prefer last buddy, try to return the CPU to a preempted task. */ - if (cfs_rq->last && wakeup_preempt_entity(cfs_rq->last, left) < 1) + if (cfs_rq->last && ENTITY_PREEMPT_ALLOWED(cfs_rq->last, left)) { se = cfs_rq->last; + goto out; + } /* - * Someone really wants this to run. If it's not unfair, run it. + * Avoid running the skip buddy, if running something else can + * be done without getting too unfair. */ - if (cfs_rq->next && wakeup_preempt_entity(cfs_rq->next, left) < 1) - se = cfs_rq->next; + if (cfs_rq->skip == se) { + struct sched_entity *second = __pick_next_entity(se); + if (second && ENTITY_PREEMPT_ALLOWED(second, left)) + se = second; + } +out: clear_buddies(cfs_rq, se); - return se; } -- 1.7.4.1
| |