Merge tag 'erofs-for-6.1-rc6-fixes' of git://git.kernel.org/pub/scm/linux/kernel...
[platform/kernel/linux-starfive.git] / fs / erofs / zdata.c
index d6caf27..b792d42 100644 (file)
@@ -1415,8 +1415,8 @@ static void z_erofs_submit_queue(struct z_erofs_decompress_frontend *f,
        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;
@@ -1466,14 +1466,18 @@ static void z_erofs_submit_queue(struct z_erofs_decompress_frontend *f,
                        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,
@@ -1503,9 +1507,9 @@ submit_bio_retry:
        } while (owned_head != Z_EROFS_PCLUSTER_TAIL);
 
        if (bio) {
-               if (!pflags)
-                       psi_memstall_leave(&pflags);
                submit_bio(bio);
+               if (memstall)
+                       psi_memstall_leave(&pflags);
        }
 
        /*