Merge tag 'mm-stable-2022-10-08' of git://git.kernel.org/pub/scm/linux/kernel/git...
[platform/kernel/linux-starfive.git] / fs / btrfs / compression.c
index 05d228e..f1f051a 100644 (file)
@@ -16,6 +16,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>
@@ -153,9 +154,7 @@ static void finish_compressed_bio_read(struct compressed_bio *cb)
        }
 
        /* Do io completion on the original bio */
-       if (cb->status != BLK_STS_OK)
-               cb->orig_bio->bi_status = cb->status;
-       bio_endio(cb->orig_bio);
+       btrfs_bio_end_io(btrfs_bio(cb->orig_bio), cb->status);
 
        /* Finally free the cb struct */
        kfree(cb->compressed_pages);
@@ -167,16 +166,15 @@ static void finish_compressed_bio_read(struct compressed_bio *cb)
  * before decompressing it into the original bio and freeing the uncompressed
  * pages.
  */
-static void end_compressed_bio_read(struct bio *bio)
+static void end_compressed_bio_read(struct btrfs_bio *bbio)
 {
-       struct compressed_bio *cb = bio->bi_private;
+       struct compressed_bio *cb = bbio->private;
        struct inode *inode = cb->inode;
        struct btrfs_fs_info *fs_info = btrfs_sb(inode->i_sb);
        struct btrfs_inode *bi = BTRFS_I(inode);
        bool csum = !(bi->flags & BTRFS_INODE_NODATASUM) &&
                    !test_bit(BTRFS_FS_STATE_NO_CSUMS, &fs_info->fs_state);
-       blk_status_t status = bio->bi_status;
-       struct btrfs_bio *bbio = btrfs_bio(bio);
+       blk_status_t status = bbio->bio.bi_status;
        struct bvec_iter iter;
        struct bio_vec bv;
        u32 offset;
@@ -187,9 +185,8 @@ static void end_compressed_bio_read(struct bio *bio)
                if (!status &&
                    (!csum || !btrfs_check_data_csum(inode, bbio, offset,
                                                     bv.bv_page, bv.bv_offset))) {
-                       clean_io_failure(fs_info, &bi->io_failure_tree,
-                                        &bi->io_tree, start, bv.bv_page,
-                                        btrfs_ino(bi), bv.bv_offset);
+                       btrfs_clean_io_failure(bi, start, bv.bv_page,
+                                              bv.bv_offset);
                } else {
                        int ret;
 
@@ -210,7 +207,7 @@ static void end_compressed_bio_read(struct bio *bio)
        if (refcount_dec_and_test(&cb->pending_ios))
                finish_compressed_bio_read(cb);
        btrfs_bio_free_csum(bbio);
-       bio_put(bio);
+       bio_put(&bbio->bio);
 }
 
 /*
@@ -300,20 +297,20 @@ static void btrfs_finish_compressed_write_work(struct work_struct *work)
  * This also calls the writeback end hooks for the file pages so that metadata
  * and checksums can be updated in the file.
  */
-static void end_compressed_bio_write(struct bio *bio)
+static void end_compressed_bio_write(struct btrfs_bio *bbio)
 {
-       struct compressed_bio *cb = bio->bi_private;
+       struct compressed_bio *cb = bbio->private;
 
-       if (bio->bi_status)
-               cb->status = bio->bi_status;
+       if (bbio->bio.bi_status)
+               cb->status = bbio->bio.bi_status;
 
        if (refcount_dec_and_test(&cb->pending_ios)) {
                struct btrfs_fs_info *fs_info = btrfs_sb(cb->inode->i_sb);
 
-               btrfs_record_physical_zoned(cb->inode, cb->start, bio);
+               btrfs_record_physical_zoned(cb->inode, cb->start, &bbio->bio);
                queue_work(fs_info->compressed_write_workers, &cb->write_end_work);
        }
-       bio_put(bio);
+       bio_put(&bbio->bio);
 }
 
 /*
@@ -334,7 +331,8 @@ static void end_compressed_bio_write(struct bio *bio)
 
 
 static struct bio *alloc_compressed_bio(struct compressed_bio *cb, u64 disk_bytenr,
-                                       blk_opf_t opf, bio_end_io_t endio_func,
+                                       blk_opf_t opf,
+                                       btrfs_bio_end_io_t endio_func,
                                        u64 *next_stripe_start)
 {
        struct btrfs_fs_info *fs_info = btrfs_sb(cb->inode->i_sb);
@@ -343,12 +341,8 @@ static struct bio *alloc_compressed_bio(struct compressed_bio *cb, u64 disk_byte
        struct bio *bio;
        int ret;
 
-       bio = btrfs_bio_alloc(BIO_MAX_VECS);
-
+       bio = btrfs_bio_alloc(BIO_MAX_VECS, opf, endio_func, cb);
        bio->bi_iter.bi_sector = disk_bytenr >> SECTOR_SHIFT;
-       bio->bi_opf = opf;
-       bio->bi_private = cb;
-       bio->bi_end_io = endio_func;
 
        em = btrfs_get_chunk_map(fs_info, disk_bytenr, fs_info->sectorsize);
        if (IS_ERR(em)) {
@@ -477,8 +471,7 @@ blk_status_t btrfs_submit_compressed_write(struct btrfs_inode *inode, u64 start,
                        if (!skip_sum) {
                                ret = btrfs_csum_one_bio(inode, bio, start, true);
                                if (ret) {
-                                       bio->bi_status = ret;
-                                       bio_endio(bio);
+                                       btrfs_bio_end_io(btrfs_bio(bio), ret);
                                        break;
                                }
                        }
@@ -518,7 +511,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;
@@ -587,6 +581,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);
@@ -595,7 +592,7 @@ static noinline int add_ra_bio_pages(struct inode *inode,
                }
 
                page_end = (pg_index << PAGE_SHIFT) + PAGE_SIZE - 1;
-               lock_extent(tree, cur, page_end);
+               lock_extent(tree, cur, page_end, NULL);
                read_lock(&em_tree->lock);
                em = lookup_extent_mapping(em_tree, cur, page_end + 1 - cur);
                read_unlock(&em_tree->lock);
@@ -609,7 +606,7 @@ static noinline int add_ra_bio_pages(struct inode *inode,
                    (cur + fs_info->sectorsize > extent_map_end(em)) ||
                    (em->block_start >> 9) != cb->orig_bio->bi_iter.bi_sector) {
                        free_extent_map(em);
-                       unlock_extent(tree, cur, page_end);
+                       unlock_extent(tree, cur, page_end, NULL);
                        unlock_page(page);
                        put_page(page);
                        break;
@@ -629,7 +626,7 @@ static noinline int add_ra_bio_pages(struct inode *inode,
                add_size = min(em->start + em->len, page_end + 1) - cur;
                ret = bio_add_page(cb->orig_bio, page, add_size, offset_in_page(cur));
                if (ret != add_size) {
-                       unlock_extent(tree, cur, page_end);
+                       unlock_extent(tree, cur, page_end, NULL);
                        unlock_page(page);
                        put_page(page);
                        break;
@@ -673,6 +670,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;
@@ -728,7 +727,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;
@@ -798,8 +797,7 @@ void btrfs_submit_compressed_read(struct inode *inode, struct bio *bio,
 
                        ret = btrfs_lookup_bio_sums(inode, comp_bio, NULL);
                        if (ret) {
-                               comp_bio->bi_status = ret;
-                               bio_endio(comp_bio);
+                               btrfs_bio_end_io(btrfs_bio(comp_bio), ret);
                                break;
                        }
 
@@ -809,6 +807,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;
@@ -825,8 +826,7 @@ fail:
        kfree(cb);
 out:
        free_extent_map(em);
-       bio->bi_status = ret;
-       bio_endio(bio);
+       btrfs_bio_end_io(btrfs_bio(bio), ret);
        return;
 }