mm: kfence: fix objcgs vector allocation
Subsystems (2)
Andrew Morton
maintainerPATCH 9/16 mm: kfence: fix objcgs vector allocation
From: Muchun Song <[email protected]>
Subject: 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.
Fixes d3fb45f370d9 ("mm, kfence: insert KFENCE hooks for SLAB")
Signed-off-by Muchun Song <[email protected]>
Reviewed-by Marco Elver <[email protected]>
Reviewed-by Roman Gushchin <[email protected]>
Cc Alexander Potapenko <[email protected]>
Cc Dmitry Vyukov <[email protected]>
Cc Xiongchun Duan <[email protected]>
Signed-off-by Andrew Morton <[email protected]>
---
mm/kfence/core.c | 11 ++++++++++- mm/kfence/kfence.h | 3 +++ 2 files changed, 13 insertions(+), 1 deletion(-)
mm/kfence/core.c renamed from mm/kfence/core.c~mm-kfence-fix-objcgs-vector-allocation +10 -1
@@ -566,6 +566,8 @@ static unsigned long kfence_init_pool(vo* enters __slab_free() slow-path. */ for (i =0 ; i <KFENCE_POOL_SIZE /PAGE_SIZE ; i++) { +struct slab *slab =page_slab (&pages[i]); +if (!i || (i %2 ))continue ;
@@ -573,7 +575,11 @@ static unsigned long kfence_init_pool(voif (WARN_ON (compound_head (&pages[i]) != &pages[i]))return addr; -__SetPageSlab (&pages[i]); +__folio_set_slab (slab_folio (slab)); +#ifdef CONFIG_MEMCG + slab->memcg_data = (unsigned long )&kfence_metadata[i /2 -1 ].objcg | +MEMCG_DATA_OBJCGS ; +#endif }/*
@@ -1033,6 +1039,9 @@ void __kfence_free(void *addr) {struct kfence_metadata *meta =addr_to_metadata ((unsigned long )addr); +#ifdef CONFIG_MEMCG +KFENCE_WARN_ON (meta->objcg); +#endif /* * If the objects of the cache are SLAB_TYPESAFE_BY_RCU, defer freeing * the object, as the object page may be recycled for other-typed
mm/kfence/kfence.h renamed from mm/kfence/kfence.h~mm-kfence-fix-objcgs-vector-allocation +3 -0
@@ -89,6 +89,9 @@ struct kfence_metadata {struct kfence_track free_track;/* For updating alloc_covered on frees. */ u32 alloc_stack_hash; +#ifdef CONFIG_MEMCG +struct obj_cgroup *objcg; +#endif };extern struct kfence_metadata kfence_metadata[CONFIG_KFENCE_NUM_OBJECTS ];
_