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 Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 3C93DC369C2 for ; Mon, 21 Apr 2025 01:36:33 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id A812F6B0006; Sun, 20 Apr 2025 21:36:31 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id A2FAD6B0007; Sun, 20 Apr 2025 21:36:31 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 8F8376B0008; Sun, 20 Apr 2025 21:36:31 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0014.hostedemail.com [216.40.44.14]) by kanga.kvack.org (Postfix) with ESMTP id 718916B0006 for ; Sun, 20 Apr 2025 21:36:31 -0400 (EDT) Received: from smtpin27.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay07.hostedemail.com (Postfix) with ESMTP id 75555161029 for ; Mon, 21 Apr 2025 01:36:31 +0000 (UTC) X-FDA: 83356336182.27.09660B4 Received: from szxga06-in.huawei.com (szxga06-in.huawei.com [45.249.212.32]) by imf14.hostedemail.com (Postfix) with ESMTP id E625E100002 for ; Mon, 21 Apr 2025 01:36:28 +0000 (UTC) Authentication-Results: imf14.hostedemail.com; dkim=none; dmarc=pass (policy=quarantine) header.from=huawei.com; spf=pass (imf14.hostedemail.com: domain of tujinjiang@huawei.com designates 45.249.212.32 as permitted sender) smtp.mailfrom=tujinjiang@huawei.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1745199389; a=rsa-sha256; cv=none; b=MY2MMkc0X1mCXESl/Yi4MQbwU5T0dWlx201iegMzMW7eFcQulwi7/INPgwLQN6jSyQBgSD qDlXzGVO/1SO0pCUXAXQMvO8fwVWNuvcE/qrVonWDnLrCS5xGWZvA9V+Hu1cqVSLBxBiAf j7lbBcuW3fKiuLF4KB0MUbhvNMSx2CA= ARC-Authentication-Results: i=1; imf14.hostedemail.com; dkim=none; dmarc=pass (policy=quarantine) header.from=huawei.com; spf=pass (imf14.hostedemail.com: domain of tujinjiang@huawei.com designates 45.249.212.32 as permitted sender) smtp.mailfrom=tujinjiang@huawei.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1745199389; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding:in-reply-to: references; bh=AKnclE4Ok5aKfp3zWb26+6FEkHAYnZpB4Yr4m2C5mks=; b=mxCsDTHJHMsMdeqbGcamhrUKDgrI6RxVlNW6xPFzxysEvU/fNFSkKj2UhaAd8YaWEP7DHO kIh37aOCiCZhz4XvVGu+nfF+oMvuxdJVFIn2f70TPIjVcJB1dBH32EflZ/6AQU9saWMeT6 A41mbc6ZQe22jzhutkmQD0uv8HCujbg= Received: from mail.maildlp.com (unknown [172.19.88.163]) by szxga06-in.huawei.com (SkyGuard) with ESMTP id 4ZgnzS0gqvz27hGv; Mon, 21 Apr 2025 09:37:08 +0800 (CST) Received: from kwepemo200002.china.huawei.com (unknown [7.202.195.209]) by mail.maildlp.com (Postfix) with ESMTPS id 51A8818001B; Mon, 21 Apr 2025 09:36:25 +0800 (CST) Received: from huawei.com (10.175.124.71) by kwepemo200002.china.huawei.com (7.202.195.209) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1544.11; Mon, 21 Apr 2025 09:36:24 +0800 From: Jinjiang Tu To: , , , CC: , , Subject: [PATCH v2] mm/contig_alloc: fix alloc_contig_range when __GFP_COMP and order < MAX_ORDER Date: Mon, 21 Apr 2025 09:36:20 +0800 Message-ID: <20250421013620.459740-1-tujinjiang@huawei.com> X-Mailer: git-send-email 2.43.0 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain X-Originating-IP: [10.175.124.71] X-ClientProxiedBy: dggems704-chm.china.huawei.com (10.3.19.181) To kwepemo200002.china.huawei.com (7.202.195.209) X-Rspamd-Server: rspam03 X-Rspamd-Queue-Id: E625E100002 X-Stat-Signature: g4wgn4nzeoyfk53e4qkyeqcg4kn6f8we X-Rspam-User: X-HE-Tag: 1745199388-523917 X-HE-Meta: U2FsdGVkX185iYNkiyQu7bmp+q7GF9k0TxO8sH+WNWLNBSWXJ0D395gPnmd0lQY6XIk+eYx9sk/EqGu8a3ZGTwbJ40/BCn5cIV065pVEyyvp6f7GeD08TU+4xQqXZstA50rjN652gWYzx0+huceBlzBdgpi4gkgOl3Of90r3zG+dL8Sc/Js/07bckydC9pDWmo7DqESXIoPGRhi1VGLzh7UYk9qewvSgVKX0Cvpbk+4BSfnVgF+CSuHfkoYZVGOFU+ccQPhf0IVEfEgqxieONcNPZNeT3VGdhUbVXy1i3n/tAZd5eqCLgW/BV+xGK8VKIlfUf/68WwUqZWOVBk9D/gIDJ/V6ks5BLlk6zYINny+0gTbWWuCtIx1WOcL1zBsNGZZhumOQwbbJws+uVrW8vKMYLx5HnZKCyYVEBh2G9TZPXCjNv8GJcCqF7QS4um3yYwVKemsuKgrF/iKsVvjoXjfsc0zig6fHOXlAYgF86q0mtV59To5zlcCKLfOMmneb7/PNLWC872Bve/jlLCqW5KBknOGY0DJ8GgQzQ5DdXzA9XTkyT7nm+vBn1KnaOQ3RGMzFec3aUX7Fy4WcnZAzwUbmsrjfpe1Dni1ZiMVmInD4ovypD9Pqkvesy0ySNV20GF4qqyn3kKthF7qSJ2XrOgSzXe2xrq9m5ElFjcupxiZIeSNIRqL/Fd1qmGAycyF5LquVcaGaRsXDGCR/qynR3UR5WSgZeaTsUrZxdrK5jhXPYu4x31Y5qNFMnnLOwIf8j+H1uzWIbraeaSYgDHB0UczTB6yl+ADwmGkOf9ymxDzuutjZ2kXFZRKRB8gy1BY4mw1X5kdjlwc8GGGZ7XvPtEJFclgDbna/CQ1vCNe3ZNna8T7c6O+AxJ13ellVU2oBFWLDzVap5csxG94WtMC2PrhEntH4bXsiJsuCAioqu6kmOZzqcrJXXq7Ket3ZGiS18R6epRlMq1WYYYkw1Vb i1yRxZUt hETQIA3yRt52qPcIbSG4hZb72NcYtgjJiHPkiPACBN4yfJ89frLgZRIyTF8zDeC5+zOLeBiYdacnAKcfXZKmjEP9AAV+lfaDC9oLbwaIES0rfMn2ifhRoEzIzfPclwbvQFjGN3IkXwhBr699q5yX6/OosfWMNHWQQ1XDHV2wNCXSNsGU0n3UZilj2UvNtkj9zri4R 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: List-Subscribe: List-Unsubscribe: When calling alloc_contig_range() with __GFP_COMP and the order of requested pfn range is pageblock_order, less than MAX_ORDER, I triggered WARNING as follows: PFN range: requested [2150105088, 2150105600), allocated [2150105088, 2150106112) WARNING: CPU: 3 PID: 580 at mm/page_alloc.c:6877 alloc_contig_range+0x280/0x340 alloc_contig_range() marks pageblocks of the requested pfn range to be isolated, migrate these pages if they are in use and will be freed to MIGRATE_ISOLATED freelist. Suppose two alloc_contig_range() calls at the same time and the requested pfn range are [0x80280000, 0x80280200) and [0x80280200, 0x80280400) respectively. Suppose the two memory range are in use, then alloc_contig_range() will migrate and free these pages to MIGRATE_ISOLATED freelist. __free_one_page() will merge MIGRATE_ISOLATE buddy to larger buddy, resulting in a MAX_ORDER buddy. Finally, find_large_buddy() in alloc_contig_range() returns a MAX_ORDER buddy and results in WARNING. To fix it, call free_contig_range() to free the excess pfn range. Fixes: e98337d11bbd ("mm/contig_alloc: support __GFP_COMP") Signed-off-by: Jinjiang Tu --- Changelog since v1: * Add comment and remove redundant code, suggested by Zi Yan mm/page_alloc.c | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 579789600a3c..f0162ab991ad 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -6440,6 +6440,7 @@ int alloc_contig_range_noprof(unsigned long start, unsigned long end, .alloc_contig = true, }; INIT_LIST_HEAD(&cc.migratepages); + bool is_range_aligned; gfp_mask = current_gfp_context(gfp_mask); if (__alloc_contig_verify_gfp_mask(gfp_mask, (gfp_t *)&cc.gfp_mask)) @@ -6528,7 +6529,14 @@ int alloc_contig_range_noprof(unsigned long start, unsigned long end, goto done; } - if (!(gfp_mask & __GFP_COMP)) { + /* + * With __GFP_COMP and the requested order < MAX_PAGE_ORDER, + * isolated free pages can have higher order than the requested + * one. Use split_free_pages() to free out of range pages. + */ + is_range_aligned = is_power_of_2(end - start); + if (!(gfp_mask & __GFP_COMP) || + (is_range_aligned && ilog2(end - start) < MAX_PAGE_ORDER)) { split_free_pages(cc.freepages, gfp_mask); /* Free head and tail (if any) */ @@ -6536,7 +6544,15 @@ int alloc_contig_range_noprof(unsigned long start, unsigned long end, free_contig_range(outer_start, start - outer_start); if (end != outer_end) free_contig_range(end, outer_end - end); - } else if (start == outer_start && end == outer_end && is_power_of_2(end - start)) { + + outer_start = start; + outer_end = end; + + if (!(gfp_mask & __GFP_COMP)) + goto done; + } + + if (start == outer_start && end == outer_end && is_range_aligned) { struct page *head = pfn_to_page(start); int order = ilog2(end - start); -- 2.43.0