linux-fsdevel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Changman Lee <cm224.lee@gmail.com>
To: Jaegeuk Kim <jaegeuk@kernel.org>
Cc: Changman Lee <cm224.lee@samsung.com>,
	"linux-fsdevel@vger.kernel.org" <linux-fsdevel@vger.kernel.org>,
	linux-f2fs-devel@lists.sourceforge.net
Subject: Re: [f2fs-dev] [PATCH] f2fs: add adaptive ssr/ipu policy as valid blocks in dirty segments
Date: Sat, 10 Jan 2015 09:56:42 +0900	[thread overview]
Message-ID: <CAN863PufYXHd9RJdc=AkirM+qvWTnkbB7cxFEJSRU60feG=ieQ@mail.gmail.com> (raw)
In-Reply-To: <20150106230700.GE54001@jaegeuk-mac02>

Hi Jaegeuk,

In this patch, it's impossible to not monitoring valid blocks from
mount time. Because we can't meet correct valid blocks when changing
policy.
I'll rethink another way.

Thanks

2015-01-07 8:07 GMT+09:00 Jaegeuk Kim <jaegeuk@kernel.org>:
> Hi Changman,
>
> On Wed, Dec 31, 2014 at 02:15:22PM +0900, Changman Lee wrote:
>> If there is not enough invalid area in dirty segments, SSR won't get any
>> gains. In the case, IPU could be better than SSR. This patch is for
>> changing write style into IPU or SSR according to valid blocks in dirty segments.
>>
>> Under 98% untilization, performance grows over 5.6%.
>>
>> [FIO randwrite performance]
>> before : 338512KB/s, 307784KB/s, 296553KB/s, 287964KB/s, 283813KB/s
>> after  : 337842KB/s, 321810KB/s, 319700KB/s, 320000KB/s, 320902KB/s
>>
>> [before]
>> IPU: 0 blocks
>> SSR: 1492820 blocks in 17278 segments
>> LFS: 517638 blocks in 1009 segments
>> BDF: 80, avg. vblocks: 457
>>
>> [after]
>> IPU: 1256249 blocks
>> SSR: 251079 blocks in 891 segments
>> LFS: 490825 blocks in 957 segments
>> BDF: 86, avg. vblocks: 380
>>
>> Signed-off-by: Changman Lee <cm224.lee@samsung.com>
>> ---
>>  Documentation/filesystems/f2fs.txt |  2 +-
>>  fs/f2fs/data.c                     |  2 +-
>>  fs/f2fs/debug.c                    | 11 +++++++
>>  fs/f2fs/f2fs.h                     |  4 +++
>>  fs/f2fs/segment.c                  | 18 +++++++++---
>>  fs/f2fs/segment.h                  | 60 ++++++++++++++++++++++++++++++++++++--
>>  fs/f2fs/super.c                    |  2 ++
>>  7 files changed, 91 insertions(+), 8 deletions(-)
>>
>> diff --git a/Documentation/filesystems/f2fs.txt b/Documentation/filesystems/f2fs.txt
>> index e0950c4..b832720 100644
>> --- a/Documentation/filesystems/f2fs.txt
>> +++ b/Documentation/filesystems/f2fs.txt
>> @@ -201,7 +201,7 @@ Files in /sys/fs/f2fs/<devname>
>>                                updates in f2fs. There are five policies:
>>                                 0x01: F2FS_IPU_FORCE, 0x02: F2FS_IPU_SSR,
>>                                 0x04: F2FS_IPU_UTIL,  0x08: F2FS_IPU_SSR_UTIL,
>> -                               0x10: F2FS_IPU_FSYNC.
>> +                               0x10: F2FS_IPU_FSYNC, 0x20: F2FS_IPU_SSR_ADAP.
>>
>>   min_ipu_util                 This parameter controls the threshold to trigger
>>                                in-place-updates. The number indicates percentage
>> diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c
>> index 6308435..80f42da 100644
>> --- a/fs/f2fs/data.c
>> +++ b/fs/f2fs/data.c
>> @@ -779,7 +779,7 @@ int do_write_data_page(struct page *page, struct f2fs_io_info *fio)
>>        */
>>       if (unlikely(fio->blk_addr != NEW_ADDR &&
>>                       !is_cold_data(page) &&
>> -                     need_inplace_update(inode))) {
>> +                     need_inplace_update(inode, page))) {
>>               rewrite_data_page(page, fio);
>>               set_inode_flag(F2FS_I(inode), FI_UPDATE_WRITE);
>>       } else {
>> diff --git a/fs/f2fs/debug.c b/fs/f2fs/debug.c
>> index dd7835b..c7e6ef8 100644
>> --- a/fs/f2fs/debug.c
>> +++ b/fs/f2fs/debug.c
>> @@ -81,6 +81,9 @@ static void update_general_status(struct f2fs_sb_info *sbi)
>>       }
>>
>>       si->inplace_count = atomic_read(&sbi->inplace_count);
>> +
>> +     for (i = 0; i < DIRTY; i++)
>> +             si->ssr_area[i] = get_ssr_area(sbi, i);
>>  }
>>
>>  /*
>> @@ -290,6 +293,14 @@ static int stat_show(struct seq_file *s, void *v)
>>               seq_printf(s, "\nBDF: %u, avg. vblocks: %u\n",
>>                          si->bimodal, si->avg_vblocks);
>>
>> +             seq_puts(s, "SSR area: ");
>> +             seq_printf(s, "%u/%u/%u, ", si->ssr_area[DIRTY_HOT_DATA],
>> +                             si->ssr_area[DIRTY_WARM_DATA],
>> +                             si->ssr_area[DIRTY_COLD_DATA]);
>> +             seq_printf(s, "%u/%u/%u\n", si->ssr_area[DIRTY_HOT_NODE],
>> +                             si->ssr_area[DIRTY_WARM_NODE],
>> +                             si->ssr_area[DIRTY_COLD_NODE]);
>> +
>>               /* memory footprint */
>>               update_mem_info(si->sbi);
>>               seq_printf(s, "\nMemory: %u KB = static: %u + cached: %u\n",
>> diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h
>> index c48847e..81f88d3 100644
>> --- a/fs/f2fs/f2fs.h
>> +++ b/fs/f2fs/f2fs.h
>> @@ -450,6 +450,8 @@ struct f2fs_sm_info {
>>       unsigned int ipu_policy;        /* in-place-update policy */
>>       unsigned int min_ipu_util;      /* in-place-update threshold */
>>       unsigned int min_fsync_blocks;  /* threshold for fsync */
>> +     unsigned int min_ssr_area;      /* in-place-update under value */
>> +     unsigned int vblocks_in_dirty[NR_CURSEG_TYPE];
>>       /* for flush command control */
>>       struct flush_cmd_control *cmd_control_info;
>> @@ -1417,6 +1419,7 @@ void clear_prefree_segments(struct f2fs_sb_info *);
>>  void release_discard_addrs(struct f2fs_sb_info *);
>>  void discard_next_dnode(struct f2fs_sb_info *, block_t);
>>  int npages_for_summary_flush(struct f2fs_sb_info *, bool);
>> +int get_segment_type(struct page *, enum page_type);
>>  void allocate_new_segments(struct f2fs_sb_info *);
>>  int f2fs_trim_fs(struct f2fs_sb_info *, struct fstrim_range *);
>>  struct page *get_sum_page(struct f2fs_sb_info *, unsigned int);
>> @@ -1525,6 +1528,7 @@ struct f2fs_stat_info {
>>       int curseg[NR_CURSEG_TYPE];
>>       int cursec[NR_CURSEG_TYPE];
>>       int curzone[NR_CURSEG_TYPE];
>> +     unsigned int ssr_area[NR_CURSEG_TYPE];
>>
>>       unsigned int segment_count[2];
>>       unsigned int block_count[2];
>> diff --git a/fs/f2fs/segment.c b/fs/f2fs/segment.c
>> index f995a85..3987e65 100644
>> --- a/fs/f2fs/segment.c
>> +++ b/fs/f2fs/segment.c
>> @@ -398,8 +398,10 @@ static void __locate_dirty_segment(struct f2fs_sb_info *sbi, unsigned int segno,
>>                       f2fs_bug_on(sbi, 1);
>>                       return;
>>               }
>> -             if (!test_and_set_bit(segno, dirty_i->dirty_segmap[t]))
>> +             if (!test_and_set_bit(segno, dirty_i->dirty_segmap[t])) {
>>                       dirty_i->nr_dirty[t]++;
>> +                     add_vblocks_in_dirty(sbi, sentry);
>> +             }
>>       }
>>  }
>>
>> @@ -415,8 +417,10 @@ static void __remove_dirty_segment(struct f2fs_sb_info *sbi, unsigned int segno,
>>               struct seg_entry *sentry = get_seg_entry(sbi, segno);
>>               enum dirty_type t = sentry->type;
>>
>> -             if (test_and_clear_bit(segno, dirty_i->dirty_segmap[t]))
>> +             if (test_and_clear_bit(segno, dirty_i->dirty_segmap[t])) {
>>                       dirty_i->nr_dirty[t]--;
>> +                     del_vblocks_in_dirty(sbi, sentry);
>> +             }
>>
>>               if (get_valid_blocks(sbi, segno, sbi->segs_per_sec) == 0)
>>                       clear_bit(GET_SECNO(sbi, segno),
>> @@ -658,6 +662,8 @@ static void update_sit_entry(struct f2fs_sb_info *sbi, block_t blkaddr, int del)
>>       f2fs_bug_on(sbi, (new_vblocks >> (sizeof(unsigned short) << 3) ||
>>                               (new_vblocks > sbi->blocks_per_seg)));
>>
>> +     update_vblocks_in_dirty(sbi, se, segno, del);
>
> If we do not use F2FS_IPU_SSR_ADAP, these functions incur another overheads.
>
> Please, avoid this first.
>
> Thanks,
>
> ------------------------------------------------------------------------------
> Dive into the World of Parallel Programming! The Go Parallel Website,
> sponsored by Intel and developed in partnership with Slashdot Media, is your
> hub for all things parallel software development, from weekly thought
> leadership blogs to news, videos, case studies, tutorials and more. Take a
> look and join the conversation now. http://goparallel.sourceforge.net
> _______________________________________________
> Linux-f2fs-devel mailing list
> Linux-f2fs-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel

      reply	other threads:[~2015-01-10  0:56 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-12-31  5:15 [PATCH] f2fs: add adaptive ssr/ipu policy as valid blocks in dirty segments Changman Lee
2015-01-06 23:07 ` Jaegeuk Kim
2015-01-10  0:56   ` Changman Lee [this message]

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='CAN863PufYXHd9RJdc=AkirM+qvWTnkbB7cxFEJSRU60feG=ieQ@mail.gmail.com' \
    --to=cm224.lee@gmail.com \
    --cc=cm224.lee@samsung.com \
    --cc=jaegeuk@kernel.org \
    --cc=linux-f2fs-devel@lists.sourceforge.net \
    --cc=linux-fsdevel@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;
as well as URLs for NNTP newsgroup(s).