When f2fs issues discard command, if segment is contiguous, let's issue more large segment to gather adjacent segments.
** blktrace ** 179,1 0 5859 42.619023770 971 C D 131072 + 2097152 [0] 179,1 0 33665 108.840475468 971 C D 2228224 + 2494464 [0] 179,1 0 33671 109.131616427 971 C D 14909440 + 344064 [0] 179,1 0 33677 109.137100677 971 C D 15261696 + 4096 [0] Signed-off-by: Changman Lee <cm224....@samsung.com> --- fs/f2fs/segment.c | 40 ++++++++++++++++++++++++++++++++++------ 1 file changed, 34 insertions(+), 6 deletions(-) diff --git a/fs/f2fs/segment.c b/fs/f2fs/segment.c index b7186a3..09f1375 100644 --- a/fs/f2fs/segment.c +++ b/fs/f2fs/segment.c @@ -141,8 +141,12 @@ void clear_prefree_segments(struct f2fs_sb_info *sbi) struct dirty_seglist_info *dirty_i = DIRTY_I(sbi); unsigned int segno = -1; unsigned int total_segs = TOTAL_SEGS(sbi); + bool init = true; + int count = 0; + int start_segno, prev_segno; mutex_lock(&dirty_i->seglist_lock); + while (1) { segno = find_next_bit(dirty_i->dirty_segmap[PRE], total_segs, segno + 1); @@ -152,15 +156,39 @@ void clear_prefree_segments(struct f2fs_sb_info *sbi) if (test_and_clear_bit(segno, dirty_i->dirty_segmap[PRE])) dirty_i->nr_dirty[PRE]--; - /* Let's use trim */ - if (test_opt(sbi, DISCARD)) - blkdev_issue_discard(sbi->sb->s_bdev, - START_BLOCK(sbi, segno) << + if (init) { + init = false; + start_segno = segno; + prev_segno = segno; + count = 1; + continue; + } + + if (segno == prev_segno + 1) { + count++; + prev_segno = segno; + } else { + if (test_opt(sbi, DISCARD)) + blkdev_issue_discard(sbi->sb->s_bdev, + START_BLOCK(sbi, start_segno) << sbi->log_sectors_per_block, - 1 << (sbi->log_sectors_per_block + - sbi->log_blocks_per_seg), + (1 << (sbi->log_sectors_per_block + + sbi->log_blocks_per_seg)) * count, GFP_NOFS, 0); + start_segno = segno; + prev_segno = segno; + count = 1; + } } + + if (count && test_opt(sbi, DISCARD)) + blkdev_issue_discard(sbi->sb->s_bdev, + START_BLOCK(sbi, start_segno) << + sbi->log_sectors_per_block, + (1 << (sbi->log_sectors_per_block + + sbi->log_blocks_per_seg)) * count, + GFP_NOFS, 0); + mutex_unlock(&dirty_i->seglist_lock); } -- 1.7.9.5 ------------------------------------------------------------------------------ November Webinars for C, C++, Fortran Developers Accelerate application performance with scalable programming models. Explore techniques for threading, error checking, porting, and tuning. Get the most from the latest Intel processors and coprocessors. See abstracts and register http://pubads.g.doubleclick.net/gampad/clk?id=60136231&iu=/4140/ostg.clktrk _______________________________________________ Linux-f2fs-devel mailing list Linux-f2fs-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel