From patchwork Tue Nov 8 18:43:55 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Yang Shi X-Patchwork-Id: 13036714 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 9EE89C4332F for ; Tue, 8 Nov 2022 18:44:23 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id EC2728E0001; Tue, 8 Nov 2022 13:44:22 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id E71696B0078; Tue, 8 Nov 2022 13:44:22 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id D39178E0001; Tue, 8 Nov 2022 13:44:22 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0012.hostedemail.com [216.40.44.12]) by kanga.kvack.org (Postfix) with ESMTP id C02126B0075 for ; Tue, 8 Nov 2022 13:44:22 -0500 (EST) Received: from smtpin27.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay04.hostedemail.com (Postfix) with ESMTP id 8FD521A06CB for ; Tue, 8 Nov 2022 18:44:22 +0000 (UTC) X-FDA: 80111150364.27.D9956B6 Received: from mail-pf1-f179.google.com (mail-pf1-f179.google.com [209.85.210.179]) by imf03.hostedemail.com (Postfix) with ESMTP id 4220120002 for ; Tue, 8 Nov 2022 18:44:22 +0000 (UTC) Received: by mail-pf1-f179.google.com with SMTP id y203so14585396pfb.4 for ; Tue, 08 Nov 2022 10:44:21 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=JH2QhHpqacgVEtOu6V/3tcH+ucME36GLS7VYH7bPh2s=; b=gfgIf/HAVM/kaYeBJhJkJ8cAIt9JH8FVUt8AbdjcL2gtn5i2PkRUCbfffZxgLEJQda Op9+9xqJl1ZSfgbDb+QoJ31XG+Y7SoFu3phXGIBD/BAi48blSD4Cy/m5cY1F0tBCCosf sqct8v5HRhlNHTPkORouibJhLs16Y7nwqpA3GX3imljNb0GU6S/UFK+giUcl8+WjhnN5 Jhgs1R1yrL0LPw2NKGkTs68Wa7hEfQkcCL9yNDgDFKkiTiH5RLEcLhiNglxXwAeW8Uzo UcsL257ewqmAUoHotpTt0ChgTn0CRmrq9BUeYpjYOqjLQQOFJ/8Bt0RwKzS6v/mY7Jl5 SKoQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=JH2QhHpqacgVEtOu6V/3tcH+ucME36GLS7VYH7bPh2s=; b=4yJB9TqvC7YzGqc/hSKaFJT9UjJL4XDOTtFSn0i47u2A1XSKxSMGuAOov8Mkw1PCEI oTYxbUK2DZL0kga61W31hcPO8At5kB7OpIijBVr/MtqErmj7cmK1zbez04CZZqxfLhqA 4frtwYXyJQaZBfmmX9kEdJb3gb0P1OIk7VrwpUZiXDrZrCyTP3UeKt/mlmjIXqfgmVqB tonZf/RaC3YQRkccb+1PSuke/t8nd7EgQ+tRHMPzgSoiLm0mCgU0tNcjBHzTUW6vWXWG r8CdaLvAYvB8hpcvNVAx7dq9Xo2wcyilMRPsHtch8vHXTUPLZIrQMPo3A7+g3jK5zCWM Eppg== X-Gm-Message-State: ACrzQf2C2CiNuWJr+ifoHFB1nUzItTSIeIrF0zle7sSXipaq97NpdScr mKBMe6jzyZUHgC1aZAw+qvM= X-Google-Smtp-Source: AMsMyM4PVPwARffTYpnfKIvuWpr70fVa/7XOUmPKj6m5uJOzRmuzpTdhkZzWLkvkEwznfbYUe1f4vw== X-Received: by 2002:a63:1652:0:b0:470:4524:dc9e with SMTP id 18-20020a631652000000b004704524dc9emr18476984pgw.402.1667933061111; Tue, 08 Nov 2022 10:44:21 -0800 (PST) Received: from localhost.localdomain (c-67-174-241-145.hsd1.ca.comcast.net. [67.174.241.145]) by smtp.gmail.com with ESMTPSA id ij22-20020a170902ab5600b0017f36638010sm7210438plb.276.2022.11.08.10.44.19 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 08 Nov 2022 10:44:19 -0800 (PST) From: Yang Shi To: zokeefe@google.com, mhocko@suse.com, akpm@linux-foundation.org Cc: shy828301@gmail.com, linux-mm@kvack.org, linux-kernel@vger.kernel.org Subject: [mm-unstable v3 PATCH 1/3] Revert "mm: don't warn if the node is offlined" Date: Tue, 8 Nov 2022 10:43:55 -0800 Message-Id: <20221108184357.55614-1-shy828301@gmail.com> X-Mailer: git-send-email 2.38.1 MIME-Version: 1.0 ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1667933062; a=rsa-sha256; cv=none; b=1penASs0awptps8gwzgRHEdTj7qVR/TrvO6eq8HGYaQlqGDTNWxNbJalra/A64PF3W1lWO +PTGGa+0eYTnBkxpaU/ApKJqHJO3mY8vqlqzn5SsywgR8B6wZ5I/p0Dl+nLIRdAnUwLWqB q7eQmgLxkIiEhOdam9DvSCFa57/Y14c= ARC-Authentication-Results: i=1; imf03.hostedemail.com; dkim=pass header.d=gmail.com header.s=20210112 header.b="gfgIf/HA"; spf=pass (imf03.hostedemail.com: domain of shy828301@gmail.com designates 209.85.210.179 as permitted sender) smtp.mailfrom=shy828301@gmail.com; dmarc=pass (policy=none) header.from=gmail.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1667933062; 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-transfer-encoding:content-transfer-encoding: in-reply-to:references:dkim-signature; bh=JH2QhHpqacgVEtOu6V/3tcH+ucME36GLS7VYH7bPh2s=; b=oNNRHDF2M8SB/xoQW/crRLco5klB6We2MuMhaJKzHtIG8Hhz4XroVO5mobzk2jVS1OZRNb XjEphjJBML+KofXmfvn9ErWsZV1osfLeT07hgZiSgJoTe7g7OoD5X6O5d40hA1HEq9nLhi Sm6oJyjWQFDuBIyrnwcQKzAC6rQkF/Q= X-Stat-Signature: dar6o1jdmug7ub8ohtohdiupakepb6x6 X-Rspamd-Queue-Id: 4220120002 Authentication-Results: imf03.hostedemail.com; dkim=pass header.d=gmail.com header.s=20210112 header.b="gfgIf/HA"; spf=pass (imf03.hostedemail.com: domain of shy828301@gmail.com designates 209.85.210.179 as permitted sender) smtp.mailfrom=shy828301@gmail.com; dmarc=pass (policy=none) header.from=gmail.com X-Rspam-User: X-Rspamd-Server: rspam11 X-HE-Tag: 1667933062-867087 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: This reverts commit 6baf85a005ad36dd8586e5c3de598f8c3059dc91. --- include/linux/gfp.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/include/linux/gfp.h b/include/linux/gfp.h index 594d6dee5646..ef4aea3b356e 100644 --- a/include/linux/gfp.h +++ b/include/linux/gfp.h @@ -218,6 +218,7 @@ static inline struct page * __alloc_pages_node(int nid, gfp_t gfp_mask, unsigned int order) { VM_BUG_ON(nid < 0 || nid >= MAX_NUMNODES); + VM_WARN_ON((gfp_mask & __GFP_THISNODE) && !node_online(nid)); return __alloc_pages(gfp_mask, order, nid, NULL); } @@ -226,6 +227,7 @@ static inline struct folio *__folio_alloc_node(gfp_t gfp, unsigned int order, int nid) { VM_BUG_ON(nid < 0 || nid >= MAX_NUMNODES); + VM_WARN_ON((gfp & __GFP_THISNODE) && !node_online(nid)); return __folio_alloc(gfp, order, nid, NULL); } From patchwork Tue Nov 8 18:43:56 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Yang Shi X-Patchwork-Id: 13036715 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 ACD4FC4167E for ; Tue, 8 Nov 2022 18:44:26 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 350346B0075; Tue, 8 Nov 2022 13:44:26 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 326988E0002; Tue, 8 Nov 2022 13:44:26 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 1A1576B007B; Tue, 8 Nov 2022 13:44:26 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0011.hostedemail.com [216.40.44.11]) by kanga.kvack.org (Postfix) with ESMTP id 07EE56B0075 for ; Tue, 8 Nov 2022 13:44:26 -0500 (EST) Received: from smtpin03.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay02.hostedemail.com (Postfix) with ESMTP id AA95F120214 for ; Tue, 8 Nov 2022 18:44:25 +0000 (UTC) X-FDA: 80111150490.03.23771AF Received: from mail-pf1-f175.google.com (mail-pf1-f175.google.com [209.85.210.175]) by imf27.hostedemail.com (Postfix) with ESMTP id 3826440007 for ; Tue, 8 Nov 2022 18:44:24 +0000 (UTC) Received: by mail-pf1-f175.google.com with SMTP id k15so14586492pfg.2 for ; Tue, 08 Nov 2022 10:44:23 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=SZMixwErSopU2O8DablnyBX7zPU8BTRivT7sp7p/Y2k=; b=UWnAbl3xsubazJPZSTpP+mGoEzK8xdDx6DvgpgItlY6+1YoyGXx/GpECTAe7UnlikC KntPpyAYXCzHCsqNqC76cAMz0msuKWO/0ZNBae3NBUneiuTOa0VW/3UrNeFVv2/TxeIh CBIiwseA0stRU00EvLBIul5+gaze5zIyQGbDqmSdaVjnH0xplySPbOSkvcVWqVtxkJdP K6JUFQtEiCjUx0awjWkunA4XSAyHf9U2Jq3qEmft+wPIh6rqPumkGL7qPJbWY034WJrw MaJnuhcbJe8R8IRYhR7ZjMWA19YzbG9L2gxhKCAx5Hr5el45OOuZAYliQIoTZzyVEgMB RTIw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=SZMixwErSopU2O8DablnyBX7zPU8BTRivT7sp7p/Y2k=; b=GCKJayRugDvTa8IQtwCojwK6v7r3AdD8l2eIWhg7BAdrxPQBsQZkjja6beQSVBtPrG g2XFh/5Kh/dEVYniCGi7vJeUc84ph2cF+79jUE9g2R4mu2MGHktq4Yv1oWpV1YeJQLfd 9pftjpc5s3kPK6PNVt4XXtnoGuyjvW0oypKTF6RXv/M3P/oyKEtvN4w+5LNUNtyn1Aww oyR9PWMV8vMeG5FMydEO7Plsijdo1Qbc1a+ZA6NUEhev9BSjLNqSerMnQHfkyqzewsuR 8/VkaH8xy+E3rMnNKuJuD0IFsUYeUvANthf9QU1kTFm27xVGs7tMRIRyk0KWH+IkSPt6 0e7w== X-Gm-Message-State: ACrzQf0itNom9gQ4tlUQ+eybHTXbLjv0GNlcDts6NPvz+9L4RB0EpJFo 2k9Ec0k+vs0DqKUwJrXmjsU= X-Google-Smtp-Source: AMsMyM65OhKUtzTKt3KxeErbsLFDmoGgmhBuGJ8kPTQz+O90x+jf9QmUw6w9Fwjnl2HLZXuCj6HX8w== X-Received: by 2002:a63:2b41:0:b0:46e:9364:eb07 with SMTP id r62-20020a632b41000000b0046e9364eb07mr48969644pgr.46.1667933063156; Tue, 08 Nov 2022 10:44:23 -0800 (PST) Received: from localhost.localdomain (c-67-174-241-145.hsd1.ca.comcast.net. [67.174.241.145]) by smtp.gmail.com with ESMTPSA id ij22-20020a170902ab5600b0017f36638010sm7210438plb.276.2022.11.08.10.44.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 08 Nov 2022 10:44:22 -0800 (PST) From: Yang Shi To: zokeefe@google.com, mhocko@suse.com, akpm@linux-foundation.org Cc: shy828301@gmail.com, linux-mm@kvack.org, linux-kernel@vger.kernel.org, syzbot+0044b22d177870ee974f@syzkaller.appspotmail.com, Zach O'Keefe Subject: [mm-unstable v3 PATCH 2/3] mm: khugepaged: allow page allocation fallback to eligible nodes Date: Tue, 8 Nov 2022 10:43:56 -0800 Message-Id: <20221108184357.55614-2-shy828301@gmail.com> X-Mailer: git-send-email 2.38.1 In-Reply-To: <20221108184357.55614-1-shy828301@gmail.com> References: <20221108184357.55614-1-shy828301@gmail.com> MIME-Version: 1.0 ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1667933064; 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-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=SZMixwErSopU2O8DablnyBX7zPU8BTRivT7sp7p/Y2k=; b=gj5XbGZsqb0vNx2TR5YUE5StICA6ZK+rg2QW6uFwMsd7osmTa7PDNHKB8KRPw09znfPpY7 snykATKeiwAyu6filqcw/Ozb4JSzqT94FqF8ZyPv0xMzQVFvN9JANvWy2+s6hCBBK2QUQN gEzIm12jMeQ+B6N4nR8wfPoAFVFd5QE= ARC-Authentication-Results: i=1; imf27.hostedemail.com; dkim=pass header.d=gmail.com header.s=20210112 header.b=UWnAbl3x; spf=pass (imf27.hostedemail.com: domain of shy828301@gmail.com designates 209.85.210.175 as permitted sender) smtp.mailfrom=shy828301@gmail.com; dmarc=pass (policy=none) header.from=gmail.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1667933064; a=rsa-sha256; cv=none; b=yDs94hw+NucSPLSIHg629HD+X/bOlbHaNT3bDLYdyp6BLIKQjdpinZYZWxTdBMvcENsBGi H1zwoYo+x9ldCziwPw58hsOV72f0S/e/atH8MhZiIPtpS95eIlQYQwX03w2e8Gk96mQSNO jfcRwG2yAkRi1goSCBDERhKltbKRGr8= X-Rspamd-Queue-Id: 3826440007 X-Rspam-User: X-Rspamd-Server: rspam08 Authentication-Results: imf27.hostedemail.com; dkim=pass header.d=gmail.com header.s=20210112 header.b=UWnAbl3x; spf=pass (imf27.hostedemail.com: domain of shy828301@gmail.com designates 209.85.210.175 as permitted sender) smtp.mailfrom=shy828301@gmail.com; dmarc=pass (policy=none) header.from=gmail.com X-Stat-Signature: gm5q9saapb37qwnk3o3xctokmrzc51fn X-HE-Tag: 1667933064-588333 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: Syzbot reported the below splat: WARNING: CPU: 1 PID: 3646 at include/linux/gfp.h:221 __alloc_pages_node include/linux/gfp.h:221 [inline] WARNING: CPU: 1 PID: 3646 at include/linux/gfp.h:221 hpage_collapse_alloc_page mm/khugepaged.c:807 [inline] WARNING: CPU: 1 PID: 3646 at include/linux/gfp.h:221 alloc_charge_hpage+0x802/0xaa0 mm/khugepaged.c:963 Modules linked in: CPU: 1 PID: 3646 Comm: syz-executor210 Not tainted 6.1.0-rc1-syzkaller-00454-ga70385240892 #0 Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 10/11/2022 RIP: 0010:__alloc_pages_node include/linux/gfp.h:221 [inline] RIP: 0010:hpage_collapse_alloc_page mm/khugepaged.c:807 [inline] RIP: 0010:alloc_charge_hpage+0x802/0xaa0 mm/khugepaged.c:963 Code: e5 01 4c 89 ee e8 6e f9 ae ff 4d 85 ed 0f 84 28 fc ff ff e8 70 fc ae ff 48 8d 6b ff 4c 8d 63 07 e9 16 fc ff ff e8 5e fc ae ff <0f> 0b e9 96 fa ff ff 41 bc 1a 00 00 00 e9 86 fd ff ff e8 47 fc ae RSP: 0018:ffffc90003fdf7d8 EFLAGS: 00010293 RAX: 0000000000000000 RBX: 0000000000000000 RCX: 0000000000000000 RDX: ffff888077f457c0 RSI: ffffffff81cd8f42 RDI: 0000000000000001 RBP: ffff888079388c0c R08: 0000000000000001 R09: 0000000000000000 R10: 0000000000000000 R11: 0000000000000000 R12: 0000000000000000 R13: dffffc0000000000 R14: 0000000000000000 R15: 0000000000000000 FS: 00007f6b48ccf700(0000) GS:ffff8880b9b00000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 00007f6b48a819f0 CR3: 00000000171e7000 CR4: 00000000003506e0 DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 Call Trace: collapse_file+0x1ca/0x5780 mm/khugepaged.c:1715 hpage_collapse_scan_file+0xd6c/0x17a0 mm/khugepaged.c:2156 madvise_collapse+0x53a/0xb40 mm/khugepaged.c:2611 madvise_vma_behavior+0xd0a/0x1cc0 mm/madvise.c:1066 madvise_walk_vmas+0x1c7/0x2b0 mm/madvise.c:1240 do_madvise.part.0+0x24a/0x340 mm/madvise.c:1419 do_madvise mm/madvise.c:1432 [inline] __do_sys_madvise mm/madvise.c:1432 [inline] __se_sys_madvise mm/madvise.c:1430 [inline] __x64_sys_madvise+0x113/0x150 mm/madvise.c:1430 do_syscall_x64 arch/x86/entry/common.c:50 [inline] do_syscall_64+0x35/0xb0 arch/x86/entry/common.c:80 entry_SYSCALL_64_after_hwframe+0x63/0xcd RIP: 0033:0x7f6b48a4eef9 Code: 28 00 00 00 75 05 48 83 c4 28 c3 e8 b1 15 00 00 90 48 89 f8 48 89 f7 48 89 d6 48 89 ca 4d 89 c2 4d 89 c8 4c 8b 4c 24 08 0f 05 <48> 3d 01 f0 ff ff 73 01 c3 48 c7 c1 b8 ff ff ff f7 d8 64 89 01 48 RSP: 002b:00007f6b48ccf318 EFLAGS: 00000246 ORIG_RAX: 000000000000001c RAX: ffffffffffffffda RBX: 00007f6b48af0048 RCX: 00007f6b48a4eef9 RDX: 0000000000000019 RSI: 0000000000600003 RDI: 0000000020000000 RBP: 00007f6b48af0040 R08: 0000000000000000 R09: 0000000000000000 R10: 0000000000000000 R11: 0000000000000246 R12: 00007f6b48aa53a4 R13: 00007f6b48bffcbf R14: 00007f6b48ccf400 R15: 0000000000022000 The khugepaged code would pick up the node with the most hit as the preferred node, and also tries to do some balance if several nodes have the same hit record. Basically it does conceptually: * If the target_node <= last_target_node, then iterate from last_target_node + 1 to MAX_NUMNODES (1024 on default config) * If the max_value == node_load[nid], then target_node = nid But there is a corner case, paritucularly for MADV_COLLAPSE, that the non-existing node may be returned as preferred node. Assuming the system has 2 nodes, the target_node is 0 and the last_target_node is 1, if MADV_COLLAPSE path is hit, the max_value may be 0, then it may return 2 for target_node, but it is actually not existing (offline), so the warn is triggered. The node balance was introduced by commit 9f1b868a13ac ("mm: thp: khugepaged: add policy for finding target node") to satisfy "numactl --interleave=all". But interleaving is a mere hint rather than something that has hard requirements. So use nodemask to record the nodes which have the same hit record, the hugepage allocation could fallback to those nodes. And remove __GFP_THISNODE since it does disallow fallback. And if the nodemask just has one node set, it means there is one single node has the most hit record, the nodemask approach actually behaves like __GFP_THISNODE. Reported-by: syzbot+0044b22d177870ee974f@syzkaller.appspotmail.com Suggested-by: Zach O'Keefe Suggested-by: Michal Hocko Reviewed-by: Zach O'Keefe Acked-by: Michal Hocko Signed-off-by: Yang Shi --- v3: * Corrected the commit log a little bit. mm/khugepaged.c | 32 ++++++++++++++------------------ 1 file changed, 14 insertions(+), 18 deletions(-) diff --git a/mm/khugepaged.c b/mm/khugepaged.c index ea0d186bc9d4..572ce7dbf4b0 100644 --- a/mm/khugepaged.c +++ b/mm/khugepaged.c @@ -97,8 +97,8 @@ struct collapse_control { /* Num pages scanned per node */ u32 node_load[MAX_NUMNODES]; - /* Last target selected in hpage_collapse_find_target_node() */ - int last_target_node; + /* nodemask for allocation fallback */ + nodemask_t alloc_nmask; }; /** @@ -734,7 +734,6 @@ static void khugepaged_alloc_sleep(void) struct collapse_control khugepaged_collapse_control = { .is_khugepaged = true, - .last_target_node = NUMA_NO_NODE, }; static bool hpage_collapse_scan_abort(int nid, struct collapse_control *cc) @@ -783,16 +782,11 @@ static int hpage_collapse_find_target_node(struct collapse_control *cc) target_node = nid; } - /* do some balance if several nodes have the same hit record */ - if (target_node <= cc->last_target_node) - for (nid = cc->last_target_node + 1; nid < MAX_NUMNODES; - nid++) - if (max_value == cc->node_load[nid]) { - target_node = nid; - break; - } + for_each_online_node(nid) { + if (max_value == cc->node_load[nid]) + node_set(nid, cc->alloc_nmask); + } - cc->last_target_node = target_node; return target_node; } #else @@ -802,9 +796,10 @@ static int hpage_collapse_find_target_node(struct collapse_control *cc) } #endif -static bool hpage_collapse_alloc_page(struct page **hpage, gfp_t gfp, int node) +static bool hpage_collapse_alloc_page(struct page **hpage, gfp_t gfp, int node, + nodemask_t *nmask) { - *hpage = __alloc_pages_node(node, gfp, HPAGE_PMD_ORDER); + *hpage = __alloc_pages(gfp, HPAGE_PMD_ORDER, node, nmask); if (unlikely(!*hpage)) { count_vm_event(THP_COLLAPSE_ALLOC_FAILED); return false; @@ -955,12 +950,11 @@ static int __collapse_huge_page_swapin(struct mm_struct *mm, static int alloc_charge_hpage(struct page **hpage, struct mm_struct *mm, struct collapse_control *cc) { - /* Only allocate from the target node */ gfp_t gfp = (cc->is_khugepaged ? alloc_hugepage_khugepaged_gfpmask() : - GFP_TRANSHUGE) | __GFP_THISNODE; + GFP_TRANSHUGE); int node = hpage_collapse_find_target_node(cc); - if (!hpage_collapse_alloc_page(hpage, gfp, node)) + if (!hpage_collapse_alloc_page(hpage, gfp, node, &cc->alloc_nmask)) return SCAN_ALLOC_HUGE_PAGE_FAIL; if (unlikely(mem_cgroup_charge(page_folio(*hpage), mm, gfp))) return SCAN_CGROUP_CHARGE_FAIL; @@ -1144,6 +1138,7 @@ static int hpage_collapse_scan_pmd(struct mm_struct *mm, goto out; memset(cc->node_load, 0, sizeof(cc->node_load)); + nodes_clear(cc->alloc_nmask); pte = pte_offset_map_lock(mm, pmd, address, &ptl); for (_address = address, _pte = pte; _pte < pte + HPAGE_PMD_NR; _pte++, _address += PAGE_SIZE) { @@ -2078,6 +2073,7 @@ static int hpage_collapse_scan_file(struct mm_struct *mm, unsigned long addr, present = 0; swap = 0; memset(cc->node_load, 0, sizeof(cc->node_load)); + nodes_clear(cc->alloc_nmask); rcu_read_lock(); xas_for_each(&xas, page, start + HPAGE_PMD_NR - 1) { if (xas_retry(&xas, page)) @@ -2581,7 +2577,6 @@ int madvise_collapse(struct vm_area_struct *vma, struct vm_area_struct **prev, if (!cc) return -ENOMEM; cc->is_khugepaged = false; - cc->last_target_node = NUMA_NO_NODE; mmgrab(mm); lru_add_drain_all(); @@ -2607,6 +2602,7 @@ int madvise_collapse(struct vm_area_struct *vma, struct vm_area_struct **prev, } mmap_assert_locked(mm); memset(cc->node_load, 0, sizeof(cc->node_load)); + nodes_clear(cc->alloc_nmask); if (IS_ENABLED(CONFIG_SHMEM) && vma->vm_file) { struct file *file = get_file(vma->vm_file); pgoff_t pgoff = linear_page_index(vma, addr); From patchwork Tue Nov 8 18:43:57 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Yang Shi X-Patchwork-Id: 13036716 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 8C541C38A2B for ; Tue, 8 Nov 2022 18:44:27 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 1A1D98E0003; Tue, 8 Nov 2022 13:44:27 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 12CF88E0002; Tue, 8 Nov 2022 13:44:27 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id E4A348E0003; Tue, 8 Nov 2022 13:44:26 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0016.hostedemail.com [216.40.44.16]) by kanga.kvack.org (Postfix) with ESMTP id CF6168E0002 for ; Tue, 8 Nov 2022 13:44:26 -0500 (EST) Received: from smtpin21.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay01.hostedemail.com (Postfix) with ESMTP id 9B1D01C6B1D for ; Tue, 8 Nov 2022 18:44:26 +0000 (UTC) X-FDA: 80111150532.21.8D336DB Received: from mail-pf1-f182.google.com (mail-pf1-f182.google.com [209.85.210.182]) by imf11.hostedemail.com (Postfix) with ESMTP id 2EE5540005 for ; Tue, 8 Nov 2022 18:44:25 +0000 (UTC) Received: by mail-pf1-f182.google.com with SMTP id k22so14584585pfd.3 for ; Tue, 08 Nov 2022 10:44:25 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=BLlH60L5DB/ktOFiwnGrQ8aIIlSEZ8HnuFFJi5Cg/+Y=; b=qHBuK7zVmzkkKLJ6WbtDxkBCLmKdeeWdk5cNJPUhRnwE3N3ZeV0/MIhTPiWbq9cfG7 XPT96SHCOmtN6tTUyWcYE3k29EqlaZvsaCjnhj5zT7/QLDFnlc+lQ10icJLdSAqykEWN S/GiLXnmZWA7TMpvCerNUtl8ewRolKYKVCmgBctDXAdnlP4T0Wn7eEWyAdoUGz2rhVkm qsr56LPR7FhESYAn7FHukIjm2P5ZpDYXbfZ/P90eQcxydPwvmKO9/GwUqpmMxntfHNnO wwGyMn2JQVlAGc112TdfsihKlTcZoctbWVCjjht8nNTg6VnyjZRjN3SOlazDDcvuV7Bx iPEg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=BLlH60L5DB/ktOFiwnGrQ8aIIlSEZ8HnuFFJi5Cg/+Y=; b=xdGbvLkyvmrToFPPQJchJWOQy4U7V+vUOXFVw5nyFjEHuaGJeZbf3dq1jJuxucN/+t E1BuT4Xa14vpzStoT5As0zSKw3F5jiD0zUHHEoXEhk9UG2fFnOjxYaBrOrmzh4qYpINz F2BdQlvCfJYWoFCDesSYoYMxg2An7+4nLuLNncT5zX/Rb/h2yci02oMDWCL+IHWMZxjT qhPejKDdA/cR3RhkbBW+TlvFh/kUf38tOWAR73imZBIfhFtkeNMkhEffW0jwMY2/eggy p2GyzGKNx1d4n1VoTX5QYOD+1nwUYLSAEF9ADezFcHCTZ2REhbRL/xoAfCJPtLcdp3kD E7Rg== X-Gm-Message-State: ACrzQf2OgIY4i9kiGPBFLjKQ3sduCJ/PX0dRU2t4zgTRylV3W1lD4yKh 6GE6+axrRWS3jto76Vlo2i7ioNrcPXs= X-Google-Smtp-Source: AMsMyM5Z2KlShdmFOZfPrVxGrGRWRaTazlfYWYcsz7XpwgtSMqG92HppQ0L3uULik1RH/jPRxRY/sQ== X-Received: by 2002:a63:8041:0:b0:470:1cd2:9914 with SMTP id j62-20020a638041000000b004701cd29914mr23509938pgd.539.1667933065185; Tue, 08 Nov 2022 10:44:25 -0800 (PST) Received: from localhost.localdomain (c-67-174-241-145.hsd1.ca.comcast.net. [67.174.241.145]) by smtp.gmail.com with ESMTPSA id ij22-20020a170902ab5600b0017f36638010sm7210438plb.276.2022.11.08.10.44.23 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 08 Nov 2022 10:44:24 -0800 (PST) From: Yang Shi To: zokeefe@google.com, mhocko@suse.com, akpm@linux-foundation.org Cc: shy828301@gmail.com, linux-mm@kvack.org, linux-kernel@vger.kernel.org, syzbot+0044b22d177870ee974f@syzkaller.appspotmail.com Subject: [mm-unstable v3 PATCH 3/3] mm: replace VM_WARN_ON to pr_warn if the node is offline with __GFP_THISNODE Date: Tue, 8 Nov 2022 10:43:57 -0800 Message-Id: <20221108184357.55614-3-shy828301@gmail.com> X-Mailer: git-send-email 2.38.1 In-Reply-To: <20221108184357.55614-1-shy828301@gmail.com> References: <20221108184357.55614-1-shy828301@gmail.com> MIME-Version: 1.0 ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1667933066; a=rsa-sha256; cv=none; b=o/ZqBkIMc3EpweLMB/xk1/i9nUdATYehgtpu5IVu4QaPls+zh1owyeUPPigl06eF7QRuLp heJp6KS4RwIGs1cTUPOv5h+les1eNtRpLfapmHDuPU9EVOXWOExdqAr0Her9u2Asf9Cw1E U/1eS1IUgRg6vqXn9eUtxA+Tos7jxEo= ARC-Authentication-Results: i=1; imf11.hostedemail.com; dkim=pass header.d=gmail.com header.s=20210112 header.b=qHBuK7zV; spf=pass (imf11.hostedemail.com: domain of shy828301@gmail.com designates 209.85.210.182 as permitted sender) smtp.mailfrom=shy828301@gmail.com; dmarc=pass (policy=none) header.from=gmail.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1667933066; 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-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=BLlH60L5DB/ktOFiwnGrQ8aIIlSEZ8HnuFFJi5Cg/+Y=; b=ksuzoTaykqE9Bg85C2hr4GAAjRWDmxUolfXCv5+B0P4RLIoqWBDghzElkFq45ozyhWEze0 z9uY7qbpxvIFfrGtBBjTuNy4qxCu5802J/vJMVOfM75am5BC3DHKpeFfImXKmoT069v7bj rDqzCtHpepuSpRjGDH2luSaLEPcgJl4= Authentication-Results: imf11.hostedemail.com; dkim=pass header.d=gmail.com header.s=20210112 header.b=qHBuK7zV; spf=pass (imf11.hostedemail.com: domain of shy828301@gmail.com designates 209.85.210.182 as permitted sender) smtp.mailfrom=shy828301@gmail.com; dmarc=pass (policy=none) header.from=gmail.com X-Rspamd-Server: rspam12 X-Rspam-User: X-Stat-Signature: inf19jf1mb6ycsunxzao9f86rdupw475 X-Rspamd-Queue-Id: 2EE5540005 X-HE-Tag: 1667933065-13102 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: Syzbot reported the below splat: WARNING: CPU: 1 PID: 3646 at include/linux/gfp.h:221 __alloc_pages_node include/linux/gfp.h:221 [inline] WARNING: CPU: 1 PID: 3646 at include/linux/gfp.h:221 hpage_collapse_alloc_page mm/khugepaged.c:807 [inline] WARNING: CPU: 1 PID: 3646 at include/linux/gfp.h:221 alloc_charge_hpage+0x802/0xaa0 mm/khugepaged.c:963 Modules linked in: CPU: 1 PID: 3646 Comm: syz-executor210 Not tainted 6.1.0-rc1-syzkaller-00454-ga70385240892 #0 Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 10/11/2022 RIP: 0010:__alloc_pages_node include/linux/gfp.h:221 [inline] RIP: 0010:hpage_collapse_alloc_page mm/khugepaged.c:807 [inline] RIP: 0010:alloc_charge_hpage+0x802/0xaa0 mm/khugepaged.c:963 Code: e5 01 4c 89 ee e8 6e f9 ae ff 4d 85 ed 0f 84 28 fc ff ff e8 70 fc ae ff 48 8d 6b ff 4c 8d 63 07 e9 16 fc ff ff e8 5e fc ae ff <0f> 0b e9 96 fa ff ff 41 bc 1a 00 00 00 e9 86 fd ff ff e8 47 fc ae RSP: 0018:ffffc90003fdf7d8 EFLAGS: 00010293 RAX: 0000000000000000 RBX: 0000000000000000 RCX: 0000000000000000 RDX: ffff888077f457c0 RSI: ffffffff81cd8f42 RDI: 0000000000000001 RBP: ffff888079388c0c R08: 0000000000000001 R09: 0000000000000000 R10: 0000000000000000 R11: 0000000000000000 R12: 0000000000000000 R13: dffffc0000000000 R14: 0000000000000000 R15: 0000000000000000 FS: 00007f6b48ccf700(0000) GS:ffff8880b9b00000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 00007f6b48a819f0 CR3: 00000000171e7000 CR4: 00000000003506e0 DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 Call Trace: collapse_file+0x1ca/0x5780 mm/khugepaged.c:1715 hpage_collapse_scan_file+0xd6c/0x17a0 mm/khugepaged.c:2156 madvise_collapse+0x53a/0xb40 mm/khugepaged.c:2611 madvise_vma_behavior+0xd0a/0x1cc0 mm/madvise.c:1066 madvise_walk_vmas+0x1c7/0x2b0 mm/madvise.c:1240 do_madvise.part.0+0x24a/0x340 mm/madvise.c:1419 do_madvise mm/madvise.c:1432 [inline] __do_sys_madvise mm/madvise.c:1432 [inline] __se_sys_madvise mm/madvise.c:1430 [inline] __x64_sys_madvise+0x113/0x150 mm/madvise.c:1430 do_syscall_x64 arch/x86/entry/common.c:50 [inline] do_syscall_64+0x35/0xb0 arch/x86/entry/common.c:80 entry_SYSCALL_64_after_hwframe+0x63/0xcd RIP: 0033:0x7f6b48a4eef9 Code: 28 00 00 00 75 05 48 83 c4 28 c3 e8 b1 15 00 00 90 48 89 f8 48 89 f7 48 89 d6 48 89 ca 4d 89 c2 4d 89 c8 4c 8b 4c 24 08 0f 05 <48> 3d 01 f0 ff ff 73 01 c3 48 c7 c1 b8 ff ff ff f7 d8 64 89 01 48 RSP: 002b:00007f6b48ccf318 EFLAGS: 00000246 ORIG_RAX: 000000000000001c RAX: ffffffffffffffda RBX: 00007f6b48af0048 RCX: 00007f6b48a4eef9 RDX: 0000000000000019 RSI: 0000000000600003 RDI: 0000000020000000 RBP: 00007f6b48af0040 R08: 0000000000000000 R09: 0000000000000000 R10: 0000000000000000 R11: 0000000000000246 R12: 00007f6b48aa53a4 R13: 00007f6b48bffcbf R14: 00007f6b48ccf400 R15: 0000000000022000 It is because khugepaged allocates pages with __GFP_THISNODE, but the preferred node is bogus. The previous patch fixed the khugepaged code to avoid allocating page from non-existing node. But it is still racy against memory hotremove. There is no synchronization with the memory hotplug so it is possible that memory gets offline during a longer taking scanning. So this warning still seems not quite helpful because: * There is no guarantee the node is online for __GFP_THISNODE context for all the callsites. * Kernel just fails the allocation regardless the warning, and it looks all callsites handle the allocation failure gracefully. Although while the warning has helped to identify a buggy code, it is not safe in general and this warning could panic the system with panic-on-warn configuration which tends to be used surprisingly often. So replace VM_WARN_ON to pr_warn(). And the warning will be triggered if __GFP_NOWARN is set since the allocator would print out warning for such case if __GFP_NOWARN is not set. Reported-by: syzbot+0044b22d177870ee974f@syzkaller.appspotmail.com Signed-off-by: Yang Shi Suggested-by: Michal Hocko Cc: Zach O'Keefe Acked-by: Michal Hocko --- v3: * Reverted the old commit from mm-unstable which remove the VM_WARN (patch 1/3). * Incorporated the suggestion from Michal to use pr_warn. v2: * Added patch 1/2. * Reworded the commit log per Michal. include/linux/gfp.h | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/include/linux/gfp.h b/include/linux/gfp.h index ef4aea3b356e..60a1c70ec85c 100644 --- a/include/linux/gfp.h +++ b/include/linux/gfp.h @@ -210,6 +210,16 @@ alloc_pages_bulk_array_node(gfp_t gfp, int nid, unsigned long nr_pages, struct p return __alloc_pages_bulk(gfp, nid, NULL, nr_pages, NULL, page_array); } +static inline void warn_if_node_offline(int nid, gfp_t gfp_mask) +{ + gfp_t gfp = gfp_mask & (__GFP_THISNODE|__GFP_NOWARN); + + if ((gfp == (__GFP_THISNODE|__GFP_NOWARN)) && !node_online(nid)) { + pr_warn("%pGg allocation from offline node %d\n", &gfp, nid); + dump_stack(); + } +} + /* * Allocate pages, preferring the node given as nid. The node must be valid and * online. For more general interface, see alloc_pages_node(). @@ -218,7 +228,7 @@ static inline struct page * __alloc_pages_node(int nid, gfp_t gfp_mask, unsigned int order) { VM_BUG_ON(nid < 0 || nid >= MAX_NUMNODES); - VM_WARN_ON((gfp_mask & __GFP_THISNODE) && !node_online(nid)); + warn_if_node_offline(nid, gfp_mask); return __alloc_pages(gfp_mask, order, nid, NULL); } @@ -227,7 +237,7 @@ static inline struct folio *__folio_alloc_node(gfp_t gfp, unsigned int order, int nid) { VM_BUG_ON(nid < 0 || nid >= MAX_NUMNODES); - VM_WARN_ON((gfp & __GFP_THISNODE) && !node_online(nid)); + warn_if_node_offline(nid, gfp); return __folio_alloc(gfp, order, nid, NULL); }