diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2008-10-23 12:37:16 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-10-23 12:37:16 -0400 |
commit | 133e887f90208d339088dd60cb1d08a72ba27288 (patch) | |
tree | 4f6bab9d13df7fac50bc7d699d8486f441deb428 /kernel/sched_fair.c | |
parent | e82cff752f57810a2259415ad2e9087c2d69484c (diff) | |
parent | 0c4b83da58ec2e96ce9c44c211d6eac5f9dae478 (diff) |
Merge branch 'sched-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip
* 'sched-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip:
sched: disable the hrtick for now
sched: revert back to per-rq vruntime
sched: fair scheduler should not resched rt tasks
sched: optimize group load balancer
sched: minor fast-path overhead reduction
sched: fix the wrong mask_len, cleanup
sched: kill unused scheduler decl.
sched: fix the wrong mask_len
sched: only update rq->clock while holding rq->lock
Diffstat (limited to 'kernel/sched_fair.c')
-rw-r--r-- | kernel/sched_fair.c | 62 |
1 files changed, 40 insertions, 22 deletions
diff --git a/kernel/sched_fair.c b/kernel/sched_fair.c index f604dae71316..9573c33688b8 100644 --- a/kernel/sched_fair.c +++ b/kernel/sched_fair.c | |||
@@ -73,6 +73,8 @@ unsigned int sysctl_sched_wakeup_granularity = 5000000UL; | |||
73 | 73 | ||
74 | const_debug unsigned int sysctl_sched_migration_cost = 500000UL; | 74 | const_debug unsigned int sysctl_sched_migration_cost = 500000UL; |
75 | 75 | ||
76 | static const struct sched_class fair_sched_class; | ||
77 | |||
76 | /************************************************************** | 78 | /************************************************************** |
77 | * CFS operations on generic schedulable entities: | 79 | * CFS operations on generic schedulable entities: |
78 | */ | 80 | */ |
@@ -334,7 +336,7 @@ int sched_nr_latency_handler(struct ctl_table *table, int write, | |||
334 | #endif | 336 | #endif |
335 | 337 | ||
336 | /* | 338 | /* |
337 | * delta *= w / rw | 339 | * delta *= P[w / rw] |
338 | */ | 340 | */ |
339 | static inline unsigned long | 341 | static inline unsigned long |
340 | calc_delta_weight(unsigned long delta, struct sched_entity *se) | 342 | calc_delta_weight(unsigned long delta, struct sched_entity *se) |
@@ -348,15 +350,13 @@ calc_delta_weight(unsigned long delta, struct sched_entity *se) | |||
348 | } | 350 | } |
349 | 351 | ||
350 | /* | 352 | /* |
351 | * delta *= rw / w | 353 | * delta /= w |
352 | */ | 354 | */ |
353 | static inline unsigned long | 355 | static inline unsigned long |
354 | calc_delta_fair(unsigned long delta, struct sched_entity *se) | 356 | calc_delta_fair(unsigned long delta, struct sched_entity *se) |
355 | { | 357 | { |
356 | for_each_sched_entity(se) { | 358 | if (unlikely(se->load.weight != NICE_0_LOAD)) |
357 | delta = calc_delta_mine(delta, | 359 | delta = calc_delta_mine(delta, NICE_0_LOAD, &se->load); |
358 | cfs_rq_of(se)->load.weight, &se->load); | ||
359 | } | ||
360 | 360 | ||
361 | return delta; | 361 | return delta; |
362 | } | 362 | } |
@@ -386,26 +386,26 @@ static u64 __sched_period(unsigned long nr_running) | |||
386 | * We calculate the wall-time slice from the period by taking a part | 386 | * We calculate the wall-time slice from the period by taking a part |
387 | * proportional to the weight. | 387 | * proportional to the weight. |
388 | * | 388 | * |
389 | * s = p*w/rw | 389 | * s = p*P[w/rw] |
390 | */ | 390 | */ |
391 | static u64 sched_slice(struct cfs_rq *cfs_rq, struct sched_entity *se) | 391 | static u64 sched_slice(struct cfs_rq *cfs_rq, struct sched_entity *se) |
392 | { | 392 | { |
393 | return calc_delta_weight(__sched_period(cfs_rq->nr_running), se); | 393 | unsigned long nr_running = cfs_rq->nr_running; |
394 | |||
395 | if (unlikely(!se->on_rq)) | ||
396 | nr_running++; | ||
397 | |||
398 | return calc_delta_weight(__sched_period(nr_running), se); | ||
394 | } | 399 | } |
395 | 400 | ||
396 | /* | 401 | /* |
397 | * We calculate the vruntime slice of a to be inserted task | 402 | * We calculate the vruntime slice of a to be inserted task |
398 | * | 403 | * |
399 | * vs = s*rw/w = p | 404 | * vs = s/w |
400 | */ | 405 | */ |
401 | static u64 sched_vslice_add(struct cfs_rq *cfs_rq, struct sched_entity *se) | 406 | static u64 sched_vslice(struct cfs_rq *cfs_rq, struct sched_entity *se) |
402 | { | 407 | { |
403 | unsigned long nr_running = cfs_rq->nr_running; | 408 | return calc_delta_fair(sched_slice(cfs_rq, se), se); |
404 | |||
405 | if (!se->on_rq) | ||
406 | nr_running++; | ||
407 | |||
408 | return __sched_period(nr_running); | ||
409 | } | 409 | } |
410 | 410 | ||
411 | /* | 411 | /* |
@@ -628,7 +628,7 @@ place_entity(struct cfs_rq *cfs_rq, struct sched_entity *se, int initial) | |||
628 | * stays open at the end. | 628 | * stays open at the end. |
629 | */ | 629 | */ |
630 | if (initial && sched_feat(START_DEBIT)) | 630 | if (initial && sched_feat(START_DEBIT)) |
631 | vruntime += sched_vslice_add(cfs_rq, se); | 631 | vruntime += sched_vslice(cfs_rq, se); |
632 | 632 | ||
633 | if (!initial) { | 633 | if (!initial) { |
634 | /* sleeps upto a single latency don't count. */ | 634 | /* sleeps upto a single latency don't count. */ |
@@ -748,7 +748,7 @@ pick_next(struct cfs_rq *cfs_rq, struct sched_entity *se) | |||
748 | struct rq *rq = rq_of(cfs_rq); | 748 | struct rq *rq = rq_of(cfs_rq); |
749 | u64 pair_slice = rq->clock - cfs_rq->pair_start; | 749 | u64 pair_slice = rq->clock - cfs_rq->pair_start; |
750 | 750 | ||
751 | if (!cfs_rq->next || pair_slice > sched_slice(cfs_rq, cfs_rq->next)) { | 751 | if (!cfs_rq->next || pair_slice > sysctl_sched_min_granularity) { |
752 | cfs_rq->pair_start = rq->clock; | 752 | cfs_rq->pair_start = rq->clock; |
753 | return se; | 753 | return se; |
754 | } | 754 | } |
@@ -849,11 +849,31 @@ static void hrtick_start_fair(struct rq *rq, struct task_struct *p) | |||
849 | hrtick_start(rq, delta); | 849 | hrtick_start(rq, delta); |
850 | } | 850 | } |
851 | } | 851 | } |
852 | |||
853 | /* | ||
854 | * called from enqueue/dequeue and updates the hrtick when the | ||
855 | * current task is from our class and nr_running is low enough | ||
856 | * to matter. | ||
857 | */ | ||
858 | static void hrtick_update(struct rq *rq) | ||
859 | { | ||
860 | struct task_struct *curr = rq->curr; | ||
861 | |||
862 | if (curr->sched_class != &fair_sched_class) | ||
863 | return; | ||
864 | |||
865 | if (cfs_rq_of(&curr->se)->nr_running < sched_nr_latency) | ||
866 | hrtick_start_fair(rq, curr); | ||
867 | } | ||
852 | #else /* !CONFIG_SCHED_HRTICK */ | 868 | #else /* !CONFIG_SCHED_HRTICK */ |
853 | static inline void | 869 | static inline void |
854 | hrtick_start_fair(struct rq *rq, struct task_struct *p) | 870 | hrtick_start_fair(struct rq *rq, struct task_struct *p) |
855 | { | 871 | { |
856 | } | 872 | } |
873 | |||
874 | static inline void hrtick_update(struct rq *rq) | ||
875 | { | ||
876 | } | ||
857 | #endif | 877 | #endif |
858 | 878 | ||
859 | /* | 879 | /* |
@@ -874,7 +894,7 @@ static void enqueue_task_fair(struct rq *rq, struct task_struct *p, int wakeup) | |||
874 | wakeup = 1; | 894 | wakeup = 1; |
875 | } | 895 | } |
876 | 896 | ||
877 | hrtick_start_fair(rq, rq->curr); | 897 | hrtick_update(rq); |
878 | } | 898 | } |
879 | 899 | ||
880 | /* | 900 | /* |
@@ -896,7 +916,7 @@ static void dequeue_task_fair(struct rq *rq, struct task_struct *p, int sleep) | |||
896 | sleep = 1; | 916 | sleep = 1; |
897 | } | 917 | } |
898 | 918 | ||
899 | hrtick_start_fair(rq, rq->curr); | 919 | hrtick_update(rq); |
900 | } | 920 | } |
901 | 921 | ||
902 | /* | 922 | /* |
@@ -1002,8 +1022,6 @@ static inline int wake_idle(int cpu, struct task_struct *p) | |||
1002 | 1022 | ||
1003 | #ifdef CONFIG_SMP | 1023 | #ifdef CONFIG_SMP |
1004 | 1024 | ||
1005 | static const struct sched_class fair_sched_class; | ||
1006 | |||
1007 | #ifdef CONFIG_FAIR_GROUP_SCHED | 1025 | #ifdef CONFIG_FAIR_GROUP_SCHED |
1008 | /* | 1026 | /* |
1009 | * effective_load() calculates the load change as seen from the root_task_group | 1027 | * effective_load() calculates the load change as seen from the root_task_group |