Skip to content

Commit

Permalink
btrfs: add manual PSI accounting for compressed reads
Browse files Browse the repository at this point in the history
btrfs compressed reads try to always read the entire compressed chunk,
even if only a subset is requested.  Currently this is covered by the
magic PSI accounting underneath submit_bio, but that is about to go
away. Instead add manual psi_memstall_{enter,leave} annotations.

Note that for readahead this really should be using readahead_expand,
but the additionals reads are also done for plain ->read_folio where
readahead_expand can't work, so this overall logic is left as-is for
now.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Acked-by: David Sterba <dsterba@suse.com>
Acked-by: Johannes Weiner <hannes@cmpxchg.org>
Link: https://lore.kernel.org/r/20220915094200.139713-4-hch@lst.de
Signed-off-by: Jens Axboe <axboe@kernel.dk>
  • Loading branch information
Christoph Hellwig authored and Jens Axboe committed Sep 20, 2022
1 parent 527eb45 commit 4088a47
Showing 1 changed file with 12 additions and 2 deletions.
14 changes: 12 additions & 2 deletions fs/btrfs/compression.c
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
#include <linux/string.h>
#include <linux/backing-dev.h>
#include <linux/writeback.h>
#include <linux/psi.h>
#include <linux/slab.h>
#include <linux/sched/mm.h>
#include <linux/log2.h>
Expand Down Expand Up @@ -519,7 +520,8 @@ static u64 bio_end_offset(struct bio *bio)
*/
static noinline int add_ra_bio_pages(struct inode *inode,
u64 compressed_end,
struct compressed_bio *cb)
struct compressed_bio *cb,
unsigned long *pflags)
{
struct btrfs_fs_info *fs_info = btrfs_sb(inode->i_sb);
unsigned long end_index;
Expand Down Expand Up @@ -588,6 +590,9 @@ static noinline int add_ra_bio_pages(struct inode *inode,
continue;
}

if (PageWorkingset(page))
psi_memstall_enter(pflags);

ret = set_page_extent_mapped(page);
if (ret < 0) {
unlock_page(page);
Expand Down Expand Up @@ -674,6 +679,8 @@ void btrfs_submit_compressed_read(struct inode *inode, struct bio *bio,
u64 em_len;
u64 em_start;
struct extent_map *em;
/* Initialize to 1 to make skip psi_memstall_leave unless needed */
unsigned long pflags = 1;
blk_status_t ret;
int ret2;
int i;
Expand Down Expand Up @@ -729,7 +736,7 @@ void btrfs_submit_compressed_read(struct inode *inode, struct bio *bio,
goto fail;
}

add_ra_bio_pages(inode, em_start + em_len, cb);
add_ra_bio_pages(inode, em_start + em_len, cb, &pflags);

/* include any pages we added in add_ra-bio_pages */
cb->len = bio->bi_iter.bi_size;
Expand Down Expand Up @@ -810,6 +817,9 @@ void btrfs_submit_compressed_read(struct inode *inode, struct bio *bio,
}
}

if (!pflags)
psi_memstall_leave(&pflags);

if (refcount_dec_and_test(&cb->pending_ios))
finish_compressed_bio_read(cb);
return;
Expand Down

0 comments on commit 4088a47

Please sign in to comment.