Commit 47249371 authored by Peng Liu's avatar Peng Liu Committed by Zheng Zengkai
Browse files

kfence: Fix wrong memblock_free when enable dynamic

hulk inclusion
category: bugfix
bugzilla: https://gitee.com/openeuler/kernel/issues/I51C37


CVE: NA

--------------------------------

Patch "kfence: Add a module parameter to adjust kfence objects" use
memblock_free to free memory allocated from memblock, but a virtual
address is passed to memblock_free where a physical address is
expected. This mistake will lead to memory leak when fail to alloc
kfence pool. Use __pa() to fix this, and the impact can be observed
by "cat /proc/meminfo".

Fixes: 901b983c ("kfence: Add a module parameter to adjust kfence objects")
Signed-off-by: default avatarPeng Liu <liupeng256@huawei.com>
Reviewed-by: default avatarKefeng Wang <wangkefeng.wang@huawei.com>
Signed-off-by: default avatarZheng Zengkai <zhengzengkai@huawei.com>
parent 16a9f8e6
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -838,7 +838,7 @@ static int __init kfence_dynamic_init(void)
	covered_size = sizeof(atomic_t) * ALLOC_COVERED_SIZE;
	alloc_covered = memblock_alloc(covered_size, PAGE_SIZE);
	if (!alloc_covered) {
		memblock_free((phys_addr_t)kfence_metadata, metadata_size);
		memblock_free(__pa(kfence_metadata), metadata_size);
		kfence_metadata = NULL;
		pr_err("failed to allocate covered\n");
		return -ENOMEM;
@@ -849,9 +849,9 @@ static int __init kfence_dynamic_init(void)

static void  __init kfence_dynamic_destroy(void)
{
	memblock_free((phys_addr_t)alloc_covered, covered_size);
	memblock_free(__pa(alloc_covered), covered_size);
	alloc_covered = NULL;
	memblock_free((phys_addr_t)kfence_metadata, metadata_size);
	memblock_free(__pa(kfence_metadata), metadata_size);
	kfence_metadata = NULL;
}
#else