aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChao Yu <chao2.yu@samsung.com>2013-10-29 02:50:40 -0400
committerJaegeuk Kim <jaegeuk.kim@samsung.com>2013-10-29 23:23:23 -0400
commit44c60bf2b9f2808e127fa4cd3b11b50a46cf5817 (patch)
tree6fb81655c3600cbf9e73fb07e19340c53ac47a1d
parent9a47938b226cc2b8e2afd72b0f1ca1a7e1367cf5 (diff)
f2fs: check all ones or zeros bitmap with bitops for better mount performance
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 <jaegeuk.kim@samsung.com> Signed-off-by: Shu Tan <shu.tan@samsung.com> Signed-off-by: Chao Yu <chao2.yu@samsung.com> Signed-off-by: Jaegeuk Kim <jaegeuk.kim@samsung.com>
-rw-r--r--fs/f2fs/segment.h19
1 files changed, 15 insertions, 4 deletions
diff --git a/fs/f2fs/segment.h b/fs/f2fs/segment.h
index 001d4c4d97fd..269f690b4e24 100644
--- a/fs/f2fs/segment.h
+++ b/fs/f2fs/segment.h
@@ -547,8 +547,9 @@ static inline void check_block_count(struct f2fs_sb_info *sbi,
547{ 547{
548 struct f2fs_sm_info *sm_info = SM_I(sbi); 548 struct f2fs_sm_info *sm_info = SM_I(sbi);
549 unsigned int end_segno = sm_info->segment_count - 1; 549 unsigned int end_segno = sm_info->segment_count - 1;
550 bool is_valid = test_bit_le(0, raw_sit->valid_map) ? true : false;
550 int valid_blocks = 0; 551 int valid_blocks = 0;
551 int i; 552 int cur_pos = 0, next_pos;
552 553
553 /* check segment usage */ 554 /* check segment usage */
554 BUG_ON(GET_SIT_VBLOCKS(raw_sit) > sbi->blocks_per_seg); 555 BUG_ON(GET_SIT_VBLOCKS(raw_sit) > sbi->blocks_per_seg);
@@ -557,9 +558,19 @@ static inline void check_block_count(struct f2fs_sb_info *sbi,
557 BUG_ON(segno > end_segno); 558 BUG_ON(segno > end_segno);
558 559
559 /* check bitmap with valid block count */ 560 /* check bitmap with valid block count */
560 for (i = 0; i < sbi->blocks_per_seg; i++) 561 do {
561 if (f2fs_test_bit(i, raw_sit->valid_map)) 562 if (is_valid) {
562 valid_blocks++; 563 next_pos = find_next_zero_bit_le(&raw_sit->valid_map,
564 sbi->blocks_per_seg,
565 cur_pos);
566 valid_blocks += next_pos - cur_pos;
567 } else
568 next_pos = find_next_bit_le(&raw_sit->valid_map,
569 sbi->blocks_per_seg,
570 cur_pos);
571 cur_pos = next_pos;
572 is_valid = !is_valid;
573 } while (cur_pos < sbi->blocks_per_seg);
563 BUG_ON(GET_SIT_VBLOCKS(raw_sit) != valid_blocks); 574 BUG_ON(GET_SIT_VBLOCKS(raw_sit) != valid_blocks);
564} 575}
565#else 576#else