From: Greg Kroah-Hartman Date: Mon, 30 Mar 2026 06:21:40 +0000 (+0200) Subject: 6.12-stable patches X-Git-Tag: v6.6.131~45 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=d27930334f0349aa87bc3f5bd25e2601259ab5a8;p=thirdparty%2Fkernel%2Fstable-queue.git 6.12-stable patches added patches: erofs-add-gfp_noio-in-the-bio-completion-if-needed.patch --- diff --git a/queue-6.12/erofs-add-gfp_noio-in-the-bio-completion-if-needed.patch b/queue-6.12/erofs-add-gfp_noio-in-the-bio-completion-if-needed.patch new file mode 100644 index 0000000000..9ee58a2db1 --- /dev/null +++ b/queue-6.12/erofs-add-gfp_noio-in-the-bio-completion-if-needed.patch @@ -0,0 +1,62 @@ +From c23df30915f83e7257c8625b690a1cece94142a0 Mon Sep 17 00:00:00 2001 +From: Jiucheng Xu +Date: Wed, 11 Mar 2026 17:11:31 +0800 +Subject: erofs: add GFP_NOIO in the bio completion if needed + +From: Jiucheng Xu + +commit c23df30915f83e7257c8625b690a1cece94142a0 upstream. + +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 +Signed-off-by: Jiucheng Xu +Reviewed-by: Chao Yu +Signed-off-by: Gao Xiang +Signed-off-by: Greg Kroah-Hartman +--- + fs/erofs/zdata.c | 3 +++ + 1 file changed, 3 insertions(+) + +--- a/fs/erofs/zdata.c ++++ b/fs/erofs/zdata.c +@@ -1425,6 +1425,7 @@ static void z_erofs_decompress_kickoff(s + 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) { +@@ -1457,7 +1458,9 @@ static void z_erofs_decompress_kickoff(s + sbi->opt.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, diff --git a/queue-6.12/series b/queue-6.12/series index 2bfb011790..44e100c65d 100644 --- a/queue-6.12/series +++ b/queue-6.12/series @@ -151,3 +151,4 @@ hwmon-peci-cputemp-fix-crit_hyst-returning-delta-instead-of-absolute-temperature hwmon-peci-cputemp-fix-off-by-one-in-cputemp_is_visible.patch media-mc-v4l2-serialize-reinit-and-reqbufs-with-req_queue_mutex.patch virtio_net-fix-uaf-on-dst_ops-when-iff_xmit_dst_release-is-cleared-and-napi_tx-is-false.patch +erofs-add-gfp_noio-in-the-bio-completion-if-needed.patch