Messages in this thread | | | Date | Mon, 16 Jan 2012 17:50:15 +0800 | From | Michael Wang <> | Subject | Re: [PATCH] sched: Accelerate "pick_next_entity" under special condition |
| |
On 01/16/2012 05:37 PM, Michael Wang wrote:
> 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. >
Please tell me if I got wrong understanding on these code, I think the change can maintain the old logic and suppose to be a little quick in some condition.
> 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)
I want to use a name which can make it more easy to be understand, please tell me if it is a bad idea...
Regards, Michael Wang
> + > /* > * 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; > } >
| |