diff options
author | Ingo Molnar <mingo@elte.hu> | 2007-10-15 11:00:05 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2007-10-15 11:00:05 -0400 |
commit | 2e09bf556fbe1a4cd8d837a3e6607de55f7cf4fd (patch) | |
tree | e73fc7738893ec5c50c3b2e626d4b2ed0809ddbe /kernel | |
parent | 5c6b5964a0629bd39fbf4e5648a8aca32de5bcaf (diff) |
sched: wakeup granularity increase
increase wakeup granularity - we were overscheduling a bit.
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
Signed-off-by: Mike Galbraith <efault@gmx.de>
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/sched_fair.c | 27 |
1 files changed, 11 insertions, 16 deletions
diff --git a/kernel/sched_fair.c b/kernel/sched_fair.c index 45c7493d8ca8..a60b1dac598a 100644 --- a/kernel/sched_fair.c +++ b/kernel/sched_fair.c | |||
@@ -74,7 +74,7 @@ const_debug unsigned int sysctl_sched_batch_wakeup_granularity = 25000000UL; | |||
74 | * and reduces their over-scheduling. Synchronous workloads will still | 74 | * and reduces their over-scheduling. Synchronous workloads will still |
75 | * have immediate wakeup/sleep latencies. | 75 | * have immediate wakeup/sleep latencies. |
76 | */ | 76 | */ |
77 | const_debug unsigned int sysctl_sched_wakeup_granularity = 1000000UL; | 77 | const_debug unsigned int sysctl_sched_wakeup_granularity = 2000000UL; |
78 | 78 | ||
79 | unsigned int sysctl_sched_runtime_limit __read_mostly; | 79 | unsigned int sysctl_sched_runtime_limit __read_mostly; |
80 | 80 | ||
@@ -582,7 +582,7 @@ dequeue_entity(struct cfs_rq *cfs_rq, struct sched_entity *se, int sleep) | |||
582 | * Preempt the current task with a newly woken task if needed: | 582 | * Preempt the current task with a newly woken task if needed: |
583 | */ | 583 | */ |
584 | static void | 584 | static void |
585 | __check_preempt_curr_fair(struct cfs_rq *cfs_rq, struct sched_entity *curr) | 585 | check_preempt_tick(struct cfs_rq *cfs_rq, struct sched_entity *curr) |
586 | { | 586 | { |
587 | unsigned long ideal_runtime, delta_exec; | 587 | unsigned long ideal_runtime, delta_exec; |
588 | 588 | ||
@@ -646,8 +646,6 @@ static void put_prev_entity(struct cfs_rq *cfs_rq, struct sched_entity *prev) | |||
646 | 646 | ||
647 | static void entity_tick(struct cfs_rq *cfs_rq, struct sched_entity *curr) | 647 | static void entity_tick(struct cfs_rq *cfs_rq, struct sched_entity *curr) |
648 | { | 648 | { |
649 | struct sched_entity *next; | ||
650 | |||
651 | /* | 649 | /* |
652 | * Dequeue and enqueue the task to update its | 650 | * Dequeue and enqueue the task to update its |
653 | * position within the tree: | 651 | * position within the tree: |
@@ -655,14 +653,8 @@ static void entity_tick(struct cfs_rq *cfs_rq, struct sched_entity *curr) | |||
655 | dequeue_entity(cfs_rq, curr, 0); | 653 | dequeue_entity(cfs_rq, curr, 0); |
656 | enqueue_entity(cfs_rq, curr, 0); | 654 | enqueue_entity(cfs_rq, curr, 0); |
657 | 655 | ||
658 | /* | 656 | if (cfs_rq->nr_running > 1) |
659 | * Reschedule if another task tops the current one. | 657 | check_preempt_tick(cfs_rq, curr); |
660 | */ | ||
661 | next = __pick_next_entity(cfs_rq); | ||
662 | if (next == curr) | ||
663 | return; | ||
664 | |||
665 | __check_preempt_curr_fair(cfs_rq, curr); | ||
666 | } | 658 | } |
667 | 659 | ||
668 | /************************************************** | 660 | /************************************************** |
@@ -852,7 +844,7 @@ static void yield_task_fair(struct rq *rq, struct task_struct *p) | |||
852 | /* | 844 | /* |
853 | * Preempt the current task with a newly woken task if needed: | 845 | * Preempt the current task with a newly woken task if needed: |
854 | */ | 846 | */ |
855 | static void check_preempt_curr_fair(struct rq *rq, struct task_struct *p) | 847 | static void check_preempt_wakeup(struct rq *rq, struct task_struct *p) |
856 | { | 848 | { |
857 | struct task_struct *curr = rq->curr; | 849 | struct task_struct *curr = rq->curr; |
858 | struct cfs_rq *cfs_rq = task_cfs_rq(curr); | 850 | struct cfs_rq *cfs_rq = task_cfs_rq(curr); |
@@ -863,9 +855,12 @@ static void check_preempt_curr_fair(struct rq *rq, struct task_struct *p) | |||
863 | resched_task(curr); | 855 | resched_task(curr); |
864 | return; | 856 | return; |
865 | } | 857 | } |
858 | if (is_same_group(curr, p)) { | ||
859 | s64 delta = curr->se.vruntime - p->se.vruntime; | ||
866 | 860 | ||
867 | if (is_same_group(curr, p)) | 861 | if (delta > (s64)sysctl_sched_wakeup_granularity) |
868 | __check_preempt_curr_fair(cfs_rq, &curr->se); | 862 | resched_task(curr); |
863 | } | ||
869 | } | 864 | } |
870 | 865 | ||
871 | static struct task_struct *pick_next_task_fair(struct rq *rq) | 866 | static struct task_struct *pick_next_task_fair(struct rq *rq) |
@@ -1095,7 +1090,7 @@ struct sched_class fair_sched_class __read_mostly = { | |||
1095 | .dequeue_task = dequeue_task_fair, | 1090 | .dequeue_task = dequeue_task_fair, |
1096 | .yield_task = yield_task_fair, | 1091 | .yield_task = yield_task_fair, |
1097 | 1092 | ||
1098 | .check_preempt_curr = check_preempt_curr_fair, | 1093 | .check_preempt_curr = check_preempt_wakeup, |
1099 | 1094 | ||
1100 | .pick_next_task = pick_next_task_fair, | 1095 | .pick_next_task = pick_next_task_fair, |
1101 | .put_prev_task = put_prev_task_fair, | 1096 | .put_prev_task = put_prev_task_fair, |