diff options
Diffstat (limited to 'mm/oom_kill.c')
| -rw-r--r-- | mm/oom_kill.c | 21 |
1 files changed, 10 insertions, 11 deletions
diff --git a/mm/oom_kill.c b/mm/oom_kill.c index ed0e19677360..ac300c99baf6 100644 --- a/mm/oom_kill.c +++ b/mm/oom_kill.c | |||
| @@ -183,7 +183,8 @@ static bool oom_unkillable_task(struct task_struct *p, | |||
| 183 | unsigned long oom_badness(struct task_struct *p, struct mem_cgroup *memcg, | 183 | unsigned long oom_badness(struct task_struct *p, struct mem_cgroup *memcg, |
| 184 | const nodemask_t *nodemask, unsigned long totalpages) | 184 | const nodemask_t *nodemask, unsigned long totalpages) |
| 185 | { | 185 | { |
| 186 | unsigned long points; | 186 | long points; |
| 187 | long adj; | ||
| 187 | 188 | ||
| 188 | if (oom_unkillable_task(p, memcg, nodemask)) | 189 | if (oom_unkillable_task(p, memcg, nodemask)) |
| 189 | return 0; | 190 | return 0; |
| @@ -192,7 +193,8 @@ unsigned long oom_badness(struct task_struct *p, struct mem_cgroup *memcg, | |||
| 192 | if (!p) | 193 | if (!p) |
| 193 | return 0; | 194 | return 0; |
| 194 | 195 | ||
| 195 | if (p->signal->oom_score_adj == OOM_SCORE_ADJ_MIN) { | 196 | adj = p->signal->oom_score_adj; |
| 197 | if (adj == OOM_SCORE_ADJ_MIN) { | ||
| 196 | task_unlock(p); | 198 | task_unlock(p); |
| 197 | return 0; | 199 | return 0; |
| 198 | } | 200 | } |
| @@ -210,20 +212,17 @@ unsigned long oom_badness(struct task_struct *p, struct mem_cgroup *memcg, | |||
| 210 | * implementation used by LSMs. | 212 | * implementation used by LSMs. |
| 211 | */ | 213 | */ |
| 212 | if (has_capability_noaudit(p, CAP_SYS_ADMIN)) | 214 | if (has_capability_noaudit(p, CAP_SYS_ADMIN)) |
| 213 | points -= 30 * totalpages / 1000; | 215 | adj -= 30; |
| 214 | 216 | ||
| 215 | /* | 217 | /* Normalize to oom_score_adj units */ |
| 216 | * /proc/pid/oom_score_adj ranges from -1000 to +1000 such that it may | 218 | adj *= totalpages / 1000; |
| 217 | * either completely disable oom killing or always prefer a certain | 219 | points += adj; |
| 218 | * task. | ||
| 219 | */ | ||
| 220 | points += p->signal->oom_score_adj * totalpages / 1000; | ||
| 221 | 220 | ||
| 222 | /* | 221 | /* |
| 223 | * Never return 0 for an eligible task regardless of the root bonus and | 222 | * Never return 0 for an eligible task regardless of the root bonus and |
| 224 | * oom_score_adj (oom_score_adj can't be OOM_SCORE_ADJ_MIN here). | 223 | * oom_score_adj (oom_score_adj can't be OOM_SCORE_ADJ_MIN here). |
| 225 | */ | 224 | */ |
| 226 | return points ? points : 1; | 225 | return points > 0 ? points : 1; |
| 227 | } | 226 | } |
| 228 | 227 | ||
| 229 | /* | 228 | /* |
| @@ -366,7 +365,7 @@ static struct task_struct *select_bad_process(unsigned int *ppoints, | |||
| 366 | 365 | ||
| 367 | /** | 366 | /** |
| 368 | * dump_tasks - dump current memory state of all system tasks | 367 | * dump_tasks - dump current memory state of all system tasks |
| 369 | * @mem: current's memory controller, if constrained | 368 | * @memcg: current's memory controller, if constrained |
| 370 | * @nodemask: nodemask passed to page allocator for mempolicy ooms | 369 | * @nodemask: nodemask passed to page allocator for mempolicy ooms |
| 371 | * | 370 | * |
| 372 | * Dumps the current memory state of all eligible tasks. Tasks not in the same | 371 | * Dumps the current memory state of all eligible tasks. Tasks not in the same |
