Commit 658aafc8 authored by Mike Rapoport's avatar Mike Rapoport Committed by Linus Torvalds

memblock: exclude MEMBLOCK_NOMAP regions from kmemleak

Vladimir Zapolskiy reports:

Commit a7259df7 ("memblock: make memblock_find_in_range method
private") invokes a kernel panic while running kmemleak on OF platforms
with nomaped regions:

  Unable to handle kernel paging request at virtual address fff000021e00000
  [...]
    scan_block+0x64/0x170
    scan_gray_list+0xe8/0x17c
    kmemleak_scan+0x270/0x514
    kmemleak_write+0x34c/0x4ac

The memory allocated from memblock is registered with kmemleak, but if
it is marked MEMBLOCK_NOMAP it won't have linear map entries so an
attempt to scan such areas will fault.

Ideally, memblock_mark_nomap() would inform kmemleak to ignore
MEMBLOCK_NOMAP memory, but it can be called before kmemleak interfaces
operating on physical addresses can use __va() conversion.

Make sure that functions that mark allocated memory as MEMBLOCK_NOMAP
take care of informing kmemleak to ignore such memory.

Link: https://lore.kernel.org/all/8ade5174-b143-d621-8c8e-dc6a1898c6fb@linaro.org
Link: https://lore.kernel.org/all/c30ff0a2-d196-c50d-22f0-bd50696b1205@quicinc.com
Fixes: a7259df7 ("memblock: make memblock_find_in_range method private")
Reported-by: default avatarVladimir Zapolskiy <vladimir.zapolskiy@linaro.org>
Signed-off-by: default avatarMike Rapoport <rppt@linux.ibm.com>
Reviewed-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
Tested-by: default avatarVladimir Zapolskiy <vladimir.zapolskiy@linaro.org>
Tested-by: default avatarQian Cai <quic_qiancai@quicinc.com>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 6c9a5455
...@@ -21,6 +21,7 @@ ...@@ -21,6 +21,7 @@
#include <linux/earlycpio.h> #include <linux/earlycpio.h>
#include <linux/initrd.h> #include <linux/initrd.h>
#include <linux/security.h> #include <linux/security.h>
#include <linux/kmemleak.h>
#include "internal.h" #include "internal.h"
#ifdef CONFIG_ACPI_CUSTOM_DSDT #ifdef CONFIG_ACPI_CUSTOM_DSDT
...@@ -601,6 +602,8 @@ void __init acpi_table_upgrade(void) ...@@ -601,6 +602,8 @@ void __init acpi_table_upgrade(void)
*/ */
arch_reserve_mem_area(acpi_tables_addr, all_tables_size); arch_reserve_mem_area(acpi_tables_addr, all_tables_size);
kmemleak_ignore_phys(acpi_tables_addr);
/* /*
* early_ioremap only can remap 256k one time. If we map all * early_ioremap only can remap 256k one time. If we map all
* tables one time, we will hit the limit. Need to map chunks * tables one time, we will hit the limit. Need to map chunks
......
...@@ -21,6 +21,7 @@ ...@@ -21,6 +21,7 @@
#include <linux/sort.h> #include <linux/sort.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/memblock.h> #include <linux/memblock.h>
#include <linux/kmemleak.h>
#include "of_private.h" #include "of_private.h"
...@@ -46,6 +47,7 @@ static int __init early_init_dt_alloc_reserved_memory_arch(phys_addr_t size, ...@@ -46,6 +47,7 @@ static int __init early_init_dt_alloc_reserved_memory_arch(phys_addr_t size,
err = memblock_mark_nomap(base, size); err = memblock_mark_nomap(base, size);
if (err) if (err)
memblock_free(base, size); memblock_free(base, size);
kmemleak_ignore_phys(base);
} }
return err; return err;
......
...@@ -932,6 +932,9 @@ int __init_memblock memblock_mark_mirror(phys_addr_t base, phys_addr_t size) ...@@ -932,6 +932,9 @@ int __init_memblock memblock_mark_mirror(phys_addr_t base, phys_addr_t size)
* covered by the memory map. The struct page representing NOMAP memory * covered by the memory map. The struct page representing NOMAP memory
* frames in the memory map will be PageReserved() * frames in the memory map will be PageReserved()
* *
* Note: if the memory being marked %MEMBLOCK_NOMAP was allocated from
* memblock, the caller must inform kmemleak to ignore that memory
*
* Return: 0 on success, -errno on failure. * Return: 0 on success, -errno on failure.
*/ */
int __init_memblock memblock_mark_nomap(phys_addr_t base, phys_addr_t size) int __init_memblock memblock_mark_nomap(phys_addr_t base, phys_addr_t size)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment