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=-9.8 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS, USER_AGENT_GIT 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 C4E36C432C0 for ; Wed, 27 Nov 2019 11:21:41 +0000 (UTC) Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.kernel.org (Postfix) with ESMTP id 8C2912068E for ; Wed, 27 Nov 2019 11:21:41 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 8C2912068E Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=huawei.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=owner-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix) id 242E66B0385; Wed, 27 Nov 2019 06:21:41 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 1F5096B0386; Wed, 27 Nov 2019 06:21:41 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 10ACC6B0387; Wed, 27 Nov 2019 06:21:41 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0112.hostedemail.com [216.40.44.112]) by kanga.kvack.org (Postfix) with ESMTP id F132C6B0385 for ; Wed, 27 Nov 2019 06:21:40 -0500 (EST) Received: from smtpin30.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay04.hostedemail.com (Postfix) with SMTP id A2C943A92 for ; Wed, 27 Nov 2019 11:21:40 +0000 (UTC) X-FDA: 76201817160.30.fish05_659a072c0ba2a X-HE-Tag: fish05_659a072c0ba2a X-Filterd-Recvd-Size: 4314 Received: from huawei.com (szxga07-in.huawei.com [45.249.212.35]) by imf41.hostedemail.com (Postfix) with ESMTP for ; Wed, 27 Nov 2019 11:21:37 +0000 (UTC) Received: from DGGEMS406-HUB.china.huawei.com (unknown [172.30.72.59]) by Forcepoint Email with ESMTP id AB80BF20BE516ED26D71; Wed, 27 Nov 2019 19:21:33 +0800 (CST) Received: from localhost.localdomain.localdomain (10.175.113.25) by DGGEMS406-HUB.china.huawei.com (10.3.19.206) with Microsoft SMTP Server id 14.3.439.0; Wed, 27 Nov 2019 19:21:23 +0800 From: Kefeng Wang To: CC: Kefeng Wang , Andrew Morton , David Hildenbrand , "Michal Hocko" , Vlastimil Babka Subject: [PATCH] mm, page_alloc: avoid page_to_pfn() in move_freepages() Date: Wed, 27 Nov 2019 19:18:30 +0800 Message-ID: <20191127111830.87068-1-wangkefeng.wang@huawei.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <0042aeb9-8886-904b-295f-aec4f1d5bb8e@redhat.com> References: <0042aeb9-8886-904b-295f-aec4f1d5bb8e@redhat.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [10.175.113.25] X-CFilter-Loop: Reflected Content-Transfer-Encoding: quoted-printable 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: The start_pfn and end_pfn are already available in move_freepages_block()= , pfn_valid_within() should validate pfn first before touching the page, or we might access an unitialized page with CONFIG_HOLES_IN_ZONE configs. Cc: Andrew Morton Cc: David Hildenbrand Cc: Michal Hocko Cc: Vlastimil Babka Signed-off-by: Kefeng Wang --- -Drop RFC and address David's comments. mm/page_alloc.c | 28 +++++++++++++--------------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/mm/page_alloc.c b/mm/page_alloc.c index f391c0c4ed1d..fcefe2adb37d 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -2246,19 +2246,21 @@ static inline struct page *__rmqueue_cma_fallback= (struct zone *zone, * boundary. If alignment is required, use move_freepages_block() */ static int move_freepages(struct zone *zone, - struct page *start_page, struct page *end_page, + unsigned long start_pfn, unsigned long end_pfn, int migratetype, int *num_movable) { struct page *page; + unsigned long pfn; unsigned int order; int pages_moved =3D 0; =20 - for (page =3D start_page; page <=3D end_page;) { - if (!pfn_valid_within(page_to_pfn(page))) { - page++; + for (pfn =3D start_pfn; pfn <=3D end_pfn;) { + if (!pfn_valid_within(pfn)) { + pfn++; continue; } =20 + page =3D pfn_to_page(pfn); if (!PageBuddy(page)) { /* * We assume that pages that could be isolated for @@ -2268,8 +2270,7 @@ static int move_freepages(struct zone *zone, if (num_movable && (PageLRU(page) || __PageMovable(page))) (*num_movable)++; - - page++; + pfn++; continue; } =20 @@ -2279,7 +2280,7 @@ static int move_freepages(struct zone *zone, =20 order =3D page_order(page); move_to_free_area(page, &zone->free_area[order], migratetype); - page +=3D 1 << order; + pfn +=3D 1 << order; pages_moved +=3D 1 << order; } =20 @@ -2289,25 +2290,22 @@ static int move_freepages(struct zone *zone, int move_freepages_block(struct zone *zone, struct page *page, int migratetype, int *num_movable) { - unsigned long start_pfn, end_pfn; - struct page *start_page, *end_page; + unsigned long start_pfn, end_pfn, pfn; =20 if (num_movable) *num_movable =3D 0; =20 - start_pfn =3D page_to_pfn(page); - start_pfn =3D start_pfn & ~(pageblock_nr_pages-1); - start_page =3D pfn_to_page(start_pfn); - end_page =3D start_page + pageblock_nr_pages - 1; + pfn =3D page_to_pfn(page); + start_pfn =3D pfn & ~(pageblock_nr_pages-1); end_pfn =3D start_pfn + pageblock_nr_pages - 1; =20 /* Do not cross zone boundaries */ if (!zone_spans_pfn(zone, start_pfn)) - start_page =3D page; + start_pfn =3D pfn; if (!zone_spans_pfn(zone, end_pfn)) return 0; =20 - return move_freepages(zone, start_page, end_page, migratetype, + return move_freepages(zone, start_pfn, end_pfn, migratetype, num_movable); } =20 --=20 2.20.1