From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752634AbbIYJvi (ORCPT ); Fri, 25 Sep 2015 05:51:38 -0400 Received: from mailout1.samsung.com ([203.254.224.24]:41534 "EHLO mailout1.samsung.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751470AbbIYJvg (ORCPT ); Fri, 25 Sep 2015 05:51:36 -0400 X-AuditID: cbfee61a-f79a06d000005c6f-47-56051927da32 From: Chao Yu To: Jaegeuk Kim Cc: linux-f2fs-devel@lists.sourceforge.net, linux-kernel@vger.kernel.org Subject: [PATCH v2] f2fs: fix to correct freed section number during gc Date: Fri, 25 Sep 2015 17:50:55 +0800 Message-id: <01c001d0f777$c4c973d0$4e5c5b70$@samsung.com> MIME-version: 1.0 Content-type: text/plain; charset=us-ascii Content-transfer-encoding: 7bit X-Mailer: Microsoft Outlook 14.0 Thread-index: AdD3d1797arI0l2xRMKZ9S6x5jsH4w== Content-language: zh-cn X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFjrNLMWRmVeSWpSXmKPExsVy+t9jAV11SdYwg32rhC2erJ/FbHFpkbvF 5V1z2ByYPTat6mTz2L3gM5PH501yAcxRXDYpqTmZZalF+nYJXBldPW4FHwQrLu36zNbAOJmv i5GTQ0LARGLjh7nMELaYxIV769m6GLk4hASWMkq82nyDBcJ5xShxcOt6dpAqNgEVieUd/5lA bBEg+9Ciy2BxZgEPicaO76wgtrCAu0Tjg6lgNouAqsTx/71gG3gFLCX2zGxgh7AFJX5MvscC 0aslsX7ncSYIW15i85q3UBcpSOw4+5oRYpeeRMvtJVA14hIbj9ximcAoMAvJqFlIRs1CMmoW kpYFjCyrGCVSC5ILipPScw3zUsv1ihNzi0vz0vWS83M3MYKD+JnUDsaDu9wPMQpwMCrx8Cq0 soQJsSaWFVfmHmKU4GBWEuGt+gMU4k1JrKxKLcqPLyrNSS0+xCjNwaIkznvjEEOYkEB6Yklq dmpqQWoRTJaJg1OqgVFhGRPT9fX1ax4oqLK7zBPRUJK+yxfyqzhEvbx+XcuynL7LLfZlE9Oj VUIudevals+bfuwsJ4dX06MVSfd0Xn510N4TO+kTr7aWXkayoZX2p0lfJJM4b0y+NjX+Kx/T mWnPuL7c2dtSpBp6jcFjZXtqLZeEhYPawj3umTFdN5JP1itbeojsUmIpzkg01GIuKk4EABv0 VMReAgAA Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org This patch fixes to maintain the right section count freed in garbage collecting when triggering a foreground gc. Besides, when a foreground gc is running on current selected section, once we fail to gc one segment, it's better to abandon gcing the left segments in current section, because anyway we will select next victim for foreground gc, so gc on the left segments in previous section will become overhead and also cause the long latency for caller. Signed-off-by: Chao Yu --- v2: o avoid calc the wrong value when freed segments across sections. fs/f2fs/gc.c | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/fs/f2fs/gc.c b/fs/f2fs/gc.c index e932740..256ebd4 100644 --- a/fs/f2fs/gc.c +++ b/fs/f2fs/gc.c @@ -802,7 +802,7 @@ int f2fs_gc(struct f2fs_sb_info *sbi) unsigned int segno = NULL_SEGNO; unsigned int i; int gc_type = BG_GC; - int nfree = 0; + int sec_freed = 0, seg_freed; int ret = -1; struct cp_control cpc; struct gc_inode_list gc_list = { @@ -817,7 +817,7 @@ gc_more: if (unlikely(f2fs_cp_error(sbi))) goto stop; - if (gc_type == BG_GC && has_not_enough_free_secs(sbi, nfree)) { + if (gc_type == BG_GC && has_not_enough_free_secs(sbi, sec_freed)) { gc_type = FG_GC; if (__get_victim(sbi, &segno, gc_type) || prefree_segments(sbi)) write_checkpoint(sbi, &cpc); @@ -833,13 +833,25 @@ gc_more: ra_meta_pages(sbi, GET_SUM_BLOCK(sbi, segno), sbi->segs_per_sec, META_SSA); - for (i = 0; i < sbi->segs_per_sec; i++) - nfree += do_garbage_collect(sbi, segno + i, &gc_list, gc_type); + for (i = 0, seg_freed = 0; i < sbi->segs_per_sec; i++) { + /* + * for FG_GC case, halt gcing left segments once failed one + * of segments in selected section to avoid long latency. + */ + if (!do_garbage_collect(sbi, segno + i, &gc_list, gc_type) && + gc_type == FG_GC) + break; + if (gc_type == FG_GC) + seg_freed++; + } + + if (seg_freed == sbi->segs_per_sec) + sec_freed++; if (gc_type == FG_GC) sbi->cur_victim_sec = NULL_SEGNO; - if (has_not_enough_free_secs(sbi, nfree)) + if (has_not_enough_free_secs(sbi, sec_freed)) goto gc_more; if (gc_type == FG_GC) -- 2.5.2