From patchwork Wed Mar 12 08:47:05 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jinjiang Tu X-Patchwork-Id: 14013122 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 AA98AC28B28 for ; Wed, 12 Mar 2025 08:56:12 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id C39E3280003; Wed, 12 Mar 2025 04:56:10 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id BE78C280001; Wed, 12 Mar 2025 04:56:10 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id AB265280003; Wed, 12 Mar 2025 04:56:10 -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 8DD0A280001 for ; Wed, 12 Mar 2025 04:56:10 -0400 (EDT) Received: from smtpin27.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay05.hostedemail.com (Postfix) with ESMTP id A15B952E6F for ; Wed, 12 Mar 2025 08:56:11 +0000 (UTC) X-FDA: 83212292142.27.3AB6699 Received: from szxga05-in.huawei.com (szxga05-in.huawei.com [45.249.212.191]) by imf09.hostedemail.com (Postfix) with ESMTP id D0BC5140005 for ; Wed, 12 Mar 2025 08:56:08 +0000 (UTC) Authentication-Results: imf09.hostedemail.com; dkim=none; dmarc=pass (policy=quarantine) header.from=huawei.com; spf=pass (imf09.hostedemail.com: domain of tujinjiang@huawei.com designates 45.249.212.191 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=1741769769; 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=xq/4gWRjpZnMxeBTHR5h5UDxzPfchpjUHdpQRRYYEo4=; b=qYj3tkfADtsHFhGtMU5GllU7ynVJ1DBTNYl1+C09dYvMk5kg9MTN9RaZYKdmBtZoipSXuV srrfxHjuO8oXjBNe63Ad9FbnzpuD8p2xAmv8eVa2WWBHC5yKF8sotJrfI9PkASUMe03ssl y7wuzkfCfaOzNBXBfroU6n6DclengCk= ARC-Authentication-Results: i=1; imf09.hostedemail.com; dkim=none; dmarc=pass (policy=quarantine) header.from=huawei.com; spf=pass (imf09.hostedemail.com: domain of tujinjiang@huawei.com designates 45.249.212.191 as permitted sender) smtp.mailfrom=tujinjiang@huawei.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1741769769; a=rsa-sha256; cv=none; b=Zd8Qi4fKHumSQYLW8vL2qP5Epn7DIWurMpp1DIr77hm3/gzbx36fPgbhoalc4UBZdNILCa rR9+KbysHfTt5AGsqRuh8/SwHsAxugHT1qwcLjwS2um37E7zo+4qGJ4M/k7PHsf6q4rzEa ulrzztvwtTMWDCJLLN78UpjeOda+0Gw= Received: from mail.maildlp.com (unknown [172.19.163.17]) by szxga05-in.huawei.com (SkyGuard) with ESMTP id 4ZCPWM6hl4z1ltbC; Wed, 12 Mar 2025 16:51:43 +0800 (CST) Received: from kwepemo200002.china.huawei.com (unknown [7.202.195.209]) by mail.maildlp.com (Postfix) with ESMTPS id 38D791A0188; Wed, 12 Mar 2025 16:56:05 +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; Wed, 12 Mar 2025 16:56:04 +0800 From: Jinjiang Tu To: , , , CC: , , Subject: [PATCH] mm/contig_alloc: fix alloc_contig_range when __GFP_COMP and order < MAX_ORDER Date: Wed, 12 Mar 2025 16:47:05 +0800 Message-ID: <20250312084705.2938220-1-tujinjiang@huawei.com> X-Mailer: git-send-email 2.43.0 MIME-Version: 1.0 X-Originating-IP: [10.175.124.71] X-ClientProxiedBy: dggems702-chm.china.huawei.com (10.3.19.179) To kwepemo200002.china.huawei.com (7.202.195.209) X-Rspam-User: X-Rspamd-Queue-Id: D0BC5140005 X-Rspamd-Server: rspam08 X-Stat-Signature: kamz5j9tyweh9u8yf8j3q98uyppoin63 X-HE-Tag: 1741769768-710680 X-HE-Meta: U2FsdGVkX1+RPXcwMvRsPGQZlEnclrWm1nsDB+6rJGQXWsCWEWUfJHZp30U+wdcY6im65ols+vgvKlZWqd0RZEmPINxwwoWfDGXmkM0ZcRB5kLVxK2/aoDOYIYVgXWeCKHyUT18qqxMFBhyFWj6oUSeZnE7o+i/gOLiv73w4iz1fT2Ra2QlBkRp07SaJ+uxGoExzPuFb1DReNiCnkeSyiC/hc4IwmPvNwypBUcWBIcuIYVWcnqMG4NuPDE4iYUsi2pTQ8YY0NAnl/+rUI1pNikSBZktLQI4eLUmREr+YRa+lQRG8B9bfyIUcE6jgiiMoG1KvZPwf4J2IKOqQosmQAyfijKdsOrbP7wjhJinaAT8TldR53EVB5o3E4io9OmJV+vTXq4/WGIjwo+0WV9y8kM6XU5jn41w6yoemGCwnpB34psgHU/dnIIYZSxcTbHDhGaw75QPgVM9EpKgPcqFj0yUFPkQKu2h7oI0pXGhAn4tmEZS432z9bYzwEwuCXPd5oCJHeZE1/kI/PG0jDyY+sQP7yDHvugK+/R2qCduUtO2dQPNcmY5kPCA2/D+r84lSzyRN9BLk1TMWBNaV8MIQeUIUAJs7kOfw8kV5VbDGHxZWJiuFAfCOYzFC5ab0TU71/fCn+RmGYEavvguc9rHW/eh1Z+fgCncG2H9XPCY+rUK9LefNBLm3XO6Lo48+1NZJT5PKn3DtgVBtRWfCPLyVgh2V8MTNR1W4RL6Pwd6iN1o2leu/H2g1WIYK/mzAx08rw8HWzWPh4It0brfsCehYdb0EvWvuUSP8xEInIdzlkNwfrnfECi7I/ZEN77TYFJ0UTK0Ax9+0Cj+V0ruTdFRCutYk8kWyqRyFVBZ+GGufA3S8/a5R7dwzl0AwhMYSp7veG0EVYPdnj2NNNcvlqQCp6L3yXvoriTIYanQ+jPg16itPAquEtBgXbwz1/gAqqZoJ1+veFueXdwgsKrW6HmK RT2kA+jK NYpnGbE3DdB7Y1Ll1hh+SY7LEAa+hgZZfxZ5uTxBj0CjpBeWBJKn9H340UciBWMW6C/WfJa/E6OYIniO0wg/AxXmnMZEOd+Wkrnqadz3mOw7v137TyVmxE11UgBGfZ9s/M2qiBBWH0400gceogBuJx1FPoN5KBgWSl3Iaju7IWz9Kl2rxU7D72diibe81WkToBinN 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 --- mm/page_alloc.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 579789600a3c..c1260968e89e 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -6528,7 +6528,8 @@ int alloc_contig_range_noprof(unsigned long start, unsigned long end, goto done; } - if (!(gfp_mask & __GFP_COMP)) { + if (!(gfp_mask & __GFP_COMP) || + (is_power_of_2(end - start) && ilog2(end - start) < MAX_PAGE_ORDER)) { split_free_pages(cc.freepages, gfp_mask); /* Free head and tail (if any) */ @@ -6536,7 +6537,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_power_of_2(end - start)) { struct page *head = pfn_to_page(start); int order = ilog2(end - start);