Blame view
mm/oom_kill.c
17.7 KB
1da177e4c Linux-2.6.12-rc2 |
1 2 3 4 5 6 7 8 |
/* * linux/mm/oom_kill.c * * Copyright (C) 1998,2000 Rik van Riel * Thanks go out to Claus Fischer for some serious inspiration and * for goading me into coding this file... * * The routines in this file are used to kill a process when |
a49335cce [PATCH] cpusets: ... |
9 10 |
* we're seriously out of memory. This gets called from __alloc_pages() * in mm/page_alloc.c when we really run out of memory. |
1da177e4c Linux-2.6.12-rc2 |
11 12 13 14 15 16 |
* * Since we won't call these routines often (on a well-configured * machine) this file will double as a 'coding guide' and a signpost * for newbie kernel hackers. It features several pointers to major * kernel subsystems and hints as to where to find out what things do. */ |
8ac773b4f [PATCH] OOM kille... |
17 |
#include <linux/oom.h> |
1da177e4c Linux-2.6.12-rc2 |
18 |
#include <linux/mm.h> |
4e950f6f0 Remove fs.h from ... |
19 |
#include <linux/err.h> |
5a0e3ad6a include cleanup: ... |
20 |
#include <linux/gfp.h> |
1da177e4c Linux-2.6.12-rc2 |
21 22 23 24 |
#include <linux/sched.h> #include <linux/swap.h> #include <linux/timex.h> #include <linux/jiffies.h> |
ef08e3b49 [PATCH] cpusets: ... |
25 |
#include <linux/cpuset.h> |
8bc719d3c [PATCH] out of me... |
26 27 |
#include <linux/module.h> #include <linux/notifier.h> |
c7ba5c9e8 Memory controller... |
28 |
#include <linux/memcontrol.h> |
5cd9c58fb security: Fix set... |
29 |
#include <linux/security.h> |
1da177e4c Linux-2.6.12-rc2 |
30 |
|
fadd8fbd1 [PATCH] support f... |
31 |
int sysctl_panic_on_oom; |
fe071d7e8 oom: add oom_kill... |
32 |
int sysctl_oom_kill_allocating_task; |
fef1bdd68 oom: add sysctl t... |
33 |
int sysctl_oom_dump_tasks; |
c7d4caeb1 oom: fix zone_sca... |
34 |
static DEFINE_SPINLOCK(zone_scan_lock); |
1da177e4c Linux-2.6.12-rc2 |
35 |
/* #define DEBUG */ |
495789a51 oom: make oom_sco... |
36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
/* * Is all threads of the target process nodes overlap ours? */ static int has_intersects_mems_allowed(struct task_struct *tsk) { struct task_struct *t; t = tsk; do { if (cpuset_mems_allowed_intersects(current, t)) return 1; t = next_thread(t); } while (t != tsk); return 0; } |
1da177e4c Linux-2.6.12-rc2 |
52 |
/** |
6937a25cf [PATCH] mm: fix t... |
53 |
* badness - calculate a numeric value for how bad this task has been |
1da177e4c Linux-2.6.12-rc2 |
54 |
* @p: task struct of which task we should calculate |
a49335cce [PATCH] cpusets: ... |
55 |
* @uptime: current uptime in seconds |
1da177e4c Linux-2.6.12-rc2 |
56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
* * The formula used is relatively simple and documented inline in the * function. The main rationale is that we want to select a good task * to kill when we run out of memory. * * Good in this context means that: * 1) we lose the minimum amount of work done * 2) we recover a large amount of memory * 3) we don't kill anything innocent of eating tons of memory * 4) we want to kill the minimum amount of processes (one) * 5) we try to kill the process the user expects us to kill, this * algorithm has been meticulously tuned to meet the principle * of least surprise ... (be careful when you change it) */ |
97d87c971 oom_kill: remove ... |
70 |
unsigned long badness(struct task_struct *p, unsigned long uptime) |
1da177e4c Linux-2.6.12-rc2 |
71 |
{ |
a12888f77 oom_kill: don't c... |
72 |
unsigned long points, cpu_time, run_time; |
97c2c9b84 [PATCH] oom-kill:... |
73 74 |
struct mm_struct *mm; struct task_struct *child; |
28b83c519 oom: move oom_adj... |
75 |
int oom_adj = p->signal->oom_adj; |
495789a51 oom: make oom_sco... |
76 77 78 |
struct task_cputime task_time; unsigned long utime; unsigned long stime; |
28b83c519 oom: move oom_adj... |
79 80 81 |
if (oom_adj == OOM_DISABLE) return 0; |
1da177e4c Linux-2.6.12-rc2 |
82 |
|
97c2c9b84 [PATCH] oom-kill:... |
83 84 85 86 |
task_lock(p); mm = p->mm; if (!mm) { task_unlock(p); |
1da177e4c Linux-2.6.12-rc2 |
87 |
return 0; |
97c2c9b84 [PATCH] oom-kill:... |
88 |
} |
1da177e4c Linux-2.6.12-rc2 |
89 90 91 92 |
/* * The memory size of the process is the basis for the badness. */ |
97c2c9b84 [PATCH] oom-kill:... |
93 94 95 96 97 98 |
points = mm->total_vm; /* * After this unlock we can no longer dereference local variable `mm' */ task_unlock(p); |
1da177e4c Linux-2.6.12-rc2 |
99 100 |
/* |
7ba348594 [PATCH] fix OOM k... |
101 102 |
* swapoff can easily use up all memory, so kill those first. */ |
35451beec ksm: unmerge is a... |
103 |
if (p->flags & PF_OOM_ORIGIN) |
7ba348594 [PATCH] fix OOM k... |
104 105 106 |
return ULONG_MAX; /* |
1da177e4c Linux-2.6.12-rc2 |
107 |
* Processes which fork a lot of child processes are likely |
9827b781f [PATCH] OOM kill:... |
108 |
* a good choice. We add half the vmsize of the children if they |
1da177e4c Linux-2.6.12-rc2 |
109 |
* have an own mm. This prevents forking servers to flood the |
9827b781f [PATCH] OOM kill:... |
110 111 112 |
* machine with an endless amount of children. In case a single * child is eating the vast majority of memory, adding only half * to the parents will make the child our kill candidate of choice. |
1da177e4c Linux-2.6.12-rc2 |
113 |
*/ |
97c2c9b84 [PATCH] oom-kill:... |
114 115 116 117 118 |
list_for_each_entry(child, &p->children, sibling) { task_lock(child); if (child->mm != mm && child->mm) points += child->mm->total_vm/2 + 1; task_unlock(child); |
1da177e4c Linux-2.6.12-rc2 |
119 120 121 122 123 124 125 |
} /* * CPU time is in tens of seconds and run time is in thousands * of seconds. There is no particular reason for this other than * that it turned out to work very well in practice. */ |
495789a51 oom: make oom_sco... |
126 127 128 129 |
thread_group_cputime(p, &task_time); utime = cputime_to_jiffies(task_time.utime); stime = cputime_to_jiffies(task_time.stime); cpu_time = (utime + stime) >> (SHIFT_HZ + 3); |
1da177e4c Linux-2.6.12-rc2 |
130 131 132 133 134 |
if (uptime >= p->start_time.tv_sec) run_time = (uptime - p->start_time.tv_sec) >> 10; else run_time = 0; |
a12888f77 oom_kill: don't c... |
135 136 137 138 |
if (cpu_time) points /= int_sqrt(cpu_time); if (run_time) points /= int_sqrt(int_sqrt(run_time)); |
1da177e4c Linux-2.6.12-rc2 |
139 140 141 142 143 144 145 146 147 148 149 150 |
/* * Niced processes are most likely less important, so double * their badness points. */ if (task_nice(p) > 0) points *= 2; /* * Superuser processes are usually more important, so we make it * less likely that we kill those. */ |
a2f2945a9 The oomkiller cal... |
151 152 |
if (has_capability_noaudit(p, CAP_SYS_ADMIN) || has_capability_noaudit(p, CAP_SYS_RESOURCE)) |
1da177e4c Linux-2.6.12-rc2 |
153 154 155 156 157 158 159 160 |
points /= 4; /* * We don't want to kill a process with direct hardware access. * Not only could that mess up the hardware, but usually users * tend to only have this flag set on applications they think * of as important. */ |
a2f2945a9 The oomkiller cal... |
161 |
if (has_capability_noaudit(p, CAP_SYS_RAWIO)) |
1da177e4c Linux-2.6.12-rc2 |
162 163 164 |
points /= 4; /* |
7887a3da7 [PATCH] oom: cpus... |
165 166 167 168 |
* If p's nodes don't overlap ours, it may still help to kill p * because p may have allocated or otherwise mapped memory on * this node before. However it will be less likely. */ |
495789a51 oom: make oom_sco... |
169 |
if (!has_intersects_mems_allowed(p)) |
7887a3da7 [PATCH] oom: cpus... |
170 171 172 |
points /= 8; /* |
28b83c519 oom: move oom_adj... |
173 |
* Adjust the score by oom_adj. |
1da177e4c Linux-2.6.12-rc2 |
174 |
*/ |
28b83c519 oom: move oom_adj... |
175 176 |
if (oom_adj) { if (oom_adj > 0) { |
9a82782f8 allow oom_adj of ... |
177 178 |
if (!points) points = 1; |
28b83c519 oom: move oom_adj... |
179 |
points <<= oom_adj; |
9a82782f8 allow oom_adj of ... |
180 |
} else |
28b83c519 oom: move oom_adj... |
181 |
points >>= -(oom_adj); |
1da177e4c Linux-2.6.12-rc2 |
182 183 184 |
} #ifdef DEBUG |
a5e58a614 oom: print points... |
185 186 |
printk(KERN_DEBUG "OOMkill: task %d (%s) got %lu points ", |
1da177e4c Linux-2.6.12-rc2 |
187 188 189 190 191 192 |
p->pid, p->comm, points); #endif return points; } /* |
9b0f8b040 [PATCH] Terminate... |
193 194 |
* Determine the type of allocation constraint. */ |
9b0f8b040 [PATCH] Terminate... |
195 |
#ifdef CONFIG_NUMA |
4365a5676 oom-kill: fix NUM... |
196 197 198 |
static enum oom_constraint constrained_alloc(struct zonelist *zonelist, gfp_t gfp_mask, nodemask_t *nodemask) { |
54a6eb5c4 mm: use two zonel... |
199 |
struct zone *zone; |
dd1a239f6 mm: have zonelist... |
200 |
struct zoneref *z; |
54a6eb5c4 mm: use two zonel... |
201 |
enum zone_type high_zoneidx = gfp_zone(gfp_mask); |
9b0f8b040 [PATCH] Terminate... |
202 |
|
4365a5676 oom-kill: fix NUM... |
203 204 205 206 207 208 209 |
/* * Reach here only when __GFP_NOFAIL is used. So, we should avoid * to kill current.We have to random task kill in this case. * Hopefully, CONSTRAINT_THISNODE...but no way to handle it, now. */ if (gfp_mask & __GFP_THISNODE) return CONSTRAINT_NONE; |
9b0f8b040 [PATCH] Terminate... |
210 |
|
4365a5676 oom-kill: fix NUM... |
211 212 213 214 215 216 217 |
/* * The nodemask here is a nodemask passed to alloc_pages(). Now, * cpuset doesn't use this nodemask for its hardwall/softwall/hierarchy * feature. mempolicy is an only user of nodemask here. * check mempolicy's nodemask contains all N_HIGH_MEMORY */ if (nodemask && !nodes_subset(node_states[N_HIGH_MEMORY], *nodemask)) |
9b0f8b040 [PATCH] Terminate... |
218 |
return CONSTRAINT_MEMORY_POLICY; |
4365a5676 oom-kill: fix NUM... |
219 220 221 222 223 224 |
/* Check this allocation failure is caused by cpuset's wall function */ for_each_zone_zonelist_nodemask(zone, z, zonelist, high_zoneidx, nodemask) if (!cpuset_zone_allowed_softwall(zone, gfp_mask)) return CONSTRAINT_CPUSET; |
9b0f8b040 [PATCH] Terminate... |
225 226 227 |
return CONSTRAINT_NONE; } |
4365a5676 oom-kill: fix NUM... |
228 229 230 231 232 233 234 |
#else static enum oom_constraint constrained_alloc(struct zonelist *zonelist, gfp_t gfp_mask, nodemask_t *nodemask) { return CONSTRAINT_NONE; } #endif |
9b0f8b040 [PATCH] Terminate... |
235 236 |
/* |
1da177e4c Linux-2.6.12-rc2 |
237 238 239 240 241 |
* Simple selection loop. We chose the process with the highest * number of 'points'. We expect the caller will lock the tasklist. * * (not docbooked, we don't want this one cluttering up the manual) */ |
c7ba5c9e8 Memory controller... |
242 243 |
static struct task_struct *select_bad_process(unsigned long *ppoints, struct mem_cgroup *mem) |
1da177e4c Linux-2.6.12-rc2 |
244 |
{ |
495789a51 oom: make oom_sco... |
245 |
struct task_struct *p; |
1da177e4c Linux-2.6.12-rc2 |
246 247 |
struct task_struct *chosen = NULL; struct timespec uptime; |
9827b781f [PATCH] OOM kill:... |
248 |
*ppoints = 0; |
1da177e4c Linux-2.6.12-rc2 |
249 250 |
do_posix_clock_monotonic_gettime(&uptime); |
495789a51 oom: make oom_sco... |
251 |
for_each_process(p) { |
a49335cce [PATCH] cpusets: ... |
252 |
unsigned long points; |
a49335cce [PATCH] cpusets: ... |
253 |
|
28324d1df [PATCH] select_ba... |
254 255 256 257 |
/* * skip kernel threads and tasks which have already released * their mm. */ |
5081dde33 [PATCH] oom: kthr... |
258 259 |
if (!p->mm) continue; |
28324d1df [PATCH] select_ba... |
260 |
/* skip the init task */ |
b460cbc58 pid namespaces: d... |
261 |
if (is_global_init(p)) |
a49335cce [PATCH] cpusets: ... |
262 |
continue; |
4c4a22148 memcontrol: move ... |
263 264 |
if (mem && !task_in_mem_cgroup(p, mem)) continue; |
ef08e3b49 [PATCH] cpusets: ... |
265 |
|
a49335cce [PATCH] cpusets: ... |
266 |
/* |
b78483a4b [PATCH] oom: don'... |
267 268 269 270 271 272 273 274 275 276 277 278 |
* This task already has access to memory reserves and is * being killed. Don't allow any other task access to the * memory reserve. * * Note: this may have a chance of deadlock if it gets * blocked waiting for another task which itself is waiting * for memory. Is there a better alternative? */ if (test_tsk_thread_flag(p, TIF_MEMDIE)) return ERR_PTR(-1UL); /* |
6937a25cf [PATCH] mm: fix t... |
279 |
* This is in the process of releasing memory so wait for it |
a49335cce [PATCH] cpusets: ... |
280 |
* to finish before killing some other task by mistake. |
50ec3bbff [PATCH] oom: hand... |
281 282 283 284 285 |
* * However, if p is the current task, we allow the 'kill' to * go ahead if it is exiting: this will simply set TIF_MEMDIE, * which will allow it to gain access to memory reserves in * the process of exiting and releasing its resources. |
b78483a4b [PATCH] oom: don'... |
286 |
* Otherwise we could get an easy OOM deadlock. |
a49335cce [PATCH] cpusets: ... |
287 |
*/ |
b78483a4b [PATCH] oom: don'... |
288 289 290 |
if (p->flags & PF_EXITING) { if (p != current) return ERR_PTR(-1UL); |
972c4ea59 [PATCH] select_ba... |
291 292 |
chosen = p; *ppoints = ULONG_MAX; |
50ec3bbff [PATCH] oom: hand... |
293 |
} |
972c4ea59 [PATCH] select_ba... |
294 |
|
28b83c519 oom: move oom_adj... |
295 |
if (p->signal->oom_adj == OOM_DISABLE) |
0753ba01e mm: revert "oom: ... |
296 |
continue; |
97d87c971 oom_kill: remove ... |
297 |
points = badness(p, uptime.tv_sec); |
0753ba01e mm: revert "oom: ... |
298 |
if (points > *ppoints || !chosen) { |
a49335cce [PATCH] cpusets: ... |
299 |
chosen = p; |
9827b781f [PATCH] OOM kill:... |
300 |
*ppoints = points; |
1da177e4c Linux-2.6.12-rc2 |
301 |
} |
495789a51 oom: make oom_sco... |
302 |
} |
972c4ea59 [PATCH] select_ba... |
303 |
|
1da177e4c Linux-2.6.12-rc2 |
304 305 306 307 |
return chosen; } /** |
1b578df02 mm/oom_kill: fix ... |
308 309 310 |
* dump_tasks - dump current memory state of all system tasks * @mem: target memory controller * |
fef1bdd68 oom: add sysctl t... |
311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 |
* Dumps the current memory state of all system tasks, excluding kernel threads. * State information includes task's pid, uid, tgid, vm size, rss, cpu, oom_adj * score, and name. * * If the actual is non-NULL, only tasks that are a member of the mem_cgroup are * shown. * * Call with tasklist_lock read-locked. */ static void dump_tasks(const struct mem_cgroup *mem) { struct task_struct *g, *p; printk(KERN_INFO "[ pid ] uid tgid total_vm rss cpu oom_adj " "name "); do_each_thread(g, p) { |
6d2661ede oom: fix possible... |
328 |
struct mm_struct *mm; |
fef1bdd68 oom: add sysctl t... |
329 330 |
if (mem && !task_in_mem_cgroup(p, mem)) continue; |
b4416d2be oom: do not dump ... |
331 332 |
if (!thread_group_leader(p)) continue; |
fef1bdd68 oom: add sysctl t... |
333 334 |
task_lock(p); |
6d2661ede oom: fix possible... |
335 336 337 338 339 340 341 342 343 344 |
mm = p->mm; if (!mm) { /* * total_vm and rss sizes do not exist for tasks with no * mm so there's no need to report them; they can't be * oom killed anyway. */ task_unlock(p); continue; } |
fef1bdd68 oom: add sysctl t... |
345 346 |
printk(KERN_INFO "[%5d] %5d %5d %8lu %8lu %3d %3d %s ", |
6d2661ede oom: fix possible... |
347 |
p->pid, __task_cred(p)->uid, p->tgid, mm->total_vm, |
28b83c519 oom: move oom_adj... |
348 |
get_mm_rss(mm), (int)task_cpu(p), p->signal->oom_adj, |
0753ba01e mm: revert "oom: ... |
349 |
p->comm); |
fef1bdd68 oom: add sysctl t... |
350 351 352 |
task_unlock(p); } while_each_thread(g, p); } |
d31f56dbf memcg: avoid oom-... |
353 354 |
static void dump_header(struct task_struct *p, gfp_t gfp_mask, int order, struct mem_cgroup *mem) |
1b604d75b oom: dump stack a... |
355 356 357 358 359 360 361 362 363 |
{ pr_warning("%s invoked oom-killer: gfp_mask=0x%x, order=%d, " "oom_adj=%d ", current->comm, gfp_mask, order, current->signal->oom_adj); task_lock(current); cpuset_print_task_mems_allowed(current); task_unlock(current); dump_stack(); |
d31f56dbf memcg: avoid oom-... |
364 |
mem_cgroup_print_oom_info(mem, p); |
1b604d75b oom: dump stack a... |
365 366 367 368 |
show_mem(); if (sysctl_oom_dump_tasks) dump_tasks(mem); } |
3b4798cbc oom-kill: show vi... |
369 |
#define K(x) ((x) << (PAGE_SHIFT-10)) |
1b578df02 mm/oom_kill: fix ... |
370 |
/* |
5a291b98b [PATCH] oom-kill:... |
371 372 373 |
* Send SIGKILL to the selected process irrespective of CAP_SYS_RAW_IO * flag though it's unlikely that we select a process with CAP_SYS_RAW_IO * set. |
1da177e4c Linux-2.6.12-rc2 |
374 |
*/ |
f3af38d30 [PATCH] oom: clea... |
375 |
static void __oom_kill_task(struct task_struct *p, int verbose) |
1da177e4c Linux-2.6.12-rc2 |
376 |
{ |
b460cbc58 pid namespaces: d... |
377 |
if (is_global_init(p)) { |
1da177e4c Linux-2.6.12-rc2 |
378 379 380 381 382 |
WARN_ON(1); printk(KERN_WARNING "tried to kill init! "); return; } |
3b4798cbc oom-kill: show vi... |
383 |
task_lock(p); |
0753ba01e mm: revert "oom: ... |
384 385 |
if (!p->mm) { WARN_ON(1); |
3b4798cbc oom-kill: show vi... |
386 387 388 389 |
printk(KERN_WARNING "tried to kill an mm-less task %d (%s)! ", task_pid_nr(p), p->comm); task_unlock(p); |
1da177e4c Linux-2.6.12-rc2 |
390 |
return; |
0753ba01e mm: revert "oom: ... |
391 |
} |
50ec3bbff [PATCH] oom: hand... |
392 |
|
f3af38d30 [PATCH] oom: clea... |
393 |
if (verbose) |
3b4798cbc oom-kill: show vi... |
394 395 396 397 398 |
printk(KERN_ERR "Killed process %d (%s) " "vsz:%lukB, anon-rss:%lukB, file-rss:%lukB ", task_pid_nr(p), p->comm, K(p->mm->total_vm), |
d559db086 mm: clean up mm_c... |
399 400 |
K(get_mm_counter(p->mm, MM_ANONPAGES)), K(get_mm_counter(p->mm, MM_FILEPAGES))); |
3b4798cbc oom-kill: show vi... |
401 |
task_unlock(p); |
1da177e4c Linux-2.6.12-rc2 |
402 403 404 405 406 407 |
/* * We give our sacrificial lamb high priority and access to * all the memory it needs. That way it should be able to * exit() and clear out its resources quickly... */ |
fa717060f sched: sched_rt_e... |
408 |
p->rt.time_slice = HZ; |
1da177e4c Linux-2.6.12-rc2 |
409 410 411 412 |
set_tsk_thread_flag(p, TIF_MEMDIE); force_sig(SIGKILL, p); } |
f3af38d30 [PATCH] oom: clea... |
413 |
static int oom_kill_task(struct task_struct *p) |
1da177e4c Linux-2.6.12-rc2 |
414 |
{ |
0753ba01e mm: revert "oom: ... |
415 416 417 418 419 420 421 422 |
/* WARNING: mm may not be dereferenced since we did not obtain its * value from get_task_mm(p). This is OK since all we need to do is * compare mm to q->mm below. * * Furthermore, even if mm contains a non-NULL value, p->mm may * change to NULL at any time since we do not hold task_lock(p). * However, this is of no concern to us. */ |
8c5cd6f3a oom: oom_kill doe... |
423 |
if (!p->mm || p->signal->oom_adj == OOM_DISABLE) |
013159227 [PATCH] mm: fix m... |
424 |
return 1; |
0753ba01e mm: revert "oom: ... |
425 |
|
f3af38d30 [PATCH] oom: clea... |
426 |
__oom_kill_task(p, 1); |
c33e0fca3 [PATCH] oom: don'... |
427 |
|
013159227 [PATCH] mm: fix m... |
428 |
return 0; |
1da177e4c Linux-2.6.12-rc2 |
429 |
} |
7213f5066 oom: suppress ext... |
430 |
static int oom_kill_process(struct task_struct *p, gfp_t gfp_mask, int order, |
fef1bdd68 oom: add sysctl t... |
431 432 |
unsigned long points, struct mem_cgroup *mem, const char *message) |
1da177e4c Linux-2.6.12-rc2 |
433 |
{ |
1da177e4c Linux-2.6.12-rc2 |
434 |
struct task_struct *c; |
1da177e4c Linux-2.6.12-rc2 |
435 |
|
1b604d75b oom: dump stack a... |
436 |
if (printk_ratelimit()) |
d31f56dbf memcg: avoid oom-... |
437 |
dump_header(p, gfp_mask, order, mem); |
7213f5066 oom: suppress ext... |
438 |
|
50ec3bbff [PATCH] oom: hand... |
439 440 441 442 |
/* * If the task is already exiting, don't alarm the sysadmin or kill * its children or threads, just set TIF_MEMDIE so it can die quickly */ |
0753ba01e mm: revert "oom: ... |
443 |
if (p->flags & PF_EXITING) { |
f3af38d30 [PATCH] oom: clea... |
444 |
__oom_kill_task(p, 0); |
50ec3bbff [PATCH] oom: hand... |
445 446 |
return 0; } |
f3af38d30 [PATCH] oom: clea... |
447 448 |
printk(KERN_ERR "%s: kill process %d (%s) score %li or a child ", |
ba25f9dcc Use helpers to ob... |
449 |
message, task_pid_nr(p), p->comm, points); |
f3af38d30 [PATCH] oom: clea... |
450 |
|
1da177e4c Linux-2.6.12-rc2 |
451 |
/* Try to kill a child first */ |
7b1915a98 mm/oom_kill.c: Us... |
452 |
list_for_each_entry(c, &p->children, sibling) { |
1da177e4c Linux-2.6.12-rc2 |
453 454 |
if (c->mm == p->mm) continue; |
5a2d41961 memcg: fix oom ki... |
455 456 |
if (mem && !task_in_mem_cgroup(c, mem)) continue; |
f3af38d30 [PATCH] oom: clea... |
457 |
if (!oom_kill_task(c)) |
013159227 [PATCH] mm: fix m... |
458 |
return 0; |
1da177e4c Linux-2.6.12-rc2 |
459 |
} |
f3af38d30 [PATCH] oom: clea... |
460 |
return oom_kill_task(p); |
1da177e4c Linux-2.6.12-rc2 |
461 |
} |
00f0b8259 Memory controller... |
462 |
#ifdef CONFIG_CGROUP_MEM_RES_CTLR |
c7ba5c9e8 Memory controller... |
463 464 465 466 |
void mem_cgroup_out_of_memory(struct mem_cgroup *mem, gfp_t gfp_mask) { unsigned long points = 0; struct task_struct *p; |
daaf1e688 memcg: handle pan... |
467 468 469 |
if (sysctl_panic_on_oom == 2) panic("out of memory(memcg). panic_on_oom is selected. "); |
e115f2d89 memcg: fix oops i... |
470 |
read_lock(&tasklist_lock); |
c7ba5c9e8 Memory controller... |
471 472 |
retry: p = select_bad_process(&points, mem); |
df64f81bb memcg: make oom k... |
473 |
if (!p || PTR_ERR(p) == -1UL) |
c7ba5c9e8 Memory controller... |
474 |
goto out; |
fef1bdd68 oom: add sysctl t... |
475 |
if (oom_kill_process(p, gfp_mask, 0, points, mem, |
c7ba5c9e8 Memory controller... |
476 477 478 |
"Memory cgroup out of memory")) goto retry; out: |
e115f2d89 memcg: fix oops i... |
479 |
read_unlock(&tasklist_lock); |
c7ba5c9e8 Memory controller... |
480 481 |
} #endif |
8bc719d3c [PATCH] out of me... |
482 483 484 485 486 487 488 489 490 491 492 493 494 |
static BLOCKING_NOTIFIER_HEAD(oom_notify_list); int register_oom_notifier(struct notifier_block *nb) { return blocking_notifier_chain_register(&oom_notify_list, nb); } EXPORT_SYMBOL_GPL(register_oom_notifier); int unregister_oom_notifier(struct notifier_block *nb) { return blocking_notifier_chain_unregister(&oom_notify_list, nb); } EXPORT_SYMBOL_GPL(unregister_oom_notifier); |
098d7f128 oom: add per-zone... |
495 496 497 498 499 |
/* * Try to acquire the OOM killer lock for the zones in zonelist. Returns zero * if a parallel OOM killing is already taking place that includes a zone in * the zonelist. Otherwise, locks all zones in the zonelist and returns 1. */ |
dd1a239f6 mm: have zonelist... |
500 |
int try_set_zone_oom(struct zonelist *zonelist, gfp_t gfp_mask) |
098d7f128 oom: add per-zone... |
501 |
{ |
dd1a239f6 mm: have zonelist... |
502 503 |
struct zoneref *z; struct zone *zone; |
098d7f128 oom: add per-zone... |
504 |
int ret = 1; |
c7d4caeb1 oom: fix zone_sca... |
505 |
spin_lock(&zone_scan_lock); |
dd1a239f6 mm: have zonelist... |
506 507 |
for_each_zone_zonelist(zone, z, zonelist, gfp_zone(gfp_mask)) { if (zone_is_oom_locked(zone)) { |
098d7f128 oom: add per-zone... |
508 509 510 |
ret = 0; goto out; } |
dd1a239f6 mm: have zonelist... |
511 512 513 514 |
} for_each_zone_zonelist(zone, z, zonelist, gfp_zone(gfp_mask)) { /* |
c7d4caeb1 oom: fix zone_sca... |
515 |
* Lock each zone in the zonelist under zone_scan_lock so a |
dd1a239f6 mm: have zonelist... |
516 517 518 519 520 |
* parallel invocation of try_set_zone_oom() doesn't succeed * when it shouldn't. */ zone_set_flag(zone, ZONE_OOM_LOCKED); } |
098d7f128 oom: add per-zone... |
521 |
|
098d7f128 oom: add per-zone... |
522 |
out: |
c7d4caeb1 oom: fix zone_sca... |
523 |
spin_unlock(&zone_scan_lock); |
098d7f128 oom: add per-zone... |
524 525 526 527 528 529 530 531 |
return ret; } /* * Clears the ZONE_OOM_LOCKED flag for all zones in the zonelist so that failed * allocation attempts with zonelists containing them may now recall the OOM * killer, if necessary. */ |
dd1a239f6 mm: have zonelist... |
532 |
void clear_zonelist_oom(struct zonelist *zonelist, gfp_t gfp_mask) |
098d7f128 oom: add per-zone... |
533 |
{ |
dd1a239f6 mm: have zonelist... |
534 535 |
struct zoneref *z; struct zone *zone; |
098d7f128 oom: add per-zone... |
536 |
|
c7d4caeb1 oom: fix zone_sca... |
537 |
spin_lock(&zone_scan_lock); |
dd1a239f6 mm: have zonelist... |
538 539 540 |
for_each_zone_zonelist(zone, z, zonelist, gfp_zone(gfp_mask)) { zone_clear_flag(zone, ZONE_OOM_LOCKED); } |
c7d4caeb1 oom: fix zone_sca... |
541 |
spin_unlock(&zone_scan_lock); |
098d7f128 oom: add per-zone... |
542 |
} |
1c0fe6e3b mm: invoke oom-ki... |
543 544 545 546 547 |
/* * Must be called with tasklist_lock held for read. */ static void __out_of_memory(gfp_t gfp_mask, int order) { |
184101bf1 oom: prevent live... |
548 549 |
struct task_struct *p; unsigned long points; |
1c0fe6e3b mm: invoke oom-ki... |
550 |
|
184101bf1 oom: prevent live... |
551 552 553 |
if (sysctl_oom_kill_allocating_task) if (!oom_kill_process(current, gfp_mask, order, 0, NULL, "Out of memory (oom_kill_allocating_task)")) |
1c0fe6e3b mm: invoke oom-ki... |
554 |
return; |
184101bf1 oom: prevent live... |
555 556 557 558 559 560 |
retry: /* * Rambo mode: Shoot down a process and hope it solves whatever * issues we may have. */ p = select_bad_process(&points, NULL); |
1c0fe6e3b mm: invoke oom-ki... |
561 |
|
184101bf1 oom: prevent live... |
562 563 |
if (PTR_ERR(p) == -1UL) return; |
1c0fe6e3b mm: invoke oom-ki... |
564 |
|
184101bf1 oom: prevent live... |
565 566 567 |
/* Found nothing?!?! Either we hang forever, or we panic. */ if (!p) { read_unlock(&tasklist_lock); |
d31f56dbf memcg: avoid oom-... |
568 |
dump_header(NULL, gfp_mask, order, NULL); |
184101bf1 oom: prevent live... |
569 570 |
panic("Out of memory and no killable processes... "); |
1c0fe6e3b mm: invoke oom-ki... |
571 |
} |
184101bf1 oom: prevent live... |
572 573 574 575 |
if (oom_kill_process(p, gfp_mask, order, points, NULL, "Out of memory")) goto retry; |
1c0fe6e3b mm: invoke oom-ki... |
576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 |
} /* * pagefault handler calls into here because it is out of memory but * doesn't know exactly how or why. */ void pagefault_out_of_memory(void) { unsigned long freed = 0; blocking_notifier_call_chain(&oom_notify_list, 0, &freed); if (freed > 0) /* Got some memory back in the last second. */ return; if (sysctl_panic_on_oom) panic("out of memory from page fault. panic_on_oom is selected. "); read_lock(&tasklist_lock); __out_of_memory(0, 0); /* unknown gfp_mask and order */ read_unlock(&tasklist_lock); /* * Give "p" a good chance of killing itself before we * retry to allocate memory. */ if (!test_thread_flag(TIF_MEMDIE)) schedule_timeout_uninterruptible(1); } |
1da177e4c Linux-2.6.12-rc2 |
606 |
/** |
6937a25cf [PATCH] mm: fix t... |
607 |
* out_of_memory - kill the "best" process when we run out of memory |
1b578df02 mm/oom_kill: fix ... |
608 609 610 |
* @zonelist: zonelist pointer * @gfp_mask: memory allocation flags * @order: amount of memory being requested as a power of 2 |
1da177e4c Linux-2.6.12-rc2 |
611 612 613 614 615 616 |
* * If we run out of memory, we have the choice between either * killing a random task (bad), letting the system crash (worse) * OR try to be smart about which process to kill. Note that we * don't have to be perfect here, we just have to be good. */ |
4365a5676 oom-kill: fix NUM... |
617 618 |
void out_of_memory(struct zonelist *zonelist, gfp_t gfp_mask, int order, nodemask_t *nodemask) |
1da177e4c Linux-2.6.12-rc2 |
619 |
{ |
8bc719d3c [PATCH] out of me... |
620 |
unsigned long freed = 0; |
70e24bdf6 oom: move constra... |
621 |
enum oom_constraint constraint; |
8bc719d3c [PATCH] out of me... |
622 623 624 625 626 |
blocking_notifier_call_chain(&oom_notify_list, 0, &freed); if (freed > 0) /* Got some memory back in the last second. */ return; |
1da177e4c Linux-2.6.12-rc2 |
627 |
|
1b604d75b oom: dump stack a... |
628 |
if (sysctl_panic_on_oom == 2) { |
d31f56dbf memcg: avoid oom-... |
629 |
dump_header(NULL, gfp_mask, order, NULL); |
2b744c01a mm: fix handling ... |
630 631 |
panic("out of memory. Compulsory panic_on_oom is selected. "); |
1b604d75b oom: dump stack a... |
632 |
} |
2b744c01a mm: fix handling ... |
633 |
|
9b0f8b040 [PATCH] Terminate... |
634 635 636 637 |
/* * Check if there were limitations on the allocation (only relevant for * NUMA) that may require different handling. */ |
4365a5676 oom-kill: fix NUM... |
638 |
constraint = constrained_alloc(zonelist, gfp_mask, nodemask); |
2b45ab339 oom: fix constrai... |
639 640 641 |
read_lock(&tasklist_lock); switch (constraint) { |
9b0f8b040 [PATCH] Terminate... |
642 |
case CONSTRAINT_MEMORY_POLICY: |
1c0fe6e3b mm: invoke oom-ki... |
643 |
oom_kill_process(current, gfp_mask, order, 0, NULL, |
9b0f8b040 [PATCH] Terminate... |
644 645 |
"No available memory (MPOL_BIND)"); break; |
9b0f8b040 [PATCH] Terminate... |
646 |
case CONSTRAINT_NONE: |
1b604d75b oom: dump stack a... |
647 |
if (sysctl_panic_on_oom) { |
d31f56dbf memcg: avoid oom-... |
648 |
dump_header(NULL, gfp_mask, order, NULL); |
fadd8fbd1 [PATCH] support f... |
649 650 |
panic("out of memory. panic_on_oom is selected "); |
1b604d75b oom: dump stack a... |
651 |
} |
fe071d7e8 oom: add oom_kill... |
652 653 |
/* Fall-through */ case CONSTRAINT_CPUSET: |
1c0fe6e3b mm: invoke oom-ki... |
654 |
__out_of_memory(gfp_mask, order); |
9b0f8b040 [PATCH] Terminate... |
655 656 |
break; } |
1da177e4c Linux-2.6.12-rc2 |
657 |
|
140ffcec4 [PATCH] out_of_me... |
658 |
read_unlock(&tasklist_lock); |
1da177e4c Linux-2.6.12-rc2 |
659 660 661 |
/* * Give "p" a good chance of killing itself before we |
2f659f462 [PATCH] Optimise ... |
662 |
* retry to allocate memory unless "p" is current |
1da177e4c Linux-2.6.12-rc2 |
663 |
*/ |
2f659f462 [PATCH] Optimise ... |
664 |
if (!test_thread_flag(TIF_MEMDIE)) |
140ffcec4 [PATCH] out_of_me... |
665 |
schedule_timeout_uninterruptible(1); |
1da177e4c Linux-2.6.12-rc2 |
666 |
} |