Commit 2c8f5e8c authored by Filipe Manana's avatar Filipe Manana Committed by David Sterba

btrfs: remove leftover setting of EXTENT_UPTODATE state in an inode's io_tree

We don't need to set the EXTENT_UPDATE bit in an inode's io_tree to mark a
range as uptodate, we rely on the pages themselves being uptodate - page
reading is not triggered for already uptodate pages. Recently we removed
most use of the EXTENT_UPTODATE for buffered IO with commit 52b029f4
("btrfs: remove unnecessary EXTENT_UPTODATE state in buffered I/O path"),
but there were a few leftovers, namely when reading from holes and
successfully finishing read repair.

These leftovers are unnecessarily making an inode's tree larger and deeper,
slowing down searches on it. So remove all the leftovers.

This change is part of a patchset that has the goal to make performance
better for applications that use lseek's SEEK_HOLE and SEEK_DATA modes to
iterate over the extents of a file. Two examples are the cp program from
coreutils 9.0+ and the tar program (when using its --sparse / -S option).
A sample test and results are listed in the changelog of the last patch
in the series:

  1/9 btrfs: remove leftover setting of EXTENT_UPTODATE state in an inode's io_tree
  2/9 btrfs: add an early exit when searching for delalloc range for lseek/fiemap
  3/9 btrfs: skip unnecessary delalloc searches during lseek/fiemap
  4/9 btrfs: search for delalloc more efficiently during lseek/fiemap
  5/9 btrfs: remove no longer used btrfs_next_extent_map()
  6/9 btrfs: allow passing a cached state record to count_range_bits()
  7/9 btrfs: update stale comment for count_range_bits()
  8/9 btrfs: use cached state when looking for delalloc ranges with fiemap
  9/9 btrfs: use cached state when looking for delalloc ranges with lseek
Reported-by: default avatarWang Yugui <wangyugui@e16-tech.com>
Link: https://lore.kernel.org/linux-btrfs/20221106073028.71F9.409509F4@e16-tech.com/
Link: https://lore.kernel.org/linux-btrfs/CAL3q7H5NSVicm7nYBJ7x8fFkDpno8z3PYt5aPU43Bajc1H0h1Q@mail.gmail.com/Signed-off-by: default avatarFilipe Manana <fdmanana@suse.com>
Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
parent 947a6299
...@@ -216,13 +216,6 @@ static inline int set_extent_new(struct extent_io_tree *tree, u64 start, ...@@ -216,13 +216,6 @@ static inline int set_extent_new(struct extent_io_tree *tree, u64 start,
return set_extent_bit(tree, start, end, EXTENT_NEW, NULL, GFP_NOFS); return set_extent_bit(tree, start, end, EXTENT_NEW, NULL, GFP_NOFS);
} }
static inline int set_extent_uptodate(struct extent_io_tree *tree, u64 start,
u64 end, struct extent_state **cached_state, gfp_t mask)
{
return set_extent_bit(tree, start, end, EXTENT_UPTODATE,
cached_state, mask);
}
int find_first_extent_bit(struct extent_io_tree *tree, u64 start, int find_first_extent_bit(struct extent_io_tree *tree, u64 start,
u64 *start_ret, u64 *end_ret, u32 bits, u64 *start_ret, u64 *end_ret, u32 bits,
struct extent_state **cached_state); struct extent_state **cached_state);
......
...@@ -901,14 +901,9 @@ static void end_sector_io(struct page *page, u64 offset, bool uptodate) ...@@ -901,14 +901,9 @@ static void end_sector_io(struct page *page, u64 offset, bool uptodate)
{ {
struct btrfs_inode *inode = BTRFS_I(page->mapping->host); struct btrfs_inode *inode = BTRFS_I(page->mapping->host);
const u32 sectorsize = inode->root->fs_info->sectorsize; const u32 sectorsize = inode->root->fs_info->sectorsize;
struct extent_state *cached = NULL;
end_page_read(page, uptodate, offset, sectorsize); end_page_read(page, uptodate, offset, sectorsize);
if (uptodate) unlock_extent(&inode->io_tree, offset, offset + sectorsize - 1, NULL);
set_extent_uptodate(&inode->io_tree, offset,
offset + sectorsize - 1, &cached, GFP_NOFS);
unlock_extent(&inode->io_tree, offset, offset + sectorsize - 1,
&cached);
} }
static void submit_data_read_repair(struct inode *inode, static void submit_data_read_repair(struct inode *inode,
...@@ -1781,13 +1776,9 @@ static int btrfs_do_readpage(struct page *page, struct extent_map **em_cached, ...@@ -1781,13 +1776,9 @@ static int btrfs_do_readpage(struct page *page, struct extent_map **em_cached,
ASSERT(IS_ALIGNED(cur, fs_info->sectorsize)); ASSERT(IS_ALIGNED(cur, fs_info->sectorsize));
if (cur >= last_byte) { if (cur >= last_byte) {
struct extent_state *cached = NULL;
iosize = PAGE_SIZE - pg_offset; iosize = PAGE_SIZE - pg_offset;
memzero_page(page, pg_offset, iosize); memzero_page(page, pg_offset, iosize);
set_extent_uptodate(tree, cur, cur + iosize - 1, unlock_extent(tree, cur, cur + iosize - 1, NULL);
&cached, GFP_NOFS);
unlock_extent(tree, cur, cur + iosize - 1, &cached);
end_page_read(page, true, cur, iosize); end_page_read(page, true, cur, iosize);
break; break;
} }
...@@ -1863,13 +1854,9 @@ static int btrfs_do_readpage(struct page *page, struct extent_map **em_cached, ...@@ -1863,13 +1854,9 @@ static int btrfs_do_readpage(struct page *page, struct extent_map **em_cached,
/* we've found a hole, just zero and go on */ /* we've found a hole, just zero and go on */
if (block_start == EXTENT_MAP_HOLE) { if (block_start == EXTENT_MAP_HOLE) {
struct extent_state *cached = NULL;
memzero_page(page, pg_offset, iosize); memzero_page(page, pg_offset, iosize);
set_extent_uptodate(tree, cur, cur + iosize - 1, unlock_extent(tree, cur, cur + iosize - 1, NULL);
&cached, GFP_NOFS);
unlock_extent(tree, cur, cur + iosize - 1, &cached);
end_page_read(page, true, cur, iosize); end_page_read(page, true, cur, iosize);
cur = cur + iosize; cur = cur + iosize;
pg_offset += iosize; pg_offset += iosize;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment