Commit 6e0fc46d authored by David Rientjes's avatar David Rientjes Committed by Linus Torvalds

mm, oom: organize oom context into struct

There are essential elements to an oom context that are passed around to
multiple functions.

Organize these elements into a new struct, struct oom_control, that
specifies the context for an oom condition.

This patch introduces no functional change.
Signed-off-by: default avatarDavid Rientjes <rientjes@google.com>
Acked-by: default avatarMichal Hocko <mhocko@suse.cz>
Cc: Sergey Senozhatsky <sergey.senozhatsky.work@gmail.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 2c0b80d4
...@@ -353,9 +353,17 @@ static struct sysrq_key_op sysrq_term_op = { ...@@ -353,9 +353,17 @@ static struct sysrq_key_op sysrq_term_op = {
static void moom_callback(struct work_struct *ignored) static void moom_callback(struct work_struct *ignored)
{ {
const gfp_t gfp_mask = GFP_KERNEL;
struct oom_control oc = {
.zonelist = node_zonelist(first_memory_node, gfp_mask),
.nodemask = NULL,
.gfp_mask = gfp_mask,
.order = 0,
.force_kill = true,
};
mutex_lock(&oom_lock); mutex_lock(&oom_lock);
if (!out_of_memory(node_zonelist(first_memory_node, GFP_KERNEL), if (!out_of_memory(&oc))
GFP_KERNEL, 0, NULL, true))
pr_info("OOM request ignored because killer is disabled\n"); pr_info("OOM request ignored because killer is disabled\n");
mutex_unlock(&oom_lock); mutex_unlock(&oom_lock);
} }
......
...@@ -12,6 +12,14 @@ struct notifier_block; ...@@ -12,6 +12,14 @@ struct notifier_block;
struct mem_cgroup; struct mem_cgroup;
struct task_struct; struct task_struct;
struct oom_control {
struct zonelist *zonelist;
nodemask_t *nodemask;
gfp_t gfp_mask;
int order;
bool force_kill;
};
/* /*
* Types of limitations to the nodes from which allocations may occur * Types of limitations to the nodes from which allocations may occur
*/ */
...@@ -57,21 +65,18 @@ extern unsigned long oom_badness(struct task_struct *p, ...@@ -57,21 +65,18 @@ extern unsigned long oom_badness(struct task_struct *p,
extern int oom_kills_count(void); extern int oom_kills_count(void);
extern void note_oom_kill(void); extern void note_oom_kill(void);
extern void oom_kill_process(struct task_struct *p, gfp_t gfp_mask, int order, extern void oom_kill_process(struct oom_control *oc, struct task_struct *p,
unsigned int points, unsigned long totalpages, unsigned int points, unsigned long totalpages,
struct mem_cgroup *memcg, nodemask_t *nodemask, struct mem_cgroup *memcg, const char *message);
const char *message);
extern void check_panic_on_oom(enum oom_constraint constraint, gfp_t gfp_mask, extern void check_panic_on_oom(struct oom_control *oc,
int order, const nodemask_t *nodemask, enum oom_constraint constraint,
struct mem_cgroup *memcg); struct mem_cgroup *memcg);
extern enum oom_scan_t oom_scan_process_thread(struct task_struct *task, extern enum oom_scan_t oom_scan_process_thread(struct oom_control *oc,
unsigned long totalpages, const nodemask_t *nodemask, struct task_struct *task, unsigned long totalpages);
bool force_kill);
extern bool out_of_memory(struct zonelist *zonelist, gfp_t gfp_mask, extern bool out_of_memory(struct oom_control *oc);
int order, nodemask_t *mask, bool force_kill);
extern void exit_oom_victim(void); extern void exit_oom_victim(void);
......
...@@ -1545,6 +1545,13 @@ static unsigned long mem_cgroup_get_limit(struct mem_cgroup *memcg) ...@@ -1545,6 +1545,13 @@ static unsigned long mem_cgroup_get_limit(struct mem_cgroup *memcg)
static void mem_cgroup_out_of_memory(struct mem_cgroup *memcg, gfp_t gfp_mask, static void mem_cgroup_out_of_memory(struct mem_cgroup *memcg, gfp_t gfp_mask,
int order) int order)
{ {
struct oom_control oc = {
.zonelist = NULL,
.nodemask = NULL,
.gfp_mask = gfp_mask,
.order = order,
.force_kill = false,
};
struct mem_cgroup *iter; struct mem_cgroup *iter;
unsigned long chosen_points = 0; unsigned long chosen_points = 0;
unsigned long totalpages; unsigned long totalpages;
...@@ -1563,7 +1570,7 @@ static void mem_cgroup_out_of_memory(struct mem_cgroup *memcg, gfp_t gfp_mask, ...@@ -1563,7 +1570,7 @@ static void mem_cgroup_out_of_memory(struct mem_cgroup *memcg, gfp_t gfp_mask,
goto unlock; goto unlock;
} }
check_panic_on_oom(CONSTRAINT_MEMCG, gfp_mask, order, NULL, memcg); check_panic_on_oom(&oc, CONSTRAINT_MEMCG, memcg);
totalpages = mem_cgroup_get_limit(memcg) ? : 1; totalpages = mem_cgroup_get_limit(memcg) ? : 1;
for_each_mem_cgroup_tree(iter, memcg) { for_each_mem_cgroup_tree(iter, memcg) {
struct css_task_iter it; struct css_task_iter it;
...@@ -1571,8 +1578,7 @@ static void mem_cgroup_out_of_memory(struct mem_cgroup *memcg, gfp_t gfp_mask, ...@@ -1571,8 +1578,7 @@ static void mem_cgroup_out_of_memory(struct mem_cgroup *memcg, gfp_t gfp_mask,
css_task_iter_start(&iter->css, &it); css_task_iter_start(&iter->css, &it);
while ((task = css_task_iter_next(&it))) { while ((task = css_task_iter_next(&it))) {
switch (oom_scan_process_thread(task, totalpages, NULL, switch (oom_scan_process_thread(&oc, task, totalpages)) {
false)) {
case OOM_SCAN_SELECT: case OOM_SCAN_SELECT:
if (chosen) if (chosen)
put_task_struct(chosen); put_task_struct(chosen);
...@@ -1610,8 +1616,8 @@ static void mem_cgroup_out_of_memory(struct mem_cgroup *memcg, gfp_t gfp_mask, ...@@ -1610,8 +1616,8 @@ static void mem_cgroup_out_of_memory(struct mem_cgroup *memcg, gfp_t gfp_mask,
if (chosen) { if (chosen) {
points = chosen_points * 1000 / totalpages; points = chosen_points * 1000 / totalpages;
oom_kill_process(chosen, gfp_mask, order, points, totalpages, oom_kill_process(&oc, chosen, points, totalpages, memcg,
memcg, NULL, "Memory cgroup out of memory"); "Memory cgroup out of memory");
} }
unlock: unlock:
mutex_unlock(&oom_lock); mutex_unlock(&oom_lock);
......
This diff is collapsed.
...@@ -2693,6 +2693,13 @@ static inline struct page * ...@@ -2693,6 +2693,13 @@ static inline struct page *
__alloc_pages_may_oom(gfp_t gfp_mask, unsigned int order, __alloc_pages_may_oom(gfp_t gfp_mask, unsigned int order,
const struct alloc_context *ac, unsigned long *did_some_progress) const struct alloc_context *ac, unsigned long *did_some_progress)
{ {
struct oom_control oc = {
.zonelist = ac->zonelist,
.nodemask = ac->nodemask,
.gfp_mask = gfp_mask,
.order = order,
.force_kill = false,
};
struct page *page; struct page *page;
*did_some_progress = 0; *did_some_progress = 0;
...@@ -2744,8 +2751,7 @@ __alloc_pages_may_oom(gfp_t gfp_mask, unsigned int order, ...@@ -2744,8 +2751,7 @@ __alloc_pages_may_oom(gfp_t gfp_mask, unsigned int order,
goto out; goto out;
} }
/* Exhausted what can be done so it's blamo time */ /* Exhausted what can be done so it's blamo time */
if (out_of_memory(ac->zonelist, gfp_mask, order, ac->nodemask, false) if (out_of_memory(&oc) || WARN_ON_ONCE(gfp_mask & __GFP_NOFAIL))
|| WARN_ON_ONCE(gfp_mask & __GFP_NOFAIL))
*did_some_progress = 1; *did_some_progress = 1;
out: out:
mutex_unlock(&oom_lock); mutex_unlock(&oom_lock);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment