31 Jul, 2014

1 commit


16 Jul, 2014

1 commit

  • In __set_test_and_free we will check whether all segment are free in one section
    When free one segment, in order to set section to free status.
    But the searching region of segmap is from start segno to last segno of f2fs,
    it's not necessary. So let's just only check all segment bitmap of target
    section.

    Signed-off-by: Chao Yu
    Signed-off-by: Jaegeuk Kim

    Chao Yu
     

20 Mar, 2014

1 commit

  • It is more reasonable to determine the reclaiming rate of prefree segments
    according to the volume size, which is set to 5% by default.
    For example, if the volume is 128GB, the prefree segments are reclaimed
    when the number reaches to 6.4GB.

    Signed-off-by: Jaegeuk Kim

    Jaegeuk Kim
     

18 Mar, 2014

2 commits


24 Feb, 2014

1 commit


17 Feb, 2014

1 commit


20 Jan, 2014

1 commit


23 Dec, 2013

7 commits

  • This patch introduces new sysfs entries for users to control the policy of
    in-place-updates, namely IPU, in f2fs.

    Sometimes f2fs suffers from performance degradation due to its out-of-place
    update policy that produces many additional node block writes.
    If the storage performance is very dependant on the amount of data writes
    instead of IO patterns, we'd better drop this out-of-place update policy.

    This patch suggests 5 polcies and their triggering conditions as follows.

    [sysfs entry name = ipu_policy]

    0: F2FS_IPU_FORCE all the time,
    1: F2FS_IPU_SSR if SSR mode is activated,
    2: F2FS_IPU_UTIL if FS utilization is over threashold,
    3: F2FS_IPU_SSR_UTIL if SSR mode is activated and FS utilization is over
    threashold,
    4: F2FS_IPU_DISABLE disable IPU. (=default option)

    [sysfs entry name = min_ipu_util]

    This parameter controls the threshold to trigger in-place-updates.
    The number indicates percentage of the filesystem utilization, and used by
    F2FS_IPU_UTIL and F2FS_IPU_SSR_UTIL policies.

    For more details, see need_inplace_update() in segment.h.

    Signed-off-by: Jaegeuk Kim

    Jaegeuk Kim
     
  • As we know, some of our branch condition will rarely be true. So we could add
    'unlikely' to let compiler optimize these code, by this way we could drop
    unneeded 'jump' assemble code to improve performance.

    change log:
    o add *unlikely* as many as possible across the whole source files at once
    suggested by Jaegeuk Kim.

    Suggested-by: Jaegeuk Kim
    Signed-off-by: Chao Yu
    Signed-off-by: Jaegeuk Kim

    Chao Yu
     
  • Previously f2fs allocates its own bi_private data structure all the time even
    though we don't use it. But, can we remove this bi_private allocation?

    This patch removes such the additional bi_private allocation.

    1. Retrieve f2fs_sb_info from its page->mapping->host->i_sb.
    - This removes the usecases of bi_private in end_io.

    2. Use bi_private only when we really need it.
    - The bi_private is used only when the checkpoint procedure is conducted.
    - When conducting the checkpoint, f2fs submits a META_FLUSH bio to wait its bio
    completion.
    - Since we have no dependancies to remove bi_private now, let's just use
    bi_private pointer as the completion pointer.

    Reviewed-by: Gu Zheng
    Signed-off-by: Jaegeuk Kim

    Jaegeuk Kim
     
  • The void *wait in bio_private is used for waiting completion of checkpoint bio.
    So we don't need to use its type as void, but declare it as completion type.

    Signed-off-by: Chao Yu
    [Jaegeuk Kim: add description]
    Signed-off-by: Jaegeuk Kim

    Chao Yu
     
  • This patch fixes some bit overflows by the shift operations.

    Dan Carpenter reported potential bugs on bit overflows as follows.

    fs/f2fs/segment.c:910 submit_write_page()
    warn: should 'blk_addr << ((sbi)->log_blocksize - 9)' be a 64 bit type?
    fs/f2fs/checkpoint.c:429 get_valid_checkpoint()
    warn: should '1 << ()' be a 64 bit type?
    fs/f2fs/data.c:408 f2fs_readpage()
    warn: should 'blk_addr << ((sbi)->log_blocksize - 9)' be a 64 bit type?
    fs/f2fs/data.c:457 submit_read_page()
    warn: should 'blk_addr << ((sbi)->log_blocksize - 9)' be a 64 bit type?
    fs/f2fs/data.c:525 get_data_block_ro()
    warn: should 'i << blkbits' be a 64 bit type?

    Bug-Reported-by: Dan Carpenter
    Signed-off-by: Jaegeuk Kim

    Jaegeuk Kim
     
  • Previously we read sit entries page one by one, this method lost the chance
    of reading contiguous page together. So we read pages as contiguous as
    possible for better mount performance.

    change log:
    o merge judgements/use 'Continue' or 'Break' instead of 'Goto' as Gu Zheng
    suggested.
    o add mark_page_accessed() before release page to delay VM reclaiming.
    o remove '*order' for simplification of function as Jaegeuk Kim suggested.

    Signed-off-by: Chao Yu
    [Jaegeuk Kim: fix a bug on the block address calculation]
    Signed-off-by: Jaegeuk Kim

    Chao Yu
     
  • It is not efficient comparing each segment type to find node or data.

    Signed-off-by: Changman Lee
    [Jaegeuk Kim: remove unnecessary white spaces]
    Signed-off-by: Jaegeuk Kim

    Changman Lee
     

30 Oct, 2013

1 commit

  • Previously, check_block_count check valid_map with bit data type in common
    scenario that sit has all ones or zeros bitmap, it makes low mount performance.
    So let's check the special bitmap with integer data type instead of the bit one.

    v1-->v2:
    o use find_next_{zero_}bit_le for better performance and readable as Jaegeuk
    suggested.
    o use neat logogram in comment as Gu Zheng suggested.
    o search continuous ones or zeros for better performance when checking mixed
    bitmap.

    Suggested-by: Jaegeuk Kim
    Signed-off-by: Shu Tan
    Signed-off-by: Chao Yu
    Signed-off-by: Jaegeuk Kim

    Chao Yu
     

29 Oct, 2013

1 commit


25 Oct, 2013

1 commit

  • Previously, f2fs postpones reclaiming prefree segments into free segments
    as much as possible.
    However, if user writes and deletes a bunch of data without any sync or fsync
    calls, some flash storages can suffer from garbage collections.

    So, this patch adds the reclaiming codes to f2fs_write_node_pages and background
    GC thread.

    If there are a lot of prefree segments, let's do checkpoint so that f2fs
    submits discard commands for the prefree regions to the flash storage.

    Signed-off-by: Changman Lee
    Signed-off-by: Jaegeuk Kim

    Jaegeuk Kim
     

24 Sep, 2013

1 commit

  • This patch add macro MAX_BIO_BLOCKS to limit value of npages in
    f2fs_bio_alloc, it can avoid allocating failure in bio_alloc caused by
    npages is larger than BIO_MAX_PAGES.

    Signed-off-by: Yu Chao
    Reviewed-by: Gu Zheng
    Signed-off-by: Jaegeuk Kim

    Chao Yu
     

05 Sep, 2013

1 commit

  • 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: Jin Xu
    [Jaegeuk Kim: suggested simpler solution]
    Reviewed-by: Jaegeuk Kim
    Signed-off-by: Jaegeuk Kim

    Jin Xu
     

03 Sep, 2013

2 commits


30 Apr, 2013

1 commit

  • When testing f2fs on an SSD, I found some 128 page IOs followed by 1 page IO
    were issued by f2fs_write_node_pages.
    This means that there were some mishandling flows which degrades performance.

    Previous f2fs_write_node_pages determines the number of pages to be written,
    nr_to_write, as follows.

    1. The bio_get_nr_vecs returns 129 pages.
    2. The bio_alloc makes a room for 128 pages.
    3. The initial 128 pages go into one bio.
    4. The existing bio is submitted, and a new bio is prepared for the last 1 page.
    5. Finally, sync_node_pages submits the last 1 page bio.

    The problem is from the use of bio_get_nr_vecs, so this patch replace it
    with max_hw_blocks using queue_max_sectors.

    Signed-off-by: Jaegeuk Kim

    Jaegeuk Kim
     

09 Apr, 2013

1 commit

  • Fix typo mistakes.
    1. I think that it should be 'L' instead of 'V'.
    2. and try to fix 'Front' instead of 'Frone'

    Signed-off-by: Namjae Jeon
    Signed-off-by: Amit Sahrawat
    Signed-off-by: Jaegeuk Kim

    Namjae Jeon
     

03 Apr, 2013

3 commits

  • This patch removes a bitmap for victim segments selected by foreground GC, and
    modifies the other bitmap for victim segments selected by background GC.

    1) foreground GC bitmap
    : We don't need to manage this, since we just only one previous victim section
    number instead of the whole victim history.
    The f2fs uses the victim section number in order not to allocate currently
    GC'ed section to current active logs.

    2) background GC bitmap
    : This bitmap is used to avoid selecting victims repeatedly by background GCs.
    In addition, the victims are able to be selected by foreground GCs, since
    there is no need to read victim blocks during foreground GCs.

    By the fact that the foreground GC reclaims segments in a section unit, it'd
    be better to manage this bitmap based on the section granularity.

    Reviewed-by: Namjae Jeon
    Signed-off-by: Jaegeuk Kim

    Jaegeuk Kim
     
  • Let's use a macro to get the total number of sections.

    Reviewed-by: Namjae Jeon
    Signed-off-by: Jaegeuk Kim

    Jaegeuk Kim
     
  • A macro should not use duplicate parameter names.

    Reviewed-by: Namjae Jeon
    Signed-off-by: Jaegeuk Kim

    Jaegeuk Kim
     

08 Mar, 2013

1 commit


12 Feb, 2013

3 commits

  • This patch makes clearer the ambiguous f2fs_gc flow as follows.

    1. Remove intermediate checkpoint condition during f2fs_gc
    (i.e., should_do_checkpoint() and GC_BLOCKED)

    2. Remove unnecessary return values of f2fs_gc because of #1.
    (i.e., GC_NODE, GC_OK, etc)

    3. Simplify write_checkpoint() because of #2.

    4. Clarify the main f2fs_gc flow.
    o monitor how many freed sections during one iteration of do_garbage_collect().
    o do GC more without checkpoints if we can't get enough free sections.
    o do checkpoint once we've got enough free sections through forground GCs.

    5. Adopt thread-logging (Slack-Space-Recycle) scheme more aggressively on data
    log types. See. get_ssr_segement()

    Signed-off-by: Jaegeuk Kim

    Jaegeuk Kim
     
  • Instead of evaluating the free_sections and then deciding to return
    true/false from that path. We can directly use the evaluation condition
    for returning proper value.

    Signed-off-by: Namjae Jeon
    Signed-off-by: Amit Sahrawat
    Signed-off-by: Jaegeuk Kim

    Namjae Jeon
     
  • Introduce accessor to get the sections based upon the block type
    (node,dents...) and modify the functions : should_do_checkpoint,
    has_not_enough_free_secs to use this accessor function to get
    the node sections and dent sections.

    Signed-off-by: Namjae Jeon
    Signed-off-by: Amit Sahrawat
    Signed-off-by: Jaegeuk Kim

    Namjae Jeon
     

28 Dec, 2012

1 commit

  • Practically, has_not_enough_free_secs() should calculate with the numbers of
    current node and directory data blocks together.
    Actually the equation was implemented in need_to_flush().

    So, this patch removes need_flush() and moves the equation into
    has_not_enough_free_secs().

    Signed-off-by: Jaegeuk Kim

    Jaegeuk Kim
     

11 Dec, 2012

3 commits

  • Do cleanup more for better code readability.

    - Change the parameter set of f2fs_bio_alloc()
    This function should allocate a bio only since it is not something like
    f2fs_bio_init(). Instead, the caller should initialize the allocated bio.

    - Introduce SECTOR_FROM_BLOCK
    This macro translates a block address to its sector address.

    Signed-off-by: Jaegeuk Kim
    Reviewed-by: Namjae Jeon

    Jaegeuk Kim
     
  • As pointed out by Randy Dunlap, this patch removes all usage of "/**" for comment
    blocks. Instead, just use "/*".

    Signed-off-by: Jaegeuk Kim

    Jaegeuk Kim
     
  • This adds the following major in-memory structures in f2fs.

    - f2fs_sb_info:
    contains f2fs-specific information, two special inode pointers for node and
    meta address spaces, and orphan inode management.

    - f2fs_inode_info:
    contains vfs_inode and other fs-specific information.

    - f2fs_nm_info:
    contains node manager information such as NAT entry cache, free nid list,
    and NAT page management.

    - f2fs_node_info:
    represents a node as node id, inode number, block address, and its version.

    - f2fs_sm_info:
    contains segment manager information such as SIT entry cache, free segment
    map, current active logs, dirty segment management, and segment utilization.
    The specific structures are sit_info, free_segmap_info, dirty_seglist_info,
    curseg_info.

    In addition, add F2FS_SUPER_MAGIC in magic.h.

    Signed-off-by: Chul Lee
    Signed-off-by: Jaegeuk Kim

    Jaegeuk Kim