|
|
@@ -670,7 +670,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))
|