Received: by 2002:a05:6a10:413:0:0:0:0 with SMTP id 19csp1592096pxp; Thu, 17 Mar 2022 12:15:18 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwLpRfx3WrKi0YvBpepCypab75F7dxw4bxo0Cj0MP10zby51lN+5z+wDucBrbSbzy8sjJPi X-Received: by 2002:a63:224a:0:b0:368:e837:3262 with SMTP id t10-20020a63224a000000b00368e8373262mr4958425pgm.546.1647544518290; Thu, 17 Mar 2022 12:15:18 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1647544518; cv=none; d=google.com; s=arc-20160816; b=zubPy/IzTpkCN8LxmLaIbMR2HPA2EsHW+yWfY9sytTWJOiUX5dpg/cDGvxGUHayryA LhF0Tiqbx5rhd4zM6pGhSlMYhQtpvXOQ6Jj40/HeOLgEIsgOEsZRFxw7u4RtBXdwp4gV UBD4uN1hZovtXO9+4gWg1als7WBkHkAuo/IUnY6s8WiXlLHlTzI7FyuJzyIHA+BLDdVt tG02SV9MnCjWjT2gxTUzqVGnY9TwBmgQA/lT/B0BvWKZFdsx5DsPVXsdThI3JjYDJh0w RVNuFu9OyqicS6rLI67Nz6tNg1EPjSpOKF4f37GAwuTW4T7r9vzYDeLjt1LXUEUwAArr iIGQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version:reply-to :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature:dkim-signature; bh=IwpK4EjSDm5cyo9H1N99J/Cf3Rm01pT5/3W5ylhq6co=; b=awAzjHGNF/x7JDjjEWX3qX1Iz6oigzQiz+0nWTDLT+ifFJQ9SpeNf2lXo2KTXdnTUd u6wMjFh8O1LnvcVse3DaAvREr66eHuN/Af9GXlWlQzOlHwKOaA1H1bN/I3Cd5zMbodMf 0/KANLqb7/QUTZ1kCbkKlNbA9Qkxzagw4Zy/tqAA5SxBS9hkk4r3SIqT/CYHmOMZYcKJ RplM9isGMXtPrPY+iauYZVUhEPN8Lj3QIg0UfBITn7x0e9p06BDNxznaNrezFQkfeprQ IN6HUrrq5LDSQNfQa6G57foPAIJtpNtjwfKotoFwdtB/sXZJd+xjCI2wGu+Q5lohSB2U YZ+g== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@sent.com header.s=fm3 header.b=k0LgMa6N; dkim=pass header.i=@messagingengine.com header.s=fm3 header.b=hW5vjcZI; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=sent.com Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id d7-20020a056a0010c700b004f72f321f0asi6372449pfu.147.2022.03.17.12.15.02; Thu, 17 Mar 2022 12:15:18 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@sent.com header.s=fm3 header.b=k0LgMa6N; dkim=pass header.i=@messagingengine.com header.s=fm3 header.b=hW5vjcZI; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=sent.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235974AbiCQPjL (ORCPT + 99 others); Thu, 17 Mar 2022 11:39:11 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:34054 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235946AbiCQPjF (ORCPT ); Thu, 17 Mar 2022 11:39:05 -0400 Received: from out4-smtp.messagingengine.com (out4-smtp.messagingengine.com [66.111.4.28]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 8E67F20C19D for ; Thu, 17 Mar 2022 08:37:48 -0700 (PDT) Received: from compute5.internal (compute5.nyi.internal [10.202.2.45]) by mailout.nyi.internal (Postfix) with ESMTP id F2A105C080A; Thu, 17 Mar 2022 11:37:47 -0400 (EDT) Received: from mailfrontend1 ([10.202.2.162]) by compute5.internal (MEProxy); Thu, 17 Mar 2022 11:37:47 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sent.com; h=cc :cc:content-transfer-encoding:date:date:from:from:in-reply-to :in-reply-to:message-id:mime-version:references:reply-to :reply-to:sender:subject:subject:to:to; s=fm3; bh=IwpK4EjSDm5cyo 9H1N99J/Cf3Rm01pT5/3W5ylhq6co=; b=k0LgMa6N5Ps6AGLiW1XLeCiRs/ic0h hpfzCIlmN6GC98gjQj1w0ZUWcAtj4Bnh1PZx0x+b3RIm73VSW6bhnJpMdbsTMU6j rMmHbJtSebIfl+qPUVAXB3tIvtdrRzAngtE+hIZw3UeK4lRH72onqT72l8juLk+g a2tLz3Y6wS1uudGsSeDZqfhXR28J+Y+7hRps+HvXFhX/CPZ4ygJAmZqCl/c9Jm+N eibRyroteRE2ka+RDGMN2N//O+CF6wKjwPWI4uexPADbwNLKvKx7/YVjPQzyLurK Xb3q/ij7ELB09tUafMuhnMZ10MybMtxbDIgvFanEl/KN2h+s0dy5CpDQ== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-transfer-encoding:date:date :from:from:in-reply-to:in-reply-to:message-id:mime-version :references:reply-to:reply-to:sender:subject:subject:to:to :x-me-proxy:x-me-proxy:x-me-sender:x-me-sender:x-sasl-enc; s= fm3; bh=IwpK4EjSDm5cyo9H1N99J/Cf3Rm01pT5/3W5ylhq6co=; b=hW5vjcZI P2MDORtXn+WqKJR9NVrHgxleRDaTWtFwx12CP7+HUGjnb2YGsfsPfonmcMgVP9GB if1VcIxQnq8Awfvk4v606w8+p0e7t+UQA+EwPMUtlEpy3jSLVab/JOc2rPr74d+K g0ud7k6zhvTeJd4gsgAqt96hr/QK98mXi6dQi1gb4WRthQQkQ+BSUxjV2uW07/WS 6MS8VT++IgT/IfjrTuyfh7QHWn1NeVgC9TYjTjkV6VNuBnC0Ya7MRkpC2GaVO3IH ImWOyfIlLDSrB79k/MR3Ie/o2CWb3ePrd12oTxkZ/BQTcBJ8UpB2bN83YWBTNQp3 nk6eM+sfg2lZ2w== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgedvvddrudefgedgjeejucetufdoteggodetrfdotf fvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfqfgfvpdfurfetoffkrfgpnffqhgen uceurghilhhouhhtmecufedttdenucesvcftvggtihhpihgvnhhtshculddquddttddmne cujfgurhephffvufffkffojghfrhgggfestdhqredtredttdenucfhrhhomhepkghiucgj rghnuceoiihirdihrghnsehsvghnthdrtghomheqnecuggftrfgrthhtvghrnhepieejue dvueduuefhgefhheeiuedvtedvuefgieegveetueeiueehtdegudehfeelnecuvehluhhs thgvrhfuihiivgeptdenucfrrghrrghmpehmrghilhhfrhhomhepiihirdihrghnsehsvg hnthdrtghomh X-ME-Proxy: Received: by mail.messagingengine.com (Postfix) with ESMTPA; Thu, 17 Mar 2022 11:37:47 -0400 (EDT) From: Zi Yan To: David Hildenbrand , linux-mm@kvack.org Cc: linux-kernel@vger.kernel.org, virtualization@lists.linux-foundation.org, Vlastimil Babka , Mel Gorman , Eric Ren , Mike Rapoport , Oscar Salvador , Christophe Leroy , Zi Yan Subject: [PATCH v8 2/5] mm: page_isolation: check specified range for unmovable pages Date: Thu, 17 Mar 2022 11:37:30 -0400 Message-Id: <20220317153733.2171277-3-zi.yan@sent.com> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20220317153733.2171277-1-zi.yan@sent.com> References: <20220317153733.2171277-1-zi.yan@sent.com> Reply-To: Zi Yan MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Spam-Status: No, score=-2.8 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,FREEMAIL_FROM,RCVD_IN_DNSWL_LOW, RCVD_IN_MSPIKE_H3,RCVD_IN_MSPIKE_WL,SPF_HELO_PASS,SPF_PASS, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Zi Yan Enable set_migratetype_isolate() to check specified sub-range for unmovable pages during isolation. Page isolation is done at max(MAX_ORDER_NR_PAEGS, pageblock_nr_pages) granularity, but not all pages within that granularity are intended to be isolated. For example, alloc_contig_range(), which uses page isolation, allows ranges without alignment. This commit makes unmovable page check only look for interesting pages, so that page isolation can succeed for any non-overlapping ranges. Signed-off-by: Zi Yan --- include/linux/page-isolation.h | 10 +++++ mm/page_alloc.c | 13 +------ mm/page_isolation.c | 69 ++++++++++++++++++++-------------- 3 files changed, 51 insertions(+), 41 deletions(-) diff --git a/include/linux/page-isolation.h b/include/linux/page-isolation.h index e14eddf6741a..eb4a208fe907 100644 --- a/include/linux/page-isolation.h +++ b/include/linux/page-isolation.h @@ -15,6 +15,16 @@ static inline bool is_migrate_isolate(int migratetype) { return migratetype =3D=3D MIGRATE_ISOLATE; } +static inline unsigned long pfn_max_align_down(unsigned long pfn) +{ + return ALIGN_DOWN(pfn, MAX_ORDER_NR_PAGES); +} + +static inline unsigned long pfn_max_align_up(unsigned long pfn) +{ + return ALIGN(pfn, MAX_ORDER_NR_PAGES); +} + #else static inline bool has_isolate_pageblock(struct zone *zone) { diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 6de57d058d3d..680580a40a35 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -8937,16 +8937,6 @@ void *__init alloc_large_system_hash(const char *tab= lename, } =20 #ifdef CONFIG_CONTIG_ALLOC -static unsigned long pfn_max_align_down(unsigned long pfn) -{ - return ALIGN_DOWN(pfn, MAX_ORDER_NR_PAGES); -} - -static unsigned long pfn_max_align_up(unsigned long pfn) -{ - return ALIGN(pfn, MAX_ORDER_NR_PAGES); -} - #if defined(CONFIG_DYNAMIC_DEBUG) || \ (defined(CONFIG_DYNAMIC_DEBUG_CORE) && defined(DYNAMIC_DEBUG_MODULE)) /* Usage: See admin-guide/dynamic-debug-howto.rst */ @@ -9091,8 +9081,7 @@ int alloc_contig_range(unsigned long start, unsigned = long end, * put back to page allocator so that buddy can use them. */ =20 - ret =3D start_isolate_page_range(pfn_max_align_down(start), - pfn_max_align_up(end), migratetype, 0); + ret =3D start_isolate_page_range(start, end, migratetype, 0); if (ret) return ret; =20 diff --git a/mm/page_isolation.c b/mm/page_isolation.c index b34f1310aeaa..419c805dbdcd 100644 --- a/mm/page_isolation.c +++ b/mm/page_isolation.c @@ -16,7 +16,8 @@ #include =20 /* - * This function checks whether pageblock includes unmovable pages or not. + * This function checks whether pageblock within [start_pfn, end_pfn) incl= udes + * unmovable pages or not. * * PageLRU check without isolation or lru_lock could race so that * MIGRATE_MOVABLE block might include unmovable pages. And __PageMovable @@ -28,27 +29,26 @@ * cannot get removed (e.g., via memory unplug) concurrently. * */ -static struct page *has_unmovable_pages(struct zone *zone, struct page *pa= ge, - int migratetype, int flags) +static struct page *has_unmovable_pages(unsigned long start_pfn, unsigned = long end_pfn, + int migratetype, int flags) { - unsigned long iter =3D 0; - unsigned long pfn =3D page_to_pfn(page); - unsigned long offset =3D pfn % pageblock_nr_pages; + unsigned long pfn =3D start_pfn; =20 - if (is_migrate_cma_page(page)) { - /* - * CMA allocations (alloc_contig_range) really need to mark - * isolate CMA pageblocks even when they are not movable in fact - * so consider them movable here. - */ - if (is_migrate_cma(migratetype)) - return NULL; + for (pfn =3D start_pfn; pfn < end_pfn; pfn++) { + struct page *page =3D pfn_to_page(pfn); + struct zone *zone =3D page_zone(page); =20 - return page; - } + if (is_migrate_cma_page(page)) { + /* + * CMA allocations (alloc_contig_range) really need to mark + * isolate CMA pageblocks even when they are not movable in fact + * so consider them movable here. + */ + if (is_migrate_cma(migratetype)) + return NULL; =20 - for (; iter < pageblock_nr_pages - offset; iter++) { - page =3D pfn_to_page(pfn + iter); + return page; + } =20 /* * Both, bootmem allocations and memory holes are marked @@ -85,7 +85,7 @@ static struct page *has_unmovable_pages(struct zone *zone= , struct page *page, } =20 skip_pages =3D compound_nr(head) - (page - head); - iter +=3D skip_pages - 1; + pfn +=3D skip_pages - 1; continue; } =20 @@ -97,7 +97,7 @@ static struct page *has_unmovable_pages(struct zone *zone= , struct page *page, */ if (!page_ref_count(page)) { if (PageBuddy(page)) - iter +=3D (1 << buddy_order(page)) - 1; + pfn +=3D (1 << buddy_order(page)) - 1; continue; } =20 @@ -134,7 +134,13 @@ static struct page *has_unmovable_pages(struct zone *z= one, struct page *page, return NULL; } =20 -static int set_migratetype_isolate(struct page *page, int migratetype, int= isol_flags) +/* + * This function set pageblock migratetype to isolate if no unmovable page= is + * present in [start_pfn, end_pfn). The pageblock must intersect with + * [start_pfn, end_pfn). + */ +static int set_migratetype_isolate(struct page *page, int migratetype, int= isol_flags, + unsigned long start_pfn, unsigned long end_pfn) { struct zone *zone =3D page_zone(page); struct page *unmovable; @@ -155,8 +161,13 @@ static int set_migratetype_isolate(struct page *page, = int migratetype, int isol_ /* * FIXME: Now, memory hotplug doesn't call shrink_slab() by itself. * We just check MOVABLE pages. + * + * Pass the intersection of [start_pfn, end_pfn) and the page's pageblock + * to avoid redundant checks. */ - unmovable =3D has_unmovable_pages(zone, page, migratetype, isol_flags); + unmovable =3D has_unmovable_pages(max(page_to_pfn(page), start_pfn), + min(ALIGN(page_to_pfn(page) + 1, pageblock_nr_pages), end_pfn), + migratetype, isol_flags); if (!unmovable) { unsigned long nr_pages; int mt =3D get_pageblock_migratetype(page); @@ -267,7 +278,6 @@ __first_valid_page(unsigned long pfn, unsigned long nr_= pages) * be MIGRATE_ISOLATE. * @start_pfn: The lower PFN of the range to be isolated. * @end_pfn: The upper PFN of the range to be isolated. - * start_pfn/end_pfn must be aligned to pageblock_order. * @migratetype: Migrate type to set in error recovery. * @flags: The following flags are allowed (they can be combined in * a bit mask) @@ -309,15 +319,16 @@ int start_isolate_page_range(unsigned long start_pfn,= unsigned long end_pfn, unsigned long pfn; struct page *page; =20 - BUG_ON(!IS_ALIGNED(start_pfn, pageblock_nr_pages)); - BUG_ON(!IS_ALIGNED(end_pfn, pageblock_nr_pages)); + unsigned long isolate_start =3D pfn_max_align_down(start_pfn); + unsigned long isolate_end =3D pfn_max_align_up(end_pfn); =20 - for (pfn =3D start_pfn; - pfn < end_pfn; + for (pfn =3D isolate_start; + pfn < isolate_end; pfn +=3D pageblock_nr_pages) { page =3D __first_valid_page(pfn, pageblock_nr_pages); - if (page && set_migratetype_isolate(page, migratetype, flags)) { - undo_isolate_page_range(start_pfn, pfn, migratetype); + if (page && set_migratetype_isolate(page, migratetype, flags, + start_pfn, end_pfn)) { + undo_isolate_page_range(isolate_start, pfn, migratetype); return -EBUSY; } } --=20 2.35.1