33 #include <linux/module.h>
34 #include <linux/kernel.h>
36 #include <linux/oom.h>
37 #include <linux/sched.h>
42 static uint32_t lowmem_debug_level = 2;
43 static int lowmem_adj[6] = {
49 static int lowmem_adj_size = 4;
50 static int lowmem_minfree[6] = {
56 static int lowmem_minfree_size = 4;
58 static unsigned long lowmem_deathpending_timeout;
60 #define lowmem_print(level, x...) \
62 if (lowmem_debug_level >= (level)) \
74 int selected_tasksize = 0;
75 int selected_oom_score_adj;
81 if (lowmem_adj_size < array_size)
82 array_size = lowmem_adj_size;
83 if (lowmem_minfree_size < array_size)
84 array_size = lowmem_minfree_size;
85 for (i = 0; i < array_size; i++) {
86 if (other_free < lowmem_minfree[i] &&
87 other_file < lowmem_minfree[i]) {
88 min_score_adj = lowmem_adj[
i];
93 lowmem_print(3,
"lowmem_shrink %lu, %x, ofree %d %d, ma %d\n",
95 other_file, min_score_adj);
105 selected_oom_score_adj = min_score_adj;
125 oom_score_adj = p->
signal->oom_score_adj;
126 if (oom_score_adj < min_score_adj) {
130 tasksize = get_mm_rss(p->
mm);
135 if (oom_score_adj < selected_oom_score_adj)
137 if (oom_score_adj == selected_oom_score_adj &&
138 tasksize <= selected_tasksize)
142 selected_tasksize = tasksize;
143 selected_oom_score_adj = oom_score_adj;
144 lowmem_print(2,
"select %d (%s), adj %d, size %d, to kill\n",
145 p->
pid, p->
comm, oom_score_adj, tasksize);
148 lowmem_print(1,
"send sigkill to %d (%s), adj %d, size %d\n",
150 selected_oom_score_adj, selected_tasksize);
151 lowmem_deathpending_timeout =
jiffies +
HZ;
154 rem -= selected_tasksize;
162 static struct shrinker lowmem_shrinker = {
163 .shrink = lowmem_shrink,
167 static int __init lowmem_init(
void)
173 static void __exit lowmem_exit(
void)