From nobody Wed Oct 1 21:27:11 2025 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3CDC82D5934 for ; Sun, 28 Sep 2025 09:20:58 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759051259; cv=none; b=aN60I7ag626KUhnCwJdKekNXepNYwG66E6zOufTx5KNg+rS49fF4mG8eUjsP47ST4Eolw9J9Xv6kMxBW5y4LKqboz5N+/0FfrfTwCd5VWHNHcW21AdSOBo7hvOzmSmSGZyJYKBidB7bd7oKeXr7HQxRIjo2Wnqi3iH8ndHllH2U= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1759051259; c=relaxed/simple; bh=HGSCBqF0nvehYR+QitbLZiNNu/TWckHchcmeVXOC/Nc=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=qG+9lrxIWy0PYb/2zBhlPULg6fidy5g+M6ZCxr718pO3hwk23uQmygyKL2KWjXHsF6f6JOISH05i1xdxgR+KdgurqyfE0ZCPybRlwuHAQTbA/ZI7NcMgtTaeqAQ8ubdVpJWbHEpKu3a/hRSauBlPiaVIjH8jgBBa5EqOGtKBtQY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=VaxlDwFT; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="VaxlDwFT" Received: by smtp.kernel.org (Postfix) with ESMTPSA id C9EA1C4CEF0; Sun, 28 Sep 2025 09:20:57 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1759051258; bh=HGSCBqF0nvehYR+QitbLZiNNu/TWckHchcmeVXOC/Nc=; h=From:To:Cc:Subject:Date:From; b=VaxlDwFTKd+5LjXs2erIuWRg6NXFgMX4ZNe8FXYTjGgpFIH/D3iSzGg3tQDYCuFgL pXijOmFW9YAkfAXXDhSbaviAgxnhVbbq4YkCBe/IXkaXyziIIcpLFgLzT7i+ms6XuB /7QeihPc8qd4QVb8J9RsE5cTMAOY9Iu3mqtdNWVaGiIvi/IcAFY8HMszwlzAwUhrza 8dbZ6q3sb55+nJ8mGcmMST6DssfwK70eF2bn9IsoZjszOZEA6NbTMFx4iKveuo5BGL RaUtkAcKLsPMm3kS3P62M1duPnSJpo2Vpr/y02gbulA6zPA04YcapHqujdz+E0Mw3L fysAUVdZC3HHA== From: Chao Yu To: jaegeuk@kernel.org Cc: linux-f2fs-devel@lists.sourceforge.net, linux-kernel@vger.kernel.org, Chao Yu Subject: [PATCH RFC] f2fs: freeze fs operations during f2fs_enable_checkpoint() Date: Sun, 28 Sep 2025 17:20:50 +0800 Message-ID: <20250928092050.287779-1-chao@kernel.org> X-Mailer: git-send-email 2.51.0.536.g15c5d4f767-goog Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" If there are too many background IOs during f2fs_enable_checkpoint(), sync_inodes_sb() may be blocked for long time due to it will loop to write dirty datas which are generated by in parallel write() continuously. Let's change as below to resolve this issue: - freeze fs operations to avoid race condition - decrease DEF_ENABLE_INTERVAL from 16 to 5 In addition, dump more logs during f2fs_enable_checkpoint(). Testcase: 1. fill data to dirty filesystem 2. mount -o remount,checkpoint=3Ddisable:10% /data 3. fio --rw=3Drandwrite --bs=3D4kb --size=3D1GB --numjobs=3D10 \ --iodepth=3D64 --ioengine=3Dpsync --time_based --runtime=3D600 & 4. mount -o remount,checkpoint=3Denable /data Before: F2FS-fs (dm-51): f2fs_enable_checkpoint() finishes, writeback:7232, sync:39= 793, cp:457 After: F2FS-fs (dm-51): f2fs_enable_checkpoint() finishes, writeback:5945, lock:28= , sync:9289, cp:0, 434, 0 Signed-off-by: Chao Yu --- fs/f2fs/f2fs.h | 2 +- fs/f2fs/super.c | 49 +++++++++++++++++++++++++++++++++++++++++-------- 2 files changed, 42 insertions(+), 9 deletions(-) diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h index c4a197c4d804..060a4603a779 100644 --- a/fs/f2fs/f2fs.h +++ b/fs/f2fs/f2fs.h @@ -281,7 +281,7 @@ enum { #define DEF_CP_INTERVAL 60 /* 60 secs */ #define DEF_IDLE_INTERVAL 5 /* 5 secs */ #define DEF_DISABLE_INTERVAL 5 /* 5 secs */ -#define DEF_ENABLE_INTERVAL 16 /* 16 secs */ +#define DEF_ENABLE_INTERVAL 5 /* 5 secs */ #define DEF_DISABLE_QUICK_INTERVAL 1 /* 1 secs */ #define DEF_UMOUNT_DISCARD_TIMEOUT 5 /* 5 secs */ =20 diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c index 1e0678e37a30..dfdd3c3795a2 100644 --- a/fs/f2fs/super.c +++ b/fs/f2fs/super.c @@ -2626,12 +2626,25 @@ static int f2fs_disable_checkpoint(struct f2fs_sb_i= nfo *sbi) return err; } =20 +static void f2fs_freeze_operations(struct super_block *sb) +{ + percpu_down_write(sb->s_writers.rw_sem + SB_FREEZE_WRITE - 1); + percpu_down_write(sb->s_writers.rw_sem + SB_FREEZE_PAGEFAULT - 1); +} + +static void f2fs_unfreeze_operations(struct super_block *sb) +{ + percpu_up_write(sb->s_writers.rw_sem + SB_FREEZE_PAGEFAULT - 1); + percpu_up_write(sb->s_writers.rw_sem + SB_FREEZE_WRITE - 1); +} + static void f2fs_enable_checkpoint(struct f2fs_sb_info *sbi) { unsigned int nr_pages =3D get_pages(sbi, F2FS_DIRTY_DATA) / 16; - long long start, writeback, end; + long long start, writeback, lock, sync_inode, end; =20 - f2fs_info(sbi, "f2fs_enable_checkpoint() starts, meta: %lld, node: %lld, = data: %lld", + f2fs_info(sbi, "%s start, meta: %lld, node: %lld, data: %lld", + __func__, get_pages(sbi, F2FS_DIRTY_META), get_pages(sbi, F2FS_DIRTY_NODES), get_pages(sbi, F2FS_DIRTY_DATA)); @@ -2650,11 +2663,18 @@ static void f2fs_enable_checkpoint(struct f2fs_sb_i= nfo *sbi) } writeback =3D ktime_get(); =20 - sync_inodes_sb(sbi->sb); + f2fs_freeze_operations(sbi->sb); + + lock =3D ktime_get(); + + if (get_pages(sbi, F2FS_DIRTY_DATA)) + sync_inodes_sb(sbi->sb); =20 if (unlikely(get_pages(sbi, F2FS_DIRTY_DATA))) - f2fs_warn(sbi, "checkpoint=3Denable has some unwritten data: %lld", - get_pages(sbi, F2FS_DIRTY_DATA)); + f2fs_warn(sbi, "%s: has some unwritten data: %lld", + __func__, get_pages(sbi, F2FS_DIRTY_DATA)); + + sync_inode =3D ktime_get(); =20 f2fs_down_write(&sbi->gc_lock); f2fs_dirty_to_prefree(sbi); @@ -2663,16 +2683,29 @@ static void f2fs_enable_checkpoint(struct f2fs_sb_i= nfo *sbi) set_sbi_flag(sbi, SBI_IS_DIRTY); f2fs_up_write(&sbi->gc_lock); =20 + f2fs_info(sbi, "%s sync_fs, meta: %lld, imeta: %lld, node: %lld, dents: %= lld, qdata: %lld", + __func__, + get_pages(sbi, F2FS_DIRTY_META), + get_pages(sbi, F2FS_DIRTY_IMETA), + get_pages(sbi, F2FS_DIRTY_NODES), + get_pages(sbi, F2FS_DIRTY_DENTS), + get_pages(sbi, F2FS_DIRTY_QDATA)); f2fs_sync_fs(sbi->sb, 1); =20 /* Let's ensure there's no pending checkpoint anymore */ f2fs_flush_ckpt_thread(sbi); =20 + f2fs_unfreeze_operations(sbi->sb); + end =3D ktime_get(); =20 - f2fs_info(sbi, "f2fs_enable_checkpoint() finishes, writeback:%llu, sync:%= llu", - ktime_ms_delta(writeback, start), - ktime_ms_delta(end, writeback)); + f2fs_info(sbi, "%s end, writeback:%llu, " + "lock:%llu, sync_inode:%llu, sync_fs:%llu", + __func__, + ktime_ms_delta(writeback, start), + ktime_ms_delta(lock, writeback), + ktime_ms_delta(sync_inode, lock), + ktime_ms_delta(end, sync_inode)); } =20 static int __f2fs_remount(struct fs_context *fc, struct super_block *sb) --=20 2.49.0