Going to send it to mainstream?

--
Best regards,

Konstantin Khorenko,
Virtuozzo Linux Kernel Team

On 04/27/2016 04:09 PM, Vladimir Davydov wrote:
mem_cgroup_iter and try_get_mem_cgroup_from_mm return NULL in this case,
handle this properly.

https://jira.sw.ru/browse/PSBM-43328

Signed-off-by: Vladimir Davydov <vdavy...@virtuozzo.com>
---
  include/linux/memcontrol.h |  5 +++--
  mm/memcontrol.c            |  4 +++-
  mm/oom_kill.c              | 20 +++++++++++---------
  3 files changed, 17 insertions(+), 12 deletions(-)

diff --git a/include/linux/memcontrol.h b/include/linux/memcontrol.h
index d90f6c77dc69..743fb0b6f621 100644
--- a/include/linux/memcontrol.h
+++ b/include/linux/memcontrol.h
@@ -31,6 +31,8 @@ struct mm_struct;
  struct kmem_cache;
  struct oom_context;

+extern struct oom_context global_oom_ctx;
+
  /* Stats that can be updated by kernel. */
  enum mem_cgroup_page_stat_item {
        MEMCG_NR_FILE_MAPPED, /* # of pages charged as file rss */
@@ -392,8 +394,7 @@ mem_cgroup_update_lru_size(struct lruvec *lruvec, enum 
lru_list lru,
  static inline struct oom_context *
  mem_cgroup_oom_context(struct mem_cgroup *memcg)
  {
-       extern struct oom_context oom_ctx;
-       return &oom_ctx;
+       return &global_oom_ctx;
  }

  static inline unsigned long mem_cgroup_overdraft(struct mem_cgroup *memcg)
diff --git a/mm/memcontrol.c b/mm/memcontrol.c
index 61c395b7c4ed..fa66d1128cfb 100644
--- a/mm/memcontrol.c
+++ b/mm/memcontrol.c
@@ -1699,6 +1699,8 @@ void mem_cgroup_note_oom_kill(struct mem_cgroup 
*root_memcg,

  struct oom_context *mem_cgroup_oom_context(struct mem_cgroup *memcg)
  {
+       if (mem_cgroup_disabled())
+               return &global_oom_ctx;
        if (!memcg)
                memcg = root_mem_cgroup;
        return &memcg->oom_ctx;
@@ -1708,7 +1710,7 @@ unsigned long mem_cgroup_overdraft(struct mem_cgroup 
*memcg)
  {
        unsigned long long guarantee, usage;

-       if (mem_cgroup_is_root(memcg))
+       if (mem_cgroup_disabled() || mem_cgroup_is_root(memcg))
                return 0;

        guarantee = ACCESS_ONCE(memcg->oom_guarantee);
diff --git a/mm/oom_kill.c b/mm/oom_kill.c
index 2402fcceda6e..7a328e8c3204 100644
--- a/mm/oom_kill.c
+++ b/mm/oom_kill.c
@@ -51,12 +51,10 @@ static DEFINE_SPINLOCK(oom_context_lock);
  #define OOM_BASE_RAGE -10
  #define OOM_MAX_RAGE  20

-#ifndef CONFIG_MEMCG
-struct oom_context oom_ctx = {
+struct oom_context global_oom_ctx = {
        .rage           = OOM_BASE_RAGE,
-       .waitq          = __WAIT_QUEUE_HEAD_INITIALIZER(oom_ctx.waitq),
+       .waitq          = __WAIT_QUEUE_HEAD_INITIALIZER(global_oom_ctx.waitq),
  };
-#endif

  void init_oom_context(struct oom_context *ctx)
  {
@@ -187,7 +185,8 @@ static unsigned long mm_overdraft(struct mm_struct *mm)
        memcg = try_get_mem_cgroup_from_mm(mm);
        ctx = mem_cgroup_oom_context(memcg);
        overdraft = ctx->overdraft;
-       mem_cgroup_put(memcg);
+       if (memcg)
+               mem_cgroup_put(memcg);

        return overdraft;
  }
@@ -497,7 +496,8 @@ void mark_oom_victim(struct task_struct *tsk)
                ctx->marked = true;
        }
        spin_unlock(&oom_context_lock);
-       mem_cgroup_put(memcg);
+       if (memcg)
+               mem_cgroup_put(memcg);
  }

  /**
@@ -608,7 +608,7 @@ bool oom_trylock(struct mem_cgroup *memcg)
                 * information will be used in oom_badness.
                 */
                ctx->overdraft = mem_cgroup_overdraft(iter);
-               parent = parent_mem_cgroup(iter);
+               parent = iter ? parent_mem_cgroup(iter) : NULL;
                if (parent && iter != memcg)
                        ctx->overdraft = max(ctx->overdraft,
                                mem_cgroup_oom_context(parent)->overdraft);
@@ -645,7 +645,8 @@ void oom_unlock(struct mem_cgroup *memcg)
                         * on it for the victim to exit below.
                         */
                        victim_memcg = iter;
-                       mem_cgroup_get(iter);
+                       if (iter)
+                               mem_cgroup_get(iter);

                        mem_cgroup_iter_break(memcg, iter);
                        break;
@@ -695,7 +696,8 @@ void oom_unlock(struct mem_cgroup *memcg)
         */
        ctx = mem_cgroup_oom_context(victim_memcg);
        __wait_oom_context(ctx);
-       mem_cgroup_put(victim_memcg);
+       if (victim_memcg)
+               mem_cgroup_put(victim_memcg);
  }

  /*

_______________________________________________
Devel mailing list
Devel@openvz.org
https://lists.openvz.org/mailman/listinfo/devel

Reply via email to