memcg, oom: notify on oom killer invocation from the charge path
Burt Holzman has noticed that memcg v1 doesn't notify about OOM events via eventfd anymore. The reason is that29ef680ae7("memcg, oom: move out_of_memory back to the charge path") has moved the oom handling back to the charge path. While doing so the notification was left behind in mem_cgroup_oom_synchronize. Fix the issue by replicating the oom hierarchy locking and the notification. Link: http://lkml.kernel.org/r/20181224091107.18354-1-mhocko@kernel.org Fixes:29ef680ae7("memcg, oom: move out_of_memory back to the charge path") Signed-off-by: Michal Hocko <mhocko@suse.com> Reported-by: Burt Holzman <burt@fnal.gov> Acked-by: Johannes Weiner <hannes@cmpxchg.org> Cc: Vladimir Davydov <vdavydov.dev@gmail.com Cc: <stable@vger.kernel.org> [4.19+] Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
		
				
					committed by
					
						
						Linus Torvalds
					
				
			
			
				
	
			
			
			
						parent
						
							7af7a8e19f
						
					
				
				
					commit
					7056d3a37d
				
			@@ -1673,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;
 | 
			
		||||
 | 
			
		||||
@@ -1707,10 +1710,23 @@ static enum oom_status mem_cgroup_oom(struct mem_cgroup *memcg, gfp_t mask, int
 | 
			
		||||
		return OOM_ASYNC;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (mem_cgroup_out_of_memory(memcg, mask, order))
 | 
			
		||||
		return OOM_SUCCESS;
 | 
			
		||||
	mem_cgroup_mark_under_oom(memcg);
 | 
			
		||||
 | 
			
		||||
	return OOM_FAILED;
 | 
			
		||||
	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))
 | 
			
		||||
		ret = OOM_SUCCESS;
 | 
			
		||||
	else
 | 
			
		||||
		ret = OOM_FAILED;
 | 
			
		||||
 | 
			
		||||
	if (locked)
 | 
			
		||||
		mem_cgroup_oom_unlock(memcg);
 | 
			
		||||
 | 
			
		||||
	return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user