From: Mike Rapoport <rppt@kernel•org>
To: linux-kernel@vger•kernel.org
Cc: Rich Felker <dalias@libc•org>,
linux-ia64@vger•kernel.org, linux-doc@vger•kernel.org,
Catalin Marinas <catalin.marinas@arm•com>,
Heiko Carstens <heiko.carstens@de•ibm.com>,
Michal Hocko <mhocko@kernel•org>,
"James E.J. Bottomley" <James.Bottomley@HansenPartnership•com>,
Max Filippov <jcmvbkbc@gmail•com>, Guo Ren <guoren@kernel•org>,
linux-csky@vger•kernel.org, linux-parisc@vger•kernel.org,
sparclinux@vger•kernel.org, linux-hexagon@vger•kernel.org,
linux-riscv@lists•infradead.org,
Mike Rapoport <rppt@linux•ibm.com>,
Greg Ungerer <gerg@linux-m68k•org>,
linux-arch@vger•kernel.org, linux-s390@vger•kernel.org,
linux-c6x-dev@linux-c6x•org, Baoquan He <bhe@redhat•com>,
Jonathan Corbet <corbet@lwn•net>,
linux-sh@vger•kernel.org, Helge Deller <deller@gmx•de>,
x86@kernel•org, Russell King <linux@armlinux•org.uk>,
Ley Foon Tan <ley.foon.tan@intel•com>,
Yoshinori Sato <ysato@users•sourceforge.jp>,
Geert Uytterhoeven <geert@linux-m68k•org>,
linux-arm-kernel@lists•infradead.org,
Mark Salter <msalter@redhat•com>,
Matt Turner <mattst88@gmail•com>,
linux-snps-arc@lists•infradead.org,
uclinux-h8-devel@lists•sourceforge.jp,
linux-xtensa@linux-xtensa•org, linux-alpha@vger•kernel.org,
linux-um@lists•infradead.org, linux-m68k@lists•linux-m68k.org,
Tony Luck <tony.luck@intel•com>,
Greentime Hu <green.hu@gmail•com>,
Paul Walmsley <paul.walmsley@sifive•com>,
Stafford Horne <shorne@gmail•com>, Guan Xuetao <gxt@pku•edu.cn>,
Hoan Tran <Hoan@os•amperecomputing.com>,
Michal Simek <monstr@monstr•eu>,
Thomas Bogendoerfer <tsbogend@alpha•franken.de>,
Brian Cain <bcain@codeaurora•org>, Nick Hu <nickhu@andestech•com>,
linux-mm@kvack•org, Vineet Gupta <vgupta@synopsys•com>,
linux-mips@vger•kernel.org, openrisc@lists•librecores.org,
Richard Weinberger <richard@nod•at>,
Andrew Morton <akpm@linux-foundation•org>,
linuxppc-dev@lists•ozlabs.org,
"David S. Miller" <davem@davemloft•net>,
Mike Rapoport <rppt@kernel•org>
Subject: [PATCH 15/21] mm: memmap_init: iterate over memblock regions rather that check each PFN
Date: Sun, 12 Apr 2020 22:48:53 +0300 [thread overview]
Message-ID: <20200412194859.12663-16-rppt@kernel.org> (raw)
In-Reply-To: <20200412194859.12663-1-rppt@kernel.org>
From: Baoquan He <bhe@redhat•com>
When called during boot the memmap_init_zone() function checks if each PFN
is valid and actually belongs to the node being initialized using
early_pfn_valid() and early_pfn_in_nid().
Each such check may cost up to O(log(n)) where n is the number of memory
banks, so for large amount of memory overall time spent in early_pfn*()
becomes substantial.
Since the information is anyway present in memblock, we can iterate over
memblock memory regions in memmap_init() and only call memmap_init_zone()
for PFN ranges that are know to be valid and in the appropriate node.
Signed-off-by: Baoquan He <bhe@redhat•com>
Signed-off-by: Mike Rapoport <rppt@linux•ibm.com>
---
mm/page_alloc.c | 26 ++++++++++++++++----------
1 file changed, 16 insertions(+), 10 deletions(-)
diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index 7f6a3081edb8..c43ce8709457 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -5995,14 +5995,6 @@ void __meminit memmap_init_zone(unsigned long size, int nid, unsigned long zone,
* function. They do not exist on hotplugged memory.
*/
if (context == MEMMAP_EARLY) {
- if (!early_pfn_valid(pfn)) {
- pfn = next_pfn(pfn);
- continue;
- }
- if (!early_pfn_in_nid(pfn, nid)) {
- pfn++;
- continue;
- }
if (overlap_memmap_init(zone, &pfn))
continue;
if (defer_init(nid, pfn, end_pfn))
@@ -6118,9 +6110,23 @@ static void __meminit zone_init_free_lists(struct zone *zone)
}
void __meminit __weak memmap_init(unsigned long size, int nid,
- unsigned long zone, unsigned long start_pfn)
+ unsigned long zone,
+ unsigned long range_start_pfn)
{
- memmap_init_zone(size, nid, zone, start_pfn, MEMMAP_EARLY, NULL);
+ unsigned long start_pfn, end_pfn;
+ unsigned long range_end_pfn = range_start_pfn + size;
+ int i;
+
+ for_each_mem_pfn_range(i, nid, &start_pfn, &end_pfn, NULL) {
+ start_pfn = clamp(start_pfn, range_start_pfn, range_end_pfn);
+ end_pfn = clamp(end_pfn, range_start_pfn, range_end_pfn);
+
+ if (end_pfn > start_pfn) {
+ size = end_pfn - start_pfn;
+ memmap_init_zone(size, nid, zone, start_pfn,
+ MEMMAP_EARLY, NULL);
+ }
+ }
}
static int zone_batchsize(struct zone *zone)
--
2.25.1
next prev parent reply other threads:[~2020-04-12 20:20 UTC|newest]
Thread overview: 48+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-04-12 19:48 [PATCH 00/21] mm: rework free_area_init*() funcitons Mike Rapoport
2020-04-12 19:48 ` [PATCH 01/21] mm: memblock: replace dereferences of memblock_region.nid with API calls Mike Rapoport
2020-04-21 2:06 ` Baoquan He
2020-04-12 19:48 ` [PATCH 02/21] mm: make early_pfn_to_nid() and related defintions close to each other Mike Rapoport
2020-04-21 2:24 ` Baoquan He
2020-04-21 8:49 ` Mike Rapoport
2020-04-21 9:33 ` Baoquan He
2020-04-21 3:31 ` Baoquan He
2020-04-21 8:39 ` Mike Rapoport
2020-04-12 19:48 ` [PATCH 03/21] mm: remove CONFIG_HAVE_MEMBLOCK_NODE_MAP option Mike Rapoport
2020-04-21 4:23 ` Baoquan He
2020-04-21 9:09 ` Mike Rapoport
2020-04-21 9:45 ` Baoquan He
2020-04-12 19:48 ` [PATCH 04/21] mm: free_area_init: use maximal zone PFNs rather than zone sizes Mike Rapoport
2020-04-22 23:41 ` Baoquan He
2020-06-15 3:53 ` Greg Ungerer
2020-06-15 6:22 ` Mike Rapoport
2020-06-15 7:17 ` Greg Ungerer
2020-04-12 19:48 ` [PATCH 05/21] mm: use free_area_init() instead of free_area_init_nodes() Mike Rapoport
2020-04-23 0:02 ` Baoquan He
2020-04-12 19:48 ` [PATCH 06/21] alpha: simplify detection of memory zone boundaries Mike Rapoport
2020-04-12 19:48 ` [PATCH 07/21] arm: " Mike Rapoport
2020-04-12 19:48 ` [PATCH 08/21] arm64: simplify detection of memory zone boundaries for UMA configs Mike Rapoport
2020-04-12 19:48 ` [PATCH 09/21] csky: simplify detection of memory zone boundaries Mike Rapoport
2020-04-12 19:48 ` [PATCH 10/21] m68k: mm: " Mike Rapoport
2020-04-12 19:48 ` [PATCH 11/21] parisc: " Mike Rapoport
2020-04-12 19:48 ` [PATCH 12/21] sparc32: " Mike Rapoport
2020-04-12 19:48 ` [PATCH 13/21] unicore32: " Mike Rapoport
2020-04-12 19:48 ` [PATCH 14/21] xtensa: " Mike Rapoport
2020-04-12 19:48 ` Mike Rapoport [this message]
2020-04-20 14:26 ` [PATCH 15/21] mm: memmap_init: iterate over memblock regions rather that check each PFN Qian Cai
2020-04-24 7:22 ` David Hildenbrand
2020-04-25 16:49 ` Mike Rapoport
2020-04-12 19:48 ` [PATCH 16/21] mm: remove early_pfn_in_nid() and CONFIG_NODES_SPAN_OTHER_NODES Mike Rapoport
2020-04-23 1:13 ` Baoquan He
2020-04-23 5:50 ` Mike Rapoport
2020-05-18 21:38 ` Hoan Tran
2020-04-12 19:48 ` [PATCH 17/21] mm: free_area_init: allow defining max_zone_pfn in descending order Mike Rapoport
2020-04-23 2:53 ` Baoquan He
2020-04-23 2:57 ` Baoquan He
2020-04-23 5:55 ` Mike Rapoport
2020-04-24 0:33 ` Baoquan He
2020-04-12 19:48 ` [PATCH 18/21] mm: rename free_area_init_node() to free_area_init_memoryless_node() Mike Rapoport
2020-04-23 3:14 ` Baoquan He
2020-04-23 6:18 ` Mike Rapoport
2020-04-12 19:48 ` [PATCH 19/21] mm: clean up free_area_init_node() and its helpers Mike Rapoport
2020-04-12 19:48 ` [PATCH 20/21] mm: simplify find_min_pfn_with_active_regions() Mike Rapoport
2020-04-12 19:48 ` [PATCH 21/21] docs/vm: update memory-models documentation Mike Rapoport
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20200412194859.12663-16-rppt@kernel.org \
--to=rppt@kernel$(echo .)org \
--cc=Hoan@os$(echo .)amperecomputing.com \
--cc=James.Bottomley@HansenPartnership$(echo .)com \
--cc=akpm@linux-foundation$(echo .)org \
--cc=bcain@codeaurora$(echo .)org \
--cc=bhe@redhat$(echo .)com \
--cc=catalin.marinas@arm$(echo .)com \
--cc=corbet@lwn$(echo .)net \
--cc=dalias@libc$(echo .)org \
--cc=davem@davemloft$(echo .)net \
--cc=deller@gmx$(echo .)de \
--cc=geert@linux-m68k$(echo .)org \
--cc=gerg@linux-m68k$(echo .)org \
--cc=green.hu@gmail$(echo .)com \
--cc=guoren@kernel$(echo .)org \
--cc=gxt@pku$(echo .)edu.cn \
--cc=heiko.carstens@de$(echo .)ibm.com \
--cc=jcmvbkbc@gmail$(echo .)com \
--cc=ley.foon.tan@intel$(echo .)com \
--cc=linux-alpha@vger$(echo .)kernel.org \
--cc=linux-arch@vger$(echo .)kernel.org \
--cc=linux-arm-kernel@lists$(echo .)infradead.org \
--cc=linux-c6x-dev@linux-c6x$(echo .)org \
--cc=linux-csky@vger$(echo .)kernel.org \
--cc=linux-doc@vger$(echo .)kernel.org \
--cc=linux-hexagon@vger$(echo .)kernel.org \
--cc=linux-ia64@vger$(echo .)kernel.org \
--cc=linux-kernel@vger$(echo .)kernel.org \
--cc=linux-m68k@lists$(echo .)linux-m68k.org \
--cc=linux-mips@vger$(echo .)kernel.org \
--cc=linux-mm@kvack$(echo .)org \
--cc=linux-parisc@vger$(echo .)kernel.org \
--cc=linux-riscv@lists$(echo .)infradead.org \
--cc=linux-s390@vger$(echo .)kernel.org \
--cc=linux-sh@vger$(echo .)kernel.org \
--cc=linux-snps-arc@lists$(echo .)infradead.org \
--cc=linux-um@lists$(echo .)infradead.org \
--cc=linux-xtensa@linux-xtensa$(echo .)org \
--cc=linux@armlinux$(echo .)org.uk \
--cc=linuxppc-dev@lists$(echo .)ozlabs.org \
--cc=mattst88@gmail$(echo .)com \
--cc=mhocko@kernel$(echo .)org \
--cc=monstr@monstr$(echo .)eu \
--cc=msalter@redhat$(echo .)com \
--cc=nickhu@andestech$(echo .)com \
--cc=openrisc@lists$(echo .)librecores.org \
--cc=paul.walmsley@sifive$(echo .)com \
--cc=richard@nod$(echo .)at \
--cc=rppt@linux$(echo .)ibm.com \
--cc=shorne@gmail$(echo .)com \
--cc=sparclinux@vger$(echo .)kernel.org \
--cc=tony.luck@intel$(echo .)com \
--cc=tsbogend@alpha$(echo .)franken.de \
--cc=uclinux-h8-devel@lists$(echo .)sourceforge.jp \
--cc=vgupta@synopsys$(echo .)com \
--cc=x86@kernel$(echo .)org \
--cc=ysato@users$(echo .)sourceforge.jp \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox