[PATCH v2 2/3] kfence: clear the pool pointer before freeing pages
Jackie Liu
liu.yun at linux.dev
Wed Oct 28 19:57:42 PDT 2026
From: Jackie Liu <liuyun01 at kylinos.cn>
Late initialization frees a failed pool before clearing __kfence_pool.
Slab allocations can reuse those pages in between and be mistaken for
KFENCE objects by is_kfence_address(), even though KFENCE is not enabled.
Clear __kfence_pool before freeing the pages, and use the saved address
for cleanup.
Fixes: b33f778bba5e ("kfence: alloc kfence_pool after system startup")
Cc: stable at vger.kernel.org
Signed-off-by: Jackie Liu <liuyun01 at kylinos.cn>
Reviewed-by: Marco Elver <elver at google.com>
---
mm/kfence/core.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/mm/kfence/core.c b/mm/kfence/core.c
index 6e3d01bccdf1..434df6cef7f2 100644
--- a/mm/kfence/core.c
+++ b/mm/kfence/core.c
@@ -1052,16 +1052,17 @@ static int kfence_init_late(void)
free_contig_range(page_to_pfn(virt_to_page((void *)kfence_metadata_init)),
nr_pages_meta);
free_pool:
+ WRITE_ONCE(__kfence_pool, NULL);
free_contig_range(page_to_pfn(virt_to_page((void *)addr)),
free_size / PAGE_SIZE);
#else
free_pages_exact((void *)kfence_metadata_init, KFENCE_METADATA_SIZE);
free_pool:
+ WRITE_ONCE(__kfence_pool, NULL);
free_pages_exact((void *)addr, free_size);
#endif
kfence_metadata_init = NULL;
- __kfence_pool = NULL;
return err;
}
--
2.56.0
More information about the linux-riscv
mailing list