From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.8 required=3.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 4002CC3815B for ; Mon, 20 Apr 2020 14:26:14 +0000 (UTC) Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.kernel.org (Postfix) with ESMTP id ECB0020857 for ; Mon, 20 Apr 2020 14:26:13 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lca.pw header.i=@lca.pw header.b="DnvEUFzS" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org ECB0020857 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=lca.pw Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=owner-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix) id 7FF438E0005; Mon, 20 Apr 2020 10:26:13 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 7887B8E0003; Mon, 20 Apr 2020 10:26:13 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 629BA8E0005; Mon, 20 Apr 2020 10:26:13 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0197.hostedemail.com [216.40.44.197]) by kanga.kvack.org (Postfix) with ESMTP id 480C58E0003 for ; Mon, 20 Apr 2020 10:26:13 -0400 (EDT) Received: from smtpin06.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay02.hostedemail.com (Postfix) with ESMTP id 0F6E1440B for ; Mon, 20 Apr 2020 14:26:13 +0000 (UTC) X-FDA: 76728458226.06.crib45_70668855ecd4d X-HE-Tag: crib45_70668855ecd4d X-Filterd-Recvd-Size: 8759 Received: from mail-qt1-f194.google.com (mail-qt1-f194.google.com [209.85.160.194]) by imf24.hostedemail.com (Postfix) with ESMTP for ; Mon, 20 Apr 2020 14:26:12 +0000 (UTC) Received: by mail-qt1-f194.google.com with SMTP id s30so8573121qth.2 for ; Mon, 20 Apr 2020 07:26:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=lca.pw; s=google; h=mime-version:subject:from:in-reply-to:date:cc :content-transfer-encoding:message-id:references:to; bh=x4haHkUujR1fKPz5RIOI82+KmuZk6e+W1yh47eNmIvQ=; b=DnvEUFzSch8BOWv/K7yUwrGGEukS5excCJecSvcapVOhdy/OFYe7Y9x1bGe8SeT916 l1+1chsImNg3ZkGKpfN6ahvWi6toqC2h9IrP5AAGTN0GSjdGn3qsRFRJ+RJKyRIC9tu1 Dj3ea0wViCiibWw2vLnH2xAQFEOjXLO8KUs1T46qoBzPcqk7/mrvO1+D2/LejHD1ICpo KoyvCsqeLxeoDgKdlRyHMBD+KBeYlPJHqA50tfN8jzW6UL/Xp60Ax2PqCOWTXHM9g3GG cbNMSaz+pl+PNBKPTXdiSGvlo1iEHh3BDrH71SvZZsVGfYckGoh6BGUSunvfhu/heiMK xWhA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:subject:from:in-reply-to:date:cc :content-transfer-encoding:message-id:references:to; bh=x4haHkUujR1fKPz5RIOI82+KmuZk6e+W1yh47eNmIvQ=; b=bw1LInfjPXsMdz2Xx7AkAUWtVnH1/4zfDQSyqJ7LfCDI0neVp0omwmjBw2LYSQV9Q8 tenvnYnikeAS9CDfdPFh5zCnd45mf8PRx/nvFsV8qFpNF+fk1tdQqxr7argg0r2lu+n4 XeqJUCkLa/u1blEF7VIZZD/6bwKToDe4E9O08wAarjJlQoJMfBb0u9CcSBERpLJq9uMQ 3GqNuiBJfDfjPQjEPl76s8T9aAM/GfhRyH2maArkAnvcjV16L3AQnVPUY8M/n0g0ktzt lfiR1rND/3FB28ULl9o8kJc7X63xHQe0MsRgZfyzvfNVHPLJ9yAmha30zZj4OStRrfOG n+IQ== X-Gm-Message-State: AGi0PubEudpXewfjGBY7/uH0uPPnrw55g0tVB9C0JPC0aaYwtODPqfO/ QdkoSVL3Z6pi7lgNm2I3ZGbocQ== X-Google-Smtp-Source: APiQypK9hXIJAT9p6UDuSW0Ke/HoSOO0StxcY8aUeQ8xLhHHYW6L8ucFNnBF0yisbryde+2cyEFxTQ== X-Received: by 2002:ac8:76da:: with SMTP id q26mr15821003qtr.168.1587392770907; Mon, 20 Apr 2020 07:26:10 -0700 (PDT) Received: from [192.168.1.153] (pool-71-184-117-43.bstnma.fios.verizon.net. [71.184.117.43]) by smtp.gmail.com with ESMTPSA id p1sm665290qkd.23.2020.04.20.07.26.07 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Mon, 20 Apr 2020 07:26:09 -0700 (PDT) Content-Type: text/plain; charset=us-ascii Mime-Version: 1.0 (Mac OS X Mail 13.4 \(3608.80.23.2.2\)) Subject: Re: [PATCH 15/21] mm: memmap_init: iterate over memblock regions rather that check each PFN From: Qian Cai In-Reply-To: <20200412194859.12663-16-rppt@kernel.org> Date: Mon, 20 Apr 2020 10:26:06 -0400 Cc: LKML , Andrew Morton , Brian Cain , Catalin Marinas , "David S. Miller" , Geert Uytterhoeven , Greentime Hu , Greg Ungerer , Guan Xuetao , Guo Ren , Heiko Carstens , Helge Deller , Hoan Tran , "James E.J. Bottomley" , Jonathan Corbet , Ley Foon Tan , Mark Salter , Matt Turner , Max Filippov , Michael Ellerman , Michal Hocko , Michal Simek , Nick Hu , Paul Walmsley , Richard Weinberger , Rich Felker , Russell King , Stafford Horne , Thomas Bogendoerfer , Tony Luck , Vineet Gupta , the arch/x86 maintainers , Yoshinori Sato , linux-alpha@vger.kernel.org, linux-arch@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-c6x-dev@linux-c6x.org, linux-csky@vger.kernel.org, linux-doc@vger.kernel.org, linux-hexagon@vger.kernel.org, linux-ia64@vger.kernel.org, linux-m68k@lists.linux-m68k.org, linux-mips@vger.kernel.org, Linux-MM , linux-parisc@vger.kernel.org, linuxppc-dev , linux-riscv@lists.infradead.org, linux-s390@vger.kernel.org, linux-sh@vger.kernel.org, linux-snps-arc@lists.infradead.org, linux-um@lists.infradead.org, linux-xtensa@linux-xtensa.org, openrisc@lists.librecores.org, sparclinux@vger.kernel.org, uclinux-h8-devel@lists.sourceforge.jp, Mike Rapoport Content-Transfer-Encoding: quoted-printable Message-Id: References: <20200412194859.12663-1-rppt@kernel.org> <20200412194859.12663-16-rppt@kernel.org> To: Mike Rapoport , Baoquan He X-Mailer: Apple Mail (2.3608.80.23.2.2) X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: > On Apr 12, 2020, at 3:48 PM, Mike Rapoport wrote: >=20 > From: Baoquan He >=20 > 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(). >=20 > 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. >=20 > 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. >=20 > Signed-off-by: Baoquan He > Signed-off-by: Mike Rapoport > --- > mm/page_alloc.c | 26 ++++++++++++++++---------- > 1 file changed, 16 insertions(+), 10 deletions(-) >=20 > 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 =3D=3D MEMMAP_EARLY) { > - if (!early_pfn_valid(pfn)) { > - pfn =3D next_pfn(pfn); > - continue; > - } > - if (!early_pfn_in_nid(pfn, nid)) { > - pfn++; > - continue; > - } This causes a compilation warning from Clang, mm/page_alloc.c:5917:39: warning: unused function 'next_pfn' = [-Wunused-function] static inline __meminit unsigned long next_pfn(unsigned long pfn) This should fix it, diff --git a/mm/page_alloc.c b/mm/page_alloc.c index d469384c9ca7..b48336e20bdc 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -5912,23 +5912,6 @@ overlap_memmap_init(unsigned long zone, unsigned = long *pfn) return false; } =20 -#ifdef CONFIG_SPARSEMEM -/* Skip PFNs that belong to non-present sections */ -static inline __meminit unsigned long next_pfn(unsigned long pfn) -{ - const unsigned long section_nr =3D pfn_to_section_nr(++pfn); - - if (present_section_nr(section_nr)) - return pfn; - return section_nr_to_pfn(next_present_section_nr(section_nr)); -} -#else -static inline __meminit unsigned long next_pfn(unsigned long pfn) -{ - return pfn++; -} -#endif - /* * Initially all pages are reserved - free ones are freed * up by memblock_free_all() once the early boot process is > 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) > } >=20 > 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 =3D range_start_pfn + size; > + int i; > + > + for_each_mem_pfn_range(i, nid, &start_pfn, &end_pfn, NULL) { > + start_pfn =3D clamp(start_pfn, range_start_pfn, = range_end_pfn); > + end_pfn =3D clamp(end_pfn, range_start_pfn, = range_end_pfn); > + > + if (end_pfn > start_pfn) { > + size =3D end_pfn - start_pfn; > + memmap_init_zone(size, nid, zone, start_pfn, > + MEMMAP_EARLY, NULL); > + } > + } > } >=20 > static int zone_batchsize(struct zone *zone) > --=20 > 2.25.1 >=20 >=20