Thread (208 messages) 208 messages, 21 authors, 2024-02-29

Re: [PATCH v3 32/35] codetag: debug: skip objext checking when it's for objext itself

From: Suren Baghdasaryan <surenb@google.com>
Date: 2024-02-19 16:55:36
Also in: cgroups, linux-arch, linux-doc, linux-fsdevel, linux-iommu, linux-mm, lkml

On Mon, Feb 19, 2024 at 1:17 AM Vlastimil Babka [off-list ref] wrote:
On 2/19/24 02:04, Suren Baghdasaryan wrote:
quoted
On Fri, Feb 16, 2024 at 6:39 PM Vlastimil Babka [off-list ref] wrote:
quoted
On 2/12/24 22:39, Suren Baghdasaryan wrote:
quoted
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 <surenb@google.com>
---
 include/linux/alloc_tag.h | 26 ++++++++++++++++++++++++++
 mm/slab.h                 | 25 +++++++++++++++++++++++++
 mm/slab_common.c          |  1 +
 mm/slub.c                 |  8 ++++++++
 4 files changed, 60 insertions(+)
diff --git a/include/linux/alloc_tag.h b/include/linux/alloc_tag.h
index 0a5973c4ad77..1f3207097b03 100644
...
quoted
index c4bd0d5348cb..cf332a839bf4 100644
--- a/mm/slab.h
+++ b/mm/slab.h
@@ -567,6 +567,31 @@ static inline struct slabobj_ext *slab_obj_exts(struct slab *slab)
 int alloc_slab_obj_exts(struct slab *slab, struct kmem_cache *s,
                      gfp_t gfp, bool new_slab);

+
+#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 */
+
I assume with alloc_slab_obj_exts() moved to slub.c, mark_objexts_empty()
could move there too.
No, I think mark_objexts_empty() belongs here. This patch introduced
the function and uses it. Makes sense to me to keep it all together.
Hi,

here I didn't mean moving between patches, but files. alloc_slab_obj_exts()
in slub.c means all callers of mark_objexts_empty() are in slub.c so it
doesn't need to be in slab.h
Ah, I see. I misunderstood your comment. Yes, after slab/slob cleanup
this makes sense.
Also same thing with mark_failed_objexts_alloc() and
handle_failed_objexts_alloc() in patch 34/35.
Ack. Thanks!
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help