From: Hao Ge Since OBJEXTS_ALLOC_FAIL and MEMCG_DATA_OBJEXTS currently share the same bit position, we cannot determine whether memcg_data still points to the slabobj_ext vector simply by checking folio->memcg_data & MEMCG_DATA_OBJEXTS. If obj_exts allocation failed, slab->obj_exts is set to OBJEXTS_ALLOC_FAIL, and during the release of the associated folio, the BUG check is triggered because it was mistakenly assumed that a valid folio->memcg_data was not cleared before freeing the folio. So let's check for memcg_data != OBJEXTS_ALLOC_FAIL in folio_memcg_kmem. Fixes: 7612833192d5 ("slab: Reuse first bit for OBJEXTS_ALLOC_FAIL") Suggested-by: Harry Yoo Signed-off-by: Hao Ge --- v3: Simplify the solution, per Harry's suggestion in the v1 comments Add Suggested-by: Harry Yoo --- include/linux/memcontrol.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/include/linux/memcontrol.h b/include/linux/memcontrol.h index 873e510d6f8d..7ed15f858dc4 100644 --- a/include/linux/memcontrol.h +++ b/include/linux/memcontrol.h @@ -534,7 +534,9 @@ static inline struct mem_cgroup *get_mem_cgroup_from_objcg(struct obj_cgroup *ob static inline bool folio_memcg_kmem(struct folio *folio) { VM_BUG_ON_PGFLAGS(PageTail(&folio->page), &folio->page); - VM_BUG_ON_FOLIO(folio->memcg_data & MEMCG_DATA_OBJEXTS, folio); + VM_BUG_ON_FOLIO((folio->memcg_data != OBJEXTS_ALLOC_FAIL) && + (folio->memcg_data & MEMCG_DATA_OBJEXTS), + folio); return folio->memcg_data & MEMCG_DATA_KMEM; } -- 2.25.1