erofs: add GFP_NOIO in the bio completion if needed
authorJiucheng Xu <jiucheng.xu@amlogic.com>
Wed, 11 Mar 2026 09:11:31 +0000 (17:11 +0800)
committerGao Xiang <hsiangkao@linux.alibaba.com>
Wed, 18 Mar 2026 16:24:21 +0000 (00:24 +0800)
commitc23df30915f83e7257c8625b690a1cece94142a0
tree3e39aeac4663980965568c3047e765f3f7793061
parenteade54040384f54b7fb330e4b0975c5734850b3c
erofs: add GFP_NOIO in the bio completion if needed

The bio completion path in the process context (e.g. dm-verity)
will directly call into decompression rather than trigger another
workqueue context for minimal scheduling latencies, which can
then call vm_map_ram() with GFP_KERNEL.

Due to insufficient memory, vm_map_ram() 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.

Reviewed-by: Gao Xiang <hsiangkao@linux.alibaba.com>
Signed-off-by: Jiucheng Xu <jiucheng.xu@amlogic.com>
Reviewed-by: Chao Yu <chao@kernel.org>
Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
fs/erofs/zdata.c