Re: [PATCH] memcg: print cgroup information when system panics due to panic_on_oom

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



[CCing Johannes and Andrew]

On Sat 07-03-15 00:23:44, Balasubramani Vivekanandan wrote:
> If kernel panics due to oom, caused by a cgroup reaching its limit, when
> 'compulsory panic_on_oom' is enabled, then we will only see that the OOM
> happened because of "compulsory panic_on_oom is enabled" but this
> doesn't tell the difference between mempolicy and memcg. And dumping
> system wide information is plain wrong and more confusing. This patch
> provides the information of the cgroup whose limit triggerred panic
> 
> Signed-off-by: Balasubramani Vivekanandan <balasubramani_vivekanandan@xxxxxxxxxx>

Acked-by: Michal Hocko <mhocko@xxxxxxx>

Thanks!

> ---
>  include/linux/oom.h |  3 ++-
>  mm/memcontrol.c     | 16 +++++++++-------
>  mm/oom_kill.c       |  7 ++++---
>  3 files changed, 15 insertions(+), 11 deletions(-)
> 
> diff --git a/include/linux/oom.h b/include/linux/oom.h
> index d5771bed..44b2f6f 100644
> --- a/include/linux/oom.h
> +++ b/include/linux/oom.h
> @@ -66,7 +66,8 @@ extern bool oom_zonelist_trylock(struct zonelist *zonelist, gfp_t gfp_flags);
>  extern void oom_zonelist_unlock(struct zonelist *zonelist, gfp_t gfp_flags);
>  
>  extern void check_panic_on_oom(enum oom_constraint constraint, gfp_t gfp_mask,
> -			       int order, const nodemask_t *nodemask);
> +			       int order, const nodemask_t *nodemask,
> +			       struct mem_cgroup *memcg);
>  
>  extern enum oom_scan_t oom_scan_process_thread(struct task_struct *task,
>  		unsigned long totalpages, const nodemask_t *nodemask,
> diff --git a/mm/memcontrol.c b/mm/memcontrol.c
> index 0c86945..fb884eb 100644
> --- a/mm/memcontrol.c
> +++ b/mm/memcontrol.c
> @@ -1442,15 +1442,17 @@ void mem_cgroup_print_oom_info(struct mem_cgroup *memcg, struct task_struct *p)
>  	struct mem_cgroup *iter;
>  	unsigned int i;
>  
> -	if (!p)
> -		return;
> -
>  	mutex_lock(&oom_info_lock);
>  	rcu_read_lock();
>  
> -	pr_info("Task in ");
> -	pr_cont_cgroup_path(task_cgroup(p, memory_cgrp_id));
> -	pr_cont(" killed as a result of limit of ");
> +	if (p) {
> +		pr_info("Task in ");
> +		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");
>  
> @@ -1537,7 +1539,7 @@ static void mem_cgroup_out_of_memory(struct mem_cgroup *memcg, gfp_t gfp_mask,
>  		return;
>  	}
>  
> -	check_panic_on_oom(CONSTRAINT_MEMCG, gfp_mask, order, NULL);
> +	check_panic_on_oom(CONSTRAINT_MEMCG, gfp_mask, order, NULL, memcg);
>  	totalpages = mem_cgroup_get_limit(memcg) ? : 1;
>  	for_each_mem_cgroup_tree(iter, memcg) {
>  		struct css_task_iter it;
> diff --git a/mm/oom_kill.c b/mm/oom_kill.c
> index 642f38c..52628c8 100644
> --- a/mm/oom_kill.c
> +++ b/mm/oom_kill.c
> @@ -612,7 +612,8 @@ void oom_kill_process(struct task_struct *p, gfp_t gfp_mask, int order,
>   * Determines whether the kernel must panic because of the panic_on_oom sysctl.
>   */
>  void check_panic_on_oom(enum oom_constraint constraint, gfp_t gfp_mask,
> -			int order, const nodemask_t *nodemask)
> +			int order, const nodemask_t *nodemask,
> +			struct mem_cgroup *memcg)
>  {
>  	if (likely(!sysctl_panic_on_oom))
>  		return;
> @@ -625,7 +626,7 @@ void check_panic_on_oom(enum oom_constraint constraint, gfp_t gfp_mask,
>  		if (constraint != CONSTRAINT_NONE)
>  			return;
>  	}
> -	dump_header(NULL, gfp_mask, order, NULL, nodemask);
> +	dump_header(NULL, gfp_mask, order, memcg, nodemask);
>  	panic("Out of memory: %s panic_on_oom is enabled\n",
>  		sysctl_panic_on_oom == 2 ? "compulsory" : "system-wide");
>  }
> @@ -740,7 +741,7 @@ static void __out_of_memory(struct zonelist *zonelist, gfp_t gfp_mask,
>  	constraint = constrained_alloc(zonelist, gfp_mask, nodemask,
>  						&totalpages);
>  	mpol_mask = (constraint == CONSTRAINT_MEMORY_POLICY) ? nodemask : NULL;
> -	check_panic_on_oom(constraint, gfp_mask, order, mpol_mask);
> +	check_panic_on_oom(constraint, gfp_mask, order, mpol_mask, NULL);
>  
>  	if (sysctl_oom_kill_allocating_task && current->mm &&
>  	    !oom_unkillable_task(current, NULL, nodemask) &&
> -- 
> 2.3.1
> 

-- 
Michal Hocko
SUSE Labs
--
To unsubscribe from this list: send the line "unsubscribe cgroups" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Security]     [Bugtraq]     [Linux OMAP]     [Linux MIPS]     [eCos]     [Asterisk Internet PBX]     [Linux API]     [Monitors]

  Powered by Linux