diff options
Diffstat (limited to 'kernel/sched.c')
-rw-r--r-- | kernel/sched.c | 30 |
1 files changed, 18 insertions, 12 deletions
diff --git a/kernel/sched.c b/kernel/sched.c index 3332bbb5d5cf..cb31fb4a1379 100644 --- a/kernel/sched.c +++ b/kernel/sched.c | |||
@@ -736,7 +736,9 @@ static void update_curr_load(struct rq *rq, u64 now) | |||
736 | * | 736 | * |
737 | * The "10% effect" is relative and cumulative: from _any_ nice level, | 737 | * The "10% effect" is relative and cumulative: from _any_ nice level, |
738 | * if you go up 1 level, it's -10% CPU usage, if you go down 1 level | 738 | * if you go up 1 level, it's -10% CPU usage, if you go down 1 level |
739 | * it's +10% CPU usage. | 739 | * it's +10% CPU usage. (to achieve that we use a multiplier of 1.25. |
740 | * If a task goes up by ~10% and another task goes down by ~10% then | ||
741 | * the relative distance between them is ~25%.) | ||
740 | */ | 742 | */ |
741 | static const int prio_to_weight[40] = { | 743 | static const int prio_to_weight[40] = { |
742 | /* -20 */ 88818, 71054, 56843, 45475, 36380, 29104, 23283, 18626, 14901, 11921, | 744 | /* -20 */ 88818, 71054, 56843, 45475, 36380, 29104, 23283, 18626, 14901, 11921, |
@@ -746,15 +748,22 @@ static const int prio_to_weight[40] = { | |||
746 | /* 10 */ 110, 87, 70, 56, 45, 36, 29, 23, 18, 15, | 748 | /* 10 */ 110, 87, 70, 56, 45, 36, 29, 23, 18, 15, |
747 | }; | 749 | }; |
748 | 750 | ||
751 | /* | ||
752 | * Inverse (2^32/x) values of the prio_to_weight[] array, precalculated. | ||
753 | * | ||
754 | * In cases where the weight does not change often, we can use the | ||
755 | * precalculated inverse to speed up arithmetics by turning divisions | ||
756 | * into multiplications: | ||
757 | */ | ||
749 | static const u32 prio_to_wmult[40] = { | 758 | static const u32 prio_to_wmult[40] = { |
750 | 48356, 60446, 75558, 94446, 118058, 147573, | 759 | /* -20 */ 48356, 60446, 75558, 94446, 118058, |
751 | 184467, 230589, 288233, 360285, 450347, | 760 | /* -15 */ 147573, 184467, 230589, 288233, 360285, |
752 | 562979, 703746, 879575, 1099582, 1374389, | 761 | /* -10 */ 450347, 562979, 703746, 879575, 1099582, |
753 | 1717986, 2147483, 2684354, 3355443, 4194304, | 762 | /* -5 */ 1374389, 1717986, 2147483, 2684354, 3355443, |
754 | 5244160, 6557201, 8196502, 10250518, 12782640, | 763 | /* 0 */ 4194304, 5244160, 6557201, 8196502, 10250518, |
755 | 16025997, 19976592, 24970740, 31350126, 39045157, | 764 | /* 5 */ 12782640, 16025997, 19976592, 24970740, 31350126, |
756 | 49367440, 61356675, 76695844, 95443717, 119304647, | 765 | /* 10 */ 39045157, 49367440, 61356675, 76695844, 95443717, |
757 | 148102320, 186737708, 238609294, 286331153, | 766 | /* 15 */ 119304647, 148102320, 186737708, 238609294, 286331153, |
758 | }; | 767 | }; |
759 | 768 | ||
760 | static inline void | 769 | static inline void |
@@ -4903,8 +4912,6 @@ static int migration_thread(void *data) | |||
4903 | struct migration_req *req; | 4912 | struct migration_req *req; |
4904 | struct list_head *head; | 4913 | struct list_head *head; |
4905 | 4914 | ||
4906 | try_to_freeze(); | ||
4907 | |||
4908 | spin_lock_irq(&rq->lock); | 4915 | spin_lock_irq(&rq->lock); |
4909 | 4916 | ||
4910 | if (cpu_is_offline(cpu)) { | 4917 | if (cpu_is_offline(cpu)) { |
@@ -5138,7 +5145,6 @@ migration_call(struct notifier_block *nfb, unsigned long action, void *hcpu) | |||
5138 | p = kthread_create(migration_thread, hcpu, "migration/%d", cpu); | 5145 | p = kthread_create(migration_thread, hcpu, "migration/%d", cpu); |
5139 | if (IS_ERR(p)) | 5146 | if (IS_ERR(p)) |
5140 | return NOTIFY_BAD; | 5147 | return NOTIFY_BAD; |
5141 | p->flags |= PF_NOFREEZE; | ||
5142 | kthread_bind(p, cpu); | 5148 | kthread_bind(p, cpu); |
5143 | /* Must be high prio: stop_machine expects to yield to it. */ | 5149 | /* Must be high prio: stop_machine expects to yield to it. */ |
5144 | rq = task_rq_lock(p, &flags); | 5150 | rq = task_rq_lock(p, &flags); |