All of lore.kernel.org
 help / color / mirror / Atom feed
* [RFC PATCH V3 0/7] mm/slab: reduce slab accounting memory overhead by allocating slabobj_ext metadata within unused slab space
@ 2025-10-27 12:28 Harry Yoo
  2025-10-27 12:28 ` [RFC PATCH V3 1/7] mm/slab: allow specifying freepointer offset when using constructor Harry Yoo
                   ` (7 more replies)
  0 siblings, 8 replies; 35+ messages in thread
From: Harry Yoo @ 2025-10-27 12:28 UTC (permalink / raw)
  To: akpm, vbabka
  Cc: andreyknvl, cl, dvyukov, glider, hannes, linux-mm, mhocko,
	muchun.song, rientjes, roman.gushchin, ryabinin.a.a, shakeel.butt,
	surenb, vincenzo.frascino, yeoreum.yun, harry.yoo, tytso,
	adilger.kernel, linux-ext4, linux-kernel

RFC v2: https://lore.kernel.org/linux-mm/20250827113726.707801-1-harry.yoo@oracle.com/

RFC v2 -> v3:
  - RFC v3 now depends on the patch "[PATCH V2] mm/slab: ensure all metadata
    in slab object are word-aligned"

  - During the merge window, the size of ext4 inode cache has shrunken
    and it couldn't benefit from the change anymore as the unused space
    became smaller. But I somehow found a way to shrink the size of
    ext4 inode object by a word...

    With new patch 1 and 2, now it can benefit from the optimization again.

  - As suggested by Andrey, SLUB now disables KASAN and KMSAN, and reset the
    kasan tag instead of unpoisoning slabobj_ext metadata (Patch 5).

When CONFIG_MEMCG and CONFIG_MEM_ALLOC_PROFILING are enabled,
the kernel allocates two pointers per object: one for the memory cgroup
(obj_cgroup) to which it belongs, and another for the code location
that requested the allocation.

In two special cases, this overhead can be eliminated by allocating
slabobj_ext metadata from unused space within a slab:

  Case 1. The "leftover" space after the last slab object is larger than
          the size of an array of slabobj_ext.

  Case 2. The per-object alignment padding is larger than
          sizeof(struct slabobj_ext).

For these two cases, one or two pointers can be saved per slab object.
Examples: ext4 inode cache (case 1) and xfs inode cache (case 2).
That's approximately 0.7-0.8% (memcg) or 1.5-1.6%% (memcg + mem profiling)
of the total inode cache size.

Implementing case 2 is not straightforward, because the existing code
assumes that slab->obj_exts is an array of slabobj_ext, while case 2
breaks the assumption.

As suggested by Vlastimil, abstract access to individual slabobj_ext
metadata via a new helper named slab_obj_ext():

static inline struct slabobj_ext *slab_obj_ext(struct slab *slab,
                                               unsigned long obj_exts,
                                               unsigned int index)
{
        return (struct slabobj_ext *)(obj_exts + slab_get_stride(slab) * index);
} 

In the normal case (including case 1), slab->obj_exts points to an array
of slabobj_ext, and the stride is sizeof(struct slabobj_ext).

In case 2, the stride is s->size and
slab->obj_exts = slab_address(slab) + s->red_left_pad + (offset of slabobj_ext)

With this approach, the memcg charging fastpath doesn't need to care the
storage method of slabobj_ext.

Harry Yoo (7):
  mm/slab: allow specifying freepointer offset when using constructor
  ext4: specify the free pointer offset for ext4_inode_cache
  mm/slab: abstract slabobj_ext access via new slab_obj_ext() helper
  mm/slab: use stride to access slabobj_ext
  mm/memcontrol,alloc_tag: handle slabobj_ext access under KASAN poison
  mm/slab: save memory by allocating slabobj_ext array from leftover
  mm/slab: place slabobj_ext metadata in unused space within s->size

 fs/ext4/super.c      |  20 ++-
 include/linux/slab.h |   9 ++
 mm/memcontrol.c      |  34 +++--
 mm/slab.h            |  94 ++++++++++++-
 mm/slab_common.c     |   8 +-
 mm/slub.c            | 304 ++++++++++++++++++++++++++++++++++++-------
 6 files changed, 398 insertions(+), 71 deletions(-)

-- 
2.43.0


^ permalink raw reply	[flat|nested] 35+ messages in thread

end of thread, other threads:[~2025-12-22 11:14 UTC | newest]

Thread overview: 35+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-10-27 12:28 [RFC PATCH V3 0/7] mm/slab: reduce slab accounting memory overhead by allocating slabobj_ext metadata within unused slab space Harry Yoo
2025-10-27 12:28 ` [RFC PATCH V3 1/7] mm/slab: allow specifying freepointer offset when using constructor Harry Yoo
2025-10-28 17:43   ` Suren Baghdasaryan
2025-10-29  7:10     ` Harry Yoo
2025-10-30 14:35       ` Vlastimil Babka
2025-10-27 12:28 ` [RFC PATCH V3 2/7] ext4: specify the free pointer offset for ext4_inode_cache Harry Yoo
2025-10-28 17:22   ` Suren Baghdasaryan
2025-10-28 17:25     ` Suren Baghdasaryan
2025-10-27 12:28 ` [RFC PATCH V3 3/7] mm/slab: abstract slabobj_ext access via new slab_obj_ext() helper Harry Yoo
2025-10-28 17:55   ` Suren Baghdasaryan
2025-10-29  8:49     ` Harry Yoo
2025-10-29 15:24       ` Suren Baghdasaryan
2025-10-30  1:26         ` Harry Yoo
2025-10-30  5:03           ` Suren Baghdasaryan
2025-10-27 12:28 ` [RFC PATCH V3 4/7] mm/slab: use stride to access slabobj_ext Harry Yoo
2025-10-28 20:10   ` Suren Baghdasaryan
2025-10-27 12:28 ` [RFC PATCH V3 5/7] mm/memcontrol,alloc_tag: handle slabobj_ext access under KASAN poison Harry Yoo
2025-10-28 23:03   ` Suren Baghdasaryan
2025-10-29  8:06     ` Harry Yoo
2025-10-29 15:28       ` Suren Baghdasaryan
2025-10-27 12:28 ` [RFC PATCH V3 6/7] mm/slab: save memory by allocating slabobj_ext array from leftover Harry Yoo
2025-10-29  3:07   ` Suren Baghdasaryan
2025-10-29  7:59     ` Harry Yoo
2025-10-29 18:37       ` Suren Baghdasaryan
2025-10-30  0:40         ` Harry Yoo
2025-10-30 16:33           ` Vlastimil Babka
2025-10-29 18:45   ` Andrey Ryabinin
2025-10-30  1:11     ` Harry Yoo
2025-10-27 12:28 ` [RFC PATCH V3 7/7] mm/slab: place slabobj_ext metadata in unused space within s->size Harry Yoo
2025-10-29  3:19   ` Suren Baghdasaryan
2025-12-22 11:14     ` Harry Yoo
2025-10-29 18:19   ` Andrey Ryabinin
2025-10-30  0:51     ` Harry Yoo
2025-10-30 12:41       ` Yeoreum Yun
2025-10-30 16:39 ` [RFC PATCH V3 0/7] mm/slab: reduce slab accounting memory overhead by allocating slabobj_ext metadata within unused slab space Vlastimil Babka

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.