diff options
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/sched.c | 101 |
1 files changed, 12 insertions, 89 deletions
diff --git a/kernel/sched.c b/kernel/sched.c index 7ce959e0b69a..886531c681c1 100644 --- a/kernel/sched.c +++ b/kernel/sched.c | |||
@@ -103,87 +103,6 @@ unsigned long long __attribute__((weak)) sched_clock(void) | |||
103 | */ | 103 | */ |
104 | #define MIN_TIMESLICE max(5 * HZ / 1000, 1) | 104 | #define MIN_TIMESLICE max(5 * HZ / 1000, 1) |
105 | #define DEF_TIMESLICE (100 * HZ / 1000) | 105 | #define DEF_TIMESLICE (100 * HZ / 1000) |
106 | #define ON_RUNQUEUE_WEIGHT 30 | ||
107 | #define CHILD_PENALTY 95 | ||
108 | #define PARENT_PENALTY 100 | ||
109 | #define EXIT_WEIGHT 3 | ||
110 | #define PRIO_BONUS_RATIO 25 | ||
111 | #define MAX_BONUS (MAX_USER_PRIO * PRIO_BONUS_RATIO / 100) | ||
112 | #define INTERACTIVE_DELTA 2 | ||
113 | #define MAX_SLEEP_AVG (DEF_TIMESLICE * MAX_BONUS) | ||
114 | #define STARVATION_LIMIT (MAX_SLEEP_AVG) | ||
115 | #define NS_MAX_SLEEP_AVG (JIFFIES_TO_NS(MAX_SLEEP_AVG)) | ||
116 | |||
117 | /* | ||
118 | * If a task is 'interactive' then we reinsert it in the active | ||
119 | * array after it has expired its current timeslice. (it will not | ||
120 | * continue to run immediately, it will still roundrobin with | ||
121 | * other interactive tasks.) | ||
122 | * | ||
123 | * This part scales the interactivity limit depending on niceness. | ||
124 | * | ||
125 | * We scale it linearly, offset by the INTERACTIVE_DELTA delta. | ||
126 | * Here are a few examples of different nice levels: | ||
127 | * | ||
128 | * TASK_INTERACTIVE(-20): [1,1,1,1,1,1,1,1,1,0,0] | ||
129 | * TASK_INTERACTIVE(-10): [1,1,1,1,1,1,1,0,0,0,0] | ||
130 | * TASK_INTERACTIVE( 0): [1,1,1,1,0,0,0,0,0,0,0] | ||
131 | * TASK_INTERACTIVE( 10): [1,1,0,0,0,0,0,0,0,0,0] | ||
132 | * TASK_INTERACTIVE( 19): [0,0,0,0,0,0,0,0,0,0,0] | ||
133 | * | ||
134 | * (the X axis represents the possible -5 ... 0 ... +5 dynamic | ||
135 | * priority range a task can explore, a value of '1' means the | ||
136 | * task is rated interactive.) | ||
137 | * | ||
138 | * Ie. nice +19 tasks can never get 'interactive' enough to be | ||
139 | * reinserted into the active array. And only heavily CPU-hog nice -20 | ||
140 | * tasks will be expired. Default nice 0 tasks are somewhere between, | ||
141 | * it takes some effort for them to get interactive, but it's not | ||
142 | * too hard. | ||
143 | */ | ||
144 | |||
145 | #define CURRENT_BONUS(p) \ | ||
146 | (NS_TO_JIFFIES((p)->sleep_avg) * MAX_BONUS / \ | ||
147 | MAX_SLEEP_AVG) | ||
148 | |||
149 | #define GRANULARITY (10 * HZ / 1000 ? : 1) | ||
150 | |||
151 | #ifdef CONFIG_SMP | ||
152 | #define TIMESLICE_GRANULARITY(p) (GRANULARITY * \ | ||
153 | (1 << (((MAX_BONUS - CURRENT_BONUS(p)) ? : 1) - 1)) * \ | ||
154 | num_online_cpus()) | ||
155 | #else | ||
156 | #define TIMESLICE_GRANULARITY(p) (GRANULARITY * \ | ||
157 | (1 << (((MAX_BONUS - CURRENT_BONUS(p)) ? : 1) - 1))) | ||
158 | #endif | ||
159 | |||
160 | #define SCALE(v1,v1_max,v2_max) \ | ||
161 | (v1) * (v2_max) / (v1_max) | ||
162 | |||
163 | #define DELTA(p) \ | ||
164 | (SCALE(TASK_NICE(p) + 20, 40, MAX_BONUS) - 20 * MAX_BONUS / 40 + \ | ||
165 | INTERACTIVE_DELTA) | ||
166 | |||
167 | #define TASK_INTERACTIVE(p) \ | ||
168 | ((p)->prio <= (p)->static_prio - DELTA(p)) | ||
169 | |||
170 | #define INTERACTIVE_SLEEP(p) \ | ||
171 | (JIFFIES_TO_NS(MAX_SLEEP_AVG * \ | ||
172 | (MAX_BONUS / 2 + DELTA((p)) + 1) / MAX_BONUS - 1)) | ||
173 | |||
174 | #define TASK_PREEMPTS_CURR(p, rq) \ | ||
175 | ((p)->prio < (rq)->curr->prio) | ||
176 | |||
177 | #define SCALE_PRIO(x, prio) \ | ||
178 | max(x * (MAX_PRIO - prio) / (MAX_USER_PRIO / 2), MIN_TIMESLICE) | ||
179 | |||
180 | static unsigned int static_prio_timeslice(int static_prio) | ||
181 | { | ||
182 | if (static_prio < NICE_TO_PRIO(0)) | ||
183 | return SCALE_PRIO(DEF_TIMESLICE * 4, static_prio); | ||
184 | else | ||
185 | return SCALE_PRIO(DEF_TIMESLICE, static_prio); | ||
186 | } | ||
187 | 106 | ||
188 | #ifdef CONFIG_SMP | 107 | #ifdef CONFIG_SMP |
189 | /* | 108 | /* |
@@ -206,18 +125,22 @@ static inline void sg_inc_cpu_power(struct sched_group *sg, u32 val) | |||
206 | } | 125 | } |
207 | #endif | 126 | #endif |
208 | 127 | ||
128 | #define SCALE_PRIO(x, prio) \ | ||
129 | max(x * (MAX_PRIO - prio) / (MAX_USER_PRIO / 2), MIN_TIMESLICE) | ||
130 | |||
209 | /* | 131 | /* |
210 | * task_timeslice() scales user-nice values [ -20 ... 0 ... 19 ] | 132 | * static_prio_timeslice() scales user-nice values [ -20 ... 0 ... 19 ] |
211 | * to time slice values: [800ms ... 100ms ... 5ms] | 133 | * to time slice values: [800ms ... 100ms ... 5ms] |
212 | * | ||
213 | * The higher a thread's priority, the bigger timeslices | ||
214 | * it gets during one round of execution. But even the lowest | ||
215 | * priority thread gets MIN_TIMESLICE worth of execution time. | ||
216 | */ | 134 | */ |
217 | 135 | static unsigned int static_prio_timeslice(int static_prio) | |
218 | static inline unsigned int task_timeslice(struct task_struct *p) | ||
219 | { | 136 | { |
220 | return static_prio_timeslice(p->static_prio); | 137 | if (static_prio == NICE_TO_PRIO(19)) |
138 | return 1; | ||
139 | |||
140 | if (static_prio < NICE_TO_PRIO(0)) | ||
141 | return SCALE_PRIO(DEF_TIMESLICE * 4, static_prio); | ||
142 | else | ||
143 | return SCALE_PRIO(DEF_TIMESLICE, static_prio); | ||
221 | } | 144 | } |
222 | 145 | ||
223 | static inline int rt_policy(int policy) | 146 | static inline int rt_policy(int policy) |