objext objects are created with __GFP_NO_OBJ_EXT flag and therefore have
no corresponding objext themselves (otherwise we would get an infinite
recursion). When freeing these objects their codetag will be empty and
when CONFIG_MEM_ALLOC_PROFILING_DEBUG is enabled this will lead to false
warnings. Introduce CODETAG_EMPTY special codetag value to mark
allocations which intentionally lack codetag to avoid these warnings.
Set objext codetags to CODETAG_EMPTY before freeing to indicate that
the codetag is expected to be empty.

Signed-off-by: Suren Baghdasaryan <sur...@google.com>
---
 include/linux/alloc_tag.h | 26 ++++++++++++++++++++++++++
 mm/slub.c                 | 33 +++++++++++++++++++++++++++++++++
 2 files changed, 59 insertions(+)

diff --git a/include/linux/alloc_tag.h b/include/linux/alloc_tag.h
index aefe3c81a1e3..c30e6c944353 100644
--- a/include/linux/alloc_tag.h
+++ b/include/linux/alloc_tag.h
@@ -28,6 +28,27 @@ struct alloc_tag {
        struct alloc_tag_counters __percpu      *counters;
 } __aligned(8);
 
+#ifdef CONFIG_MEM_ALLOC_PROFILING_DEBUG
+
+#define CODETAG_EMPTY  ((void *)1)
+
+static inline bool is_codetag_empty(union codetag_ref *ref)
+{
+       return ref->ct == CODETAG_EMPTY;
+}
+
+static inline void set_codetag_empty(union codetag_ref *ref)
+{
+       if (ref)
+               ref->ct = CODETAG_EMPTY;
+}
+
+#else /* CONFIG_MEM_ALLOC_PROFILING_DEBUG */
+
+static inline bool is_codetag_empty(union codetag_ref *ref) { return false; }
+
+#endif /* CONFIG_MEM_ALLOC_PROFILING_DEBUG */
+
 #ifdef CONFIG_MEM_ALLOC_PROFILING
 
 struct codetag_bytes {
@@ -140,6 +161,11 @@ static inline void alloc_tag_sub(union codetag_ref *ref, 
size_t bytes)
        if (!ref || !ref->ct)
                return;
 
+       if (is_codetag_empty(ref)) {
+               ref->ct = NULL;
+               return;
+       }
+
        tag = ct_to_alloc_tag(ref->ct);
 
        this_cpu_sub(tag->counters->bytes, bytes);
diff --git a/mm/slub.c b/mm/slub.c
index 5e6d68d05740..4a396e1315ae 100644
--- a/mm/slub.c
+++ b/mm/slub.c
@@ -1883,6 +1883,30 @@ static inline enum node_stat_item 
cache_vmstat_idx(struct kmem_cache *s)
 
 #ifdef CONFIG_SLAB_OBJ_EXT
 
+#ifdef CONFIG_MEM_ALLOC_PROFILING_DEBUG
+
+static inline void mark_objexts_empty(struct slabobj_ext *obj_exts)
+{
+       struct slabobj_ext *slab_exts;
+       struct slab *obj_exts_slab;
+
+       obj_exts_slab = virt_to_slab(obj_exts);
+       slab_exts = slab_obj_exts(obj_exts_slab);
+       if (slab_exts) {
+               unsigned int offs = obj_to_index(obj_exts_slab->slab_cache,
+                                                obj_exts_slab, obj_exts);
+               /* codetag should be NULL */
+               WARN_ON(slab_exts[offs].ref.ct);
+               set_codetag_empty(&slab_exts[offs].ref);
+       }
+}
+
+#else /* CONFIG_MEM_ALLOC_PROFILING_DEBUG */
+
+static inline void mark_objexts_empty(struct slabobj_ext *obj_exts) {}
+
+#endif /* CONFIG_MEM_ALLOC_PROFILING_DEBUG */
+
 /*
  * The allocated objcg pointers array is not accounted directly.
  * Moreover, it should not come from DMA buffer and is not readily
@@ -1923,6 +1947,7 @@ static int alloc_slab_obj_exts(struct slab *slab, struct 
kmem_cache *s,
                 * assign slabobj_exts in parallel. In this case the existing
                 * objcg vector should be reused.
                 */
+               mark_objexts_empty(vec);
                kfree(vec);
                return 0;
        }
@@ -1939,6 +1964,14 @@ static inline void free_slab_obj_exts(struct slab *slab)
        if (!obj_exts)
                return;
 
+       /*
+        * obj_exts was created with __GFP_NO_OBJ_EXT flag, therefore its
+        * corresponding extension will be NULL. alloc_tag_sub() will throw a
+        * warning if slab has extensions but the extension of an object is
+        * NULL, therefore replace NULL with CODETAG_EMPTY to indicate that
+        * the extension for obj_exts is expected to be NULL.
+        */
+       mark_objexts_empty(obj_exts);
        kfree(obj_exts);
        slab->obj_exts = 0;
 }
-- 
2.44.0.278.ge034bb2e1d-goog


Reply via email to