Lines Matching refs:oc

74 static inline bool is_memcg_oom(struct oom_control *oc)  in is_memcg_oom()  argument
76 return oc->memcg != NULL; in is_memcg_oom()
93 struct oom_control *oc) in oom_cpuset_eligible() argument
97 const nodemask_t *mask = oc->nodemask; in oom_cpuset_eligible()
99 if (is_memcg_oom(oc)) in oom_cpuset_eligible()
127 static bool oom_cpuset_eligible(struct task_struct *tsk, struct oom_control *oc) in oom_cpuset_eligible() argument
162 static inline bool is_sysrq_oom(struct oom_control *oc) in is_sysrq_oom() argument
164 return oc->order == -1; in is_sysrq_oom()
255 static enum oom_constraint constrained_alloc(struct oom_control *oc) in constrained_alloc() argument
259 enum zone_type highest_zoneidx = gfp_zone(oc->gfp_mask); in constrained_alloc()
263 if (is_memcg_oom(oc)) { in constrained_alloc()
264 oc->totalpages = mem_cgroup_get_max(oc->memcg) ?: 1; in constrained_alloc()
269 oc->totalpages = totalram_pages() + total_swap_pages; in constrained_alloc()
274 if (!oc->zonelist) in constrained_alloc()
281 if (oc->gfp_mask & __GFP_THISNODE) in constrained_alloc()
289 if (oc->nodemask && in constrained_alloc()
290 !nodes_subset(node_states[N_MEMORY], *oc->nodemask)) { in constrained_alloc()
291 oc->totalpages = total_swap_pages; in constrained_alloc()
292 for_each_node_mask(nid, *oc->nodemask) in constrained_alloc()
293 oc->totalpages += node_present_pages(nid); in constrained_alloc()
298 for_each_zone_zonelist_nodemask(zone, z, oc->zonelist, in constrained_alloc()
299 highest_zoneidx, oc->nodemask) in constrained_alloc()
300 if (!cpuset_zone_allowed(zone, oc->gfp_mask)) in constrained_alloc()
304 oc->totalpages = total_swap_pages; in constrained_alloc()
306 oc->totalpages += node_present_pages(nid); in constrained_alloc()
314 struct oom_control *oc = arg; in oom_evaluate_task() local
321 if (!is_memcg_oom(oc) && !oom_cpuset_eligible(task, oc)) in oom_evaluate_task()
330 if (!is_sysrq_oom(oc) && tsk_is_oom_victim(task)) { in oom_evaluate_task()
345 points = oom_badness(task, oc->totalpages); in oom_evaluate_task()
355 points > oc->chosen_non_negative_adj_points) { in oom_evaluate_task()
356 if (oc->chosen_non_negative_adj) in oom_evaluate_task()
357 put_task_struct(oc->chosen_non_negative_adj); in oom_evaluate_task()
359 oc->chosen_non_negative_adj = task; in oom_evaluate_task()
360 oc->chosen_non_negative_adj_points = points; in oom_evaluate_task()
363 if (points < oc->chosen_points) in oom_evaluate_task()
367 if (oc->chosen) in oom_evaluate_task()
368 put_task_struct(oc->chosen); in oom_evaluate_task()
370 oc->chosen = task; in oom_evaluate_task()
371 oc->chosen_points = points; in oom_evaluate_task()
375 if (oc->chosen_non_negative_adj) in oom_evaluate_task()
376 put_task_struct(oc->chosen_non_negative_adj); in oom_evaluate_task()
377 if (oc->chosen) in oom_evaluate_task()
378 put_task_struct(oc->chosen); in oom_evaluate_task()
379 oc->chosen_non_negative_adj = NULL; in oom_evaluate_task()
380 oc->chosen = (void *)-1UL; in oom_evaluate_task()
388 static void select_bad_process(struct oom_control *oc) in select_bad_process() argument
390 oc->chosen_points = LONG_MIN; in select_bad_process()
391 oc->chosen_non_negative_adj_points = LONG_MIN; in select_bad_process()
392 oc->chosen_non_negative_adj = NULL; in select_bad_process()
394 if (is_memcg_oom(oc)) in select_bad_process()
395 mem_cgroup_scan_tasks(oc->memcg, oom_evaluate_task, oc); in select_bad_process()
401 if (oom_evaluate_task(p, oc)) in select_bad_process()
406 if (oc->chosen_non_negative_adj) { in select_bad_process()
412 if (oc->chosen && oc->chosen->signal->oom_score_adj < 0) { in select_bad_process()
413 put_task_struct(oc->chosen); in select_bad_process()
414 oc->chosen = oc->chosen_non_negative_adj; in select_bad_process()
415 oc->chosen_points = oc->chosen_non_negative_adj_points; in select_bad_process()
417 put_task_struct(oc->chosen_non_negative_adj); in select_bad_process()
423 struct oom_control *oc = arg; in dump_task() local
430 if (!is_memcg_oom(oc) && !oom_cpuset_eligible(p, oc)) in dump_task()
464 static void dump_tasks(struct oom_control *oc) in dump_tasks() argument
469 if (is_memcg_oom(oc)) in dump_tasks()
470 mem_cgroup_scan_tasks(oc->memcg, dump_task, oc); in dump_tasks()
476 dump_task(p, oc); in dump_tasks()
481 static void dump_oom_summary(struct oom_control *oc, struct task_struct *victim) in dump_oom_summary() argument
485 oom_constraint_text[oc->constraint], in dump_oom_summary()
486 nodemask_pr_args(oc->nodemask)); in dump_oom_summary()
488 mem_cgroup_print_oom_context(oc->memcg, victim); in dump_oom_summary()
493 static void dump_header(struct oom_control *oc, struct task_struct *p) in dump_header() argument
496 current->comm, oc->gfp_mask, &oc->gfp_mask, oc->order, in dump_header()
498 if (!IS_ENABLED(CONFIG_COMPACTION) && oc->order) in dump_header()
502 if (is_memcg_oom(oc)) in dump_header()
503 mem_cgroup_print_oom_meminfo(oc->memcg); in dump_header()
505 show_mem(SHOW_MEM_FILTER_NODES, oc->nodemask); in dump_header()
510 dump_tasks(oc); in dump_header()
512 dump_oom_summary(oc, p); in dump_header()
1004 static void oom_kill_process(struct oom_control *oc, const char *message) in oom_kill_process() argument
1006 struct task_struct *victim = oc->chosen; in oom_kill_process()
1027 dump_header(oc, victim); in oom_kill_process()
1034 oom_group = mem_cgroup_get_oom_group(victim, oc->memcg); in oom_kill_process()
1052 static void check_panic_on_oom(struct oom_control *oc) in check_panic_on_oom() argument
1062 if (oc->constraint != CONSTRAINT_NONE) in check_panic_on_oom()
1066 if (is_sysrq_oom(oc)) in check_panic_on_oom()
1068 dump_header(oc, NULL); in check_panic_on_oom()
1096 bool out_of_memory(struct oom_control *oc) in out_of_memory() argument
1103 if (!is_memcg_oom(oc)) { in out_of_memory()
1128 if (oc->gfp_mask && !(oc->gfp_mask & __GFP_FS) && !is_memcg_oom(oc)) in out_of_memory()
1135 oc->constraint = constrained_alloc(oc); in out_of_memory()
1136 if (oc->constraint != CONSTRAINT_MEMORY_POLICY) in out_of_memory()
1137 oc->nodemask = NULL; in out_of_memory()
1138 check_panic_on_oom(oc); in out_of_memory()
1140 if (!is_memcg_oom(oc) && sysctl_oom_kill_allocating_task && in out_of_memory()
1142 oom_cpuset_eligible(current, oc) && in out_of_memory()
1145 oc->chosen = current; in out_of_memory()
1146 oom_kill_process(oc, "Out of memory (oom_kill_allocating_task)"); in out_of_memory()
1150 select_bad_process(oc); in out_of_memory()
1152 if (!oc->chosen) { in out_of_memory()
1155 trace_android_vh_oom_check_panic(oc, &ret); in out_of_memory()
1159 dump_header(oc, NULL); in out_of_memory()
1166 if (!is_sysrq_oom(oc) && !is_memcg_oom(oc)) in out_of_memory()
1169 if (oc->chosen && oc->chosen != (void *)-1UL) in out_of_memory()
1170 oom_kill_process(oc, !is_memcg_oom(oc) ? "Out of memory" : in out_of_memory()
1172 return !!oc->chosen; in out_of_memory()