Skip to content

Commit 8f0b364

Browse files
songmuchuntorvalds
authored andcommitted
mm: kfence: fix objcgs vector allocation
If the kfence object is allocated to be used for objects vector, then this slot of the pool eventually being occupied permanently since the vector is never freed. The solutions could be (1) freeing vector when the kfence object is freed or (2) allocating all vectors statically. Since the memory consumption of object vectors is low, it is better to chose (2) to fix the issue and it is also can reduce overhead of vectors allocating in the future. Link: https://lkml.kernel.org/r/20220328132843.16624-1-songmuchun@bytedance.com Fixes: d3fb45f ("mm, kfence: insert KFENCE hooks for SLAB") Signed-off-by: Muchun Song <songmuchun@bytedance.com> Reviewed-by: Marco Elver <elver@google.com> Reviewed-by: Roman Gushchin <roman.gushchin@linux.dev> Cc: Alexander Potapenko <glider@google.com> Cc: Dmitry Vyukov <dvyukov@google.com> Cc: Xiongchun Duan <duanxiongchun@bytedance.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
1 parent adb11e7 commit 8f0b364

2 files changed

Lines changed: 13 additions & 1 deletion

File tree

mm/kfence/core.c

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -566,14 +566,20 @@ static unsigned long kfence_init_pool(void)
566566
* enters __slab_free() slow-path.
567567
*/
568568
for (i = 0; i < KFENCE_POOL_SIZE / PAGE_SIZE; i++) {
569+
struct slab *slab = page_slab(&pages[i]);
570+
569571
if (!i || (i % 2))
570572
continue;
571573

572574
/* Verify we do not have a compound head page. */
573575
if (WARN_ON(compound_head(&pages[i]) != &pages[i]))
574576
return addr;
575577

576-
__SetPageSlab(&pages[i]);
578+
__folio_set_slab(slab_folio(slab));
579+
#ifdef CONFIG_MEMCG
580+
slab->memcg_data = (unsigned long)&kfence_metadata[i / 2 - 1].objcg |
581+
MEMCG_DATA_OBJCGS;
582+
#endif
577583
}
578584

579585
/*
@@ -1033,6 +1039,9 @@ void __kfence_free(void *addr)
10331039
{
10341040
struct kfence_metadata *meta = addr_to_metadata((unsigned long)addr);
10351041

1042+
#ifdef CONFIG_MEMCG
1043+
KFENCE_WARN_ON(meta->objcg);
1044+
#endif
10361045
/*
10371046
* If the objects of the cache are SLAB_TYPESAFE_BY_RCU, defer freeing
10381047
* the object, as the object page may be recycled for other-typed

mm/kfence/kfence.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,9 @@ struct kfence_metadata {
8989
struct kfence_track free_track;
9090
/* For updating alloc_covered on frees. */
9191
u32 alloc_stack_hash;
92+
#ifdef CONFIG_MEMCG
93+
struct obj_cgroup *objcg;
94+
#endif
9295
};
9396

9497
extern struct kfence_metadata kfence_metadata[CONFIG_KFENCE_NUM_OBJECTS];

0 commit comments

Comments
 (0)