|
@@ -44,6 +44,7 @@
|
|
|
|
|
|
#include <asm/tlb.h>
|
|
|
#include "internal.h"
|
|
|
+#include "slab.h"
|
|
|
|
|
|
#define CREATE_TRACE_POINTS
|
|
|
#include <trace/events/oom.h>
|
|
@@ -161,6 +162,25 @@ static bool oom_unkillable_task(struct task_struct *p,
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
+/*
|
|
|
+ * Print out unreclaimble slabs info when unreclaimable slabs amount is greater
|
|
|
+ * than all user memory (LRU pages)
|
|
|
+ */
|
|
|
+static bool is_dump_unreclaim_slabs(void)
|
|
|
+{
|
|
|
+ unsigned long nr_lru;
|
|
|
+
|
|
|
+ nr_lru = global_node_page_state(NR_ACTIVE_ANON) +
|
|
|
+ global_node_page_state(NR_INACTIVE_ANON) +
|
|
|
+ global_node_page_state(NR_ACTIVE_FILE) +
|
|
|
+ global_node_page_state(NR_INACTIVE_FILE) +
|
|
|
+ global_node_page_state(NR_ISOLATED_ANON) +
|
|
|
+ global_node_page_state(NR_ISOLATED_FILE) +
|
|
|
+ global_node_page_state(NR_UNEVICTABLE);
|
|
|
+
|
|
|
+ return (global_node_page_state(NR_SLAB_UNRECLAIMABLE) > nr_lru);
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
* oom_badness - heuristic function to determine which candidate task to kill
|
|
|
* @p: task struct of which task we should calculate
|
|
@@ -420,10 +440,13 @@ static void dump_header(struct oom_control *oc, struct task_struct *p)
|
|
|
|
|
|
cpuset_print_current_mems_allowed();
|
|
|
dump_stack();
|
|
|
- if (oc->memcg)
|
|
|
+ if (is_memcg_oom(oc))
|
|
|
mem_cgroup_print_oom_info(oc->memcg, p);
|
|
|
- else
|
|
|
+ else {
|
|
|
show_mem(SHOW_MEM_FILTER_NODES, oc->nodemask);
|
|
|
+ if (is_dump_unreclaim_slabs())
|
|
|
+ dump_unreclaimable_slab();
|
|
|
+ }
|
|
|
if (sysctl_oom_dump_tasks)
|
|
|
dump_tasks(oc->memcg, oc->nodemask);
|
|
|
}
|