From: Zi Yan <ziy@nvidia.com>
To: Chao Yu <chao@kernel.org>, Jaegeuk Kim <jaegeuk@kernel.org>,
Daeho Jeong <daehojeong@google.com>
Cc: linux-f2fs-devel@lists.sourceforge.net,
linux-kernel@vger.kernel.org,
Andrew Morton <akpm@linux-foundation.org>
Subject: Re: [PATCH v4 00/16] Remove PG_private by using page/folio->private checks instead
Date: Tue, 15 Sep 2026 14:18:09 -0400 [thread overview]
Message-ID: <862E7DC4-14D6-48AE-87C8-11664354718C@nvidia.com> (raw)
In-Reply-To: <20260913203959.6b46b0b5a052aec818a7f267@linux-foundation.org>
On 13 Sep 2026, at 23:39, Andrew Morton wrote:
> On Sun, 13 Sep 2026 22:23:58 -0400 Zi Yan <ziy@nvidia.com> wrote:
>
>> This patchset removes PG_private to make space for upcoming PG_folio for
>> identifying pages from a folio (more details in Note below). Instead of
>> checking PG_private, all code is changed to check page/folio->private !=
>> NULL instead.
>>
>> MM people are cc'd on all patches and subsystem people are cc'd on the
>> cover letter and corresponding patches.
>>
>> Patch 6 is picked up separately in f2fs tree, but since mm-new does not
>> have it yet, it is sent for MM testing.
>
> AI review claims to have found a pre-existing critical level deadlock
> in f2fs:
>
> https://sashiko.dev/#/patchset/20260913-remove-pg_private-v4-0-848550f7574e@nvidia.com
>
drop non f2fs people and lists
Hi Chao, Jaegeuk, and Daeho,
I used LLM locally and discovered the deadlock issue in f2fs (sashiko's report
is overwritten. The fix is below, let me know your thoughts. Thanks.
It applies on top of my other f2fs patches.
From f0c1e94d229a97614738d5c317187bf42a3ff2b2 Mon Sep 17 00:00:00 2001
From: Zi Yan <ziy@nvidia.com>
Date: Tue, 15 Sep 2026 13:43:35 -0400
Subject: [PATCH] f2fs: fix potential deadlocks in cancel_cluster_writeback()
When f2fs_write_compressed_pages() fails to submit a compressed page, it
calls cancel_cluster_writeback() to end writeback and lock all pages.
cancel_cluster_writeback() relocks unlocked folios in [0, submitted), while
still holding the locks of the folios in [submitted, cluster_size).
The folio locks are no longer held in order of ascending index, violating
the requirement of folio_lock().
cancel_cluster_writeback() also ends folio writeback after taking its lock
for folios in [0, submitted). A deadlock can happen if one like
truncate_inode_pages_range() takes the folio lock and is waiting for the
completion of folio writeback forever.
Fix both by ending writeback and dropping all folio locks first, then
retaking them in ascending index order.
Fixes: 2174035a7f11 ("f2fs: clear writeback when compression failed")
Cc: stable@vger.kernel.org
Assisted-by: LLM
Signed-off-by: Zi Yan <ziy@nvidia.com>
To: Jaegeuk Kim <jaegeuk@kernel.org>
To: Chao Yu <chao@kernel.org>
To: Daeho Jeong <daehojeong@google.com>
Cc: linux-f2fs-devel@lists.sourceforge.net
Cc: linux-kernel@vger.kernel.org
---
fs/f2fs/compress.c | 20 +++++++++++++++-----
1 file changed, 15 insertions(+), 5 deletions(-)
diff --git a/fs/f2fs/compress.c b/fs/f2fs/compress.c
index 09d9b8d0fdcce..88797dedc96bf 100644
--- a/fs/f2fs/compress.c
+++ b/fs/f2fs/compress.c
@@ -1062,18 +1062,28 @@ static void cancel_cluster_writeback(struct compress_ctx *cc,
f2fs_io_schedule_timeout(DEFAULT_SCHEDULE_TIMEOUT);
}
- /* Cancel writeback and stay locked. */
+ /*
+ * Cancel writeback and lock every folio in the cluster.
+ * Drop the locks on [submitted, cluster_size) before retaking dropped
+ * locks on [0, submitted) to prevent deadlocks.
+ */
for (i = 0; i < cc->cluster_size; i++) {
struct folio *folio = page_folio(cc->rpages[i]);
- if (i < submitted) {
+ if (i < submitted)
inode_inc_dirty_pages(cc->inode);
- folio_lock(folio);
- }
- folio_clear_f2fs_gcing(folio);
+ else
+ folio_unlock(folio);
if (folio_test_writeback(folio))
folio_end_writeback(folio);
}
+ /* Retake all folio locks in ascending order */
+ for (i = 0; i < cc->cluster_size; i++) {
+ struct folio *folio = page_folio(cc->rpages[i]);
+
+ folio_lock(folio);
+ folio_clear_f2fs_gcing(folio);
+ }
}
static void set_cluster_dirty(struct compress_ctx *cc)
--
2.53.0
Best Regards,
Yan, Zi
next prev parent reply other threads:[~2026-09-15 18:18 UTC|newest]
Thread overview: 42+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-14 2:23 Zi Yan
2026-09-14 2:23 ` [PATCH v4 01/16] mm/zsmalloc: replace PG_private with pointer comparison Zi Yan
2026-09-14 2:24 ` [PATCH v4 02/16] perf/ring_buffer: stop using PG_private as AUX page high-order marker Zi Yan
2026-09-14 2:24 ` [PATCH v4 03/16] xen/grant-table: stop setting PG_private on pages for grant mapping Zi Yan
2026-09-14 13:15 ` David Hildenbrand (Arm)
2026-09-14 2:24 ` [PATCH v4 04/16] fscrypt: stop setting PG_private on bounce page Zi Yan
2026-09-14 2:24 ` [PATCH v4 05/16] mm/hugetlb: use direct assignment instead of folio_change_private() Zi Yan
2026-09-14 2:58 ` Muchun Song
2026-09-14 13:16 ` David Hildenbrand (Arm)
2026-09-16 1:56 ` Zi Yan
2026-09-16 6:12 ` David Hildenbrand (Arm)
2026-09-18 1:41 ` Zi Yan
2026-09-18 3:13 ` Muchun Song
2026-09-14 2:24 ` [PATCH v4 06/16] f2fs: stop using PG_private Zi Yan
2026-09-14 13:17 ` David Hildenbrand (Arm)
2026-09-14 2:24 ` [PATCH v4 07/16] f2fs: convert the ->private flag helpers to folio-only Zi Yan
2026-09-16 2:20 ` Zi Yan
2026-09-14 2:24 ` [PATCH v4 08/16] erofs: mm/pagemap: add readahead_folio_last() to avoid folio->private Zi Yan
2026-09-14 2:24 ` [PATCH v4 09/16] erofs: use folio_attach/detach_private() instead of direct assignment Zi Yan
2026-09-14 13:18 ` David Hildenbrand (Arm)
2026-09-14 2:24 ` [PATCH v4 10/16] mm/page-flags: check page/folio->private instead of PG_private Zi Yan
2026-09-14 13:26 ` David Hildenbrand (Arm)
2026-09-14 14:44 ` Zi Yan
2026-09-14 15:11 ` David Hildenbrand (Arm)
2026-09-14 15:21 ` Zi Yan
2026-09-14 2:24 ` [PATCH v4 11/16] treewide: remove folio_set/clear_private() usage Zi Yan
2026-09-14 2:24 ` [PATCH v4 12/16] ceph: replace PagePrivate() with page_private() Zi Yan
2026-09-14 13:26 ` David Hildenbrand (Arm)
2026-09-14 2:24 ` [PATCH v4 13/16] md/md-bitmap: " Zi Yan
2026-09-14 2:24 ` [PATCH v4 14/16] buffer: replace page_buffer() with page_private() and delete it Zi Yan
2026-09-14 2:24 ` [PATCH v4 15/16] treewide: remove PagePrivate() and PG_private from comments and docs Zi Yan
2026-09-14 13:36 ` David Hildenbrand (Arm)
2026-09-14 2:24 ` [PATCH v4 16/16] mm/page-flags: remove PG_private Zi Yan
2026-09-14 2:47 ` sashiko-bot
2026-09-14 13:37 ` David Hildenbrand (Arm)
2026-09-14 13:38 ` David Hildenbrand (Arm)
2026-09-14 3:39 ` [PATCH v4 00/16] Remove PG_private by using page/folio->private checks instead Andrew Morton
2026-09-15 17:16 ` Zi Yan
2026-09-15 18:18 ` Zi Yan [this message]
2026-09-14 4:21 ` Matthew Wilcox
2026-09-14 13:10 ` David Hildenbrand (Arm)
2026-09-14 15:30 ` [f2fs-dev] " patchwork-bot+f2fs
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=862E7DC4-14D6-48AE-87C8-11664354718C@nvidia.com \
--to=ziy@nvidia.com \
--cc=akpm@linux-foundation.org \
--cc=chao@kernel.org \
--cc=daehojeong@google.com \
--cc=jaegeuk@kernel.org \
--cc=linux-f2fs-devel@lists.sourceforge.net \
--cc=linux-kernel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®