diff options
| author | Chen Shang <shangcs@gmail.com> | 2005-06-25 17:57:31 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-06-25 19:24:44 -0400 |
| commit | a3464a102a69a4e00efb0a763e274ce290995b4b (patch) | |
| tree | 63a9301d4a02dfcefd8dff70f033c634aa93bb2f | |
| parent | 77391d71681d05d2f4502f91ad62618522abf624 (diff) | |
[PATCH] sched: micro-optimize task requeueing in schedule()
micro-optimize task requeueing in schedule() & clean up recalc_task_prio().
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
| -rw-r--r-- | kernel/sched.c | 19 |
1 files changed, 12 insertions, 7 deletions
diff --git a/kernel/sched.c b/kernel/sched.c index 6e452eb95ac3..a3d1c8e43d34 100644 --- a/kernel/sched.c +++ b/kernel/sched.c | |||
| @@ -673,7 +673,7 @@ static inline void __activate_idle_task(task_t *p, runqueue_t *rq) | |||
| 673 | rq->nr_running++; | 673 | rq->nr_running++; |
| 674 | } | 674 | } |
| 675 | 675 | ||
| 676 | static void recalc_task_prio(task_t *p, unsigned long long now) | 676 | static int recalc_task_prio(task_t *p, unsigned long long now) |
| 677 | { | 677 | { |
| 678 | /* Caller must always ensure 'now >= p->timestamp' */ | 678 | /* Caller must always ensure 'now >= p->timestamp' */ |
| 679 | unsigned long long __sleep_time = now - p->timestamp; | 679 | unsigned long long __sleep_time = now - p->timestamp; |
| @@ -732,7 +732,7 @@ static void recalc_task_prio(task_t *p, unsigned long long now) | |||
| 732 | } | 732 | } |
| 733 | } | 733 | } |
| 734 | 734 | ||
| 735 | p->prio = effective_prio(p); | 735 | return effective_prio(p); |
| 736 | } | 736 | } |
| 737 | 737 | ||
| 738 | /* | 738 | /* |
| @@ -755,7 +755,7 @@ static void activate_task(task_t *p, runqueue_t *rq, int local) | |||
| 755 | } | 755 | } |
| 756 | #endif | 756 | #endif |
| 757 | 757 | ||
| 758 | recalc_task_prio(p, now); | 758 | p->prio = recalc_task_prio(p, now); |
| 759 | 759 | ||
| 760 | /* | 760 | /* |
| 761 | * This checks to make sure it's not an uninterruptible task | 761 | * This checks to make sure it's not an uninterruptible task |
| @@ -2751,7 +2751,7 @@ asmlinkage void __sched schedule(void) | |||
| 2751 | struct list_head *queue; | 2751 | struct list_head *queue; |
| 2752 | unsigned long long now; | 2752 | unsigned long long now; |
| 2753 | unsigned long run_time; | 2753 | unsigned long run_time; |
| 2754 | int cpu, idx; | 2754 | int cpu, idx, new_prio; |
| 2755 | 2755 | ||
| 2756 | /* | 2756 | /* |
| 2757 | * Test if we are atomic. Since do_exit() needs to call into | 2757 | * Test if we are atomic. Since do_exit() needs to call into |
| @@ -2873,9 +2873,14 @@ go_idle: | |||
| 2873 | delta = delta * (ON_RUNQUEUE_WEIGHT * 128 / 100) / 128; | 2873 | delta = delta * (ON_RUNQUEUE_WEIGHT * 128 / 100) / 128; |
| 2874 | 2874 | ||
| 2875 | array = next->array; | 2875 | array = next->array; |
| 2876 | dequeue_task(next, array); | 2876 | new_prio = recalc_task_prio(next, next->timestamp + delta); |
| 2877 | recalc_task_prio(next, next->timestamp + delta); | 2877 | |
| 2878 | enqueue_task(next, array); | 2878 | if (unlikely(next->prio != new_prio)) { |
| 2879 | dequeue_task(next, array); | ||
| 2880 | next->prio = new_prio; | ||
| 2881 | enqueue_task(next, array); | ||
| 2882 | } else | ||
| 2883 | requeue_task(next, array); | ||
| 2879 | } | 2884 | } |
| 2880 | next->activated = 0; | 2885 | next->activated = 0; |
| 2881 | switch_tasks: | 2886 | switch_tasks: |
