diff options
Diffstat (limited to 'mm/memcontrol.c')
| -rw-r--r-- | mm/memcontrol.c | 53 | 
1 files changed, 38 insertions, 15 deletions
diff --git a/mm/memcontrol.c b/mm/memcontrol.c index 6e1469b80cb7..af7f18b32389 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c @@ -1293,32 +1293,39 @@ static const char *const memcg1_stat_names[] = {  #define K(x) ((x) << (PAGE_SHIFT-10))  /** - * mem_cgroup_print_oom_info: Print OOM information relevant to memory controller. + * mem_cgroup_print_oom_context: Print OOM information relevant to + * memory controller.   * @memcg: The memory cgroup that went over limit   * @p: Task that is going to be killed   *   * NOTE: @memcg and @p's mem_cgroup can be different when hierarchy is   * enabled   */ -void mem_cgroup_print_oom_info(struct mem_cgroup *memcg, struct task_struct *p) +void mem_cgroup_print_oom_context(struct mem_cgroup *memcg, struct task_struct *p)  { -	struct mem_cgroup *iter; -	unsigned int i; -  	rcu_read_lock(); +	if (memcg) { +		pr_cont(",oom_memcg="); +		pr_cont_cgroup_path(memcg->css.cgroup); +	} else +		pr_cont(",global_oom");  	if (p) { -		pr_info("Task in "); +		pr_cont(",task_memcg=");  		pr_cont_cgroup_path(task_cgroup(p, memory_cgrp_id)); -		pr_cont(" killed as a result of limit of "); -	} else { -		pr_info("Memory limit reached of cgroup ");  	} - -	pr_cont_cgroup_path(memcg->css.cgroup); -	pr_cont("\n"); -  	rcu_read_unlock(); +} + +/** + * mem_cgroup_print_oom_meminfo: Print OOM memory information relevant to + * memory controller. + * @memcg: The memory cgroup that went over limit + */ +void mem_cgroup_print_oom_meminfo(struct mem_cgroup *memcg) +{ +	struct mem_cgroup *iter; +	unsigned int i;  	pr_info("memory: usage %llukB, limit %llukB, failcnt %lu\n",  		K((u64)page_counter_read(&memcg->memory)), @@ -1666,6 +1673,9 @@ enum oom_status {  static enum oom_status mem_cgroup_oom(struct mem_cgroup *memcg, gfp_t mask, int order)  { +	enum oom_status ret; +	bool locked; +  	if (order > PAGE_ALLOC_COSTLY_ORDER)  		return OOM_SKIPPED; @@ -1700,10 +1710,23 @@ static enum oom_status mem_cgroup_oom(struct mem_cgroup *memcg, gfp_t mask, int  		return OOM_ASYNC;  	} +	mem_cgroup_mark_under_oom(memcg); + +	locked = mem_cgroup_oom_trylock(memcg); + +	if (locked) +		mem_cgroup_oom_notify(memcg); + +	mem_cgroup_unmark_under_oom(memcg);  	if (mem_cgroup_out_of_memory(memcg, mask, order)) -		return OOM_SUCCESS; +		ret = OOM_SUCCESS; +	else +		ret = OOM_FAILED; -	return OOM_FAILED; +	if (locked) +		mem_cgroup_oom_unlock(memcg); + +	return ret;  }  /**  | 
