git://ftp.safe.ca
/
safe
/
jmp
/
linux-2.6
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
percpu: misc preparations for nommu support
[safe/jmp/linux-2.6]
/
mm
/
oom_kill.c
diff --git
a/mm/oom_kill.c
b/mm/oom_kill.c
index
25c679e
..
b68e802
100644
(file)
--- a/
mm/oom_kill.c
+++ b/
mm/oom_kill.c
@@
-18,6
+18,7
@@
#include <linux/oom.h>
#include <linux/mm.h>
#include <linux/err.h>
#include <linux/oom.h>
#include <linux/mm.h>
#include <linux/err.h>
+#include <linux/gfp.h>
#include <linux/sched.h>
#include <linux/swap.h>
#include <linux/timex.h>
#include <linux/sched.h>
#include <linux/swap.h>
#include <linux/timex.h>
@@
-356,7
+357,8
@@
static void dump_tasks(const struct mem_cgroup *mem)
} while_each_thread(g, p);
}
} while_each_thread(g, p);
}
-static void dump_header(gfp_t gfp_mask, int order, struct mem_cgroup *mem)
+static void dump_header(struct task_struct *p, gfp_t gfp_mask, int order,
+ struct mem_cgroup *mem)
{
pr_warning("%s invoked oom-killer: gfp_mask=0x%x, order=%d, "
"oom_adj=%d\n",
{
pr_warning("%s invoked oom-killer: gfp_mask=0x%x, order=%d, "
"oom_adj=%d\n",
@@
-365,7
+367,7
@@
static void dump_header(gfp_t gfp_mask, int order, struct mem_cgroup *mem)
cpuset_print_task_mems_allowed(current);
task_unlock(current);
dump_stack();
cpuset_print_task_mems_allowed(current);
task_unlock(current);
dump_stack();
- mem_cgroup_print_oom_info(mem,
current
);
+ mem_cgroup_print_oom_info(mem,
p
);
show_mem();
if (sysctl_oom_dump_tasks)
dump_tasks(mem);
show_mem();
if (sysctl_oom_dump_tasks)
dump_tasks(mem);
@@
-400,8
+402,8
@@
static void __oom_kill_task(struct task_struct *p, int verbose)
"vsz:%lukB, anon-rss:%lukB, file-rss:%lukB\n",
task_pid_nr(p), p->comm,
K(p->mm->total_vm),
"vsz:%lukB, anon-rss:%lukB, file-rss:%lukB\n",
task_pid_nr(p), p->comm,
K(p->mm->total_vm),
- K(get_mm_counter(p->mm,
anon_rss
)),
- K(get_mm_counter(p->mm,
file_rss
)));
+ K(get_mm_counter(p->mm,
MM_ANONPAGES
)),
+ K(get_mm_counter(p->mm,
MM_FILEPAGES
)));
task_unlock(p);
/*
task_unlock(p);
/*
@@
-440,7
+442,7
@@
static int oom_kill_process(struct task_struct *p, gfp_t gfp_mask, int order,
struct task_struct *c;
if (printk_ratelimit())
struct task_struct *c;
if (printk_ratelimit())
- dump_header(gfp_mask, order, mem);
+ dump_header(
p,
gfp_mask, order, mem);
/*
* If the task is already exiting, don't alarm the sysadmin or kill
/*
* If the task is already exiting, don't alarm the sysadmin or kill
@@
-458,6
+460,8
@@
static int oom_kill_process(struct task_struct *p, gfp_t gfp_mask, int order,
list_for_each_entry(c, &p->children, sibling) {
if (c->mm == p->mm)
continue;
list_for_each_entry(c, &p->children, sibling) {
if (c->mm == p->mm)
continue;
+ if (mem && !task_in_mem_cgroup(c, mem))
+ continue;
if (!oom_kill_task(c))
return 0;
}
if (!oom_kill_task(c))
return 0;
}
@@
-470,6
+474,8
@@
void mem_cgroup_out_of_memory(struct mem_cgroup *mem, gfp_t gfp_mask)
unsigned long points = 0;
struct task_struct *p;
unsigned long points = 0;
struct task_struct *p;
+ if (sysctl_panic_on_oom == 2)
+ panic("out of memory(memcg). panic_on_oom is selected.\n");
read_lock(&tasklist_lock);
retry:
p = select_bad_process(&points, mem);
read_lock(&tasklist_lock);
retry:
p = select_bad_process(&points, mem);
@@
-576,7
+582,7
@@
retry:
/* Found nothing?!?! Either we hang forever, or we panic. */
if (!p) {
read_unlock(&tasklist_lock);
/* Found nothing?!?! Either we hang forever, or we panic. */
if (!p) {
read_unlock(&tasklist_lock);
- dump_header(gfp_mask, order, NULL);
+ dump_header(
NULL,
gfp_mask, order, NULL);
panic("Out of memory and no killable processes...\n");
}
panic("Out of memory and no killable processes...\n");
}
@@
-598,13
+604,6
@@
void pagefault_out_of_memory(void)
/* Got some memory back in the last second. */
return;
/* Got some memory back in the last second. */
return;
- /*
- * If this is from memcg, oom-killer is already invoked.
- * and not worth to go system-wide-oom.
- */
- if (mem_cgroup_oom_called(current))
- goto rest_and_return;
-
if (sysctl_panic_on_oom)
panic("out of memory from page fault. panic_on_oom is selected.\n");
if (sysctl_panic_on_oom)
panic("out of memory from page fault. panic_on_oom is selected.\n");
@@
-616,7
+615,6
@@
void pagefault_out_of_memory(void)
* Give "p" a good chance of killing itself before we
* retry to allocate memory.
*/
* Give "p" a good chance of killing itself before we
* retry to allocate memory.
*/
-rest_and_return:
if (!test_thread_flag(TIF_MEMDIE))
schedule_timeout_uninterruptible(1);
}
if (!test_thread_flag(TIF_MEMDIE))
schedule_timeout_uninterruptible(1);
}
@@
-644,7
+642,7
@@
void out_of_memory(struct zonelist *zonelist, gfp_t gfp_mask,
return;
if (sysctl_panic_on_oom == 2) {
return;
if (sysctl_panic_on_oom == 2) {
- dump_header(gfp_mask, order, NULL);
+ dump_header(
NULL,
gfp_mask, order, NULL);
panic("out of memory. Compulsory panic_on_oom is selected.\n");
}
panic("out of memory. Compulsory panic_on_oom is selected.\n");
}
@@
-663,7
+661,7
@@
void out_of_memory(struct zonelist *zonelist, gfp_t gfp_mask,
case CONSTRAINT_NONE:
if (sysctl_panic_on_oom) {
case CONSTRAINT_NONE:
if (sysctl_panic_on_oom) {
- dump_header(gfp_mask, order, NULL);
+ dump_header(
NULL,
gfp_mask, order, NULL);
panic("out of memory. panic_on_oom is selected\n");
}
/* Fall-through */
panic("out of memory. panic_on_oom is selected\n");
}
/* Fall-through */