static noinline int add_ra_bio_pages(struct inode *inode,
                                     u64 compressed_end,
                                     struct compressed_bio *cb,
-                                    unsigned long *pflags)
+                                    int *memstall, unsigned long *pflags)
 {
        struct btrfs_fs_info *fs_info = btrfs_sb(inode->i_sb);
        unsigned long end_index;
                        continue;
                }
 
-               if (PageWorkingset(page))
+               if (!*memstall && PageWorkingset(page)) {
                        psi_memstall_enter(pflags);
+                       *memstall = 1;
+               }
 
                ret = set_page_extent_mapped(page);
                if (ret < 0) {
        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;
+       unsigned long pflags;
+       int memstall = 0;
        blk_status_t ret;
        int ret2;
        int i;
                goto fail;
        }
 
-       add_ra_bio_pages(inode, em_start + em_len, cb, &pflags);
+       add_ra_bio_pages(inode, em_start + em_len, cb, &memstall, &pflags);
 
        /* include any pages we added in add_ra-bio_pages */
        cb->len = bio->bi_iter.bi_size;
                }
        }
 
-       if (!pflags)
+       if (memstall)
                psi_memstall_leave(&pflags);
 
        if (refcount_dec_and_test(&cb->pending_ios))
 
        struct block_device *last_bdev;
        unsigned int nr_bios = 0;
        struct bio *bio = NULL;
-       /* initialize to 1 to make skip psi_memstall_leave unless needed */
-       unsigned long pflags = 1;
+       unsigned long pflags;
+       int memstall = 0;
 
        bi_private = jobqueueset_init(sb, q, fgq, force_fg);
        qtail[JQ_BYPASS] = &q[JQ_BYPASS]->head;
                        if (bio && (cur != last_index + 1 ||
                                    last_bdev != mdev.m_bdev)) {
 submit_bio_retry:
-                               if (!pflags)
-                                       psi_memstall_leave(&pflags);
                                submit_bio(bio);
+                               if (memstall) {
+                                       psi_memstall_leave(&pflags);
+                                       memstall = 0;
+                               }
                                bio = NULL;
                        }
 
-                       if (unlikely(PageWorkingset(page)))
+                       if (unlikely(PageWorkingset(page)) && !memstall) {
                                psi_memstall_enter(&pflags);
+                               memstall = 1;
+                       }
 
                        if (!bio) {
                                bio = bio_alloc(mdev.m_bdev, BIO_MAX_VECS,
        } while (owned_head != Z_EROFS_PCLUSTER_TAIL);
 
        if (bio) {
-               if (!pflags)
-                       psi_memstall_leave(&pflags);
                submit_bio(bio);
+               if (memstall)
+                       psi_memstall_leave(&pflags);
        }
 
        /*