Skip to content

Commit 09f5d92

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> Reviewed-by: David Sterba <dsterba@suse.com> Signed-off-by: David Sterba <dsterba@suse.com>
1 parent 4bd427f commit 09f5d92

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
@@ -1439,8 +1439,9 @@ static noinline_for_stack int writepage_delalloc(struct btrfs_inode *inode,
14391439
u64 delalloc_start = page_start;
14401440
u64 delalloc_end = page_end;
14411441
u64 delalloc_to_write = 0;
1442+
unsigned int start_bit;
1443+
unsigned int end_bit;
14421444
int ret = 0;
1443-
int bit;
14441445

14451446
/* Save the dirty bitmap as our submission bitmap will be a subset of it. */
14461447
if (btrfs_is_subpage(fs_info, folio)) {
@@ -1450,10 +1451,12 @@ static noinline_for_stack int writepage_delalloc(struct btrfs_inode *inode,
14501451
bio_ctrl->submit_bitmap = 1;
14511452
}
14521453

1453-
for_each_set_bit(bit, &bio_ctrl->submit_bitmap, blocks_per_folio) {
1454-
u64 start = page_start + (bit << fs_info->sectorsize_bits);
1454+
for_each_set_bitrange(start_bit, end_bit, &bio_ctrl->submit_bitmap,
1455+
blocks_per_folio) {
1456+
u64 start = page_start + (start_bit << fs_info->sectorsize_bits);
1457+
u32 len = (end_bit - start_bit) << fs_info->sectorsize_bits;
14551458

1456-
btrfs_folio_set_lock(fs_info, folio, start, fs_info->sectorsize);
1459+
btrfs_folio_set_lock(fs_info, folio, start, len);
14571460
}
14581461

14591462
/* Lock all (subpage) delalloc ranges inside the folio first. */
@@ -1570,10 +1573,13 @@ static noinline_for_stack int writepage_delalloc(struct btrfs_inode *inode,
15701573
fs_info->sectorsize_bits,
15711574
blocks_per_folio);
15721575

1573-
for_each_set_bit(bit, &bio_ctrl->submit_bitmap, bitmap_size)
1574-
btrfs_mark_ordered_io_finished(inode, folio,
1575-
page_start + (bit << fs_info->sectorsize_bits),
1576-
fs_info->sectorsize, false);
1576+
for_each_set_bitrange(start_bit, end_bit, &bio_ctrl->submit_bitmap,
1577+
bitmap_size) {
1578+
u64 start = page_start + (start_bit << fs_info->sectorsize_bits);
1579+
u32 len = (end_bit - start_bit) << fs_info->sectorsize_bits;
1580+
1581+
btrfs_mark_ordered_io_finished(inode, folio, start, len, false);
1582+
}
15771583
return ret;
15781584
}
15791585
out:
@@ -1741,8 +1747,8 @@ static noinline_for_stack int extent_writepage_io(struct btrfs_inode *inode,
17411747
return ret;
17421748
}
17431749

1744-
for (cur = start; cur < end; cur += fs_info->sectorsize)
1745-
set_bit((cur - folio_start) >> fs_info->sectorsize_bits, &range_bitmap);
1750+
bitmap_set(&range_bitmap, (start - folio_pos(folio)) >> fs_info->sectorsize_bits,
1751+
len >> fs_info->sectorsize_bits);
17461752
bitmap_and(&bio_ctrl->submit_bitmap, &bio_ctrl->submit_bitmap, &range_bitmap,
17471753
blocks_per_folio);
17481754

0 commit comments

Comments
 (0)