linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] arm: skip nomap memblocks while finding the lowmem/highmem boundary
@ 2019-08-22  3:45 Chester Lin
  2019-08-22  3:59 ` Chester Lin
  2019-08-22  6:40 ` Mike Rapoport
  0 siblings, 2 replies; 5+ messages in thread
From: Chester Lin @ 2019-08-22  3:45 UTC (permalink / raw)
  To: linux, rppt, ard.biesheuvel, akpm, geert, tglx, mark.rutland
  Cc: linux-arm-kernel, linux-kernel, guillaume.gardet, Chester Lin,
	Gary Lin, Joey Lee

adjust_lowmem_bounds() checks every memblocks in order to find the boundary
between lowmem and highmem. However some memblocks could be marked as NOMAP
so they are not used by kernel, which should be skipped while calculating
the boundary.

Signed-off-by: Chester Lin <clin@suse.com>
---
 arch/arm/mm/mmu.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/arch/arm/mm/mmu.c b/arch/arm/mm/mmu.c
index 426d9085396b..b86dba44d828 100644
--- a/arch/arm/mm/mmu.c
+++ b/arch/arm/mm/mmu.c
@@ -1181,6 +1181,9 @@ void __init adjust_lowmem_bounds(void)
 		phys_addr_t block_start = reg->base;
 		phys_addr_t block_end = reg->base + reg->size;
 
+		if (memblock_is_nomap(reg))
+			continue;
+
 		if (reg->base < vmalloc_limit) {
 			if (block_end > lowmem_limit)
 				/*
-- 
2.22.0


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

* Re: [PATCH] arm: skip nomap memblocks while finding the lowmem/highmem boundary
  2019-08-22  3:45 [PATCH] arm: skip nomap memblocks while finding the lowmem/highmem boundary Chester Lin
@ 2019-08-22  3:59 ` Chester Lin
  2019-08-22  6:44   ` Mike Rapoport
  2019-08-22  6:40 ` Mike Rapoport
  1 sibling, 1 reply; 5+ messages in thread
From: Chester Lin @ 2019-08-22  3:59 UTC (permalink / raw)
  To: linux, rppt, ard.biesheuvel, akpm, geert, tglx, mark.rutland
  Cc: linux-arm-kernel, linux-kernel, guillaume.gardet, Gary Lin, Joey Lee

On Thu, Aug 22, 2019 at 11:45:34AM +0800, Chester Lin wrote:
> adjust_lowmem_bounds() checks every memblocks in order to find the boundary
> between lowmem and highmem. However some memblocks could be marked as NOMAP
> so they are not used by kernel, which should be skipped while calculating
> the boundary.
> 
> Signed-off-by: Chester Lin <clin@suse.com>
> ---
>  arch/arm/mm/mmu.c | 3 +++
>  1 file changed, 3 insertions(+)
> 
> diff --git a/arch/arm/mm/mmu.c b/arch/arm/mm/mmu.c
> index 426d9085396b..b86dba44d828 100644
> --- a/arch/arm/mm/mmu.c
> +++ b/arch/arm/mm/mmu.c
> @@ -1181,6 +1181,9 @@ void __init adjust_lowmem_bounds(void)
>  		phys_addr_t block_start = reg->base;
>  		phys_addr_t block_end = reg->base + reg->size;
>  
> +		if (memblock_is_nomap(reg))
> +			continue;
> +
>  		if (reg->base < vmalloc_limit) {
>  			if (block_end > lowmem_limit)
>  				/*
> -- 
> 2.22.0
>

Hi Russell, Mike and Ard,

Per the discussion in the thread "[PATH] efi/arm: fix allocation failure ...",
(https://lkml.org/lkml/2019/8/21/163), I presume that the change to disregard
NOMAP memblocks in adjust_lowmem_bounds() should be separated as a single patch.

Please let me know if any suggestion, thank you.



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

* Re: [PATCH] arm: skip nomap memblocks while finding the lowmem/highmem boundary
  2019-08-22  3:45 [PATCH] arm: skip nomap memblocks while finding the lowmem/highmem boundary Chester Lin
  2019-08-22  3:59 ` Chester Lin
@ 2019-08-22  6:40 ` Mike Rapoport
  1 sibling, 0 replies; 5+ messages in thread
From: Mike Rapoport @ 2019-08-22  6:40 UTC (permalink / raw)
  To: Chester Lin
  Cc: linux, ard.biesheuvel, akpm, geert, tglx, mark.rutland,
	linux-arm-kernel, linux-kernel, guillaume.gardet, Gary Lin,
	Joey Lee

On Thu, Aug 22, 2019 at 03:45:34AM +0000, Chester Lin wrote:
> adjust_lowmem_bounds() checks every memblocks in order to find the boundary
> between lowmem and highmem. However some memblocks could be marked as NOMAP
> so they are not used by kernel, which should be skipped while calculating
> the boundary.
> 
> Signed-off-by: Chester Lin <clin@suse.com>

Reviewed-by: Mike Rapoport <rppt@linux.ibm.com>

> ---
>  arch/arm/mm/mmu.c | 3 +++
>  1 file changed, 3 insertions(+)
> 
> diff --git a/arch/arm/mm/mmu.c b/arch/arm/mm/mmu.c
> index 426d9085396b..b86dba44d828 100644
> --- a/arch/arm/mm/mmu.c
> +++ b/arch/arm/mm/mmu.c
> @@ -1181,6 +1181,9 @@ void __init adjust_lowmem_bounds(void)
>  		phys_addr_t block_start = reg->base;
>  		phys_addr_t block_end = reg->base + reg->size;
>  
> +		if (memblock_is_nomap(reg))
> +			continue;
> +
>  		if (reg->base < vmalloc_limit) {
>  			if (block_end > lowmem_limit)
>  				/*
> -- 
> 2.22.0
> 

-- 
Sincerely yours,
Mike.


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

* Re: [PATCH] arm: skip nomap memblocks while finding the lowmem/highmem boundary
  2019-08-22  3:59 ` Chester Lin
@ 2019-08-22  6:44   ` Mike Rapoport
  2019-08-22  6:46     ` Ard Biesheuvel
  0 siblings, 1 reply; 5+ messages in thread
From: Mike Rapoport @ 2019-08-22  6:44 UTC (permalink / raw)
  To: Chester Lin
  Cc: linux, ard.biesheuvel, akpm, geert, tglx, mark.rutland,
	linux-arm-kernel, linux-kernel, guillaume.gardet, Gary Lin,
	Joey Lee

On Thu, Aug 22, 2019 at 03:59:42AM +0000, Chester Lin wrote:
> On Thu, Aug 22, 2019 at 11:45:34AM +0800, Chester Lin wrote:
> > adjust_lowmem_bounds() checks every memblocks in order to find the boundary
> > between lowmem and highmem. However some memblocks could be marked as NOMAP
> > so they are not used by kernel, which should be skipped while calculating
> > the boundary.
> > 
> > Signed-off-by: Chester Lin <clin@suse.com>
> > ---
> >  arch/arm/mm/mmu.c | 3 +++
> >  1 file changed, 3 insertions(+)
> > 
> > diff --git a/arch/arm/mm/mmu.c b/arch/arm/mm/mmu.c
> > index 426d9085396b..b86dba44d828 100644
> > --- a/arch/arm/mm/mmu.c
> > +++ b/arch/arm/mm/mmu.c
> > @@ -1181,6 +1181,9 @@ void __init adjust_lowmem_bounds(void)
> >  		phys_addr_t block_start = reg->base;
> >  		phys_addr_t block_end = reg->base + reg->size;
> >  
> > +		if (memblock_is_nomap(reg))
> > +			continue;
> > +
> >  		if (reg->base < vmalloc_limit) {
> >  			if (block_end > lowmem_limit)
> >  				/*
> > -- 
> > 2.22.0
> >
> 
> Hi Russell, Mike and Ard,
> 
> Per the discussion in the thread "[PATH] efi/arm: fix allocation failure ...",
> (https://lkml.org/lkml/2019/8/21/163), I presume that the change to disregard
> NOMAP memblocks in adjust_lowmem_bounds() should be separated as a single patch.
> 
> Please let me know if any suggestion, thank you.

Let's add this one to the series: 

From 06a986e79d60c310c804b3e550bd50316597aec5 Mon Sep 17 00:00:00 2001
From: Mike Rapoport <rppt@linux.ibm.com>
Date: Thu, 22 Aug 2019 09:27:40 +0300
Subject: [PATCH] arm: ensure that usable memory in bank 0 starts from a
 PMD-aligned address

The calculation of memblock_limit in adjust_lowmem_bounds() assumes that
bank 0 starts from a PMD-aligned address. However, the beginning of the
first bank may be NOMAP memory and the start of usable memory
will be not aligned to PMD boundary. In such case the memblock_limit will
be set to the end of the NOMAP region, which will prevent any memblock
allocations.

Mark the region between the end of the NOMAP area and the next PMD-aligned
address as NOMAP as well, so that the usable memory will start at
PMD-aligned address.

Signed-off-by: Mike Rapoport <rppt@linux.ibm.com>
---
 arch/arm/mm/mmu.c | 16 ++++++++++++++++
 1 file changed, 16 insertions(+)

diff --git a/arch/arm/mm/mmu.c b/arch/arm/mm/mmu.c
index 4495a26..25da9b2 100644
--- a/arch/arm/mm/mmu.c
+++ b/arch/arm/mm/mmu.c
@@ -1177,6 +1177,22 @@ void __init adjust_lowmem_bounds(void)
 	 */
 	vmalloc_limit = (u64)(uintptr_t)vmalloc_min - PAGE_OFFSET + PHYS_OFFSET;
 
+	/*
+	 * The first usable region must be PMD aligned. Mark its start
+	 * as MEMBLOCK_NOMAP if it isn't
+	 */
+	for_each_memblock(memory, reg) {
+		if (!memblock_is_nomap(reg)) {
+			if (!IS_ALIGNED(reg->base, PMD_SIZE)) {
+				phys_addr_t len;
+
+				len = round_up(reg->base, PMD_SIZE) - reg->base;
+				memblock_mark_nomap(reg->base, len);
+			}
+			break;
+		}
+	}
+
 	for_each_memblock(memory, reg) {
 		phys_addr_t block_start = reg->base;
 		phys_addr_t block_end = reg->base + reg->size;
-- 
2.7.4


-- 
Sincerely yours,
Mike.


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

* Re: [PATCH] arm: skip nomap memblocks while finding the lowmem/highmem boundary
  2019-08-22  6:44   ` Mike Rapoport
@ 2019-08-22  6:46     ` Ard Biesheuvel
  0 siblings, 0 replies; 5+ messages in thread
From: Ard Biesheuvel @ 2019-08-22  6:46 UTC (permalink / raw)
  To: Mike Rapoport
  Cc: Chester Lin, linux, akpm, geert, tglx, mark.rutland,
	linux-arm-kernel, linux-kernel, guillaume.gardet, Gary Lin,
	Joey Lee

On Thu, 22 Aug 2019 at 09:44, Mike Rapoport <rppt@linux.ibm.com> wrote:
>
> On Thu, Aug 22, 2019 at 03:59:42AM +0000, Chester Lin wrote:
> > On Thu, Aug 22, 2019 at 11:45:34AM +0800, Chester Lin wrote:
> > > adjust_lowmem_bounds() checks every memblocks in order to find the boundary
> > > between lowmem and highmem. However some memblocks could be marked as NOMAP
> > > so they are not used by kernel, which should be skipped while calculating
> > > the boundary.
> > >
> > > Signed-off-by: Chester Lin <clin@suse.com>
> > > ---
> > >  arch/arm/mm/mmu.c | 3 +++
> > >  1 file changed, 3 insertions(+)
> > >
> > > diff --git a/arch/arm/mm/mmu.c b/arch/arm/mm/mmu.c
> > > index 426d9085396b..b86dba44d828 100644
> > > --- a/arch/arm/mm/mmu.c
> > > +++ b/arch/arm/mm/mmu.c
> > > @@ -1181,6 +1181,9 @@ void __init adjust_lowmem_bounds(void)
> > >             phys_addr_t block_start = reg->base;
> > >             phys_addr_t block_end = reg->base + reg->size;
> > >
> > > +           if (memblock_is_nomap(reg))
> > > +                   continue;
> > > +
> > >             if (reg->base < vmalloc_limit) {
> > >                     if (block_end > lowmem_limit)
> > >                             /*
> > > --
> > > 2.22.0
> > >
> >
> > Hi Russell, Mike and Ard,
> >
> > Per the discussion in the thread "[PATH] efi/arm: fix allocation failure ...",
> > (https://lkml.org/lkml/2019/8/21/163), I presume that the change to disregard
> > NOMAP memblocks in adjust_lowmem_bounds() should be separated as a single patch.
> >
> > Please let me know if any suggestion, thank you.
>
> Let's add this one to the series:
>
> From 06a986e79d60c310c804b3e550bd50316597aec5 Mon Sep 17 00:00:00 2001
> From: Mike Rapoport <rppt@linux.ibm.com>
> Date: Thu, 22 Aug 2019 09:27:40 +0300
> Subject: [PATCH] arm: ensure that usable memory in bank 0 starts from a
>  PMD-aligned address
>
> The calculation of memblock_limit in adjust_lowmem_bounds() assumes that
> bank 0 starts from a PMD-aligned address. However, the beginning of the
> first bank may be NOMAP memory and the start of usable memory
> will be not aligned to PMD boundary. In such case the memblock_limit will
> be set to the end of the NOMAP region, which will prevent any memblock
> allocations.
>
> Mark the region between the end of the NOMAP area and the next PMD-aligned
> address as NOMAP as well, so that the usable memory will start at
> PMD-aligned address.
>
> Signed-off-by: Mike Rapoport <rppt@linux.ibm.com>

Acked-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>

> ---
>  arch/arm/mm/mmu.c | 16 ++++++++++++++++
>  1 file changed, 16 insertions(+)
>
> diff --git a/arch/arm/mm/mmu.c b/arch/arm/mm/mmu.c
> index 4495a26..25da9b2 100644
> --- a/arch/arm/mm/mmu.c
> +++ b/arch/arm/mm/mmu.c
> @@ -1177,6 +1177,22 @@ void __init adjust_lowmem_bounds(void)
>          */
>         vmalloc_limit = (u64)(uintptr_t)vmalloc_min - PAGE_OFFSET + PHYS_OFFSET;
>
> +       /*
> +        * The first usable region must be PMD aligned. Mark its start
> +        * as MEMBLOCK_NOMAP if it isn't
> +        */
> +       for_each_memblock(memory, reg) {
> +               if (!memblock_is_nomap(reg)) {
> +                       if (!IS_ALIGNED(reg->base, PMD_SIZE)) {
> +                               phys_addr_t len;
> +
> +                               len = round_up(reg->base, PMD_SIZE) - reg->base;
> +                               memblock_mark_nomap(reg->base, len);
> +                       }
> +                       break;
> +               }
> +       }
> +
>         for_each_memblock(memory, reg) {
>                 phys_addr_t block_start = reg->base;
>                 phys_addr_t block_end = reg->base + reg->size;
> --
> 2.7.4
>
>
> --
> Sincerely yours,
> Mike.
>

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

end of thread, other threads:[~2019-08-22  6:47 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-08-22  3:45 [PATCH] arm: skip nomap memblocks while finding the lowmem/highmem boundary Chester Lin
2019-08-22  3:59 ` Chester Lin
2019-08-22  6:44   ` Mike Rapoport
2019-08-22  6:46     ` Ard Biesheuvel
2019-08-22  6:40 ` Mike Rapoport

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).