]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
6.9-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 12 Jun 2024 12:55:51 +0000 (14:55 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 12 Jun 2024 12:55:51 +0000 (14:55 +0200)
added patches:
erofs-avoid-allocating-deflate-streams-before-mounting.patch

queue-6.9/erofs-avoid-allocating-deflate-streams-before-mounting.patch [new file with mode: 0644]
queue-6.9/series

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 (file)
index 0000000..ffe03bb
--- /dev/null
@@ -0,0 +1,108 @@
+From 80eb4f62056d6ae709bdd0636ab96ce660f494b2 Mon Sep 17 00:00:00 2001
+From: Gao Xiang <hsiangkao@linux.alibaba.com>
+Date: Mon, 20 May 2024 17:01:06 +0800
+Subject: erofs: avoid allocating DEFLATE streams before mounting
+
+From: Gao Xiang <hsiangkao@linux.alibaba.com>
+
+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: <stable@vger.kernel.org> # 6.6+
+Reviewed-by: Sandeep Dhavale <dhavale@google.com>
+Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
+Link: https://lore.kernel.org/r/20240520090106.2898681-1-hsiangkao@linux.alibaba.com
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ 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,
index 63d0fae8dfa0a2335482529aa4b898802374e36f..bc6c47ce02ff4fba404328e6eae5ce021b31fdd0 100644 (file)
@@ -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