Skip to content

Commit ac35d1e

Browse files
adam900710kdave
authored andcommitted
btrfs: replace for_each_set_bit() with for_each_set_bitmap()
Inside extent_io.c, there are several simple call sites doing things like: for_each_set_bit(bit, bitmap, bitmap_size) { /* handle one fs block */ } The workload includes: - set_bit() Inside extent_writepage_io(). This can be replaced with a bitmap_set(). - btrfs_folio_set_lock() - btrfs_mark_ordered_io_finished() Inside writepage_delalloc(). Instead of calling it multiple times, we can pass a range into the function with one call. Reviewed-by: Boris Burkov <boris@bur.io> Signed-off-by: Qu Wenruo <wqu@suse.com> Signed-off-by: David Sterba <dsterba@suse.com>
1 parent ee15967 commit ac35d1e

File tree

1 file changed

+16
-10
lines changed

1 file changed

+16
-10
lines changed

fs/btrfs/extent_io.c

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1426,8 +1426,9 @@ static noinline_for_stack int writepage_delalloc(struct btrfs_inode *inode,
14261426
u64 delalloc_start = page_start;
14271427
u64 delalloc_end = page_end;
14281428
u64 delalloc_to_write = 0;
1429+
unsigned int start_bit;
1430+
unsigned int end_bit;
14291431
int ret = 0;
1430-
int bit;
14311432

14321433
/* Save the dirty bitmap as our submission bitmap will be a subset of it. */
14331434
if (btrfs_is_subpage(fs_info, folio)) {
@@ -1437,10 +1438,12 @@ static noinline_for_stack int writepage_delalloc(struct btrfs_inode *inode,
14371438
bio_ctrl->submit_bitmap = 1;
14381439
}
14391440

1440-
for_each_set_bit(bit, &bio_ctrl->submit_bitmap, blocks_per_folio) {
1441-
u64 start = page_start + (bit << fs_info->sectorsize_bits);
1441+
for_each_set_bitrange(start_bit, end_bit, &bio_ctrl->submit_bitmap,
1442+
blocks_per_folio) {
1443+
u64 start = page_start + (start_bit << fs_info->sectorsize_bits);
1444+
u32 len = (end_bit - start_bit) << fs_info->sectorsize_bits;
14421445

1443-
btrfs_folio_set_lock(fs_info, folio, start, fs_info->sectorsize);
1446+
btrfs_folio_set_lock(fs_info, folio, start, len);
14441447
}
14451448

14461449
/* Lock all (subpage) delalloc ranges inside the folio first. */
@@ -1557,10 +1560,13 @@ static noinline_for_stack int writepage_delalloc(struct btrfs_inode *inode,
15571560
fs_info->sectorsize_bits,
15581561
blocks_per_folio);
15591562

1560-
for_each_set_bit(bit, &bio_ctrl->submit_bitmap, bitmap_size)
1561-
btrfs_mark_ordered_io_finished(inode, folio,
1562-
page_start + (bit << fs_info->sectorsize_bits),
1563-
fs_info->sectorsize, false);
1563+
for_each_set_bitrange(start_bit, end_bit, &bio_ctrl->submit_bitmap,
1564+
bitmap_size) {
1565+
u64 start = page_start + (start_bit << fs_info->sectorsize_bits);
1566+
u32 len = (end_bit - start_bit) << fs_info->sectorsize_bits;
1567+
1568+
btrfs_mark_ordered_io_finished(inode, folio, start, len, false);
1569+
}
15641570
return ret;
15651571
}
15661572
out:
@@ -1728,8 +1734,8 @@ static noinline_for_stack int extent_writepage_io(struct btrfs_inode *inode,
17281734
return ret;
17291735
}
17301736

1731-
for (cur = start; cur < end; cur += fs_info->sectorsize)
1732-
set_bit((cur - folio_start) >> fs_info->sectorsize_bits, &range_bitmap);
1737+
bitmap_set(&range_bitmap, (start - folio_pos(folio)) >> fs_info->sectorsize_bits,
1738+
len >> fs_info->sectorsize_bits);
17331739
bitmap_and(&bio_ctrl->submit_bitmap, &bio_ctrl->submit_bitmap, &range_bitmap,
17341740
blocks_per_folio);
17351741

0 commit comments

Comments
 (0)