From: Greg Kroah-Hartman Date: Wed, 12 Jun 2024 12:55:51 +0000 (+0200) Subject: 6.9-stable patches X-Git-Tag: v4.19.316~126 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=cbb4aff501004b886071f9c7f0be994454166cf6;p=thirdparty%2Fkernel%2Fstable-queue.git 6.9-stable patches added patches: erofs-avoid-allocating-deflate-streams-before-mounting.patch --- diff --git a/queue-6.9/erofs-avoid-allocating-deflate-streams-before-mounting.patch b/queue-6.9/erofs-avoid-allocating-deflate-streams-before-mounting.patch new file mode 100644 index 00000000000..ffe03bb7c73 --- /dev/null +++ b/queue-6.9/erofs-avoid-allocating-deflate-streams-before-mounting.patch @@ -0,0 +1,108 @@ +From 80eb4f62056d6ae709bdd0636ab96ce660f494b2 Mon Sep 17 00:00:00 2001 +From: Gao Xiang +Date: Mon, 20 May 2024 17:01:06 +0800 +Subject: erofs: avoid allocating DEFLATE streams before mounting + +From: Gao Xiang + +commit 80eb4f62056d6ae709bdd0636ab96ce660f494b2 upstream. + +Currently, each DEFLATE stream takes one 32 KiB permanent internal +window buffer even if there is no running instance which uses DEFLATE +algorithm. + +It's unexpected and wasteful on embedded devices with limited resources +and servers with hundreds of CPU cores if DEFLATE is enabled but unused. + +Fixes: ffa09b3bd024 ("erofs: DEFLATE compression support") +Cc: # 6.6+ +Reviewed-by: Sandeep Dhavale +Signed-off-by: Gao Xiang +Link: https://lore.kernel.org/r/20240520090106.2898681-1-hsiangkao@linux.alibaba.com +Signed-off-by: Greg Kroah-Hartman +--- + fs/erofs/decompressor_deflate.c | 57 +++++++++++++++++++++------------------- + 1 file changed, 30 insertions(+), 27 deletions(-) + +--- a/fs/erofs/decompressor_deflate.c ++++ b/fs/erofs/decompressor_deflate.c +@@ -46,39 +46,15 @@ int __init z_erofs_deflate_init(void) + /* by default, use # of possible CPUs instead */ + if (!z_erofs_deflate_nstrms) + z_erofs_deflate_nstrms = num_possible_cpus(); +- +- for (; z_erofs_deflate_avail_strms < z_erofs_deflate_nstrms; +- ++z_erofs_deflate_avail_strms) { +- struct z_erofs_deflate *strm; +- +- strm = kzalloc(sizeof(*strm), GFP_KERNEL); +- if (!strm) +- goto out_failed; +- +- /* XXX: in-kernel zlib cannot shrink windowbits currently */ +- strm->z.workspace = vmalloc(zlib_inflate_workspacesize()); +- if (!strm->z.workspace) { +- kfree(strm); +- goto out_failed; +- } +- +- spin_lock(&z_erofs_deflate_lock); +- strm->next = z_erofs_deflate_head; +- z_erofs_deflate_head = strm; +- spin_unlock(&z_erofs_deflate_lock); +- } + return 0; +- +-out_failed: +- erofs_err(NULL, "failed to allocate zlib workspace"); +- z_erofs_deflate_exit(); +- return -ENOMEM; + } + + int z_erofs_load_deflate_config(struct super_block *sb, + struct erofs_super_block *dsb, void *data, int size) + { + struct z_erofs_deflate_cfgs *dfl = data; ++ static DEFINE_MUTEX(deflate_resize_mutex); ++ static bool inited; + + if (!dfl || size < sizeof(struct z_erofs_deflate_cfgs)) { + erofs_err(sb, "invalid deflate cfgs, size=%u", size); +@@ -89,9 +65,36 @@ int z_erofs_load_deflate_config(struct s + erofs_err(sb, "unsupported windowbits %u", dfl->windowbits); + return -EOPNOTSUPP; + } +- ++ mutex_lock(&deflate_resize_mutex); ++ if (!inited) { ++ for (; z_erofs_deflate_avail_strms < z_erofs_deflate_nstrms; ++ ++z_erofs_deflate_avail_strms) { ++ struct z_erofs_deflate *strm; ++ ++ strm = kzalloc(sizeof(*strm), GFP_KERNEL); ++ if (!strm) ++ goto failed; ++ /* XXX: in-kernel zlib cannot customize windowbits */ ++ strm->z.workspace = vmalloc(zlib_inflate_workspacesize()); ++ if (!strm->z.workspace) { ++ kfree(strm); ++ goto failed; ++ } ++ ++ spin_lock(&z_erofs_deflate_lock); ++ strm->next = z_erofs_deflate_head; ++ z_erofs_deflate_head = strm; ++ spin_unlock(&z_erofs_deflate_lock); ++ } ++ inited = true; ++ } ++ mutex_unlock(&deflate_resize_mutex); + erofs_info(sb, "EXPERIMENTAL DEFLATE feature in use. Use at your own risk!"); + return 0; ++failed: ++ mutex_unlock(&deflate_resize_mutex); ++ z_erofs_deflate_exit(); ++ return -ENOMEM; + } + + int z_erofs_deflate_decompress(struct z_erofs_decompress_req *rq, diff --git a/queue-6.9/series b/queue-6.9/series index 63d0fae8dfa..bc6c47ce02f 100644 --- a/queue-6.9/series +++ b/queue-6.9/series @@ -1,3 +1,4 @@ drm-amdkfd-handle-duplicate-bos-in-reserve_bo_and_cond_vms.patch drm-i915-hwmon-get-rid-of-devm.patch afs-don-t-cross-.backup-mountpoint-from-backup-volume.patch +erofs-avoid-allocating-deflate-streams-before-mounting.patch