memcg, oom: lock mem_cgroup_print_oom_info
[platform/adaptation/renesas_rcar/renesas_kernel.git] / mm / memcontrol.c
index bf5e894..57b1608 100644 (file)
@@ -338,7 +338,7 @@ struct mem_cgroup {
 static size_t memcg_size(void)
 {
        return sizeof(struct mem_cgroup) +
-               nr_node_ids * sizeof(struct mem_cgroup_per_node);
+               nr_node_ids * sizeof(struct mem_cgroup_per_node *);
 }
 
 /* internal only representation about the status of kmem accounting. */
@@ -1647,13 +1647,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;
@@ -1662,6 +1662,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;
@@ -1730,6 +1731,7 @@ done:
 
                pr_cont("\n");
        }
+       spin_unlock(&oom_info_lock);
 }
 
 /*
@@ -2959,7 +2961,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;
 }
 
 /*
@@ -3086,7 +3089,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;