Use __GFP_NO_OBJ_EXT to prevent recursions when allocating slabobj_ext
objects. Also prevent slabobj_ext allocations for kmem_cache objects.

Signed-off-by: Suren Baghdasaryan <sur...@google.com>
---
 mm/slab.h        | 6 ++++++
 mm/slab_common.c | 2 ++
 2 files changed, 8 insertions(+)

diff --git a/mm/slab.h b/mm/slab.h
index 5a47125469f1..187acc593397 100644
--- a/mm/slab.h
+++ b/mm/slab.h
@@ -489,6 +489,12 @@ prepare_slab_obj_exts_hook(struct kmem_cache *s, gfp_t 
flags, void *p)
        if (!need_slab_obj_ext())
                return NULL;
 
+       if (s->flags & SLAB_NO_OBJ_EXT)
+               return NULL;
+
+       if (flags & __GFP_NO_OBJ_EXT)
+               return NULL;
+
        slab = virt_to_slab(p);
        if (!slab_obj_exts(slab) &&
            WARN(alloc_slab_obj_exts(slab, s, flags, false),
diff --git a/mm/slab_common.c b/mm/slab_common.c
index 2b42a9d2c11c..446f406d2703 100644
--- a/mm/slab_common.c
+++ b/mm/slab_common.c
@@ -222,6 +222,8 @@ int alloc_slab_obj_exts(struct slab *slab, struct 
kmem_cache *s,
        void *vec;
 
        gfp &= ~OBJCGS_CLEAR_MASK;
+       /* Prevent recursive extension vector allocation */
+       gfp |= __GFP_NO_OBJ_EXT;
        vec = kcalloc_node(objects, sizeof(struct slabobj_ext), gfp,
                           slab_nid(slab));
        if (!vec)
-- 
2.42.0.758.gaed0368e0e-goog


Reply via email to