Re: [PATCH] ubifs: Add support for zstd compression.

From: Emil Lenngren
Date: Fri Jun 07 2019 - 11:38:44 EST


Hello,

Den ons 15 maj 2019 kl 23:03 skrev Richard Weinberger <richard@xxxxxx>:
>
> From: Michele Dionisio <michele.dionisio@xxxxxxxxx>
>
> zstd shows a good compression rate and is faster than lzo,
> also on slow ARM cores.
>
> Cc: Sebastian Andrzej Siewior <sebastian@xxxxxxxxxxxxx>
> Signed-off-by: Michele Dionisio <michele.dionisio@xxxxxxxxx>
> [rw: rewrote commit message]
> Signed-off-by: Richard Weinberger <richard@xxxxxx>
> ---
> fs/ubifs/Kconfig | 10 ++++++++++
> fs/ubifs/compress.c | 27 ++++++++++++++++++++++++++-
> fs/ubifs/super.c | 2 ++
> fs/ubifs/ubifs-media.h | 2 ++
> 4 files changed, 40 insertions(+), 1 deletion(-)
>
> diff --git a/fs/ubifs/Kconfig b/fs/ubifs/Kconfig
> index 9da2f135121b..8d84d2ed096d 100644
> --- a/fs/ubifs/Kconfig
> +++ b/fs/ubifs/Kconfig
> @@ -5,8 +5,10 @@ config UBIFS_FS
> select CRYPTO if UBIFS_FS_ADVANCED_COMPR
> select CRYPTO if UBIFS_FS_LZO
> select CRYPTO if UBIFS_FS_ZLIB
> + select CRYPTO if UBIFS_FS_ZSTD
> select CRYPTO_LZO if UBIFS_FS_LZO
> select CRYPTO_DEFLATE if UBIFS_FS_ZLIB
> + select CRYPTO_ZSTD if UBIFS_FS_ZSTD
> select CRYPTO_HASH_INFO
> select UBIFS_FS_XATTR if FS_ENCRYPTION
> depends on MTD_UBI
> @@ -37,6 +39,14 @@ config UBIFS_FS_ZLIB
> help
> Zlib compresses better than LZO but it is slower. Say 'Y' if unsure.
>
> +config UBIFS_FS_ZSTD
> + bool "ZSTD compression support" if UBIFS_FS_ADVANCED_COMPR
> + depends on UBIFS_FS
> + default y
> + help
> + ZSTD compresses is a big win in speed over Zlib and
> + in compression ratio over LZO. Say 'Y' if unsure.
> +
> config UBIFS_ATIME_SUPPORT
> bool "Access time support"
> default n
> diff --git a/fs/ubifs/compress.c b/fs/ubifs/compress.c
> index 565cb56d7225..89183aeeeb7a 100644
> --- a/fs/ubifs/compress.c
> +++ b/fs/ubifs/compress.c
> @@ -71,6 +71,24 @@ static struct ubifs_compressor zlib_compr = {
> };
> #endif
>
> +#ifdef CONFIG_UBIFS_FS_ZSTD
> +static DEFINE_MUTEX(zstd_enc_mutex);
> +static DEFINE_MUTEX(zstd_dec_mutex);
> +
> +static struct ubifs_compressor zstd_compr = {
> + .compr_type = UBIFS_COMPR_ZSTD,
> + .comp_mutex = &zstd_enc_mutex,
> + .decomp_mutex = &zstd_dec_mutex,
> + .name = "zstd",
> + .capi_name = "zstd",
> +};
> +#else
> +static struct ubifs_compressor zstd_compr = {
> + .compr_type = UBIFS_COMPR_ZSTD,
> + .name = "zstd",
> +};
> +#endif
> +
> /* All UBIFS compressors */
> struct ubifs_compressor *ubifs_compressors[UBIFS_COMPR_TYPES_CNT];
>
> @@ -228,13 +246,19 @@ int __init ubifs_compressors_init(void)
> if (err)
> return err;
>
> - err = compr_init(&zlib_compr);
> + err = compr_init(&zstd_compr);
> if (err)
> goto out_lzo;
>
> + err = compr_init(&zlib_compr);
> + if (err)
> + goto out_zstd;
> +
> ubifs_compressors[UBIFS_COMPR_NONE] = &none_compr;
> return 0;
>
> +out_zstd:
> + compr_exit(&zstd_compr);
> out_lzo:
> compr_exit(&lzo_compr);
> return err;
> @@ -247,4 +271,5 @@ void ubifs_compressors_exit(void)
> {
> compr_exit(&lzo_compr);
> compr_exit(&zlib_compr);
> + compr_exit(&zstd_compr);
> }
> diff --git a/fs/ubifs/super.c b/fs/ubifs/super.c
> index 04b8ecfd3470..ea8615261936 100644
> --- a/fs/ubifs/super.c
> +++ b/fs/ubifs/super.c
> @@ -1055,6 +1055,8 @@ static int ubifs_parse_options(struct ubifs_info *c, char *options,
> c->mount_opts.compr_type = UBIFS_COMPR_LZO;
> else if (!strcmp(name, "zlib"))
> c->mount_opts.compr_type = UBIFS_COMPR_ZLIB;
> + else if (!strcmp(name, "zstd"))
> + c->mount_opts.compr_type = UBIFS_COMPR_ZSTD;
> else {
> ubifs_err(c, "unknown compressor \"%s\"", name); //FIXME: is c ready?
> kfree(name);
> diff --git a/fs/ubifs/ubifs-media.h b/fs/ubifs/ubifs-media.h
> index 8b7c1844014f..697b1b89066a 100644
> --- a/fs/ubifs/ubifs-media.h
> +++ b/fs/ubifs/ubifs-media.h
> @@ -348,12 +348,14 @@ enum {
> * UBIFS_COMPR_NONE: no compression
> * UBIFS_COMPR_LZO: LZO compression
> * UBIFS_COMPR_ZLIB: ZLIB compression
> + * UBIFS_COMPR_ZSTD: ZSTD compression
> * UBIFS_COMPR_TYPES_CNT: count of supported compression types
> */
> enum {
> UBIFS_COMPR_NONE,
> UBIFS_COMPR_LZO,
> UBIFS_COMPR_ZLIB,
> + UBIFS_COMPR_ZSTD,
> UBIFS_COMPR_TYPES_CNT,
> };
>
> --
> 2.16.4

In fs/ubifs/sb.c we have

static int get_default_compressor(struct ubifs_info *c)
{
if (ubifs_compr_present(c, UBIFS_COMPR_LZO))
return UBIFS_COMPR_LZO;

if (ubifs_compr_present(c, UBIFS_COMPR_ZLIB))
return UBIFS_COMPR_ZLIB;

return UBIFS_COMPR_NONE;
}

Maybe add an entry for zstd here as well?

/Emil