From nobody Sat Feb 7 21:24:29 2026 Received: from mail-pg1-f179.google.com (mail-pg1-f179.google.com [209.85.215.179]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D86F6322DBB for ; Tue, 30 Dec 2025 17:38:50 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.179 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767116332; cv=none; b=F1NvGnlxsAJWwIJEeMfcZ88LySG3bzTP/LkEjDjX7tDyZUEev2Dvvx91GIda6yr7wv84EIR0FDd7v9jYtb+A7yRK+/RSqfMW+Y6Dp/VmY/YhnTXR4Ndhk03X5PfyG/zZ6mKEFP3wbY7XBynM6aYf1/cpmADlAS5voPOhyYCTYfo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767116332; c=relaxed/simple; bh=p91+R+xDejVouUMc/ATUnraYOvVQ7JlwVw0J940zKNk=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=AbzNyP8BdLPUtny7Uuhf0OAfV4nWaWEWX9fvyB+fWV7eNwxtrkwA1WDVST9ChIIdcY5Jf7c0CuKzQezJlpuk2h4UnqJPjecsi3f1/aqlMYgwx7X/48k/rw0SYQrJny333ODcYJFtrBLFAy/bDZ2m1/rHnkB0v9ocBroXrZgBMs8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=beiHds6M; arc=none smtp.client-ip=209.85.215.179 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="beiHds6M" Received: by mail-pg1-f179.google.com with SMTP id 41be03b00d2f7-c1cf2f0523eso7047755a12.3 for ; Tue, 30 Dec 2025 09:38:50 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1767116330; x=1767721130; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=Qxdt/kyhf3WYbLmjM9uI+Ex5hbzqYjgcy6n4m4nmiV0=; b=beiHds6MSvKFXkX+z/TfS3vuO0U1QT+PF07p7y4YUhGBqZLcLGrHBPjf+wzEniAfXv GOBur/65FvdARVXjo8SbrS8DHmbEfClB5dRqpjLqk8lMm0th+Vc2IrPtxW3y9YKX465f 89Z4bqIa645l3Jj9jX7MA4qHHn3Y+kt+XaxUP5HniPDySO189B3xmXAM4nq18kMbjAz0 clPjURidxYBOtdu6wZSxqYB9PQx8He5gAMB6Rte6v+DqkQ7tlq/Rc03SsacIRwlqwwOl lJsNed+9ofxoIoJUFgqfIXnVrgvBT2YJ1fbdupdquFqyn602gECTxQ0LW76O0FPWheYn gJyQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1767116330; x=1767721130; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=Qxdt/kyhf3WYbLmjM9uI+Ex5hbzqYjgcy6n4m4nmiV0=; b=DDQHIYmL9vbfhZvdIASAqLx6F4ZHIo3RDDt7yjpiyIrRzylkaY3o+YRkVRWSxhzxrZ xbwS2+0kw0QkX/xf2RkR31ImP1C2jnqgAGFnCWJOec6WOylA6uMHIFT0CXuVuAOK0U/1 BjUG1Wjhud/5IqTUZ4Fm4zvYHYoIPHNcQwHhTZb/fHIeVUo5A04wr9fxjt5xQVLFF9o/ OOBvSRktZ8naPv2mF8BgIajUKsLJbmYP5s2uUCxPEP5v8BiAYkGS9ghy80tdY23PsJCl 0d6HBzhRelUwWfxrSFK4ucXtKMhB+QElpmtCVSeyfMRSBv2P/K3kudEzbmHkQY04lzBV 7T7A== X-Gm-Message-State: AOJu0YwCDLgaPbZIx1atmGmYKOVd7tEYlv9GODp6/ysKozXc64F91UG7 EJBAQrMSehUoNfgk4hLfLDGvtMmxEch6DDnRoPbKDFBDqM0vHCbC5h/GZAv4+Q== X-Gm-Gg: AY/fxX5gVecI3W6fjZvolMWT+VHmnb6DX85oIGpcuzpma8K2+kLsPIQTWe0L7br/bp5 lWd0PA4c5vQwXIrTBvG/BE85se7bEVlEBHdbpSca4K23HBrZ+KUScYmo+8cqzqplPLrHTa8WxOU rYX6wM64OQsUiLVLGXAQaQ4mbgw2L3593FyRCQ6OVo5NIKM4I6Rcs3drUZAkJWsPow68vtKq0cw +YGQSruhFy04IdiDjcqAvIxQDOT7pYOILVjCtoFGjgWeiFriDzZ1Gs111RYyod85q/9eQZLaJq/ ua5wxJhw7AVImVA+ZfJLoGUEoTL+L9NznxzJZJ4MhURFljSPYSLyddO14W1fWvLfb65a6tr5678 +tuUbccc6bgRnaFZDyworEJbxyLoc+Jru2KNVFLjyF9+REyrIf9uF6S8jxK4qBHrE9YxUedQmhR elei7Ee9U4fOt+xzNd8ZqRImOh7Be3+MEj2decfmnGZeW4lxRul9gwjMOfIRSfD+GqliHx+7+0L b3iIVasMJ1DG+s1vWgRICe2gwQsjhUOzFzVn+k= X-Google-Smtp-Source: AGHT+IFTUkXUvgYWbhaTsv6NeMktSYxRYi7p1BYVBdEvXjZG6+sP03VtFmAdzxRknHKuawXSydq/9Q== X-Received: by 2002:a05:7300:de07:b0:2ae:51ae:5cf3 with SMTP id 5a478bee46e88-2b05ebd0d80mr26034218eec.6.1767116329634; Tue, 30 Dec 2025 09:38:49 -0800 (PST) Received: from daehojeong-desktop.mtv.corp.google.com ([2a00:79e0:2e7c:8:3f02:5aba:72e2:8c51]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-2b05ffd5f86sm73202579eec.5.2025.12.30.09.38.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 30 Dec 2025 09:38:49 -0800 (PST) From: Daeho Jeong To: linux-kernel@vger.kernel.org, linux-f2fs-devel@lists.sourceforge.net, kernel-team@android.com Cc: Daeho Jeong Subject: [PATCH] f2fs: flush plug periodically during GC to maximize readahead effect Date: Tue, 30 Dec 2025 09:38:45 -0800 Message-ID: <20251230173845.2310677-1-daeho43@gmail.com> X-Mailer: git-send-email 2.52.0.351.gbe84eed79e-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" From: Daeho Jeong During the garbage collection process, F2FS submits readahead I/Os for valid blocks. However, since the GC loop runs within a single plug scope without intermediate flushing, these readahead I/Os often accumulate in the block layer's plug list instead of being dispatched to the device immediately. Consequently, when the GC thread attempts to lock the page later, the I/O might not have completed (or even started), leading to a "read try and wait" scenario. This negates the benefit of readahead and causes unnecessary delays in GC latency. This patch addresses this issue by introducing an intermediate blk_finish_plug() and blk_start_plug() pair within the GC loop. This forces the dispatch of pending I/Os, ensuring that readahead pages are fetched in time, thereby reducing GC latency. Signed-off-by: Daeho Jeong Reviewed-by: Chao Yu --- fs/f2fs/gc.c | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/fs/f2fs/gc.c b/fs/f2fs/gc.c index 384fa7e2085b..8ffc3d4f7989 100644 --- a/fs/f2fs/gc.c +++ b/fs/f2fs/gc.c @@ -1031,7 +1031,8 @@ static int check_valid_map(struct f2fs_sb_info *sbi, * ignore that. */ static int gc_node_segment(struct f2fs_sb_info *sbi, - struct f2fs_summary *sum, unsigned int segno, int gc_type) + struct f2fs_summary *sum, unsigned int segno, int gc_type, + struct blk_plug *plug) { struct f2fs_summary *entry; block_t start_addr; @@ -1100,8 +1101,11 @@ static int gc_node_segment(struct f2fs_sb_info *sbi, stat_inc_node_blk_count(sbi, 1, gc_type); } =20 - if (++phase < 3) + if (++phase < 3) { + blk_finish_plug(plug); + blk_start_plug(plug); goto next_step; + } =20 if (fggc) atomic_dec(&sbi->wb_sync_req[NODE]); @@ -1535,7 +1539,7 @@ static int move_data_page(struct inode *inode, block_= t bidx, int gc_type, */ static int gc_data_segment(struct f2fs_sb_info *sbi, struct f2fs_summary *= sum, struct gc_inode_list *gc_list, unsigned int segno, int gc_type, - bool force_migrate) + bool force_migrate, struct blk_plug *plug) { struct super_block *sb =3D sbi->sb; struct f2fs_summary *entry; @@ -1703,8 +1707,11 @@ static int gc_data_segment(struct f2fs_sb_info *sbi,= struct f2fs_summary *sum, } } =20 - if (++phase < 5) + if (++phase < 5) { + blk_finish_plug(plug); + blk_start_plug(plug); goto next_step; + } =20 return submitted; } @@ -1853,11 +1860,11 @@ static int do_garbage_collect(struct f2fs_sb_info *= sbi, */ if (type =3D=3D SUM_TYPE_NODE) submitted +=3D gc_node_segment(sbi, sum->entries, - cur_segno, gc_type); + cur_segno, gc_type, &plug); else submitted +=3D gc_data_segment(sbi, sum->entries, gc_list, cur_segno, - gc_type, force_migrate); + gc_type, force_migrate, &plug); =20 stat_inc_gc_seg_count(sbi, data_type, gc_type); sbi->gc_reclaimed_segs[sbi->gc_mode]++; --=20 2.52.0.351.gbe84eed79e-goog