linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2 0/2] memblock: exclude MEMBLOCK_NOMAP regions from kmemleak
@ 2021-10-21  7:09 Mike Rapoport
  2021-10-21  7:09 ` [PATCH v2 1/2] Revert "memblock: exclude NOMAP regions from kmemleak" Mike Rapoport
                   ` (2 more replies)
  0 siblings, 3 replies; 9+ messages in thread
From: Mike Rapoport @ 2021-10-21  7:09 UTC (permalink / raw)
  To: linux-mm
  Cc: Andrew Morton, Catalin Marinas, Linus Torvalds, Mike Rapoport,
	Mike Rapoport, Qian Cai, Vladimir Zapolskiy, linux-kernel

From: Mike Rapoport <rppt@linux.ibm.com>

Hi,

This is take 2 to fix interaction between MEMBLOCK_NOMAP and kmemleak.

The previous version caused boot failures Qian Cai reported here:

https://lore.kernel.org/all/c30ff0a2-d196-c50d-22f0-bd50696b1205@quicinc.com

The failures happened because calling kmemleak_free_part_phys() (or any
kmemleak phys APIs for that matter) too early means it cannot use __va() on
arm64.

This late in the cycle I can only think of reverting kmemleak wavier from
memblock_mark_nomap() and putting it in the only two callers that set
MEMBLOCK_NOMAP to an allocated chunk rather than marking NOMAP "unusable"
memory reported by firmware.

The first patch here is the revert of v1 and the second patch is actual v2
implementation.

Vladimir and Qian, I'd appreciate if you could verify that v2 works for
you.

v2:
* move kmemleak waiver from memblock_mark_nomap() to callers that need it
* use kmemleak_ignore_phys() rather than kmemleak_free_part_phys() as
  Catalin suggested.

v1: https://lore.kernel.org/all/20211013054756.12177-1-rppt@kernel.org

Mike Rapoport (2):
  Revert "memblock: exclude NOMAP regions from kmemleak"
  memblock: exclude MEMBLOCK_NOMAP regions from kmemleak

 drivers/acpi/tables.c        |  3 +++
 drivers/of/of_reserved_mem.c |  2 ++
 mm/memblock.c                | 10 ++++------
 3 files changed, 9 insertions(+), 6 deletions(-)


base-commit: 519d81956ee277b4419c723adfb154603c2565ba
-- 
2.28.0


^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH v2 1/2] Revert "memblock: exclude NOMAP regions from kmemleak"
  2021-10-21  7:09 [PATCH v2 0/2] memblock: exclude MEMBLOCK_NOMAP regions from kmemleak Mike Rapoport
@ 2021-10-21  7:09 ` Mike Rapoport
  2021-10-21  8:29   ` Catalin Marinas
  2021-10-22 12:22   ` David Hildenbrand
  2021-10-21  7:09 ` [PATCH v2 2/2] memblock: exclude MEMBLOCK_NOMAP regions from kmemleak Mike Rapoport
  2021-10-21 16:52 ` [PATCH v2 0/2] " Qian Cai
  2 siblings, 2 replies; 9+ messages in thread
From: Mike Rapoport @ 2021-10-21  7:09 UTC (permalink / raw)
  To: linux-mm
  Cc: Andrew Morton, Catalin Marinas, Linus Torvalds, Mike Rapoport,
	Mike Rapoport, Qian Cai, Vladimir Zapolskiy, linux-kernel

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);
 }
 
 /**
-- 
2.28.0


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH v2 2/2] memblock: exclude MEMBLOCK_NOMAP regions from kmemleak
  2021-10-21  7:09 [PATCH v2 0/2] memblock: exclude MEMBLOCK_NOMAP regions from kmemleak Mike Rapoport
  2021-10-21  7:09 ` [PATCH v2 1/2] Revert "memblock: exclude NOMAP regions from kmemleak" Mike Rapoport
@ 2021-10-21  7:09 ` Mike Rapoport
  2021-10-21  8:03   ` Vladimir Zapolskiy
                     ` (2 more replies)
  2021-10-21 16:52 ` [PATCH v2 0/2] " Qian Cai
  2 siblings, 3 replies; 9+ messages in thread
From: Mike Rapoport @ 2021-10-21  7:09 UTC (permalink / raw)
  To: linux-mm
  Cc: Andrew Morton, Catalin Marinas, Linus Torvalds, Mike Rapoport,
	Mike Rapoport, Qian Cai, Vladimir Zapolskiy, linux-kernel

From: Mike Rapoport <rppt@linux.ibm.com>

Vladimir Zapolskiy reports:

commit a7259df76702 ("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: a7259df76702 ("memblock: make memblock_find_in_range method private")
Reported-by: Vladimir Zapolskiy <vladimir.zapolskiy@linaro.org>
Signed-off-by: Mike Rapoport <rppt@linux.ibm.com>
---
 drivers/acpi/tables.c        | 3 +++
 drivers/of/of_reserved_mem.c | 2 ++
 mm/memblock.c                | 3 +++
 3 files changed, 8 insertions(+)

diff --git a/drivers/acpi/tables.c b/drivers/acpi/tables.c
index f9383736fa0f..71419eb16e09 100644
--- a/drivers/acpi/tables.c
+++ b/drivers/acpi/tables.c
@@ -21,6 +21,7 @@
 #include <linux/earlycpio.h>
 #include <linux/initrd.h>
 #include <linux/security.h>
+#include <linux/kmemleak.h>
 #include "internal.h"
 
 #ifdef CONFIG_ACPI_CUSTOM_DSDT
@@ -601,6 +602,8 @@ void __init acpi_table_upgrade(void)
 	 */
 	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
 	 * tables one time, we will hit the limit. Need to map chunks
diff --git a/drivers/of/of_reserved_mem.c b/drivers/of/of_reserved_mem.c
index 59c1390cdf42..9da8835ba5a5 100644
--- a/drivers/of/of_reserved_mem.c
+++ b/drivers/of/of_reserved_mem.c
@@ -21,6 +21,7 @@
 #include <linux/sort.h>
 #include <linux/slab.h>
 #include <linux/memblock.h>
+#include <linux/kmemleak.h>
 
 #include "of_private.h"
 
@@ -46,6 +47,7 @@ static int __init early_init_dt_alloc_reserved_memory_arch(phys_addr_t size,
 		err = memblock_mark_nomap(base, size);
 		if (err)
 			memblock_free(base, size);
+		kmemleak_ignore_phys(base);
 	}
 
 	return err;
diff --git a/mm/memblock.c b/mm/memblock.c
index 184dcd2e5d99..dab804b09d62 100644
--- a/mm/memblock.c
+++ b/mm/memblock.c
@@ -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
  * 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.
  */
 int __init_memblock memblock_mark_nomap(phys_addr_t base, phys_addr_t size)
-- 
2.28.0


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* Re: [PATCH v2 2/2] memblock: exclude MEMBLOCK_NOMAP regions from kmemleak
  2021-10-21  7:09 ` [PATCH v2 2/2] memblock: exclude MEMBLOCK_NOMAP regions from kmemleak Mike Rapoport
@ 2021-10-21  8:03   ` Vladimir Zapolskiy
  2021-10-21  8:32   ` Catalin Marinas
  2021-10-22 12:22   ` David Hildenbrand
  2 siblings, 0 replies; 9+ messages in thread
From: Vladimir Zapolskiy @ 2021-10-21  8:03 UTC (permalink / raw)
  To: Mike Rapoport, linux-mm
  Cc: Andrew Morton, Catalin Marinas, Linus Torvalds, Mike Rapoport,
	Qian Cai, linux-kernel

Hi Mike,

On 10/21/21 10:09 AM, Mike Rapoport wrote:
> From: Mike Rapoport <rppt@linux.ibm.com>
> 
> Vladimir Zapolskiy reports:
> 
> commit a7259df76702 ("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: a7259df76702 ("memblock: make memblock_find_in_range method private")
> Reported-by: Vladimir Zapolskiy <vladimir.zapolskiy@linaro.org>
> Signed-off-by: Mike Rapoport <rppt@linux.ibm.com>

this change variant also solves the reported problem, thank you.

Tested-by: Vladimir Zapolskiy <vladimir.zapolskiy@linaro.org>

--
Best wishes,
Vladimir

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH v2 1/2] Revert "memblock: exclude NOMAP regions from kmemleak"
  2021-10-21  7:09 ` [PATCH v2 1/2] Revert "memblock: exclude NOMAP regions from kmemleak" Mike Rapoport
@ 2021-10-21  8:29   ` Catalin Marinas
  2021-10-22 12:22   ` David Hildenbrand
  1 sibling, 0 replies; 9+ messages in thread
From: Catalin Marinas @ 2021-10-21  8:29 UTC (permalink / raw)
  To: Mike Rapoport
  Cc: linux-mm, Andrew Morton, Linus Torvalds, Mike Rapoport, Qian Cai,
	Vladimir Zapolskiy, linux-kernel

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>

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH v2 2/2] memblock: exclude MEMBLOCK_NOMAP regions from kmemleak
  2021-10-21  7:09 ` [PATCH v2 2/2] memblock: exclude MEMBLOCK_NOMAP regions from kmemleak Mike Rapoport
  2021-10-21  8:03   ` Vladimir Zapolskiy
@ 2021-10-21  8:32   ` Catalin Marinas
  2021-10-22 12:22   ` David Hildenbrand
  2 siblings, 0 replies; 9+ messages in thread
From: Catalin Marinas @ 2021-10-21  8:32 UTC (permalink / raw)
  To: Mike Rapoport
  Cc: linux-mm, Andrew Morton, Linus Torvalds, Mike Rapoport, Qian Cai,
	Vladimir Zapolskiy, linux-kernel

On Thu, Oct 21, 2021 at 10:09:29AM +0300, Mike Rapoport wrote:
> diff --git a/drivers/acpi/tables.c b/drivers/acpi/tables.c
> index f9383736fa0f..71419eb16e09 100644
> --- a/drivers/acpi/tables.c
> +++ b/drivers/acpi/tables.c
> @@ -21,6 +21,7 @@
>  #include <linux/earlycpio.h>
>  #include <linux/initrd.h>
>  #include <linux/security.h>
> +#include <linux/kmemleak.h>
>  #include "internal.h"
>  
>  #ifdef CONFIG_ACPI_CUSTOM_DSDT
> @@ -601,6 +602,8 @@ void __init acpi_table_upgrade(void)
>  	 */
>  	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
>  	 * tables one time, we will hit the limit. Need to map chunks
> diff --git a/drivers/of/of_reserved_mem.c b/drivers/of/of_reserved_mem.c
> index 59c1390cdf42..9da8835ba5a5 100644
> --- a/drivers/of/of_reserved_mem.c
> +++ b/drivers/of/of_reserved_mem.c
> @@ -21,6 +21,7 @@
>  #include <linux/sort.h>
>  #include <linux/slab.h>
>  #include <linux/memblock.h>
> +#include <linux/kmemleak.h>
>  
>  #include "of_private.h"
>  
> @@ -46,6 +47,7 @@ static int __init early_init_dt_alloc_reserved_memory_arch(phys_addr_t size,
>  		err = memblock_mark_nomap(base, size);
>  		if (err)
>  			memblock_free(base, size);
> +		kmemleak_ignore_phys(base);
>  	}
>  
>  	return err;

More of a nitpick as there's no kmemleak scanning to race with during
early boot: I'd normally call kmemleak_ignore_phys() before marking it
nomap. Either way:

Reviewed-by: Catalin Marinas <catalin.marinas@arm.com>

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH v2 0/2] memblock: exclude MEMBLOCK_NOMAP regions from kmemleak
  2021-10-21  7:09 [PATCH v2 0/2] memblock: exclude MEMBLOCK_NOMAP regions from kmemleak Mike Rapoport
  2021-10-21  7:09 ` [PATCH v2 1/2] Revert "memblock: exclude NOMAP regions from kmemleak" Mike Rapoport
  2021-10-21  7:09 ` [PATCH v2 2/2] memblock: exclude MEMBLOCK_NOMAP regions from kmemleak Mike Rapoport
@ 2021-10-21 16:52 ` Qian Cai
  2 siblings, 0 replies; 9+ messages in thread
From: Qian Cai @ 2021-10-21 16:52 UTC (permalink / raw)
  To: Mike Rapoport, linux-mm
  Cc: Andrew Morton, Catalin Marinas, Linus Torvalds, Mike Rapoport,
	Vladimir Zapolskiy, linux-kernel



On 10/21/21 3:09 AM, Mike Rapoport wrote:
> From: Mike Rapoport <rppt@linux.ibm.com>
> 
> Hi,
> 
> This is take 2 to fix interaction between MEMBLOCK_NOMAP and kmemleak.
> 
> The previous version caused boot failures Qian Cai reported here:
> 
> https://lore.kernel.org/all/c30ff0a2-d196-c50d-22f0-bd50696b1205@quicinc.com
> 
> The failures happened because calling kmemleak_free_part_phys() (or any
> kmemleak phys APIs for that matter) too early means it cannot use __va() on
> arm64.
> 
> This late in the cycle I can only think of reverting kmemleak wavier from
> memblock_mark_nomap() and putting it in the only two callers that set
> MEMBLOCK_NOMAP to an allocated chunk rather than marking NOMAP "unusable"
> memory reported by firmware.
> 
> The first patch here is the revert of v1 and the second patch is actual v2
> implementation.
> 
> Vladimir and Qian, I'd appreciate if you could verify that v2 works for
> you.

FYI, this passed the regression tests here.


> 
> v2:
> * move kmemleak waiver from memblock_mark_nomap() to callers that need it
> * use kmemleak_ignore_phys() rather than kmemleak_free_part_phys() as
>   Catalin suggested.
> 
> v1: https://lore.kernel.org/all/20211013054756.12177-1-rppt@kernel.org
> 
> Mike Rapoport (2):
>   Revert "memblock: exclude NOMAP regions from kmemleak"
>   memblock: exclude MEMBLOCK_NOMAP regions from kmemleak
> 
>  drivers/acpi/tables.c        |  3 +++
>  drivers/of/of_reserved_mem.c |  2 ++
>  mm/memblock.c                | 10 ++++------
>  3 files changed, 9 insertions(+), 6 deletions(-)
> 
> 
> base-commit: 519d81956ee277b4419c723adfb154603c2565ba
> 

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH v2 1/2] Revert "memblock: exclude NOMAP regions from kmemleak"
  2021-10-21  7:09 ` [PATCH v2 1/2] Revert "memblock: exclude NOMAP regions from kmemleak" Mike Rapoport
  2021-10-21  8:29   ` Catalin Marinas
@ 2021-10-22 12:22   ` David Hildenbrand
  1 sibling, 0 replies; 9+ messages in thread
From: David Hildenbrand @ 2021-10-22 12:22 UTC (permalink / raw)
  To: Mike Rapoport, linux-mm
  Cc: Andrew Morton, Catalin Marinas, Linus Torvalds, Mike Rapoport,
	Qian Cai, Vladimir Zapolskiy, linux-kernel

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>

-- 
Thanks,

David / dhildenb


^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH v2 2/2] memblock: exclude MEMBLOCK_NOMAP regions from kmemleak
  2021-10-21  7:09 ` [PATCH v2 2/2] memblock: exclude MEMBLOCK_NOMAP regions from kmemleak Mike Rapoport
  2021-10-21  8:03   ` Vladimir Zapolskiy
  2021-10-21  8:32   ` Catalin Marinas
@ 2021-10-22 12:22   ` David Hildenbrand
  2 siblings, 0 replies; 9+ messages in thread
From: David Hildenbrand @ 2021-10-22 12:22 UTC (permalink / raw)
  To: Mike Rapoport, linux-mm
  Cc: Andrew Morton, Catalin Marinas, Linus Torvalds, Mike Rapoport,
	Qian Cai, Vladimir Zapolskiy, linux-kernel

On 21.10.21 09:09, Mike Rapoport wrote:
> From: Mike Rapoport <rppt@linux.ibm.com>
> 
> Vladimir Zapolskiy reports:
> 
> commit a7259df76702 ("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: a7259df76702 ("memblock: make memblock_find_in_range method private")
> Reported-by: Vladimir Zapolskiy <vladimir.zapolskiy@linaro.org>
> Signed-off-by: Mike Rapoport <rppt@linux.ibm.com>
> ---
>  drivers/acpi/tables.c        | 3 +++
>  drivers/of/of_reserved_mem.c | 2 ++
>  mm/memblock.c                | 3 +++
>  3 files changed, 8 insertions(+)
> 
> diff --git a/drivers/acpi/tables.c b/drivers/acpi/tables.c
> index f9383736fa0f..71419eb16e09 100644
> --- a/drivers/acpi/tables.c
> +++ b/drivers/acpi/tables.c
> @@ -21,6 +21,7 @@
>  #include <linux/earlycpio.h>
>  #include <linux/initrd.h>
>  #include <linux/security.h>
> +#include <linux/kmemleak.h>
>  #include "internal.h"
>  
>  #ifdef CONFIG_ACPI_CUSTOM_DSDT
> @@ -601,6 +602,8 @@ void __init acpi_table_upgrade(void)
>  	 */
>  	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
>  	 * tables one time, we will hit the limit. Need to map chunks
> diff --git a/drivers/of/of_reserved_mem.c b/drivers/of/of_reserved_mem.c
> index 59c1390cdf42..9da8835ba5a5 100644
> --- a/drivers/of/of_reserved_mem.c
> +++ b/drivers/of/of_reserved_mem.c
> @@ -21,6 +21,7 @@
>  #include <linux/sort.h>
>  #include <linux/slab.h>
>  #include <linux/memblock.h>
> +#include <linux/kmemleak.h>
>  
>  #include "of_private.h"
>  
> @@ -46,6 +47,7 @@ static int __init early_init_dt_alloc_reserved_memory_arch(phys_addr_t size,
>  		err = memblock_mark_nomap(base, size);
>  		if (err)
>  			memblock_free(base, size);
> +		kmemleak_ignore_phys(base);
>  	}
>  
>  	return err;
> diff --git a/mm/memblock.c b/mm/memblock.c
> index 184dcd2e5d99..dab804b09d62 100644
> --- a/mm/memblock.c
> +++ b/mm/memblock.c
> @@ -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
>   * 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.
>   */
>  int __init_memblock memblock_mark_nomap(phys_addr_t base, phys_addr_t size)
> 

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

-- 
Thanks,

David / dhildenb


^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2021-10-22 12:22 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-10-21  7:09 [PATCH v2 0/2] memblock: exclude MEMBLOCK_NOMAP regions from kmemleak Mike Rapoport
2021-10-21  7:09 ` [PATCH v2 1/2] Revert "memblock: exclude NOMAP regions from kmemleak" Mike Rapoport
2021-10-21  8:29   ` Catalin Marinas
2021-10-22 12:22   ` David Hildenbrand
2021-10-21  7:09 ` [PATCH v2 2/2] memblock: exclude MEMBLOCK_NOMAP regions from kmemleak Mike Rapoport
2021-10-21  8:03   ` Vladimir Zapolskiy
2021-10-21  8:32   ` Catalin Marinas
2021-10-22 12:22   ` David Hildenbrand
2021-10-21 16:52 ` [PATCH v2 0/2] " Qian Cai

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).