Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 69024
b: refs/heads/master
c: 4d78e7b
h: refs/heads/master
v: v3
  • Loading branch information
Peter Zijlstra authored and Ingo Molnar committed Oct 15, 2007
1 parent 77ba2da commit 94f4da2
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 10 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 6cb58195143b55d4c427d92f8425bec2b0d9c56c
refs/heads/master: 4d78e7b656aa6440c337302fe065338ce840a64e
36 changes: 27 additions & 9 deletions trunk/kernel/sched_fair.c
Original file line number Diff line number Diff line change
Expand Up @@ -203,6 +203,20 @@ static struct sched_entity *__pick_next_entity(struct cfs_rq *cfs_rq)
* Scheduling class statistics methods:
*/

static u64 __sched_period(unsigned long nr_running)
{
u64 period = sysctl_sched_latency;
unsigned long nr_latency =
sysctl_sched_latency / sysctl_sched_min_granularity;

if (unlikely(nr_running > nr_latency)) {
period *= nr_running;
do_div(period, nr_latency);
}

return period;
}

/*
* Calculate the preemption granularity needed to schedule every
* runnable task once per sysctl_sched_latency amount of time.
Expand Down Expand Up @@ -1103,6 +1117,8 @@ static void task_tick_fair(struct rq *rq, struct task_struct *curr)
}
}

#define swap(a,b) do { typeof(a) tmp = (a); (a) = (b); (b) = tmp; } while (0)

/*
* Share the fairness runtime between parent and child, thus the
* total amount of pressure for CPU stays equal - new tasks
Expand All @@ -1118,14 +1134,9 @@ static void task_new_fair(struct rq *rq, struct task_struct *p)
sched_info_queued(p);

update_curr(cfs_rq);
se->vruntime = cfs_rq->min_vruntime;
update_stats_enqueue(cfs_rq, se);
/*
* Child runs first: we let it run before the parent
* until it reschedules once. We set up the key so that
* it will preempt the parent:
*/
se->fair_key = curr->fair_key -
niced_granularity(curr, sched_granularity(cfs_rq)) - 1;

/*
* The first wait is dominated by the child-runs-first logic,
* so do not credit it with that waiting time yet:
Expand All @@ -1138,9 +1149,16 @@ static void task_new_fair(struct rq *rq, struct task_struct *p)
* -granularity/2, so initialize the task with that:
*/
if (sched_feat(START_DEBIT))
se->wait_runtime = -(sched_granularity(cfs_rq) / 2);
se->wait_runtime = -(__sched_period(cfs_rq->nr_running+1) / 2);

if (sysctl_sched_child_runs_first &&
curr->vruntime < se->vruntime) {

dequeue_entity(cfs_rq, curr, 0);
swap(curr->vruntime, se->vruntime);
enqueue_entity(cfs_rq, curr, 0);
}

se->vruntime = cfs_rq->min_vruntime;
update_stats_enqueue(cfs_rq, se);
__enqueue_entity(cfs_rq, se);
resched_task(rq->curr);
Expand Down

0 comments on commit 94f4da2

Please sign in to comment.