From patchwork Tue Feb 25 02:20:02 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mike Snitzer X-Patchwork-Id: 13989186 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 C5E65C021A4 for ; Tue, 25 Feb 2025 02:20:08 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 006516B007B; Mon, 24 Feb 2025 21:20:08 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id EF7196B0082; Mon, 24 Feb 2025 21:20:07 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id DBEA96B0085; Mon, 24 Feb 2025 21:20:07 -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 BF4AD6B007B for ; Mon, 24 Feb 2025 21:20:07 -0500 (EST) Received: from smtpin16.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay04.hostedemail.com (Postfix) with ESMTP id 26A911A07C1 for ; Tue, 25 Feb 2025 02:20:07 +0000 (UTC) X-FDA: 83156862054.16.B88D338 Received: from dfw.source.kernel.org (dfw.source.kernel.org [139.178.84.217]) by imf11.hostedemail.com (Postfix) with ESMTP id 7A2734000C for ; Tue, 25 Feb 2025 02:20:05 +0000 (UTC) Authentication-Results: imf11.hostedemail.com; dkim=pass header.d=kernel.org header.s=k20201202 header.b=UitmN2Ho; spf=pass (imf11.hostedemail.com: domain of snitzer@kernel.org designates 139.178.84.217 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=1740450005; 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=zeAa6aLvbkAtaRsBHbU05xyRKRY0BKMJA9MLSd2NAHE=; b=vOYuMsCGxstIODkmFYooooV76c5l5XK3DAWpdodz27ndwaUfjKGTjM8hAQJGkn2NM71HEs U4mu+XWXVpETu7Akv5UgMFLymnZUeph1R7lri4y2z4uwYFaT0u8xPI0X6vFmrET0iC2nCF 3MChiOToqS6brkPXQ2HZEhCALNFq93Y= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1740450005; a=rsa-sha256; cv=none; b=gT+8UYBW9P9CZ1w2Kqn7Mo2Bc+++kuExrfjRA3ZvUzqvkBXkPaybpkYXsZgS5dUa1/TOle vCGdSYEMJav/gX/bhkhtNBnWx/0SVZMTxGlXXNbLKZ9hfK6NZajukGW7zvd8kuzBq0ral7 I/L7RaDJzzIgHO7/qoxHn8DFdyVgNfM= ARC-Authentication-Results: i=1; imf11.hostedemail.com; dkim=pass header.d=kernel.org header.s=k20201202 header.b=UitmN2Ho; spf=pass (imf11.hostedemail.com: domain of snitzer@kernel.org designates 139.178.84.217 as permitted sender) smtp.mailfrom=snitzer@kernel.org; dmarc=pass (policy=quarantine) header.from=kernel.org Received: from smtp.kernel.org (transwarp.subspace.kernel.org [100.75.92.58]) by dfw.source.kernel.org (Postfix) with ESMTP id 70B955C600D; Tue, 25 Feb 2025 02:19:25 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id DB261C4CEE6; Tue, 25 Feb 2025 02:20:03 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1740450004; bh=5+413m+ngSS6dw6yaidAoXFdiyOOFj4mHmmkj+at7rE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=UitmN2Hor8LnbDfvmHV0O2BzM2TBJ0GRd+3hTjBEBzWCuCpJZeFYiAA29ieRZ64H9 hsHycVYwS1H6f84IBE6JqbAgB8MllAdcPoy8HIpx0lDi8pdg3CsOUEocOjV002k/Ih fwIhlgT0bmSGblcJ36wJ2rCxYJf7PhLqg1THLup5JeuKQ7qOUC7EPzht+waTexudEa oEIvJUD9G3VJEYvIeYJKjfsAa5labKH49YO6EnsiaKo6fErX95aqQA/BXaQBZXA6gy oYZ766eJa8fhD+t7/M5dMJvCKbN60JwL0Y9d00ULqcdJV+7lsO+GksjBmAQ5LItevB GEJAu9MQZQFDA== From: Mike Snitzer To: Andrew Morton Cc: Trond Myklebust , Anna Schumaker , linux-nfs@vger.kernel.org, linux-mm@kvack.org Subject: [PATCH v2 for-akpm for-6.14-rcX] NFS: fix nfs_release_folio() to not deadlock via kcompactd writeback Date: Mon, 24 Feb 2025 21:20:02 -0500 Message-ID: <20250225022002.26141-1-snitzer@kernel.org> X-Mailer: git-send-email 2.44.0 In-Reply-To: <20250225003301.25693-1-snitzer@kernel.org> References: <20250225003301.25693-1-snitzer@kernel.org> MIME-Version: 1.0 X-Rspam-User: X-Rspamd-Queue-Id: 7A2734000C X-Rspamd-Server: rspam07 X-Stat-Signature: 9ffi88jgjx7d75bgnjmm7ga4nj3yr1rf X-HE-Tag: 1740450005-744417 X-HE-Meta: U2FsdGVkX18tlMg08mN2vMgIO9IWmaclhEU/L6YQjx5rdI/G8ZgsETMjEb6QvPVKRS5Splopo+ENzt1/prLTeSBkPkkk/dR++098vnZuXl3VXHU1/brOBqBZpAgMgE8cle4TkTGh6s1kbPESHwTREIJmOlSaGAvCEZClnb1NfNk8fo0oENMYzHB7IuZPTQDDClexXZcii//yrjUMUIbpia4vAeGkp01jPu/NN19nPT65pBbMnHBWXYHbn2VQ3a51eDiTMKHIAmRHQuXTRnjr8zJlOWSER+TKmSZyn7YhQ19UUFIZYmPq9yb+znRk2zUWBLOvYidXhlLAr/BzZKxsDaLEHrGWpHkakne7V7iHRPJB3peI3QIZcRP4dL8RTLAvGsAeTODFn2C7lMzhRgZnqjtbDuaMONiXWhzE16IEalSzOsaixKTPsMr/M2n5b0XjcwxgN1Uh93uG9MPEHCcMtAQFJsL6CAi156YCmajD+qBUt4RjyMlhoVe/OA8+pDzJB9XHhxIroDChbop2si97I0oTs6hUN4b6+b/qgALDYE9Xobm4As3rZ5pe65nlfy30mmD1qKo1dc6JFUkbwM7M1IXwPzK+PVMDPGBduhAuc5FMMsj9q6nXwmHMvfpL5wbDb61+Bzp/7SaXnHxJCtCgmVjKQaoJTFhVkWSkFkHF8aGrhCX78ZI5Jsnu1X8XgOaiUrBvck8vDmT9N7xDNaO01FJXl9cjYNVamNr4itg4FoGeTibw2daZ32mXPpW5/F62B8T7UWd1nbegz+hEmMJwyva/C16QEQvcPZQ4r+G3mGVYviDaj4r0heDiVD5qPGRj2Ck4O1J2V172cP4qo+KFVgLkjS0ViNo0oUvAa9JEDK4Ue6Avn1HKzshG0Mmbco9jJ+7wbWh6X3V/338IsMSY+TTXfHmMI1jWdhzlW1u+Qu8YZBXwApV5wkb5JhbaPpytCyh9bjBEQkOxwT4O1f1 H8JayQ68 RnEgtIi3OAiz4X5EidiGxc513cwdhPp5xH5pFut+WzsslKcBg2jogHfcQBKDEzsDj/1RhHxYSoK63kAcCvuik6yMhcaepS3ZaEm2rmjK47R2OWMeTDf298J+EEa3kq2Ux5nXFtVgbqYNOEblPRVVT4KEntF5cOzS5cWf0/ALqJrMuaw1yE32R9fExuEe89HNW/obWM/NVHuu08oTQJM/X8Gon/xLalpCRqbMDe6RL+nh9VmlXAZwMfVjnHA2OYzMGDQWGv4w0wM0bX20ikn9hqixLXA== 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(-) 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 1bb646752e466..033feeab8c346 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 e947764960496..7bf0c521db634 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 8982820dae213..0d1d70aded38f 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h @@ -1682,7 +1682,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 384e4672998e5..836c36f9b2f00 100644 --- a/mm/compaction.c +++ b/mm/compaction.c @@ -3164,6 +3164,7 @@ static int kcompactd(void *p) if (!cpumask_empty(cpumask)) set_cpus_allowed_ptr(tsk, cpumask); + tsk->flags |= PF_KCOMPACTD; set_freezable(); pgdat->kcompactd_max_order = 0; @@ -3220,6 +3221,8 @@ static int kcompactd(void *p) pgdat->proactive_compact_trigger = false; } + tsk->flags &= ~PF_KCOMPACTD; + return 0; }