From patchwork Tue Feb 25 20:28:48 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mike Snitzer X-Patchwork-Id: 13990912 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 BC66CC021B8 for ; Tue, 25 Feb 2025 20:28:53 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 53451280002; Tue, 25 Feb 2025 15:28:53 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 4E33F280001; Tue, 25 Feb 2025 15:28:53 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 383D4280002; Tue, 25 Feb 2025 15:28:53 -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 18110280001 for ; Tue, 25 Feb 2025 15:28:53 -0500 (EST) Received: from smtpin09.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay05.hostedemail.com (Postfix) with ESMTP id A12D351D70 for ; Tue, 25 Feb 2025 20:28:52 +0000 (UTC) X-FDA: 83159605704.09.6FF9BA6 Received: from tor.source.kernel.org (tor.source.kernel.org [172.105.4.254]) by imf10.hostedemail.com (Postfix) with ESMTP id 0E810C0002 for ; Tue, 25 Feb 2025 20:28:50 +0000 (UTC) Authentication-Results: imf10.hostedemail.com; dkim=pass header.d=kernel.org header.s=k20201202 header.b=Tw9BiANA; spf=pass (imf10.hostedemail.com: domain of snitzer@kernel.org designates 172.105.4.254 as permitted sender) smtp.mailfrom=snitzer@kernel.org; dmarc=pass (policy=quarantine) header.from=kernel.org ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1740515331; 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=eSl5231v5c+aoJTGZh1tQwjemffGGHsdhNBAiFaBDms=; b=tPSW1nZthAKfs6uvkerjzURWnhe3AkpS1tE45rqHE+zXpeNEA46XYUINA4rL79TpEzkz5B 9SJ/UtgQ0CEO8Xkm/4QDpOeoE5z6Eq6icXe8YzvKZO22ZghiggCXzrQz8XvuURcDozKHkV QmClfCueG3qVgmLHs3Uk/JUdjuqEBTs= ARC-Authentication-Results: i=1; imf10.hostedemail.com; dkim=pass header.d=kernel.org header.s=k20201202 header.b=Tw9BiANA; spf=pass (imf10.hostedemail.com: domain of snitzer@kernel.org designates 172.105.4.254 as permitted sender) smtp.mailfrom=snitzer@kernel.org; dmarc=pass (policy=quarantine) header.from=kernel.org ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1740515331; a=rsa-sha256; cv=none; b=kv6Dil4lDFJ7Gwro4ruqVwj9f4wKGFNKs5Y0/wdzFSmWHRhXXJbo1nJ1M/e1qdkimkbgUk X8kFFm+V++tyid0rtgN4J4KMXmsz1ktFh/WrUCLwJmlQgGXV0ai5tmH9PwsFMuDUjITDja wl8OgXYR8udQRPNqg0RxjsuB5NhLAPQ= Received: from smtp.kernel.org (transwarp.subspace.kernel.org [100.75.92.58]) by tor.source.kernel.org (Postfix) with ESMTP id 53733611BA; Tue, 25 Feb 2025 20:28:43 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id C2ED3C4CEDD; Tue, 25 Feb 2025 20:28:49 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1740515330; bh=kESsj05B+77mOqXZnlpDt7BIg72CLt6Liz1yn770qJs=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Tw9BiANAUoVDxzUGhOxa1aNaR1ACvbFq3THuUHYLWA305uAukVunX+Cf/9K2mjnMD u1fTPlSnDKRtFk9LrlAxuxO9AwMDHJzxebGgPOrqX06GnTJvzK3tFztCkiG1gH5Tf6 hbTKGy37wDSGkllcww4x7KJ+vft1gLMu5tnWIz0YDnc2m8lt8W4nEBgfvFnA+iQG97 w2Y5ZSemTuLBwMrYqFvPeDmJ6bYCw6ml8zCOlSuycB6K1OA4Oecc/+I9h1sQaiIy6Y 6hDckVXJdUXvhtXg2KLkAmk+oYsBaEpqy8pdy+NS1xRFzXmQynm3+gLCOwfWg+Cgp0 a62yQYaDnPs3w== From: Mike Snitzer To: Andrew Morton Cc: Trond Myklebust , Anna Schumaker , linux-nfs@vger.kernel.org, linux-mm@kvack.org Subject: [PATCH v3 for-akpm for-6.14-rcX] NFS: fix nfs_release_folio() to not deadlock via kcompactd writeback Date: Tue, 25 Feb 2025 15:28:48 -0500 Message-ID: <20250225202848.31721-1-snitzer@kernel.org> X-Mailer: git-send-email 2.44.0 In-Reply-To: References: MIME-Version: 1.0 X-Rspam-User: X-Rspamd-Server: rspam09 X-Rspamd-Queue-Id: 0E810C0002 X-Stat-Signature: ipdku8qdnn3bg386dpndnaxh7pf4rtj8 X-HE-Tag: 1740515330-612088 X-HE-Meta: U2FsdGVkX19Qdg3oQMLeZ5tj/lJxHex3C4SJA/NpLnjLGIsIyeOM5JmtazY7cHteMOWmQ2zCLko4U3xDDTVpoScvazV0p1YkNa0oRrWNQCiaag6hKpZZZE89By/yfh8SZth0kDHOyyJz+rR28Nb3GmauLIEr9qAV5WbdcwY2geQBU7w/hoL7NyhYzL79PZab3k7iisdLZDmfcA5b/mUOmaYztfdndcU4SfVUl+FzFO7hE4kzUuU0cn6jhGizN9k9RPZjPUemRcgQed6ZCiR8/CmrI1jLreHuHEZY/M7rGcG49mBNDW3ahcAM0+ZEsgXG+FlHVyz+8LbGSqKNAbw4tomJtIZ3ar8eqej0nvy1Lkvg2qpVbJ4DpEYMwcQbELdptVvXDlLxcWtiOBUZU39nJAjSYp5A+liet8EcpITokNedbi+SMbcmfFeot4Oq6eOFELv6axHvgnHfDkMFVzFCC43Tjs3fG76uW3WRXkwXhWqGGcxD6R/Qsxem1Gi9V7Whx4Gcn+9CjIxy05xQWq0EvACQHPNLvp+qIHo3AgU0YsRb/HTvltw2/Zw5gaVrdki7sFaQROnfQbC7Nj9HccsZ5TA/qqkGk+9x0fTx/vYXxaFUzrQXAeUW93CzI/hcvsyG2I/YktVUklAct/eXUBzRo+gqXsN7oxYNV0XZOm7mWhvExYyRgvL8tSpm9TqQnACqHdt9ak2GkpDYdXJqbTU6riusXhVpmGtzuSxaWWY20mkKCgLbnkwqAPpzAiZVDXyhZ3lzrwR3MymsMzKPLe7aPLKvgQfk5hv3dQDwdTQEQqAFMqRqnKJFUcAvpNbLzfm5s+1ZF54cCRhzO4vefwsId1o3H4RFcYrUpyoXIew4uDCv6H1R5gprdvwb9LtGV28Wjb9X10/2x882pcDs0CTeNFv+gAjBgzZKZiRNe57Qq17TSyyipv/2VESb0ozPtp/P/PJBJwfSRmIcmsvaQsV vC/sh60q vB3QJM4ZLbXCi+cUXuuU8YaSMDC9tQrevyGNreDfuhjgmn0XoRik/Fz96vPPGrJYGgrHllBYu0gajxRbxL4GbvBEKRL92E4UDxANAhj2QX94q7lWUTN8wfqOXYRnrm7iWwkFeo83yg4Om8xcciKxe2ZvIejdwnHB6ktfpeGdmI6gw/7Jahy0IGlse0zCcU3Smp2aU9aHY1JQpNrFmPLCr/4Sk9a/xt9WhRXn71WfG8PNWV5+xyzCWjRve9xBUrjBNPuJMUJN9UBArsdp73WyXPG/bqQ== 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: Add PF_KCOMPACTD flag and current_is_kcompactd() helper to check for it so nfs_release_folio() can skip calling nfs_wb_folio() from kcompactd. Otherwise NFS can deadlock waiting for kcompactd enduced writeback which recurses back to NFS (which triggers writeback to NFSD via NFS loopback mount on the same host, NFSD blocks waiting for XFS's call to __filemap_get_folio): 6070.550357] INFO: task kcompactd0:58 blocked for more than 4435 seconds. {--- [58] "kcompactd0" [<0>] folio_wait_bit+0xe8/0x200 [<0>] folio_wait_writeback+0x2b/0x80 [<0>] nfs_wb_folio+0x80/0x1b0 [nfs] [<0>] nfs_release_folio+0x68/0x130 [nfs] [<0>] split_huge_page_to_list_to_order+0x362/0x840 [<0>] migrate_pages_batch+0x43d/0xb90 [<0>] migrate_pages_sync+0x9a/0x240 [<0>] migrate_pages+0x93c/0x9f0 [<0>] compact_zone+0x8e2/0x1030 [<0>] compact_node+0xdb/0x120 [<0>] kcompactd+0x121/0x2e0 [<0>] kthread+0xcf/0x100 [<0>] ret_from_fork+0x31/0x40 [<0>] ret_from_fork_asm+0x1a/0x30 ---} Fixes: 96780ca55e3cb ("NFS: fix up nfs_release_folio() to try to release the page") Signed-off-by: Mike Snitzer --- fs/nfs/file.c | 3 ++- include/linux/compaction.h | 5 +++++ include/linux/sched.h | 2 +- mm/compaction.c | 3 +++ 4 files changed, 11 insertions(+), 2 deletions(-) v3: rebase to latest Linus tree (commit cc8a0934d099). v2: use |= to properly set PF_KCOMPACTD in kcompactd(). Also adjust subject to reflect this patch fixes a deadlock. diff --git a/fs/nfs/file.c b/fs/nfs/file.c index 1bb646752e46..033feeab8c34 100644 --- a/fs/nfs/file.c +++ b/fs/nfs/file.c @@ -29,6 +29,7 @@ #include #include #include +#include #include #include @@ -457,7 +458,7 @@ static bool nfs_release_folio(struct folio *folio, gfp_t gfp) /* If the private flag is set, then the folio is not freeable */ if (folio_test_private(folio)) { if ((current_gfp_context(gfp) & GFP_KERNEL) != GFP_KERNEL || - current_is_kswapd()) + current_is_kswapd() || current_is_kcompactd()) return false; if (nfs_wb_folio(folio->mapping->host, folio) < 0) return false; diff --git a/include/linux/compaction.h b/include/linux/compaction.h index e94776496049..7bf0c521db63 100644 --- a/include/linux/compaction.h +++ b/include/linux/compaction.h @@ -80,6 +80,11 @@ static inline unsigned long compact_gap(unsigned int order) return 2UL << order; } +static inline int current_is_kcompactd(void) +{ + return current->flags & PF_KCOMPACTD; +} + #ifdef CONFIG_COMPACTION extern unsigned int extfrag_for_order(struct zone *zone, unsigned int order); diff --git a/include/linux/sched.h b/include/linux/sched.h index 9632e3318e0d..9c15365a30c0 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h @@ -1701,7 +1701,7 @@ extern struct pid *cad_pid; #define PF_USED_MATH 0x00002000 /* If unset the fpu must be initialized before use */ #define PF_USER_WORKER 0x00004000 /* Kernel thread cloned from userspace thread */ #define PF_NOFREEZE 0x00008000 /* This thread should not be frozen */ -#define PF__HOLE__00010000 0x00010000 +#define PF_KCOMPACTD 0x00010000 /* I am kcompactd */ #define PF_KSWAPD 0x00020000 /* I am kswapd */ #define PF_MEMALLOC_NOFS 0x00040000 /* All allocations inherit GFP_NOFS. See memalloc_nfs_save() */ #define PF_MEMALLOC_NOIO 0x00080000 /* All allocations inherit GFP_NOIO. See memalloc_noio_save() */ diff --git a/mm/compaction.c b/mm/compaction.c index 12ed8425fa17..a3203d97123e 100644 --- a/mm/compaction.c +++ b/mm/compaction.c @@ -3181,6 +3181,7 @@ static int kcompactd(void *p) long default_timeout = msecs_to_jiffies(HPAGE_FRAG_CHECK_INTERVAL_MSEC); long timeout = default_timeout; + current->flags |= PF_KCOMPACTD; set_freezable(); pgdat->kcompactd_max_order = 0; @@ -3237,6 +3238,8 @@ static int kcompactd(void *p) pgdat->proactive_compact_trigger = false; } + current->flags &= ~PF_KCOMPACTD; + return 0; }