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 |
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 >
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 > >
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/
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
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
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
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
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
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
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 --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);
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(-)