Merge branch 'akpm' (incoming from Andrew)
[firefly-linux-kernel-4.4.55.git] / mm / memcontrol.c
index 7caff36180cda1c3e012f6ff17765f3e26c5a07f..67dd2a881433b38221e54dc5ddd9ad398d81ba7c 100644 (file)
@@ -1688,13 +1688,13 @@ static void move_unlock_mem_cgroup(struct mem_cgroup *memcg,
  */
 void mem_cgroup_print_oom_info(struct mem_cgroup *memcg, struct task_struct *p)
 {
-       struct cgroup *task_cgrp;
-       struct cgroup *mem_cgrp;
        /*
-        * Need a buffer in BSS, can't rely on allocations. The code relies
-        * on the assumption that OOM is serialized for memory controller.
-        * If this assumption is broken, revisit this code.
+        * protects memcg_name and makes sure that parallel ooms do not
+        * interleave
         */
+       static DEFINE_SPINLOCK(oom_info_lock);
+       struct cgroup *task_cgrp;
+       struct cgroup *mem_cgrp;
        static char memcg_name[PATH_MAX];
        int ret;
        struct mem_cgroup *iter;
@@ -1703,6 +1703,7 @@ void mem_cgroup_print_oom_info(struct mem_cgroup *memcg, struct task_struct *p)
        if (!p)
                return;
 
+       spin_lock(&oom_info_lock);
        rcu_read_lock();
 
        mem_cgrp = memcg->css.cgroup;
@@ -1771,6 +1772,7 @@ done:
 
                pr_cont("\n");
        }
+       spin_unlock(&oom_info_lock);
 }
 
 /*
@@ -3000,7 +3002,8 @@ static DEFINE_MUTEX(set_limit_mutex);
 static inline bool memcg_can_account_kmem(struct mem_cgroup *memcg)
 {
        return !mem_cgroup_disabled() && !mem_cgroup_is_root(memcg) &&
-               (memcg->kmem_account_flags & KMEM_ACCOUNTED_MASK);
+               (memcg->kmem_account_flags & KMEM_ACCOUNTED_MASK) ==
+                                                       KMEM_ACCOUNTED_MASK;
 }
 
 /*
@@ -3126,7 +3129,7 @@ int memcg_cache_id(struct mem_cgroup *memcg)
  * But when we create a new cache, we can call this as well if its parent
  * is kmem-limited. That will have to hold set_limit_mutex as well.
  */
-int memcg_update_cache_sizes(struct mem_cgroup *memcg)
+static int memcg_update_cache_sizes(struct mem_cgroup *memcg)
 {
        int num, ret;