From: Christoph Hellwig hch@lst.de
mainline inclusion from mainline-v6.1-rc1 commit 4088a47e78f95a5fea683cf67e0be006b13831fd category: bugfix bugzilla: https://gitee.com/openeuler/kernel/issues/I8BCRJ CVE: NA
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?i...
--------------------------------
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 Conflicts: fs/btrfs/compression.c Signed-off-by: Liu Shixin liushixin2@huawei.com --- fs/btrfs/compression.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-)
diff --git a/fs/btrfs/compression.c b/fs/btrfs/compression.c index 646416b5940e9..2c04dd767995e 100644 --- a/fs/btrfs/compression.c +++ b/fs/btrfs/compression.c @@ -14,6 +14,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> @@ -500,7 +501,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) { unsigned long end_index; unsigned long pg_index; @@ -549,6 +551,9 @@ static noinline int add_ra_bio_pages(struct inode *inode, goto next; }
+ if (PageWorkingset(page)) + psi_memstall_enter(pflags); + end = last_offset + PAGE_SIZE - 1; /* * at this point, we have a locked page in the page cache @@ -630,6 +635,8 @@ blk_status_t btrfs_submit_compressed_read(struct inode *inode, struct bio *bio, u64 cur_disk_byte = (u64)bio->bi_iter.bi_sector << 9; u64 em_len; u64 em_start; + /* Initialize to 1 to make skip psi_memstall_leave unless needed */ + unsigned long pflags = 1; struct extent_map *em; blk_status_t ret = BLK_STS_RESOURCE; int faili = 0; @@ -688,7 +695,7 @@ blk_status_t btrfs_submit_compressed_read(struct inode *inode, struct bio *bio, faili = nr_pages - 1; cb->nr_pages = nr_pages;
- 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; @@ -767,6 +774,9 @@ blk_status_t btrfs_submit_compressed_read(struct inode *inode, struct bio *bio, bio_endio(comp_bio); }
+ if (!pflags) + psi_memstall_leave(&pflags); + return 0;
fail2: