From patchwork Wed Apr 6 15:18:53 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Zi Yan X-Patchwork-Id: 12803611 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id DC1D4C433EF for ; Wed, 6 Apr 2022 15:20:00 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 003076B0071; Wed, 6 Apr 2022 11:19:50 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id EF50B6B0073; Wed, 6 Apr 2022 11:19:49 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id D6E566B0074; Wed, 6 Apr 2022 11:19:49 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (relay.hostedemail.com [64.99.140.28]) by kanga.kvack.org (Postfix) with ESMTP id C58746B0071 for ; Wed, 6 Apr 2022 11:19:49 -0400 (EDT) Received: from smtpin14.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay11.hostedemail.com (Postfix) with ESMTP id A5C2B821DE for ; Wed, 6 Apr 2022 15:19:39 +0000 (UTC) X-FDA: 79326813678.14.FA2D928 Received: from wout1-smtp.messagingengine.com (wout1-smtp.messagingengine.com [64.147.123.24]) by imf12.hostedemail.com (Postfix) with ESMTP id E1BFF40043 for ; Wed, 6 Apr 2022 15:19:38 +0000 (UTC) Received: from compute5.internal (compute5.nyi.internal [10.202.2.45]) by mailout.west.internal (Postfix) with ESMTP id 1C80E32020CE; Wed, 6 Apr 2022 11:19:37 -0400 (EDT) Received: from mailfrontend1 ([10.202.2.162]) by compute5.internal (MEProxy); Wed, 06 Apr 2022 11:19:37 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sent.com; h=cc :cc:content-transfer-encoding:content-type:date:date:from:from :in-reply-to:message-id:mime-version:reply-to:reply-to:sender :subject:subject:to:to; s=fm3; bh=1YF7m4613MXNe8p8MqrCssfe9obIC+ Hv5MZ4GZZfmqM=; b=YKUzVxNYG2cvhjeiXBzWzrVkxVOWKhCC/CqHsO4rL3YX8l XlGY6qKkq8UFG8XwzsV6zfHooSS58WEaEttKo7JjFLcZN/ZTG3dz2H30Xp9EBIZY xg4E5sJJB/9n8Squ8e6ofAP/Py0uROYA8i1g5LYodfr2QysMFu06mJF8thiS2GAR 5Yr64p02izwtFzGv/NijRWSZBrTK04tcpVoCybjHvtqrNHsJsKhiEqi+M3ETmohr MmQhMs1YAgaZGuFkGypXkZRtsmB93sqJMBnOmqjkr0BQPkiivN4i3PrxjHdfyPGg PGPlB9iFLek36vqLMYv1DKJV4T+8P9hbY+vgYrKg== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-transfer-encoding :content-type:date:date:from:from:in-reply-to:message-id :mime-version: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=1YF7m4613MXNe8p8MqrCssfe9obIC+Hv5MZ4GZZfmqM=; b=O4ZZ3LQC 7itLMYN3x/E6kFNYn1i13LgQ/gLxOLgn1Gg18HR3x3c67LxhTzhyG5SGQ7lmqlPX p+7ol/z976hvfhsMPlOkXTqUHk2UdY7EQUcDI5NCDvueXw1Xc4OdWcR0Zlq2awdz DKbuvEvFsRG83q99oOxzMavu28bZePxrO6DUv45A5IXBwyWyW/wNuRRn3UrBfcmn KyB6Dc+XEKS+yOcsQDbmX1DBcAXuygKd+BSDVze0cLy2p6Oz5EDuCDyo2XcuxpjE y6qyu8h5bSL9V1c0p21XZf7xM39BE5EOogRYwz3NFj//1lfbzWnUy/FAKalwmU23 Mn01rk9hxNcxpA== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgedvvddrudejiedgkeejucetufdoteggodetrfdotf fvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfqfgfvpdfurfetoffkrfgpnffqhgen uceurghilhhouhhtmecufedttdenucesvcftvggtihhpihgvnhhtshculddquddttddmne cujfgurhephffvufffkfforhggtgfgsehtqhertdertdejnecuhfhrohhmpegkihcujggr nhcuoeiiihdrhigrnhesshgvnhhtrdgtohhmqeenucggtffrrghtthgvrhhnpeetteejtd eigeejuefgleduhefgueffjeevhfelvedvtddugfeiueejveduleeuvdenucffohhmrghi nhepkhgvrhhnvghlrdhorhhgnecuvehluhhsthgvrhfuihiivgeptdenucfrrghrrghmpe hmrghilhhfrhhomhepiihirdihrghnsehsvghnthdrtghomh X-ME-Proxy: Received: by mail.messagingengine.com (Postfix) with ESMTPA; Wed, 6 Apr 2022 11:19:36 -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 v10 0/5] Use pageblock_order for cma and alloc_contig_range alignment. Date: Wed, 6 Apr 2022 11:18:53 -0400 Message-Id: <20220406151858.3149821-1-zi.yan@sent.com> X-Mailer: git-send-email 2.35.1 Reply-To: Zi Yan MIME-Version: 1.0 X-Rspam-User: X-Stat-Signature: e5eqqyack9c6wmde59segjy47xdnh1rm Authentication-Results: imf12.hostedemail.com; dkim=pass header.d=sent.com header.s=fm3 header.b=YKUzVxNY; dkim=pass header.d=messagingengine.com header.s=fm3 header.b=O4ZZ3LQC; spf=pass (imf12.hostedemail.com: domain of zi.yan@sent.com designates 64.147.123.24 as permitted sender) smtp.mailfrom=zi.yan@sent.com; dmarc=pass (policy=none) header.from=sent.com X-Rspamd-Server: rspam01 X-Rspamd-Queue-Id: E1BFF40043 X-HE-Tag: 1649258378-960886 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: From: Zi Yan Hi David, This patchset tries to remove the MAX_ORDER-1 alignment requirement for CMA and alloc_contig_range(). It prepares for my upcoming changes to make MAX_ORDER adjustable at boot time[1]. It is on top of mmotm-2022-04-05-15-54. I also added "Content-Type: text/plain; charset=UTF-8" to all email bodies explicitly, please let me know if you still cannot see the emails in a proper format. Changelog === V10 --- 1. Reverted back to the original outer_start, outer_end range for test_pages_isolated() and isolate_freepages_range() in Patch 3, otherwise isolation will fail if start in alloc_contig_range() is in the middle of a free page. V9 --- 1. Limited has_unmovable_pages() check within a pageblock. 2. Added a check to ensure page isolation is done within a single zone in isolate_single_pageblock(). 3. Fixed an off-by-one bug in isolate_single_pageblock(). 4. Fixed a NULL-deferencing bug when the pages before to-be-isolated pageblock is not online in isolate_single_pageblock(). V8 --- 1. Cleaned up has_unmovable_pages() to remove page argument. V7 --- 1. Added page validity check in isolate_single_pageblock() to avoid out of zone pages. 2. Fixed a bug in split_free_page() to split and free pages in correct page order. V6 --- 1. Resolved compilation error/warning reported by kernel test robot. 2. Tried to solve the coding concerns from Christophe Leroy. 3. Shortened lengthy lines (pointed out by Christoph Hellwig). V5 --- 1. Moved isolation address alignment handling in start_isolate_page_range(). 2. Rewrote and simplified how alloc_contig_range() works at pageblock granularity (Patch 3). Only two pageblock migratetypes need to be saved and restored. start_isolate_page_range() might need to migrate pages in this version, but it prevents the caller from worrying about max(MAX_ORDER_NR_PAEGS, pageblock_nr_pages) alignment after the page range is isolated. V4 --- 1. Dropped two irrelevant patches on non-lru compound page handling, as it is not supported upstream. 2. Renamed migratetype_has_fallback() to migratetype_is_mergeable(). 3. Always check whether two pageblocks can be merged in __free_one_page() when order is >= pageblock_order, as the case (not mergeable pageblocks are isolated, CMA, and HIGHATOMIC) becomes more common. 3. Moving has_unmovable_pages() is now a separate patch. 4. Removed MAX_ORDER-1 alignment requirement in the comment in virtio_mem code. Description === The MAX_ORDER - 1 alignment requirement comes from that alloc_contig_range() isolates pageblocks to remove free memory from buddy allocator but isolating only a subset of pageblocks within a page spanning across multiple pageblocks causes free page accounting issues. Isolated page might not be put into the right free list, since the code assumes the migratetype of the first pageblock as the whole free page migratetype. This is based on the discussion at [2]. To remove the requirement, this patchset: 1. isolates pages at pageblock granularity instead of max(MAX_ORDER_NR_PAEGS, pageblock_nr_pages); 2. splits free pages across the specified range or migrates in-use pages across the specified range then splits the freed page to avoid free page accounting issues (it happens when multiple pageblocks within a single page have different migratetypes); 3. only checks unmovable pages within the range instead of MAX_ORDER - 1 aligned range during isolation to avoid alloc_contig_range() failure when pageblocks within a MAX_ORDER - 1 aligned range are allocated separately. 4. returns pages not in the range as it did before. One optimization might come later: 1. make MIGRATE_ISOLATE a separate bit to be able to restore the original migratetypes when isolation fails in the middle of the range. Feel free to give comments and suggestions. Thanks. [1] https://lore.kernel.org/linux-mm/20210805190253.2795604-1-zi.yan@sent.com/ [2] https://lore.kernel.org/linux-mm/d19fb078-cb9b-f60f-e310-fdeea1b947d2@redhat.com/ Zi Yan (5): mm: page_isolation: move has_unmovable_pages() to mm/page_isolation.c mm: page_isolation: check specified range for unmovable pages mm: make alloc_contig_range work at pageblock granularity mm: cma: use pageblock_order as the single alignment drivers: virtio_mem: use pageblock size as the minimum virtio_mem size. drivers/virtio/virtio_mem.c | 6 +- include/linux/cma.h | 4 +- include/linux/mmzone.h | 5 +- include/linux/page-isolation.h | 6 +- mm/internal.h | 6 + mm/memory_hotplug.c | 3 +- mm/page_alloc.c | 191 +++++------------- mm/page_isolation.c | 348 +++++++++++++++++++++++++++++++-- 8 files changed, 395 insertions(+), 174 deletions(-)