All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jiucheng Xu <jiucheng.xu@amlogic.com>
To: Gao Xiang <xiang@kernel.org>, Chao Yu <chao@kernel.org>,
	 Yue Hu <zbestahu@gmail.com>,
	Jeffle Xu <jefflexu@linux.alibaba.com>,
	 Sandeep Dhavale <dhavale@google.com>,
	Hongbo Li <lihongbo22@huawei.com>,
	 Chunhai Guo <guochunhai@vivo.com>
Cc: linux-erofs@lists.ozlabs.org, linux-kernel@vger.kernel.org,
	 jianxin.pan@amlogic.com, tuan.zhang@amlogic.com,
	 Jiucheng Xu <jiucheng.xu@amlogic.com>
Subject: [PATCH] erofs: use GFP_NOIO in endio decompression path of erofs
Date: Wed, 11 Mar 2026 15:22:34 +0800	[thread overview]
Message-ID: <20260311-origin-dev-v1-1-40524ef07ff0@amlogic.com> (raw)

The endio decompression path of erofs calls vm_map_ram(). Due to
insufficient memory, this function may generate memory swapping I/O,
which can cause submit_bio_wait to deadlock in some scenarios.

Trimmed down the call stack, as follows:

f2fs_submit_read_io
  submit_bio                      //bio_list is initialized.
    mmc_blk_mq_recovery
      z_erofs_endio
        vm_map_ram
          __pte_alloc_kernel
            __alloc_pages_direct_reclaim
              shrink_folio_list
                __swap_writepage
                  submit_bio_wait  //bio_list is non-NULL, hang!!!

Use memalloc_noio_{save,restore}() to wrap up this path.

Signed-off-by: Jiucheng Xu <jiucheng.xu@amlogic.com>
---
 fs/erofs/zdata.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/fs/erofs/zdata.c b/fs/erofs/zdata.c
index 3977e42b9516861bf3d59c072b6b8aaa6898dd8a..fe8121df9ef2f2404fc6e3f0fbbd6367f9ec2c67 100644
--- a/fs/erofs/zdata.c
+++ b/fs/erofs/zdata.c
@@ -1445,6 +1445,7 @@ static void z_erofs_decompress_kickoff(struct z_erofs_decompressqueue *io,
 				       int bios)
 {
 	struct erofs_sb_info *const sbi = EROFS_SB(io->sb);
+	int gfp_flag;
 
 	/* wake up the caller thread for sync decompression */
 	if (io->sync) {
@@ -1477,7 +1478,9 @@ static void z_erofs_decompress_kickoff(struct z_erofs_decompressqueue *io,
 			sbi->sync_decompress = EROFS_SYNC_DECOMPRESS_FORCE_ON;
 		return;
 	}
+	gfp_flag = memalloc_noio_save();
 	z_erofs_decompressqueue_work(&io->u.work);
+	memalloc_noio_restore(gfp_flag);
 }
 
 static void z_erofs_fill_bio_vec(struct bio_vec *bvec,

---
base-commit: 11439c4635edd669ae435eec308f4ab8a0804808
change-id: 20260311-origin-dev-1c9665798204

Best regards,
-- 
Jiucheng Xu <jiucheng.xu@amlogic.com>


WARNING: multiple messages have this Message-ID (diff)
From: Jiucheng Xu via B4 Relay <devnull+jiucheng.xu.amlogic.com@kernel.org>
To: Gao Xiang <xiang@kernel.org>, Chao Yu <chao@kernel.org>,
	 Yue Hu <zbestahu@gmail.com>,
	Jeffle Xu <jefflexu@linux.alibaba.com>,
	 Sandeep Dhavale <dhavale@google.com>,
	Hongbo Li <lihongbo22@huawei.com>,
	 Chunhai Guo <guochunhai@vivo.com>
Cc: linux-erofs@lists.ozlabs.org, linux-kernel@vger.kernel.org,
	 jianxin.pan@amlogic.com, tuan.zhang@amlogic.com,
	 Jiucheng Xu <jiucheng.xu@amlogic.com>
Subject: [PATCH] erofs: use GFP_NOIO in endio decompression path of erofs
Date: Wed, 11 Mar 2026 15:22:34 +0800	[thread overview]
Message-ID: <20260311-origin-dev-v1-1-40524ef07ff0@amlogic.com> (raw)

From: Jiucheng Xu <jiucheng.xu@amlogic.com>

The endio decompression path of erofs calls vm_map_ram(). Due to
insufficient memory, this function may generate memory swapping I/O,
which can cause submit_bio_wait to deadlock in some scenarios.

Trimmed down the call stack, as follows:

f2fs_submit_read_io
  submit_bio                      //bio_list is initialized.
    mmc_blk_mq_recovery
      z_erofs_endio
        vm_map_ram
          __pte_alloc_kernel
            __alloc_pages_direct_reclaim
              shrink_folio_list
                __swap_writepage
                  submit_bio_wait  //bio_list is non-NULL, hang!!!

Use memalloc_noio_{save,restore}() to wrap up this path.

Signed-off-by: Jiucheng Xu <jiucheng.xu@amlogic.com>
---
 fs/erofs/zdata.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/fs/erofs/zdata.c b/fs/erofs/zdata.c
index 3977e42b9516861bf3d59c072b6b8aaa6898dd8a..fe8121df9ef2f2404fc6e3f0fbbd6367f9ec2c67 100644
--- a/fs/erofs/zdata.c
+++ b/fs/erofs/zdata.c
@@ -1445,6 +1445,7 @@ static void z_erofs_decompress_kickoff(struct z_erofs_decompressqueue *io,
 				       int bios)
 {
 	struct erofs_sb_info *const sbi = EROFS_SB(io->sb);
+	int gfp_flag;
 
 	/* wake up the caller thread for sync decompression */
 	if (io->sync) {
@@ -1477,7 +1478,9 @@ static void z_erofs_decompress_kickoff(struct z_erofs_decompressqueue *io,
 			sbi->sync_decompress = EROFS_SYNC_DECOMPRESS_FORCE_ON;
 		return;
 	}
+	gfp_flag = memalloc_noio_save();
 	z_erofs_decompressqueue_work(&io->u.work);
+	memalloc_noio_restore(gfp_flag);
 }
 
 static void z_erofs_fill_bio_vec(struct bio_vec *bvec,

---
base-commit: 11439c4635edd669ae435eec308f4ab8a0804808
change-id: 20260311-origin-dev-1c9665798204

Best regards,
-- 
Jiucheng Xu <jiucheng.xu@amlogic.com>




             reply	other threads:[~2026-03-11  7:22 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-03-11  7:22 Jiucheng Xu [this message]
2026-03-11  7:22 ` [PATCH] erofs: use GFP_NOIO in endio decompression path of erofs Jiucheng Xu via B4 Relay
2026-03-11  7:46 ` Gao Xiang

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20260311-origin-dev-v1-1-40524ef07ff0@amlogic.com \
    --to=jiucheng.xu@amlogic.com \
    --cc=chao@kernel.org \
    --cc=dhavale@google.com \
    --cc=guochunhai@vivo.com \
    --cc=jefflexu@linux.alibaba.com \
    --cc=jianxin.pan@amlogic.com \
    --cc=lihongbo22@huawei.com \
    --cc=linux-erofs@lists.ozlabs.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=tuan.zhang@amlogic.com \
    --cc=xiang@kernel.org \
    --cc=zbestahu@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.