]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
zram: use statically allocated compression algorithm names
authorgao xu <gaoxu2@honor.com>
Thu, 26 Feb 2026 12:37:22 +0000 (12:37 +0000)
committerAndrew Morton <akpm@linux-foundation.org>
Sun, 5 Apr 2026 20:53:07 +0000 (13:53 -0700)
Currently, zram dynamically allocates memory for compressor algorithm
names when they are set by the user.  This requires careful memory
management, including explicit `kfree` calls and special handling to avoid
freeing statically defined default compressor names.

This patch refactors the way zram handles compression algorithm names.
Instead of storing dynamically allocated copies, `zram->comp_algs` will
now store pointers directly to the static name strings defined within the
`zcomp_ops` backend structures, thereby removing the need for conditional
`kfree` calls.

Link: https://lkml.kernel.org/r/5bb2e9318d124dbcb2b743dcdce6a950@honor.com
Signed-off-by: gao xu <gaoxu2@honor.com>
Reviewed-by: Sergey Senozhatsky <senozhatsky@chromium.org>
Cc: Jens Axboe <axboe@kernel.dk>
Cc: Minchan Kim <minchan@kernel.org>
Cc: Suren Baghdasaryan <surenb@google.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
drivers/block/zram/zcomp.c
drivers/block/zram/zcomp.h
drivers/block/zram/zram_drv.c

index a771a8ecc540bad8bf535ec87712da694e34a1d3..974c4691887e6f678fdbe91ea5f296ee173aeb75 100644 (file)
@@ -84,9 +84,14 @@ static const struct zcomp_ops *lookup_backend_ops(const char *comp)
        return backends[i];
 }
 
-bool zcomp_available_algorithm(const char *comp)
+const char *zcomp_lookup_backend_name(const char *comp)
 {
-       return lookup_backend_ops(comp) != NULL;
+       const struct zcomp_ops *backend = lookup_backend_ops(comp);
+
+       if (backend)
+               return backend->name;
+
+       return NULL;
 }
 
 /* show available compressors */
index eacfd3f7d61d9395694292713fb5da4f0023d6d7..81a0f3f6ff4871e9355fc22d92796e65b2e4bf25 100644 (file)
@@ -80,7 +80,7 @@ struct zcomp {
 int zcomp_cpu_up_prepare(unsigned int cpu, struct hlist_node *node);
 int zcomp_cpu_dead(unsigned int cpu, struct hlist_node *node);
 ssize_t zcomp_available_show(const char *comp, char *buf, ssize_t at);
-bool zcomp_available_algorithm(const char *comp);
+const char *zcomp_lookup_backend_name(const char *comp);
 
 struct zcomp *zcomp_create(const char *alg, struct zcomp_params *params);
 void zcomp_destroy(struct zcomp *comp);
index af679375b193598a836e14dbc1cebb16804c0050..990d391847f4c0ed6e34c6b270d63dd5c57664a9 100644 (file)
@@ -1621,43 +1621,29 @@ static void zram_debugfs_unregister(struct zram *zram) {};
 
 static void comp_algorithm_set(struct zram *zram, u32 prio, const char *alg)
 {
-       /* Do not free statically defined compression algorithms */
-       if (zram->comp_algs[prio] != default_compressor)
-               kfree(zram->comp_algs[prio]);
-
        zram->comp_algs[prio] = alg;
 }
 
 static int __comp_algorithm_store(struct zram *zram, u32 prio, const char *buf)
 {
-       char *compressor;
+       const char *alg;
        size_t sz;
 
        sz = strlen(buf);
        if (sz >= ZRAM_MAX_ALGO_NAME_SZ)
                return -E2BIG;
 
-       compressor = kstrdup(buf, GFP_KERNEL);
-       if (!compressor)
-               return -ENOMEM;
-
-       /* ignore trailing newline */
-       if (sz > 0 && compressor[sz - 1] == '\n')
-               compressor[sz - 1] = 0x00;
-
-       if (!zcomp_available_algorithm(compressor)) {
-               kfree(compressor);
+       alg = zcomp_lookup_backend_name(buf);
+       if (!alg)
                return -EINVAL;
-       }
 
        guard(rwsem_write)(&zram->dev_lock);
        if (init_done(zram)) {
-               kfree(compressor);
                pr_info("Can't change algorithm for initialized device\n");
                return -EBUSY;
        }
 
-       comp_algorithm_set(zram, prio, compressor);
+       comp_algorithm_set(zram, prio, alg);
        return 0;
 }
 
@@ -2840,12 +2826,8 @@ static void zram_destroy_comps(struct zram *zram)
                zram->num_active_comps--;
        }
 
-       for (prio = ZRAM_PRIMARY_COMP; prio < ZRAM_MAX_COMPS; prio++) {
-               /* Do not free statically defined compression algorithms */
-               if (zram->comp_algs[prio] != default_compressor)
-                       kfree(zram->comp_algs[prio]);
+       for (prio = ZRAM_PRIMARY_COMP; prio < ZRAM_MAX_COMPS; prio++)
                zram->comp_algs[prio] = NULL;
-       }
 
        zram_comp_params_reset(zram);
 }