diff mbox series

[v2,1/2] Revert "memblock: exclude NOMAP regions from kmemleak"

Message ID 20211021070929.23272-2-rppt@kernel.org (mailing list archive)
State New
Headers show
Series memblock: exclude MEMBLOCK_NOMAP regions from kmemleak | expand

Commit Message

Mike Rapoport Oct. 21, 2021, 7:09 a.m. UTC
From: Mike Rapoport <rppt@linux.ibm.com>

Commit 6e44bd6d34d6 ("memblock: exclude NOMAP regions from kmemleak")
breaks boot on EFI systems with kmemleak and VM_DEBUG enabled:

efi: Processing EFI memory map:
efi:   0x000090000000-0x000091ffffff [Conventional|   |  |  |  |  |  |  |  |  |   |WB|WT|WC|UC]
efi:   0x000092000000-0x0000928fffff [Runtime Data|RUN|  |  |  |  |  |  |  |  |   |WB|WT|WC|UC]
------------[ cut here ]------------
kernel BUG at mm/kmemleak.c:1140!
Internal error: Oops - BUG: 0 [#1] SMP
Modules linked in:
CPU: 0 PID: 0 Comm: swapper Not tainted 5.15.0-rc6-next-20211019+ #104
pstate: 600000c5 (nZCv daIF -PAN -UAO -TCO -DIT -SSBS BTYPE=--)
pc : kmemleak_free_part_phys+0x64/0x8c
lr : kmemleak_free_part_phys+0x38/0x8c
sp : ffff800011eafbc0
x29: ffff800011eafbc0 x28: 1fffff7fffb41c0d x27: fffffbfffda0e068
x26: 0000000092000000 x25: 1ffff000023d5f94 x24: ffff800011ed84d0
x23: ffff800011ed84c0 x22: ffff800011ed83d8 x21: 0000000000900000
x20: ffff800011782000 x19: 0000000092000000 x18: ffff800011ee0730
x17: 0000000000000000 x16: 0000000000000000 x15: 1ffff0000233252c
x14: ffff800019a905a0 x13: 0000000000000001 x12: ffff7000023d5ed7
x11: 1ffff000023d5ed6 x10: ffff7000023d5ed6 x9 : dfff800000000000
x8 : ffff800011eaf6b7 x7 : 0000000000000001 x6 : ffff800011eaf6b0
x5 : 00008ffffdc2a12a x4 : ffff7000023d5ed7 x3 : 1ffff000023dbf99
x2 : 1ffff000022f0463 x1 : 0000000000000000 x0 : ffffffffffffffff
Call trace:
 kmemleak_free_part_phys+0x64/0x8c
 memblock_mark_nomap+0x5c/0x78
 reserve_regions+0x294/0x33c
 efi_init+0x2d0/0x490
 setup_arch+0x80/0x138
 start_kernel+0xa0/0x3ec
 __primary_switched+0xc0/0xc8
Code: 34000041 97d526e7 f9418e80 36000040 (d4210000)
random: get_random_bytes called from print_oops_end_marker+0x34/0x80 with crng_init=0
---[ end trace 0000000000000000 ]---

The crash happens because kmemleak_free_part_phys() tries to use __va()
before memstart_addr is initialized and this triggers a VM_BUG_ON() in
arch/arm64/include/asm/memory.h:

Revert 6e44bd6d34d6 ("memblock: exclude NOMAP regions from kmemleak"), the
issue it is fixing will be fixed differently.

Reported-by: Qian Cai <quic_qiancai@quicinc.com>
Signed-off-by: Mike Rapoport <rppt@linux.ibm.com>
---
 mm/memblock.c | 7 +------
 1 file changed, 1 insertion(+), 6 deletions(-)

Comments

Catalin Marinas Oct. 21, 2021, 8:29 a.m. UTC | #1
On Thu, Oct 21, 2021 at 10:09:28AM +0300, Mike Rapoport wrote:
> From: Mike Rapoport <rppt@linux.ibm.com>
> 
> Commit 6e44bd6d34d6 ("memblock: exclude NOMAP regions from kmemleak")
> breaks boot on EFI systems with kmemleak and VM_DEBUG enabled:
> 
> efi: Processing EFI memory map:
> efi:   0x000090000000-0x000091ffffff [Conventional|   |  |  |  |  |  |  |  |  |   |WB|WT|WC|UC]
> efi:   0x000092000000-0x0000928fffff [Runtime Data|RUN|  |  |  |  |  |  |  |  |   |WB|WT|WC|UC]
> ------------[ cut here ]------------
> kernel BUG at mm/kmemleak.c:1140!
> Internal error: Oops - BUG: 0 [#1] SMP
> Modules linked in:
> CPU: 0 PID: 0 Comm: swapper Not tainted 5.15.0-rc6-next-20211019+ #104
> pstate: 600000c5 (nZCv daIF -PAN -UAO -TCO -DIT -SSBS BTYPE=--)
> pc : kmemleak_free_part_phys+0x64/0x8c
> lr : kmemleak_free_part_phys+0x38/0x8c
> sp : ffff800011eafbc0
> x29: ffff800011eafbc0 x28: 1fffff7fffb41c0d x27: fffffbfffda0e068
> x26: 0000000092000000 x25: 1ffff000023d5f94 x24: ffff800011ed84d0
> x23: ffff800011ed84c0 x22: ffff800011ed83d8 x21: 0000000000900000
> x20: ffff800011782000 x19: 0000000092000000 x18: ffff800011ee0730
> x17: 0000000000000000 x16: 0000000000000000 x15: 1ffff0000233252c
> x14: ffff800019a905a0 x13: 0000000000000001 x12: ffff7000023d5ed7
> x11: 1ffff000023d5ed6 x10: ffff7000023d5ed6 x9 : dfff800000000000
> x8 : ffff800011eaf6b7 x7 : 0000000000000001 x6 : ffff800011eaf6b0
> x5 : 00008ffffdc2a12a x4 : ffff7000023d5ed7 x3 : 1ffff000023dbf99
> x2 : 1ffff000022f0463 x1 : 0000000000000000 x0 : ffffffffffffffff
> Call trace:
>  kmemleak_free_part_phys+0x64/0x8c
>  memblock_mark_nomap+0x5c/0x78
>  reserve_regions+0x294/0x33c
>  efi_init+0x2d0/0x490
>  setup_arch+0x80/0x138
>  start_kernel+0xa0/0x3ec
>  __primary_switched+0xc0/0xc8
> Code: 34000041 97d526e7 f9418e80 36000040 (d4210000)
> random: get_random_bytes called from print_oops_end_marker+0x34/0x80 with crng_init=0
> ---[ end trace 0000000000000000 ]---
> 
> The crash happens because kmemleak_free_part_phys() tries to use __va()
> before memstart_addr is initialized and this triggers a VM_BUG_ON() in
> arch/arm64/include/asm/memory.h:
> 
> Revert 6e44bd6d34d6 ("memblock: exclude NOMAP regions from kmemleak"), the
> issue it is fixing will be fixed differently.
> 
> Reported-by: Qian Cai <quic_qiancai@quicinc.com>
> Signed-off-by: Mike Rapoport <rppt@linux.ibm.com>

Acked-by: Catalin Marinas <catalin.marinas@arm.com>
David Hildenbrand Oct. 22, 2021, 12:22 p.m. UTC | #2
On 21.10.21 09:09, Mike Rapoport wrote:
> From: Mike Rapoport <rppt@linux.ibm.com>
> 
> Commit 6e44bd6d34d6 ("memblock: exclude NOMAP regions from kmemleak")
> breaks boot on EFI systems with kmemleak and VM_DEBUG enabled:
> 
> efi: Processing EFI memory map:
> efi:   0x000090000000-0x000091ffffff [Conventional|   |  |  |  |  |  |  |  |  |   |WB|WT|WC|UC]
> efi:   0x000092000000-0x0000928fffff [Runtime Data|RUN|  |  |  |  |  |  |  |  |   |WB|WT|WC|UC]
> ------------[ cut here ]------------
> kernel BUG at mm/kmemleak.c:1140!
> Internal error: Oops - BUG: 0 [#1] SMP
> Modules linked in:
> CPU: 0 PID: 0 Comm: swapper Not tainted 5.15.0-rc6-next-20211019+ #104
> pstate: 600000c5 (nZCv daIF -PAN -UAO -TCO -DIT -SSBS BTYPE=--)
> pc : kmemleak_free_part_phys+0x64/0x8c
> lr : kmemleak_free_part_phys+0x38/0x8c
> sp : ffff800011eafbc0
> x29: ffff800011eafbc0 x28: 1fffff7fffb41c0d x27: fffffbfffda0e068
> x26: 0000000092000000 x25: 1ffff000023d5f94 x24: ffff800011ed84d0
> x23: ffff800011ed84c0 x22: ffff800011ed83d8 x21: 0000000000900000
> x20: ffff800011782000 x19: 0000000092000000 x18: ffff800011ee0730
> x17: 0000000000000000 x16: 0000000000000000 x15: 1ffff0000233252c
> x14: ffff800019a905a0 x13: 0000000000000001 x12: ffff7000023d5ed7
> x11: 1ffff000023d5ed6 x10: ffff7000023d5ed6 x9 : dfff800000000000
> x8 : ffff800011eaf6b7 x7 : 0000000000000001 x6 : ffff800011eaf6b0
> x5 : 00008ffffdc2a12a x4 : ffff7000023d5ed7 x3 : 1ffff000023dbf99
> x2 : 1ffff000022f0463 x1 : 0000000000000000 x0 : ffffffffffffffff
> Call trace:
>  kmemleak_free_part_phys+0x64/0x8c
>  memblock_mark_nomap+0x5c/0x78
>  reserve_regions+0x294/0x33c
>  efi_init+0x2d0/0x490
>  setup_arch+0x80/0x138
>  start_kernel+0xa0/0x3ec
>  __primary_switched+0xc0/0xc8
> Code: 34000041 97d526e7 f9418e80 36000040 (d4210000)
> random: get_random_bytes called from print_oops_end_marker+0x34/0x80 with crng_init=0
> ---[ end trace 0000000000000000 ]---
> 
> The crash happens because kmemleak_free_part_phys() tries to use __va()
> before memstart_addr is initialized and this triggers a VM_BUG_ON() in
> arch/arm64/include/asm/memory.h:
> 
> Revert 6e44bd6d34d6 ("memblock: exclude NOMAP regions from kmemleak"), the
> issue it is fixing will be fixed differently.
> 
> Reported-by: Qian Cai <quic_qiancai@quicinc.com>
> Signed-off-by: Mike Rapoport <rppt@linux.ibm.com>
> ---
>  mm/memblock.c | 7 +------
>  1 file changed, 1 insertion(+), 6 deletions(-)
> 
> diff --git a/mm/memblock.c b/mm/memblock.c
> index 5c3503c98b2f..184dcd2e5d99 100644
> --- a/mm/memblock.c
> +++ b/mm/memblock.c
> @@ -936,12 +936,7 @@ int __init_memblock memblock_mark_mirror(phys_addr_t base, phys_addr_t size)
>   */
>  int __init_memblock memblock_mark_nomap(phys_addr_t base, phys_addr_t size)
>  {
> -	int ret = memblock_setclr_flag(base, size, 1, MEMBLOCK_NOMAP);
> -
> -	if (!ret)
> -		kmemleak_free_part_phys(base, size);
> -
> -	return ret;
> +	return memblock_setclr_flag(base, size, 1, MEMBLOCK_NOMAP);
>  }
>  
>  /**
> 

Reviewed-by: David Hildenbrand <david@redhat.com>
diff mbox series

Patch

diff --git a/mm/memblock.c b/mm/memblock.c
index 5c3503c98b2f..184dcd2e5d99 100644
--- a/mm/memblock.c
+++ b/mm/memblock.c
@@ -936,12 +936,7 @@  int __init_memblock memblock_mark_mirror(phys_addr_t base, phys_addr_t size)
  */
 int __init_memblock memblock_mark_nomap(phys_addr_t base, phys_addr_t size)
 {
-	int ret = memblock_setclr_flag(base, size, 1, MEMBLOCK_NOMAP);
-
-	if (!ret)
-		kmemleak_free_part_phys(base, size);
-
-	return ret;
+	return memblock_setclr_flag(base, size, 1, MEMBLOCK_NOMAP);
 }
 
 /**