1. 05 Sep, 2013 2 commits
    • Jin Xu's avatar
      f2fs: optimize gc for better performance · a26b7c8a
      Jin Xu authored
      This patch improves the gc efficiency by optimizing the victim
      selection policy. With this optimization, the random re-write
      performance could increase up to 20%.
      
      For f2fs, when disk is in shortage of free spaces, gc will selects
      dirty segments and moves valid blocks around for making more space
      available. The gc cost of a segment is determined by the valid blocks
      in the segment. The less the valid blocks, the higher the efficiency.
      The ideal victim segment is the one that has the most garbage blocks.
      
      Currently, it searches up to 20 dirty segments for a victim segment.
      The selected victim is not likely the best victim for gc when there
      are much more dirty segments. Why not searching more dirty segments
      for a better victim? The cost of searching dirty segments is
      negligible in comparison to moving blocks.
      
      In this patch, it enlarges the MAX_VICTIM_SEARCH to 4096 to make
      the search more aggressively for a possible better victim. Since
      it also applies to victim selection for SSR, it will likely improve
      the SSR efficiency as well.
      
      The test case is simple. It creates as many files until the disk full.
      The size for each file is 32KB. Then it writes as many as 100000
      records of 4KB size to random offsets of random files in sync mode.
      The testing was done on a 2GB partition of a SDHC card. Let's see the
      test result of f2fs without and with the patch.
      
      ---------------------------------------
      2GB partition, SDHC
      create 52023 files of size 32768 bytes
      random re-write 100000 records of 4KB
      ---------------------------------------
      | file creation (s) | rewrite time (s) | gc count | gc garbage blocks |
      [no patch]  341         4227             1174          174840
      [patched]   324         2958             645           106682
      
      It's obvious that, with the patch, f2fs finishes the test in 20+% less
      time than without the patch. And internally it does much less gc with
      higher efficiency than before.
      
      Since the performance improvement is related to gc, it might not be so
      obvious for other tests that do not trigger gc as often as this one (
      This is because f2fs selects dirty segments for SSR use most of the
      time when free space is in shortage). The well-known iozone test tool
      was not used for benchmarking the patch becuase it seems do not have
      a test case that performs random re-write on a full disk.
      
      This patch is the revised version based on the suggestion from
      Jaegeuk Kim.
      Signed-off-by: default avatarJin Xu <jinuxstyle@gmail.com>
      [Jaegeuk Kim: suggested simpler solution]
      Reviewed-by: default avatarJaegeuk Kim <jaegeuk.kim@samsung.com>
      Signed-off-by: default avatarJaegeuk Kim <jaegeuk.kim@samsung.com>
      a26b7c8a
    • Jaegeuk Kim's avatar
      f2fs: merge more bios of node block writes · 423e95cc
      Jaegeuk Kim authored
      Previously, we experience bio traces as follows when running simple sequential
      write test.
      
       f2fs_do_submit_bio: type = NODE, io = no sync, sector = 500104928, size = 4K
       f2fs_do_submit_bio: type = NODE, io = no sync, sector = 499922208, size = 368K
       f2fs_do_submit_bio: type = NODE, io = no sync, sector = 499914752, size = 140K
      
       -> total 512K
      
      The first one is to write an indirect node block, and the others are to write
      direct node blocks.
      
      The reason why there are two separate bios for direct node blocks is:
      0. initial state
      ------------------    ------------------
      |                |    |xxxxxxxx        |
      ------------------    ------------------
      
      1. write 368K
      ------------------    ------------------
      |                |    |xxxxxxxxWWWWWWWW|
      ------------------    ------------------
      
      2. write 140K
      ------------------    ------------------
      |WWWWWWW         |    |xxxxxxxxWWWWWWWW|
      ------------------    ------------------
      
      This is because f2fs_write_node_pages tries to write just 512K totally, so that
      we can lose the chance to merge more bios nicely.
      
      After this patch is applied, we can get the following bio traces.
      
        f2fs_do_submit_bio: type = NODE, io = no sync, sector = 500103168, size = 8K
        f2fs_do_submit_bio: type = NODE, io = no sync, sector = 500111368, size = 4K
        f2fs_do_submit_bio: type = NODE, io = no sync, sector = 500107272, size = 512K
        f2fs_do_submit_bio: type = NODE, io = no sync, sector = 500108296, size = 512K
        f2fs_do_submit_bio: type = NODE, io = no sync, sector = 500109320, size = 500K
      
      And finally, we can improve the sequential write performance,
          from 458.775 MB/s to 479.945 MB/s on SSD.
      Signed-off-by: default avatarJaegeuk Kim <jaegeuk.kim@samsung.com>
      423e95cc
  2. 03 Sep, 2013 2 commits
  3. 27 Aug, 2013 2 commits
  4. 26 Aug, 2013 6 commits
    • Jaegeuk Kim's avatar
      f2fs: support the inline xattrs · 65985d93
      Jaegeuk Kim authored
      0. modified inode structure
      --------------------------------------
      metadata (e.g., i_mtime, i_ctime, etc)
      --------------------------------------
      direct pointers [0 ~ 873]
      
      inline xattrs (200 bytes by default)
      
      indirect pointers [0 ~ 4]
      --------------------------------------
      node footer
      --------------------------------------
      
      1. setxattr flow
       - read_all_xattrs copies all the xattrs from inline and xattr node block.
       - handle xattr entries
       - write_all_xattrs copies modified xattrs into inline and xattr node block.
      
      2. getxattr flow
       - read_all_xattrs copies all the xattrs from inline and xattr node block.
       - check target entries
      
      3. Usage
       # mount -t f2fs -o inline_xattr $DEV $MNT
      
       Once mounted with the inline_xattr option, f2fs marks all the newly created
       files to reserve an amount of inline xattr space explicitly inside the inode
       block. Without the mount option, f2fs will not touch any existing files and
       newly created files as well.
      Signed-off-by: default avatarJaegeuk Kim <jaegeuk.kim@samsung.com>
      65985d93
    • Jaegeuk Kim's avatar
      f2fs: add the truncate_xattr_node function · 4f16fb0f
      Jaegeuk Kim authored
      The truncate_xattr_node function will be used by inline xattr.
      Signed-off-by: default avatarJaegeuk Kim <jaegeuk.kim@samsung.com>
      4f16fb0f
    • Jaegeuk Kim's avatar
      f2fs: introduce __find_xattr for readability · dd9cfe23
      Jaegeuk Kim authored
      The __find_xattr is to search the wanted xattr entry starting from the
      base_addr.
      
      If not found, the returned entry is the last empty xattr entry that can be
      allocated newly.
      Signed-off-by: default avatarJaegeuk Kim <jaegeuk.kim@samsung.com>
      dd9cfe23
    • Jaegeuk Kim's avatar
      f2fs: reserve the xattr space dynamically · de93653f
      Jaegeuk Kim authored
      This patch enables the number of direct pointers inside on-disk inode block to
      be changed dynamically according to the size of inline xattr space.
      
      The number of direct pointers, ADDRS_PER_INODE, can be changed only if the file
      has inline xattr flag.
      
      The number of direct pointers that will be used by inline xattrs is defined as
      F2FS_INLINE_XATTR_ADDRS.
      Current patch assigns F2FS_INLINE_XATTR_ADDRS to 0 temporarily.
      Signed-off-by: default avatarJaegeuk Kim <jaegeuk.kim@samsung.com>
      de93653f
    • Jaegeuk Kim's avatar
      f2fs: add flags for inline xattrs · 444c580f
      Jaegeuk Kim authored
      This patch adds basic inode flags for inline xattrs, F2FS_INLINE_XATTR,
      and add a mount option, inline_xattr, which is enabled when xattr is set.
      
      If the mount option is enabled, all the files are marked with the inline_xattrs
      flag.
      Signed-off-by: default avatarJaegeuk Kim <jaegeuk.kim@samsung.com>
      444c580f
    • Wei Yongjun's avatar
      f2fs: fix error return code in init_f2fs_fs() · 6e6b978c
      Wei Yongjun authored
      Fix to return -ENOMEM in the kset create and add error handling
      case instead of 0, as done elsewhere in this function.
      
      Introduced by commit b59d0bae.
      (f2fs: add sysfs support for controlling the gc_thread)
      Signed-off-by: default avatarWei Yongjun <yongjun_wei@trendmicro.com.cn>
      Acked-by: default avatarNamjae Jeon <namjae.jeon@samsung.com>
      [Jaegeuk Kim: merge the patch with previous modification]
      Signed-off-by: default avatarJaegeuk Kim <jaegeuk.kim@samsung.com>
      6e6b978c
  5. 20 Aug, 2013 2 commits
    • Jaegeuk Kim's avatar
      f2fs: fix wrong BUG_ON condition · d59ff4df
      Jaegeuk Kim authored
      This patch removes a false-alaramed BUG_ON.
      The previous BUG_ON condition didn't cover the following true scenario.
      
      In f2fs_add_link, 1) get_new_data_page gives an uptodate page successfully,
      and then, 2) init_inode_metadata returns -ENOSPC.
      At this moment, a new clean data page is remained in the page cache, but its
      block address still indicates NEW_ADDR.
      After then, even if sync is called, this clean data page cannot be written to
      the disk due to the clean state.
      
      So this means that get_lock_data_page should make a new empty page when its
      block address is NEW_ADDR and its page is not uptodated.
      Signed-off-by: default avatarJaegeuk Kim <jaegeuk.kim@samsung.com>
      d59ff4df
    • Zhao Hongjiang's avatar
      f2fs: fix memory leak when init f2fs filesystem fail · 9890ff3f
      Zhao Hongjiang authored
      When any of the caches create fails in init_f2fs_fs(), the other caches which are
      create successful should be free.
      Signed-off-by: default avatarZhao Hongjiang <zhaohongjiang@huawei.com>
      Signed-off-by: default avatarJaegeuk Kim <jaegeuk.kim@samsung.com>
      9890ff3f
  6. 19 Aug, 2013 3 commits
  7. 12 Aug, 2013 3 commits
  8. 09 Aug, 2013 3 commits
  9. 08 Aug, 2013 1 commit
    • Jaegeuk Kim's avatar
      f2fs: fix a build failure due to missing the kobject header · c2d715d1
      Jaegeuk Kim authored
      This patch should resolve the following error reported by kbuild test robot.
      
      All error/warnings:
      
         In file included from fs/f2fs/dir.c:13:0:
         >> fs/f2fs/f2fs.h:435:17: error: field 's_kobj' has incomplete type
              struct kobject s_kobj;
      
      The failure was caused by missing the kobject header file in dir.c.
      So, this patch move the header file to the right location, f2fs.h.
      
      CC: Namjae Jeon <namjae.jeon@samsung.com>
      Signed-off-by: default avatarJaegeuk Kim <jaegeuk.kim@samsung.com>
      c2d715d1
  10. 06 Aug, 2013 4 commits
  11. 31 Jul, 2013 1 commit
  12. 30 Jul, 2013 11 commits