|
@@ -773,10 +773,10 @@ static int mem_cgroup_hierarchical_reclaim(struct mem_cgroup *root_mem,
|
|
|
* but there might be left over accounting, even after children
|
|
|
* have left.
|
|
|
*/
|
|
|
- ret = try_to_free_mem_cgroup_pages(root_mem, gfp_mask, noswap,
|
|
|
+ ret += try_to_free_mem_cgroup_pages(root_mem, gfp_mask, noswap,
|
|
|
get_swappiness(root_mem));
|
|
|
if (mem_cgroup_check_under_limit(root_mem))
|
|
|
- return 0;
|
|
|
+ return 1; /* indicate reclaim has succeeded */
|
|
|
if (!root_mem->use_hierarchy)
|
|
|
return ret;
|
|
|
|
|
@@ -787,10 +787,10 @@ static int mem_cgroup_hierarchical_reclaim(struct mem_cgroup *root_mem,
|
|
|
next_mem = mem_cgroup_get_next_node(root_mem);
|
|
|
continue;
|
|
|
}
|
|
|
- ret = try_to_free_mem_cgroup_pages(next_mem, gfp_mask, noswap,
|
|
|
+ ret += try_to_free_mem_cgroup_pages(next_mem, gfp_mask, noswap,
|
|
|
get_swappiness(next_mem));
|
|
|
if (mem_cgroup_check_under_limit(root_mem))
|
|
|
- return 0;
|
|
|
+ return 1; /* indicate reclaim has succeeded */
|
|
|
next_mem = mem_cgroup_get_next_node(root_mem);
|
|
|
}
|
|
|
return ret;
|
|
@@ -875,6 +875,8 @@ static int __mem_cgroup_try_charge(struct mm_struct *mm,
|
|
|
|
|
|
ret = mem_cgroup_hierarchical_reclaim(mem_over_limit, gfp_mask,
|
|
|
noswap);
|
|
|
+ if (ret)
|
|
|
+ continue;
|
|
|
|
|
|
/*
|
|
|
* try_to_free_mem_cgroup_pages() might not give us a full
|