aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaisuke Nishimura <nishimura@mxp.nes.nec.co.jp>2009-01-15 16:51:14 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2009-01-15 19:39:39 -0500
commit4d1c627389c8ba6d9e703208567ffcdbd356f682 (patch)
tree535720830c6f547e2d544d1dd02d23bae41da45e
parentc268e9946d7dc30ac4e55cdc3f43c8af1ae8153c (diff)
memcg: make oom less frequently
In previous implementation, mem_cgroup_try_charge checked the return value of mem_cgroup_try_to_free_pages, and just retried if some pages had been reclaimed. But now, try_charge(and mem_cgroup_hierarchical_reclaim called from it) only checks whether the usage is less than the limit. This patch tries to change the behavior as before to cause oom less frequently. Signed-off-by: Daisuke Nishimura <nishimura@mxp.nes.nec.co.jp> Acked-by: Balbir Singh <balbir@linux.vnet.ibm.com> Acked-by: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> Cc: Pavel Emelyanov <xemul@openvz.org> Cc: Li Zefan <lizf@cn.fujitsu.com> Cc: Paul Menage <menage@google.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r--mm/memcontrol.c10
1 files changed, 6 insertions, 4 deletions
diff --git a/mm/memcontrol.c b/mm/memcontrol.c
index 322625f551c2..fb62b4335fa9 100644
--- a/mm/memcontrol.c
+++ b/mm/memcontrol.c
@@ -773,10 +773,10 @@ static int mem_cgroup_hierarchical_reclaim(struct mem_cgroup *root_mem,
773 * but there might be left over accounting, even after children 773 * but there might be left over accounting, even after children
774 * have left. 774 * have left.
775 */ 775 */
776 ret = try_to_free_mem_cgroup_pages(root_mem, gfp_mask, noswap, 776 ret += try_to_free_mem_cgroup_pages(root_mem, gfp_mask, noswap,
777 get_swappiness(root_mem)); 777 get_swappiness(root_mem));
778 if (mem_cgroup_check_under_limit(root_mem)) 778 if (mem_cgroup_check_under_limit(root_mem))
779 return 0; 779 return 1; /* indicate reclaim has succeeded */
780 if (!root_mem->use_hierarchy) 780 if (!root_mem->use_hierarchy)
781 return ret; 781 return ret;
782 782
@@ -787,10 +787,10 @@ static int mem_cgroup_hierarchical_reclaim(struct mem_cgroup *root_mem,
787 next_mem = mem_cgroup_get_next_node(root_mem); 787 next_mem = mem_cgroup_get_next_node(root_mem);
788 continue; 788 continue;
789 } 789 }
790 ret = try_to_free_mem_cgroup_pages(next_mem, gfp_mask, noswap, 790 ret += try_to_free_mem_cgroup_pages(next_mem, gfp_mask, noswap,
791 get_swappiness(next_mem)); 791 get_swappiness(next_mem));
792 if (mem_cgroup_check_under_limit(root_mem)) 792 if (mem_cgroup_check_under_limit(root_mem))
793 return 0; 793 return 1; /* indicate reclaim has succeeded */
794 next_mem = mem_cgroup_get_next_node(root_mem); 794 next_mem = mem_cgroup_get_next_node(root_mem);
795 } 795 }
796 return ret; 796 return ret;
@@ -875,6 +875,8 @@ static int __mem_cgroup_try_charge(struct mm_struct *mm,
875 875
876 ret = mem_cgroup_hierarchical_reclaim(mem_over_limit, gfp_mask, 876 ret = mem_cgroup_hierarchical_reclaim(mem_over_limit, gfp_mask,
877 noswap); 877 noswap);
878 if (ret)
879 continue;
878 880
879 /* 881 /*
880 * try_to_free_mem_cgroup_pages() might not give us a full 882 * try_to_free_mem_cgroup_pages() might not give us a full