memcg: change try_to_free_pages to hierarchical_reclaim
[sfrench/cifs-2.6.git] / mm / memcontrol.c
index 435f08dac8bf6c02a2b71580f8de9dc652fa914f..a7ecf23150c50b88168f8514fbeb3d0766303168 100644 (file)
@@ -51,6 +51,7 @@ static int really_do_swap_account __initdata = 1; /* for remember boot option*/
 #define do_swap_account                (0)
 #endif
 
+static DEFINE_MUTEX(memcg_tasklist);   /* can be hold under cgroup_mutex */
 
 /*
  * Statistics for memory cgroup.
@@ -827,7 +828,9 @@ static int __mem_cgroup_try_charge(struct mm_struct *mm,
 
                if (!nr_retries--) {
                        if (oom) {
+                               mutex_lock(&memcg_tasklist);
                                mem_cgroup_out_of_memory(mem_over_limit, gfp_mask);
+                               mutex_unlock(&memcg_tasklist);
                                mem_over_limit->last_oom_jiffies = jiffies;
                        }
                        goto nomem;
@@ -1427,8 +1430,7 @@ int mem_cgroup_shrink_usage(struct mm_struct *mm, gfp_t gfp_mask)
        rcu_read_unlock();
 
        do {
-               progress = try_to_free_mem_cgroup_pages(mem, gfp_mask, true,
-                                                       get_swappiness(mem));
+               progress = mem_cgroup_hierarchical_reclaim(mem, gfp_mask, true);
                progress += mem_cgroup_check_under_limit(mem);
        } while (!progress && --retry);
 
@@ -1472,10 +1474,8 @@ static int mem_cgroup_resize_limit(struct mem_cgroup *memcg,
                if (!ret)
                        break;
 
-               progress = try_to_free_mem_cgroup_pages(memcg,
-                                                       GFP_KERNEL,
-                                                       false,
-                                                       get_swappiness(memcg));
+               progress = mem_cgroup_hierarchical_reclaim(memcg, GFP_KERNEL,
+                                                          false);
                if (!progress)                  retry_count--;
        }
 
@@ -1516,8 +1516,7 @@ int mem_cgroup_resize_memsw_limit(struct mem_cgroup *memcg,
                        break;
 
                oldusage = res_counter_read_u64(&memcg->memsw, RES_USAGE);
-               try_to_free_mem_cgroup_pages(memcg, GFP_KERNEL, true,
-                                            get_swappiness(memcg));
+               mem_cgroup_hierarchical_reclaim(memcg, GFP_KERNEL, true);
                curusage = res_counter_read_u64(&memcg->memsw, RES_USAGE);
                if (curusage >= oldusage)
                        retry_count--;
@@ -2211,10 +2210,12 @@ static void mem_cgroup_move_task(struct cgroup_subsys *ss,
                                struct cgroup *old_cont,
                                struct task_struct *p)
 {
+       mutex_lock(&memcg_tasklist);
        /*
         * FIXME: It's better to move charges of this process from old
         * memcg to new memcg. But it's just on TODO-List now.
         */
+       mutex_unlock(&memcg_tasklist);
 }
 
 struct cgroup_subsys mem_cgroup_subsys = {