diff mbox series

arm64: Use correct method to calculate nomap region boundaries

Message ID 20211022070646.41923-1-chenhuacai@loongson.cn (mailing list archive)
State New, archived
Headers show
Series arm64: Use correct method to calculate nomap region boundaries | expand

Commit Message

Huacai Chen Oct. 22, 2021, 7:06 a.m. UTC
Nomap regions are treated as "reserved". When region boundaries are not
page aligned, we usually increase the "reserved" regions rather than
decrease them. So, we should use memblock_region_reserved_base_pfn()/
memblock_region_reserved_end_pfn() instead of memblock_region_memory_
base_pfn()/memblock_region_memory_base_pfn() to calculate boundaries.

Signed-off-by: Huacai Chen <chenhuacai@loongson.cn>
---
 arch/arm64/kernel/setup.c | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

Comments

Huacai Chen Oct. 27, 2021, 8:35 a.m. UTC | #1
Ping?

On Fri, Oct 22, 2021 at 3:07 PM Huacai Chen <chenhuacai@loongson.cn> wrote:
>
> Nomap regions are treated as "reserved". When region boundaries are not
> page aligned, we usually increase the "reserved" regions rather than
> decrease them. So, we should use memblock_region_reserved_base_pfn()/
> memblock_region_reserved_end_pfn() instead of memblock_region_memory_
> base_pfn()/memblock_region_memory_base_pfn() to calculate boundaries.
>
> Signed-off-by: Huacai Chen <chenhuacai@loongson.cn>
> ---
>  arch/arm64/kernel/setup.c | 6 ++++--
>  1 file changed, 4 insertions(+), 2 deletions(-)
>
> diff --git a/arch/arm64/kernel/setup.c b/arch/arm64/kernel/setup.c
> index be5f85b0a24d..1e86d4c5ef8c 100644
> --- a/arch/arm64/kernel/setup.c
> +++ b/arch/arm64/kernel/setup.c
> @@ -232,12 +232,14 @@ static void __init request_standard_resources(void)
>                 if (memblock_is_nomap(region)) {
>                         res->name  = "reserved";
>                         res->flags = IORESOURCE_MEM;
> +                       res->start = __pfn_to_phys(memblock_region_reserved_base_pfn(region));
> +                       res->end = __pfn_to_phys(memblock_region_reserved_end_pfn(region)) - 1;
>                 } else {
>                         res->name  = "System RAM";
>                         res->flags = IORESOURCE_SYSTEM_RAM | IORESOURCE_BUSY;
> +                       res->start = __pfn_to_phys(memblock_region_memory_base_pfn(region));
> +                       res->end = __pfn_to_phys(memblock_region_memory_end_pfn(region)) - 1;
>                 }
> -               res->start = __pfn_to_phys(memblock_region_memory_base_pfn(region));
> -               res->end = __pfn_to_phys(memblock_region_memory_end_pfn(region)) - 1;
>
>                 request_resource(&iomem_resource, res);
>
> --
> 2.27.0
>
Guo Ren Nov. 1, 2021, 1:53 a.m. UTC | #2
The real reserved memory have been initialized before in
for_each_reserved_mem_region loop. If memblock_is_nomap still uses
memblock_region_reserved, than it would cause overlap with
reserved_mem_region.

nomap_region: PFN_DOWN <-> PFN_UP
reserved_region: PFN_DOWN <-> PFN_UP

We would get overlapped reserved_mem_region.

On Wed, Oct 27, 2021 at 4:35 PM Huacai Chen <chenhuacai@gmail.com> wrote:
>
> Ping?
>
> On Fri, Oct 22, 2021 at 3:07 PM Huacai Chen <chenhuacai@loongson.cn> wrote:
> >
> > Nomap regions are treated as "reserved". When region boundaries are not
> > page aligned, we usually increase the "reserved" regions rather than
> > decrease them. So, we should use memblock_region_reserved_base_pfn()/
> > memblock_region_reserved_end_pfn() instead of memblock_region_memory_
> > base_pfn()/memblock_region_memory_base_pfn() to calculate boundaries.
> >
> > Signed-off-by: Huacai Chen <chenhuacai@loongson.cn>
> > ---
> >  arch/arm64/kernel/setup.c | 6 ++++--
> >  1 file changed, 4 insertions(+), 2 deletions(-)
> >
> > diff --git a/arch/arm64/kernel/setup.c b/arch/arm64/kernel/setup.c
> > index be5f85b0a24d..1e86d4c5ef8c 100644
> > --- a/arch/arm64/kernel/setup.c
> > +++ b/arch/arm64/kernel/setup.c
> > @@ -232,12 +232,14 @@ static void __init request_standard_resources(void)
> >                 if (memblock_is_nomap(region)) {
> >                         res->name  = "reserved";
> >                         res->flags = IORESOURCE_MEM;
> > +                       res->start = __pfn_to_phys(memblock_region_reserved_base_pfn(region));
> > +                       res->end = __pfn_to_phys(memblock_region_reserved_end_pfn(region)) - 1;
> >                 } else {
> >                         res->name  = "System RAM";
> >                         res->flags = IORESOURCE_SYSTEM_RAM | IORESOURCE_BUSY;
> > +                       res->start = __pfn_to_phys(memblock_region_memory_base_pfn(region));
> > +                       res->end = __pfn_to_phys(memblock_region_memory_end_pfn(region)) - 1;
> >                 }
> > -               res->start = __pfn_to_phys(memblock_region_memory_base_pfn(region));
> > -               res->end = __pfn_to_phys(memblock_region_memory_end_pfn(region)) - 1;
> >
> >                 request_resource(&iomem_resource, res);
> >
> > --
> > 2.27.0
> >
Huacai Chen Nov. 7, 2021, 10:10 a.m. UTC | #3
Hi, Ren,

On Mon, Nov 1, 2021 at 9:53 AM Guo Ren <guoren@kernel.org> wrote:
>
> The real reserved memory have been initialized before in
> for_each_reserved_mem_region loop. If memblock_is_nomap still uses
> memblock_region_reserved, than it would cause overlap with
> reserved_mem_region.
>
> nomap_region: PFN_DOWN <-> PFN_UP
> reserved_region: PFN_DOWN <-> PFN_UP
>
> We would get overlapped reserved_mem_region.
Nomap regions are subsets of memory regions. And memory regions are
already "decreased" to page-aligned regions. So, nomap regions will
not exceed memory regions and overlap with reserved regions. In fact,
unaligned nomap regions come from memblock_mark_nomap() with unaligned
size.

Huacai
>
> On Wed, Oct 27, 2021 at 4:35 PM Huacai Chen <chenhuacai@gmail.com> wrote:
> >
> > Ping?
> >
> > On Fri, Oct 22, 2021 at 3:07 PM Huacai Chen <chenhuacai@loongson.cn> wrote:
> > >
> > > Nomap regions are treated as "reserved". When region boundaries are not
> > > page aligned, we usually increase the "reserved" regions rather than
> > > decrease them. So, we should use memblock_region_reserved_base_pfn()/
> > > memblock_region_reserved_end_pfn() instead of memblock_region_memory_
> > > base_pfn()/memblock_region_memory_base_pfn() to calculate boundaries.
> > >
> > > Signed-off-by: Huacai Chen <chenhuacai@loongson.cn>
> > > ---
> > >  arch/arm64/kernel/setup.c | 6 ++++--
> > >  1 file changed, 4 insertions(+), 2 deletions(-)
> > >
> > > diff --git a/arch/arm64/kernel/setup.c b/arch/arm64/kernel/setup.c
> > > index be5f85b0a24d..1e86d4c5ef8c 100644
> > > --- a/arch/arm64/kernel/setup.c
> > > +++ b/arch/arm64/kernel/setup.c
> > > @@ -232,12 +232,14 @@ static void __init request_standard_resources(void)
> > >                 if (memblock_is_nomap(region)) {
> > >                         res->name  = "reserved";
> > >                         res->flags = IORESOURCE_MEM;
> > > +                       res->start = __pfn_to_phys(memblock_region_reserved_base_pfn(region));
> > > +                       res->end = __pfn_to_phys(memblock_region_reserved_end_pfn(region)) - 1;
> > >                 } else {
> > >                         res->name  = "System RAM";
> > >                         res->flags = IORESOURCE_SYSTEM_RAM | IORESOURCE_BUSY;
> > > +                       res->start = __pfn_to_phys(memblock_region_memory_base_pfn(region));
> > > +                       res->end = __pfn_to_phys(memblock_region_memory_end_pfn(region)) - 1;
> > >                 }
> > > -               res->start = __pfn_to_phys(memblock_region_memory_base_pfn(region));
> > > -               res->end = __pfn_to_phys(memblock_region_memory_end_pfn(region)) - 1;
> > >
> > >                 request_resource(&iomem_resource, res);
> > >
> > > --
> > > 2.27.0
> > >
>
>
>
> --
> Best Regards
>  Guo Ren
>
> ML: https://lore.kernel.org/linux-csky/
Will Deacon Dec. 2, 2021, 10:08 a.m. UTC | #4
On Fri, Oct 22, 2021 at 03:06:46PM +0800, Huacai Chen wrote:
> Nomap regions are treated as "reserved". When region boundaries are not
> page aligned, we usually increase the "reserved" regions rather than
> decrease them. So, we should use memblock_region_reserved_base_pfn()/
> memblock_region_reserved_end_pfn() instead of memblock_region_memory_
> base_pfn()/memblock_region_memory_base_pfn() to calculate boundaries.
> 
> Signed-off-by: Huacai Chen <chenhuacai@loongson.cn>
> ---
>  arch/arm64/kernel/setup.c | 6 ++++--
>  1 file changed, 4 insertions(+), 2 deletions(-)
> 
> diff --git a/arch/arm64/kernel/setup.c b/arch/arm64/kernel/setup.c
> index be5f85b0a24d..1e86d4c5ef8c 100644
> --- a/arch/arm64/kernel/setup.c
> +++ b/arch/arm64/kernel/setup.c
> @@ -232,12 +232,14 @@ static void __init request_standard_resources(void)
>  		if (memblock_is_nomap(region)) {
>  			res->name  = "reserved";
>  			res->flags = IORESOURCE_MEM;
> +			res->start = __pfn_to_phys(memblock_region_reserved_base_pfn(region));
> +			res->end = __pfn_to_phys(memblock_region_reserved_end_pfn(region)) - 1;
>  		} else {
>  			res->name  = "System RAM";
>  			res->flags = IORESOURCE_SYSTEM_RAM | IORESOURCE_BUSY;
> +			res->start = __pfn_to_phys(memblock_region_memory_base_pfn(region));
> +			res->end = __pfn_to_phys(memblock_region_memory_end_pfn(region)) - 1;
>  		}
> -		res->start = __pfn_to_phys(memblock_region_memory_base_pfn(region));
> -		res->end = __pfn_to_phys(memblock_region_memory_end_pfn(region)) - 1;

Under which circumstances would the nomap regions not be page-aligned? That
sounds like something we should prevent, rather than work around here.

Will
Huacai Chen Dec. 6, 2021, 4:46 a.m. UTC | #5
Hi, Will

On Thu, Dec 2, 2021 at 6:08 PM Will Deacon <will@kernel.org> wrote:
>
> On Fri, Oct 22, 2021 at 03:06:46PM +0800, Huacai Chen wrote:
> > Nomap regions are treated as "reserved". When region boundaries are not
> > page aligned, we usually increase the "reserved" regions rather than
> > decrease them. So, we should use memblock_region_reserved_base_pfn()/
> > memblock_region_reserved_end_pfn() instead of memblock_region_memory_
> > base_pfn()/memblock_region_memory_base_pfn() to calculate boundaries.
> >
> > Signed-off-by: Huacai Chen <chenhuacai@loongson.cn>
> > ---
> >  arch/arm64/kernel/setup.c | 6 ++++--
> >  1 file changed, 4 insertions(+), 2 deletions(-)
> >
> > diff --git a/arch/arm64/kernel/setup.c b/arch/arm64/kernel/setup.c
> > index be5f85b0a24d..1e86d4c5ef8c 100644
> > --- a/arch/arm64/kernel/setup.c
> > +++ b/arch/arm64/kernel/setup.c
> > @@ -232,12 +232,14 @@ static void __init request_standard_resources(void)
> >               if (memblock_is_nomap(region)) {
> >                       res->name  = "reserved";
> >                       res->flags = IORESOURCE_MEM;
> > +                     res->start = __pfn_to_phys(memblock_region_reserved_base_pfn(region));
> > +                     res->end = __pfn_to_phys(memblock_region_reserved_end_pfn(region)) - 1;
> >               } else {
> >                       res->name  = "System RAM";
> >                       res->flags = IORESOURCE_SYSTEM_RAM | IORESOURCE_BUSY;
> > +                     res->start = __pfn_to_phys(memblock_region_memory_base_pfn(region));
> > +                     res->end = __pfn_to_phys(memblock_region_memory_end_pfn(region)) - 1;
> >               }
> > -             res->start = __pfn_to_phys(memblock_region_memory_base_pfn(region));
> > -             res->end = __pfn_to_phys(memblock_region_memory_end_pfn(region)) - 1;
>
> Under which circumstances would the nomap regions not be page-aligned? That
> sounds like something we should prevent, rather than work around here.

In this call path:
acpi_table_upgrade --> arch_reserve_mem_area --> memblock_mark_nomap
The nomap region is not page-aligned.

Huacai
>
> Will
Will Deacon Dec. 13, 2021, 7:07 p.m. UTC | #6
On Mon, Dec 06, 2021 at 12:46:27PM +0800, Huacai Chen wrote:
> On Thu, Dec 2, 2021 at 6:08 PM Will Deacon <will@kernel.org> wrote:
> > On Fri, Oct 22, 2021 at 03:06:46PM +0800, Huacai Chen wrote:
> > > Nomap regions are treated as "reserved". When region boundaries are not
> > > page aligned, we usually increase the "reserved" regions rather than
> > > decrease them. So, we should use memblock_region_reserved_base_pfn()/
> > > memblock_region_reserved_end_pfn() instead of memblock_region_memory_
> > > base_pfn()/memblock_region_memory_base_pfn() to calculate boundaries.
> > >
> > > Signed-off-by: Huacai Chen <chenhuacai@loongson.cn>
> > > ---
> > >  arch/arm64/kernel/setup.c | 6 ++++--
> > >  1 file changed, 4 insertions(+), 2 deletions(-)
> > >
> > > diff --git a/arch/arm64/kernel/setup.c b/arch/arm64/kernel/setup.c
> > > index be5f85b0a24d..1e86d4c5ef8c 100644
> > > --- a/arch/arm64/kernel/setup.c
> > > +++ b/arch/arm64/kernel/setup.c
> > > @@ -232,12 +232,14 @@ static void __init request_standard_resources(void)
> > >               if (memblock_is_nomap(region)) {
> > >                       res->name  = "reserved";
> > >                       res->flags = IORESOURCE_MEM;
> > > +                     res->start = __pfn_to_phys(memblock_region_reserved_base_pfn(region));
> > > +                     res->end = __pfn_to_phys(memblock_region_reserved_end_pfn(region)) - 1;
> > >               } else {
> > >                       res->name  = "System RAM";
> > >                       res->flags = IORESOURCE_SYSTEM_RAM | IORESOURCE_BUSY;
> > > +                     res->start = __pfn_to_phys(memblock_region_memory_base_pfn(region));
> > > +                     res->end = __pfn_to_phys(memblock_region_memory_end_pfn(region)) - 1;
> > >               }
> > > -             res->start = __pfn_to_phys(memblock_region_memory_base_pfn(region));
> > > -             res->end = __pfn_to_phys(memblock_region_memory_end_pfn(region)) - 1;
> >
> > Under which circumstances would the nomap regions not be page-aligned? That
> > sounds like something we should prevent, rather than work around here.
> 
> In this call path:
> acpi_table_upgrade --> arch_reserve_mem_area --> memblock_mark_nomap
> The nomap region is not page-aligned.

Fair enough, then I think this patch is probably doing the right thing.
However, Ard and Mark had some concerns about the new behaviour wrt
adjacent nomap regions where the page containing the overlap would be
reported twice. Is this a problem?

Will
Huacai Chen Dec. 14, 2021, 12:50 a.m. UTC | #7
Hi, Will,

On Tue, Dec 14, 2021 at 3:07 AM Will Deacon <will@kernel.org> wrote:
>
> On Mon, Dec 06, 2021 at 12:46:27PM +0800, Huacai Chen wrote:
> > On Thu, Dec 2, 2021 at 6:08 PM Will Deacon <will@kernel.org> wrote:
> > > On Fri, Oct 22, 2021 at 03:06:46PM +0800, Huacai Chen wrote:
> > > > Nomap regions are treated as "reserved". When region boundaries are not
> > > > page aligned, we usually increase the "reserved" regions rather than
> > > > decrease them. So, we should use memblock_region_reserved_base_pfn()/
> > > > memblock_region_reserved_end_pfn() instead of memblock_region_memory_
> > > > base_pfn()/memblock_region_memory_base_pfn() to calculate boundaries.
> > > >
> > > > Signed-off-by: Huacai Chen <chenhuacai@loongson.cn>
> > > > ---
> > > >  arch/arm64/kernel/setup.c | 6 ++++--
> > > >  1 file changed, 4 insertions(+), 2 deletions(-)
> > > >
> > > > diff --git a/arch/arm64/kernel/setup.c b/arch/arm64/kernel/setup.c
> > > > index be5f85b0a24d..1e86d4c5ef8c 100644
> > > > --- a/arch/arm64/kernel/setup.c
> > > > +++ b/arch/arm64/kernel/setup.c
> > > > @@ -232,12 +232,14 @@ static void __init request_standard_resources(void)
> > > >               if (memblock_is_nomap(region)) {
> > > >                       res->name  = "reserved";
> > > >                       res->flags = IORESOURCE_MEM;
> > > > +                     res->start = __pfn_to_phys(memblock_region_reserved_base_pfn(region));
> > > > +                     res->end = __pfn_to_phys(memblock_region_reserved_end_pfn(region)) - 1;
> > > >               } else {
> > > >                       res->name  = "System RAM";
> > > >                       res->flags = IORESOURCE_SYSTEM_RAM | IORESOURCE_BUSY;
> > > > +                     res->start = __pfn_to_phys(memblock_region_memory_base_pfn(region));
> > > > +                     res->end = __pfn_to_phys(memblock_region_memory_end_pfn(region)) - 1;
> > > >               }
> > > > -             res->start = __pfn_to_phys(memblock_region_memory_base_pfn(region));
> > > > -             res->end = __pfn_to_phys(memblock_region_memory_end_pfn(region)) - 1;
> > >
> > > Under which circumstances would the nomap regions not be page-aligned? That
> > > sounds like something we should prevent, rather than work around here.
> >
> > In this call path:
> > acpi_table_upgrade --> arch_reserve_mem_area --> memblock_mark_nomap
> > The nomap region is not page-aligned.
>
> Fair enough, then I think this patch is probably doing the right thing.
> However, Ard and Mark had some concerns about the new behaviour wrt
> adjacent nomap regions where the page containing the overlap would be
> reported twice. Is this a problem?
Seems no problem,  in most cases, memblock_mark_nomap() -->
memblock_merge_regions() --> memblock_merge_regions(), adjacent
intesected regions will be merged. Then the only problem is two or
more small regions not intersected but in a single page, I think this
is hardly happen..

But, even if this actually happens, I think it can be handle by the
later request_resource() and small regions will not be reported more
than once.

Huacai
>
> Will
Will Deacon Dec. 14, 2021, 2:11 p.m. UTC | #8
On Tue, Dec 14, 2021 at 08:50:14AM +0800, Huacai Chen wrote:
> Hi, Will,
> 
> On Tue, Dec 14, 2021 at 3:07 AM Will Deacon <will@kernel.org> wrote:
> >
> > On Mon, Dec 06, 2021 at 12:46:27PM +0800, Huacai Chen wrote:
> > > On Thu, Dec 2, 2021 at 6:08 PM Will Deacon <will@kernel.org> wrote:
> > > > On Fri, Oct 22, 2021 at 03:06:46PM +0800, Huacai Chen wrote:
> > > > > Nomap regions are treated as "reserved". When region boundaries are not
> > > > > page aligned, we usually increase the "reserved" regions rather than
> > > > > decrease them. So, we should use memblock_region_reserved_base_pfn()/
> > > > > memblock_region_reserved_end_pfn() instead of memblock_region_memory_
> > > > > base_pfn()/memblock_region_memory_base_pfn() to calculate boundaries.
> > > > >
> > > > > Signed-off-by: Huacai Chen <chenhuacai@loongson.cn>
> > > > > ---
> > > > >  arch/arm64/kernel/setup.c | 6 ++++--
> > > > >  1 file changed, 4 insertions(+), 2 deletions(-)
> > > > >
> > > > > diff --git a/arch/arm64/kernel/setup.c b/arch/arm64/kernel/setup.c
> > > > > index be5f85b0a24d..1e86d4c5ef8c 100644
> > > > > --- a/arch/arm64/kernel/setup.c
> > > > > +++ b/arch/arm64/kernel/setup.c
> > > > > @@ -232,12 +232,14 @@ static void __init request_standard_resources(void)
> > > > >               if (memblock_is_nomap(region)) {
> > > > >                       res->name  = "reserved";
> > > > >                       res->flags = IORESOURCE_MEM;
> > > > > +                     res->start = __pfn_to_phys(memblock_region_reserved_base_pfn(region));
> > > > > +                     res->end = __pfn_to_phys(memblock_region_reserved_end_pfn(region)) - 1;
> > > > >               } else {
> > > > >                       res->name  = "System RAM";
> > > > >                       res->flags = IORESOURCE_SYSTEM_RAM | IORESOURCE_BUSY;
> > > > > +                     res->start = __pfn_to_phys(memblock_region_memory_base_pfn(region));
> > > > > +                     res->end = __pfn_to_phys(memblock_region_memory_end_pfn(region)) - 1;
> > > > >               }
> > > > > -             res->start = __pfn_to_phys(memblock_region_memory_base_pfn(region));
> > > > > -             res->end = __pfn_to_phys(memblock_region_memory_end_pfn(region)) - 1;
> > > >
> > > > Under which circumstances would the nomap regions not be page-aligned? That
> > > > sounds like something we should prevent, rather than work around here.
> > >
> > > In this call path:
> > > acpi_table_upgrade --> arch_reserve_mem_area --> memblock_mark_nomap
> > > The nomap region is not page-aligned.
> >
> > Fair enough, then I think this patch is probably doing the right thing.
> > However, Ard and Mark had some concerns about the new behaviour wrt
> > adjacent nomap regions where the page containing the overlap would be
> > reported twice. Is this a problem?
> Seems no problem,  in most cases, memblock_mark_nomap() -->
> memblock_merge_regions() --> memblock_merge_regions(), adjacent
> intesected regions will be merged. Then the only problem is two or
> more small regions not intersected but in a single page, I think this
> is hardly happen..

What happens _today_ if we run into that case? Does end get rounded down
below start?

Will
Huacai Chen Dec. 15, 2021, 12:31 a.m. UTC | #9
Hi, Will,

On Tue, Dec 14, 2021 at 10:11 PM Will Deacon <will@kernel.org> wrote:
>
> On Tue, Dec 14, 2021 at 08:50:14AM +0800, Huacai Chen wrote:
> > Hi, Will,
> >
> > On Tue, Dec 14, 2021 at 3:07 AM Will Deacon <will@kernel.org> wrote:
> > >
> > > On Mon, Dec 06, 2021 at 12:46:27PM +0800, Huacai Chen wrote:
> > > > On Thu, Dec 2, 2021 at 6:08 PM Will Deacon <will@kernel.org> wrote:
> > > > > On Fri, Oct 22, 2021 at 03:06:46PM +0800, Huacai Chen wrote:
> > > > > > Nomap regions are treated as "reserved". When region boundaries are not
> > > > > > page aligned, we usually increase the "reserved" regions rather than
> > > > > > decrease them. So, we should use memblock_region_reserved_base_pfn()/
> > > > > > memblock_region_reserved_end_pfn() instead of memblock_region_memory_
> > > > > > base_pfn()/memblock_region_memory_base_pfn() to calculate boundaries.
> > > > > >
> > > > > > Signed-off-by: Huacai Chen <chenhuacai@loongson.cn>
> > > > > > ---
> > > > > >  arch/arm64/kernel/setup.c | 6 ++++--
> > > > > >  1 file changed, 4 insertions(+), 2 deletions(-)
> > > > > >
> > > > > > diff --git a/arch/arm64/kernel/setup.c b/arch/arm64/kernel/setup.c
> > > > > > index be5f85b0a24d..1e86d4c5ef8c 100644
> > > > > > --- a/arch/arm64/kernel/setup.c
> > > > > > +++ b/arch/arm64/kernel/setup.c
> > > > > > @@ -232,12 +232,14 @@ static void __init request_standard_resources(void)
> > > > > >               if (memblock_is_nomap(region)) {
> > > > > >                       res->name  = "reserved";
> > > > > >                       res->flags = IORESOURCE_MEM;
> > > > > > +                     res->start = __pfn_to_phys(memblock_region_reserved_base_pfn(region));
> > > > > > +                     res->end = __pfn_to_phys(memblock_region_reserved_end_pfn(region)) - 1;
> > > > > >               } else {
> > > > > >                       res->name  = "System RAM";
> > > > > >                       res->flags = IORESOURCE_SYSTEM_RAM | IORESOURCE_BUSY;
> > > > > > +                     res->start = __pfn_to_phys(memblock_region_memory_base_pfn(region));
> > > > > > +                     res->end = __pfn_to_phys(memblock_region_memory_end_pfn(region)) - 1;
> > > > > >               }
> > > > > > -             res->start = __pfn_to_phys(memblock_region_memory_base_pfn(region));
> > > > > > -             res->end = __pfn_to_phys(memblock_region_memory_end_pfn(region)) - 1;
> > > > >
> > > > > Under which circumstances would the nomap regions not be page-aligned? That
> > > > > sounds like something we should prevent, rather than work around here.
> > > >
> > > > In this call path:
> > > > acpi_table_upgrade --> arch_reserve_mem_area --> memblock_mark_nomap
> > > > The nomap region is not page-aligned.
> > >
> > > Fair enough, then I think this patch is probably doing the right thing.
> > > However, Ard and Mark had some concerns about the new behaviour wrt
> > > adjacent nomap regions where the page containing the overlap would be
> > > reported twice. Is this a problem?
> > Seems no problem,  in most cases, memblock_mark_nomap() -->
> > memblock_merge_regions() --> memblock_merge_regions(), adjacent
> > intesected regions will be merged. Then the only problem is two or
> > more small regions not intersected but in a single page, I think this
> > is hardly happen..
>
> What happens _today_ if we run into that case? Does end get rounded down
> below start?
Yes, the "end" will be below "start", and the small regions disappear
in /proc/iomem.

Huacai
>
> Will
Catalin Marinas Jan. 5, 2022, 6:20 p.m. UTC | #10
On Fri, 22 Oct 2021 15:06:46 +0800, Huacai Chen wrote:
> Nomap regions are treated as "reserved". When region boundaries are not
> page aligned, we usually increase the "reserved" regions rather than
> decrease them. So, we should use memblock_region_reserved_base_pfn()/
> memblock_region_reserved_end_pfn() instead of memblock_region_memory_
> base_pfn()/memblock_region_memory_base_pfn() to calculate boundaries.
> 
> 
> [...]

Applied to arm64 (for-next/misc), thanks!

[1/1] arm64: Use correct method to calculate nomap region boundaries
      https://git.kernel.org/arm64/c/daa149dd8cd4
diff mbox series

Patch

diff --git a/arch/arm64/kernel/setup.c b/arch/arm64/kernel/setup.c
index be5f85b0a24d..1e86d4c5ef8c 100644
--- a/arch/arm64/kernel/setup.c
+++ b/arch/arm64/kernel/setup.c
@@ -232,12 +232,14 @@  static void __init request_standard_resources(void)
 		if (memblock_is_nomap(region)) {
 			res->name  = "reserved";
 			res->flags = IORESOURCE_MEM;
+			res->start = __pfn_to_phys(memblock_region_reserved_base_pfn(region));
+			res->end = __pfn_to_phys(memblock_region_reserved_end_pfn(region)) - 1;
 		} else {
 			res->name  = "System RAM";
 			res->flags = IORESOURCE_SYSTEM_RAM | IORESOURCE_BUSY;
+			res->start = __pfn_to_phys(memblock_region_memory_base_pfn(region));
+			res->end = __pfn_to_phys(memblock_region_memory_end_pfn(region)) - 1;
 		}
-		res->start = __pfn_to_phys(memblock_region_memory_base_pfn(region));
-		res->end = __pfn_to_phys(memblock_region_memory_end_pfn(region)) - 1;
 
 		request_resource(&iomem_resource, res);