diff --git a/mm/vmscan.c b/mm/vmscan.c index f6153063937da4ac90085a4d6592b58ad48a5b5a..c23a9b79574cb8ef7028e77691c0701e010dfb11 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c @@ -687,7 +687,14 @@ static unsigned long shrink_slab(gfp_t gfp_mask, int nid, unsigned long ret, freed = 0; struct shrinker *shrinker; - if (!mem_cgroup_is_root(memcg)) + /* + * The root memcg might be allocated even though memcg is disabled + * via "cgroup_disable=memory" boot parameter. This could make + * mem_cgroup_is_root() return false, then just run memcg slab + * shrink, but skip global shrink. This may result in premature + * oom. + */ + if (!mem_cgroup_disabled() && !mem_cgroup_is_root(memcg)) return shrink_slab_memcg(gfp_mask, nid, memcg, priority); if (!down_read_trylock(&shrinker_rwsem))