diff options
author | Ingo Molnar <mingo@elte.hu> | 2007-08-02 11:41:40 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2007-08-02 11:41:40 -0400 |
commit | 9c2172459a47c99adf9c968180a8a57d9ff84efa (patch) | |
tree | 24478a1c0f8d32b0b1f18661d42d26e644e40292 /kernel/sched.c | |
parent | cad60d93e18ba52b6f069b2edb031c89bf603b07 (diff) |
[PATCH] sched: move load-calculation functions
move load-calculation functions so that they can use the per-policy
declarations and methods.
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'kernel/sched.c')
-rw-r--r-- | kernel/sched.c | 132 |
1 files changed, 66 insertions, 66 deletions
diff --git a/kernel/sched.c b/kernel/sched.c index 915c75e5a276..a9d374061a46 100644 --- a/kernel/sched.c +++ b/kernel/sched.c | |||
@@ -678,46 +678,6 @@ static void update_load_sub(struct load_weight *lw, unsigned long dec) | |||
678 | lw->inv_weight = 0; | 678 | lw->inv_weight = 0; |
679 | } | 679 | } |
680 | 680 | ||
681 | static void __update_curr_load(struct rq *rq, struct load_stat *ls) | ||
682 | { | ||
683 | if (rq->curr != rq->idle && ls->load.weight) { | ||
684 | ls->delta_exec += ls->delta_stat; | ||
685 | ls->delta_fair += calc_delta_fair(ls->delta_stat, &ls->load); | ||
686 | ls->delta_stat = 0; | ||
687 | } | ||
688 | } | ||
689 | |||
690 | /* | ||
691 | * Update delta_exec, delta_fair fields for rq. | ||
692 | * | ||
693 | * delta_fair clock advances at a rate inversely proportional to | ||
694 | * total load (rq->ls.load.weight) on the runqueue, while | ||
695 | * delta_exec advances at the same rate as wall-clock (provided | ||
696 | * cpu is not idle). | ||
697 | * | ||
698 | * delta_exec / delta_fair is a measure of the (smoothened) load on this | ||
699 | * runqueue over any given interval. This (smoothened) load is used | ||
700 | * during load balance. | ||
701 | * | ||
702 | * This function is called /before/ updating rq->ls.load | ||
703 | * and when switching tasks. | ||
704 | */ | ||
705 | static void update_curr_load(struct rq *rq, u64 now) | ||
706 | { | ||
707 | struct load_stat *ls = &rq->ls; | ||
708 | u64 start; | ||
709 | |||
710 | start = ls->load_update_start; | ||
711 | ls->load_update_start = now; | ||
712 | ls->delta_stat += now - start; | ||
713 | /* | ||
714 | * Stagger updates to ls->delta_fair. Very frequent updates | ||
715 | * can be expensive. | ||
716 | */ | ||
717 | if (ls->delta_stat >= sysctl_sched_stat_granularity) | ||
718 | __update_curr_load(rq, ls); | ||
719 | } | ||
720 | |||
721 | /* | 681 | /* |
722 | * To aid in avoiding the subversion of "niceness" due to uneven distribution | 682 | * To aid in avoiding the subversion of "niceness" due to uneven distribution |
723 | * of tasks with abnormal "nice" values across CPUs the contribution that | 683 | * of tasks with abnormal "nice" values across CPUs the contribution that |
@@ -768,32 +728,6 @@ static const u32 prio_to_wmult[40] = { | |||
768 | /* 15 */ 119304647, 148102320, 186737708, 238609294, 286331153, | 728 | /* 15 */ 119304647, 148102320, 186737708, 238609294, 286331153, |
769 | }; | 729 | }; |
770 | 730 | ||
771 | static inline void | ||
772 | inc_load(struct rq *rq, const struct task_struct *p, u64 now) | ||
773 | { | ||
774 | update_curr_load(rq, now); | ||
775 | update_load_add(&rq->ls.load, p->se.load.weight); | ||
776 | } | ||
777 | |||
778 | static inline void | ||
779 | dec_load(struct rq *rq, const struct task_struct *p, u64 now) | ||
780 | { | ||
781 | update_curr_load(rq, now); | ||
782 | update_load_sub(&rq->ls.load, p->se.load.weight); | ||
783 | } | ||
784 | |||
785 | static void inc_nr_running(struct task_struct *p, struct rq *rq, u64 now) | ||
786 | { | ||
787 | rq->nr_running++; | ||
788 | inc_load(rq, p, now); | ||
789 | } | ||
790 | |||
791 | static void dec_nr_running(struct task_struct *p, struct rq *rq, u64 now) | ||
792 | { | ||
793 | rq->nr_running--; | ||
794 | dec_load(rq, p, now); | ||
795 | } | ||
796 | |||
797 | static void activate_task(struct rq *rq, struct task_struct *p, int wakeup); | 731 | static void activate_task(struct rq *rq, struct task_struct *p, int wakeup); |
798 | 732 | ||
799 | /* | 733 | /* |
@@ -824,6 +758,72 @@ static int balance_tasks(struct rq *this_rq, int this_cpu, struct rq *busiest, | |||
824 | 758 | ||
825 | #define sched_class_highest (&rt_sched_class) | 759 | #define sched_class_highest (&rt_sched_class) |
826 | 760 | ||
761 | static void __update_curr_load(struct rq *rq, struct load_stat *ls) | ||
762 | { | ||
763 | if (rq->curr != rq->idle && ls->load.weight) { | ||
764 | ls->delta_exec += ls->delta_stat; | ||
765 | ls->delta_fair += calc_delta_fair(ls->delta_stat, &ls->load); | ||
766 | ls->delta_stat = 0; | ||
767 | } | ||
768 | } | ||
769 | |||
770 | /* | ||
771 | * Update delta_exec, delta_fair fields for rq. | ||
772 | * | ||
773 | * delta_fair clock advances at a rate inversely proportional to | ||
774 | * total load (rq->ls.load.weight) on the runqueue, while | ||
775 | * delta_exec advances at the same rate as wall-clock (provided | ||
776 | * cpu is not idle). | ||
777 | * | ||
778 | * delta_exec / delta_fair is a measure of the (smoothened) load on this | ||
779 | * runqueue over any given interval. This (smoothened) load is used | ||
780 | * during load balance. | ||
781 | * | ||
782 | * This function is called /before/ updating rq->ls.load | ||
783 | * and when switching tasks. | ||
784 | */ | ||
785 | static void update_curr_load(struct rq *rq, u64 now) | ||
786 | { | ||
787 | struct load_stat *ls = &rq->ls; | ||
788 | u64 start; | ||
789 | |||
790 | start = ls->load_update_start; | ||
791 | ls->load_update_start = now; | ||
792 | ls->delta_stat += now - start; | ||
793 | /* | ||
794 | * Stagger updates to ls->delta_fair. Very frequent updates | ||
795 | * can be expensive. | ||
796 | */ | ||
797 | if (ls->delta_stat >= sysctl_sched_stat_granularity) | ||
798 | __update_curr_load(rq, ls); | ||
799 | } | ||
800 | |||
801 | static inline void | ||
802 | inc_load(struct rq *rq, const struct task_struct *p, u64 now) | ||
803 | { | ||
804 | update_curr_load(rq, now); | ||
805 | update_load_add(&rq->ls.load, p->se.load.weight); | ||
806 | } | ||
807 | |||
808 | static inline void | ||
809 | dec_load(struct rq *rq, const struct task_struct *p, u64 now) | ||
810 | { | ||
811 | update_curr_load(rq, now); | ||
812 | update_load_sub(&rq->ls.load, p->se.load.weight); | ||
813 | } | ||
814 | |||
815 | static void inc_nr_running(struct task_struct *p, struct rq *rq, u64 now) | ||
816 | { | ||
817 | rq->nr_running++; | ||
818 | inc_load(rq, p, now); | ||
819 | } | ||
820 | |||
821 | static void dec_nr_running(struct task_struct *p, struct rq *rq, u64 now) | ||
822 | { | ||
823 | rq->nr_running--; | ||
824 | dec_load(rq, p, now); | ||
825 | } | ||
826 | |||
827 | static void set_load_weight(struct task_struct *p) | 827 | static void set_load_weight(struct task_struct *p) |
828 | { | 828 | { |
829 | task_rq(p)->cfs.wait_runtime -= p->se.wait_runtime; | 829 | task_rq(p)->cfs.wait_runtime -= p->se.wait_runtime; |