|
@@ -337,6 +337,21 @@ static void dump_tasks(const struct mem_cgroup *mem)
|
|
|
} while_each_thread(g, p);
|
|
|
}
|
|
|
|
|
|
+static void dump_header(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",
|
|
|
+ current->comm, gfp_mask, order, current->signal->oom_adj);
|
|
|
+ task_lock(current);
|
|
|
+ cpuset_print_task_mems_allowed(current);
|
|
|
+ task_unlock(current);
|
|
|
+ dump_stack();
|
|
|
+ mem_cgroup_print_oom_info(mem, current);
|
|
|
+ show_mem();
|
|
|
+ if (sysctl_oom_dump_tasks)
|
|
|
+ dump_tasks(mem);
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
* 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
|
|
@@ -395,20 +410,8 @@ static int oom_kill_process(struct task_struct *p, gfp_t gfp_mask, int order,
|
|
|
{
|
|
|
struct task_struct *c;
|
|
|
|
|
|
- if (printk_ratelimit()) {
|
|
|
- printk(KERN_WARNING "%s invoked oom-killer: "
|
|
|
- "gfp_mask=0x%x, order=%d, oom_adj=%d\n",
|
|
|
- current->comm, gfp_mask, order,
|
|
|
- current->signal->oom_adj);
|
|
|
- task_lock(current);
|
|
|
- cpuset_print_task_mems_allowed(current);
|
|
|
- task_unlock(current);
|
|
|
- dump_stack();
|
|
|
- mem_cgroup_print_oom_info(mem, current);
|
|
|
- show_mem();
|
|
|
- if (sysctl_oom_dump_tasks)
|
|
|
- dump_tasks(mem);
|
|
|
- }
|
|
|
+ if (printk_ratelimit())
|
|
|
+ dump_header(gfp_mask, order, mem);
|
|
|
|
|
|
/*
|
|
|
* If the task is already exiting, don't alarm the sysadmin or kill
|
|
@@ -544,6 +547,7 @@ retry:
|
|
|
/* Found nothing?!?! Either we hang forever, or we panic. */
|
|
|
if (!p) {
|
|
|
read_unlock(&tasklist_lock);
|
|
|
+ dump_header(gfp_mask, order, NULL);
|
|
|
panic("Out of memory and no killable processes...\n");
|
|
|
}
|
|
|
|
|
@@ -609,8 +613,10 @@ void out_of_memory(struct zonelist *zonelist, gfp_t gfp_mask, int order)
|
|
|
/* Got some memory back in the last second. */
|
|
|
return;
|
|
|
|
|
|
- if (sysctl_panic_on_oom == 2)
|
|
|
+ if (sysctl_panic_on_oom == 2) {
|
|
|
+ dump_header(gfp_mask, order, NULL);
|
|
|
panic("out of memory. Compulsory panic_on_oom is selected.\n");
|
|
|
+ }
|
|
|
|
|
|
/*
|
|
|
* Check if there were limitations on the allocation (only relevant for
|
|
@@ -626,8 +632,10 @@ void out_of_memory(struct zonelist *zonelist, gfp_t gfp_mask, int order)
|
|
|
break;
|
|
|
|
|
|
case CONSTRAINT_NONE:
|
|
|
- if (sysctl_panic_on_oom)
|
|
|
+ if (sysctl_panic_on_oom) {
|
|
|
+ dump_header(gfp_mask, order, NULL);
|
|
|
panic("out of memory. panic_on_oom is selected\n");
|
|
|
+ }
|
|
|
/* Fall-through */
|
|
|
case CONSTRAINT_CPUSET:
|
|
|
__out_of_memory(gfp_mask, order);
|