Skip to content

Commit 86f54f9

Browse files
GeHao01994tehcaster
authored andcommitted
slab: reset slab->obj_ext when freeing and it is OBJEXTS_ALLOC_FAIL
If obj_exts allocation failed, slab->obj_exts is set to OBJEXTS_ALLOC_FAIL, But we do not clear it when freeing the slab. Since OBJEXTS_ALLOC_FAIL and MEMCG_DATA_OBJEXTS currently share the same bit position, during the release of the associated folio, a VM_BUG_ON_FOLIO() check in folio_memcg_kmem() is triggered because the OBJEXTS_ALLOC_FAIL flag was not cleared, causing it to be interpreted as a kmem folio (non-slab) with MEMCG_OBJEXTS_DATA flag set, which is invalid because MEMCG_OBJEXTS_DATA is supposed to be set only on slabs. Another problem that predates sharing the OBJEXTS_ALLOC_FAIL and MEMCG_DATA_OBJEXTS bits is that on configurations with is_check_pages_enabled(), the non-cleared bit in page->memcg_data will trigger a free_page_is_bad() failure "page still charged to cgroup" When freeing a slab, we clear slab->obj_exts if the obj_ext array has been successfully allocated. So let's clear it also when the allocation has failed. Fixes: 09c4656 ("codetag: debug: introduce OBJEXTS_ALLOC_FAIL to mark failed slab_ext allocations") Fixes: 7612833 ("slab: Reuse first bit for OBJEXTS_ALLOC_FAIL") Link: https://lore.kernel.org/all/20251015141642.700170-1-hao.ge@linux.dev/ Cc: <stable@vger.kernel.org> Signed-off-by: Hao Ge <gehao@kylinos.cn> Reviewed-by: Suren Baghdasaryan <surenb@google.com> Reviewed-by: Harry Yoo <harry.yoo@oracle.com> Signed-off-by: Vlastimil Babka <vbabka@suse.cz>
1 parent df90f6c commit 86f54f9

File tree

1 file changed

+8
-1
lines changed

1 file changed

+8
-1
lines changed

mm/slub.c

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2170,8 +2170,15 @@ static inline void free_slab_obj_exts(struct slab *slab)
21702170
struct slabobj_ext *obj_exts;
21712171

21722172
obj_exts = slab_obj_exts(slab);
2173-
if (!obj_exts)
2173+
if (!obj_exts) {
2174+
/*
2175+
* If obj_exts allocation failed, slab->obj_exts is set to
2176+
* OBJEXTS_ALLOC_FAIL. In this case, we end up here and should
2177+
* clear the flag.
2178+
*/
2179+
slab->obj_exts = 0;
21742180
return;
2181+
}
21752182

21762183
/*
21772184
* obj_exts was created with __GFP_NO_OBJ_EXT flag, therefore its

0 commit comments

Comments
 (0)