2013-07-22 02:27:18

by Phillip Lougher

[permalink] [raw]
Subject: [PATCH 0/2] Squashfs: add LZ4 compression

Hi

Now that LZ4 compression support is in 3.11-rc1, I have written the
following two patches for Squashfs to use it.

Phillip Lougher (2):
Squashfs: add LZ4 compression support
Squashfs: Add LZ4 compression configuration option

Documentation/filesystems/squashfs.txt | 8 +-
fs/squashfs/Kconfig | 15 +++
fs/squashfs/Makefile | 1 +
fs/squashfs/decompressor.c | 7 ++
fs/squashfs/decompressor.h | 4 +
fs/squashfs/lz4_wrapper.c | 163 ++++++++++++++++++++++++++++++++
fs/squashfs/squashfs_fs.h | 1 +
7 files changed, 195 insertions(+), 4 deletions(-)
create mode 100644 fs/squashfs/lz4_wrapper.c

These patches are also available in the git tree here:

browse: https://git.kernel.org/cgit/linux/kernel/git/pkl/squashfs-lz4.git
git clone: git://git.kernel.org/pub/scm/linux/kernel/git/pkl/squashfs-lz4.git

LZ4 support has (obviously) also been added to the squashfs-tools
(Mksquashfs and Unsquashfs). This is available from the Squashfs-tools
git repository here:

browse: https://git.kernel.org/cgit/fs/squashfs/squashfs-tools.git
git clone: git://git.kernel.org/pub/scm/fs/squashfs/squashfs-tools.git

When building the squashfs-tools edit the Makefile to enable LZ4
support (by default it is disabled).

LZ4 compression can be specified by using the -comp option, e.g.
% mksquashfs xxx img.sqsh -comp lz4

The use of LZ4 high compression can be specified using -Xhc, e.g.

% mksquashfs xxx img.sqsh -comp lz4 -Xhc

Phillip


2013-07-22 02:29:19

by Phillip Lougher

[permalink] [raw]
Subject: [PATCH 2/2] Squashfs: Add LZ4 compression configuration option

Add the glue code, and also update the documentation.

Signed-off-by: Phillip Lougher <[email protected]>
---
Documentation/filesystems/squashfs.txt | 8 ++++----
fs/squashfs/Kconfig | 15 +++++++++++++++
fs/squashfs/Makefile | 1 +
fs/squashfs/decompressor.c | 7 +++++++
fs/squashfs/decompressor.h | 4 ++++
5 files changed, 31 insertions(+), 4 deletions(-)

diff --git a/Documentation/filesystems/squashfs.txt b/Documentation/filesystems/squashfs.txt
index 403c090..e5274f8 100644
--- a/Documentation/filesystems/squashfs.txt
+++ b/Documentation/filesystems/squashfs.txt
@@ -2,10 +2,10 @@ SQUASHFS 4.0 FILESYSTEM
=======================

Squashfs is a compressed read-only filesystem for Linux.
-It uses zlib/lzo/xz compression to compress files, inodes and directories.
-Inodes in the system are very small and all blocks are packed to minimise
-data overhead. Block sizes greater than 4K are supported up to a maximum
-of 1Mbytes (default block size 128K).
+It uses zlib, lz4, lzo, or xz compression to compress files, inodes and
+directories. Inodes in the system are very small and all blocks are packed to
+minimise data overhead. Block sizes greater than 4K are supported up to a
+maximum of 1Mbytes (default block size 128K).

Squashfs is intended for general read-only filesystem use, for archival
use (i.e. in cases where a .tar.gz file may be used), and in constrained
diff --git a/fs/squashfs/Kconfig b/fs/squashfs/Kconfig
index c70111e..257f934 100644
--- a/fs/squashfs/Kconfig
+++ b/fs/squashfs/Kconfig
@@ -48,6 +48,21 @@ config SQUASHFS_ZLIB

If unsure, say Y.

+config SQUASHFS_LZ4
+ bool "Include support for LZ4 compressed file systems"
+ depends on SQUASHFS
+ select LZ4_DECOMPRESS
+ help
+ Saying Y here includes support for reading Squashfs file systems
+ compressed with LZ4 compression. LZ4 compression is mainly
+ aimed at embedded systems with slower CPUs where the overheads
+ of zlib are too high.
+
+ LZ4 is not the standard compression used in Squashfs and so most
+ file systems will be readable without selecting this option.
+
+ If unsure, say N.
+
config SQUASHFS_LZO
bool "Include support for LZO compressed file systems"
depends on SQUASHFS
diff --git a/fs/squashfs/Makefile b/fs/squashfs/Makefile
index 110b047..4a80ca7 100644
--- a/fs/squashfs/Makefile
+++ b/fs/squashfs/Makefile
@@ -6,6 +6,7 @@ obj-$(CONFIG_SQUASHFS) += squashfs.o
squashfs-y += block.o cache.o dir.o export.o file.o fragment.o id.o inode.o
squashfs-y += namei.o super.o symlink.o decompressor.o
squashfs-$(CONFIG_SQUASHFS_XATTR) += xattr.o xattr_id.o
+squashfs-$(CONFIG_SQUASHFS_LZ4) += lz4_wrapper.o
squashfs-$(CONFIG_SQUASHFS_LZO) += lzo_wrapper.o
squashfs-$(CONFIG_SQUASHFS_XZ) += xz_wrapper.o
squashfs-$(CONFIG_SQUASHFS_ZLIB) += zlib_wrapper.o
diff --git a/fs/squashfs/decompressor.c b/fs/squashfs/decompressor.c
index 3f6271d..ae60211 100644
--- a/fs/squashfs/decompressor.c
+++ b/fs/squashfs/decompressor.c
@@ -40,6 +40,12 @@ static const struct squashfs_decompressor squashfs_lzma_unsupported_comp_ops = {
NULL, NULL, NULL, LZMA_COMPRESSION, "lzma", 0
};

+#ifndef CONFIG_SQUASHFS_LZ4
+static const struct squashfs_decompressor squashfs_lz4_comp_ops = {
+ NULL, NULL, NULL, LZ4_COMPRESSION, "lz4", 0
+};
+#endif
+
#ifndef CONFIG_SQUASHFS_LZO
static const struct squashfs_decompressor squashfs_lzo_comp_ops = {
NULL, NULL, NULL, LZO_COMPRESSION, "lzo", 0
@@ -64,6 +70,7 @@ static const struct squashfs_decompressor squashfs_unknown_comp_ops = {

static const struct squashfs_decompressor *decompressor[] = {
&squashfs_zlib_comp_ops,
+ &squashfs_lz4_comp_ops,
&squashfs_lzo_comp_ops,
&squashfs_xz_comp_ops,
&squashfs_lzma_unsupported_comp_ops,
diff --git a/fs/squashfs/decompressor.h b/fs/squashfs/decompressor.h
index 330073e..a9fbdd2 100644
--- a/fs/squashfs/decompressor.h
+++ b/fs/squashfs/decompressor.h
@@ -52,6 +52,10 @@ static inline int squashfs_decompress(struct squashfs_sb_info *msblk,
extern const struct squashfs_decompressor squashfs_xz_comp_ops;
#endif

+#ifdef CONFIG_SQUASHFS_LZ4
+extern const struct squashfs_decompressor squashfs_lz4_comp_ops;
+#endif
+
#ifdef CONFIG_SQUASHFS_LZO
extern const struct squashfs_decompressor squashfs_lzo_comp_ops;
#endif
--
1.7.10.4

2013-07-22 02:29:17

by Phillip Lougher

[permalink] [raw]
Subject: [PATCH 1/2] Squashfs: add LZ4 compression support

Add support for reading file systems compressed with the
LZ4 compression algorithm.

This patch adds the LZ4 decompressor wrapper code.

Signed-off-by: Phillip Lougher <[email protected]>
---
fs/squashfs/lz4_wrapper.c | 163 +++++++++++++++++++++++++++++++++++++++++++++
fs/squashfs/squashfs_fs.h | 1 +
2 files changed, 164 insertions(+)
create mode 100644 fs/squashfs/lz4_wrapper.c

diff --git a/fs/squashfs/lz4_wrapper.c b/fs/squashfs/lz4_wrapper.c
new file mode 100644
index 0000000..681ed94
--- /dev/null
+++ b/fs/squashfs/lz4_wrapper.c
@@ -0,0 +1,163 @@
+/*
+ * Squashfs - a compressed read only filesystem for Linux
+ *
+ * Copyright (c) 2013
+ * Phillip Lougher <[email protected]>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2,
+ * or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * lz4_wrapper.c
+ */
+
+#include <linux/buffer_head.h>
+#include <linux/mutex.h>
+#include <linux/slab.h>
+#include <linux/vmalloc.h>
+#include <linux/lz4.h>
+
+#include "squashfs_fs.h"
+#include "squashfs_fs_sb.h"
+#include "squashfs.h"
+#include "decompressor.h"
+
+#define LZ4_LEGACY 1
+
+struct lz4_comp_opts {
+ __le32 version;
+ __le32 flags;
+};
+
+struct squashfs_lz4 {
+ void *input;
+ void *output;
+};
+
+
+
+static void *lz4_init(struct squashfs_sb_info *msblk, void *buff, int len)
+{
+ struct lz4_comp_opts *comp_opts = buff;
+ int block_size = max_t(int, msblk->block_size, SQUASHFS_METADATA_SIZE);
+ struct squashfs_lz4 *stream;
+ int err = -ENOMEM;
+
+ /* LZ4 compressed filesystems always have compression options */
+ if(comp_opts == NULL || len < sizeof(*comp_opts)) {
+ err = -EIO;
+ goto failed;
+ }
+ if(le32_to_cpu(comp_opts->version) != LZ4_LEGACY) {
+ /* LZ4 format currently used by the kernel is the 'legacy'
+ * format */
+ ERROR("Unknown LZ4 version\n");
+ err = -EINVAL;
+ goto failed;
+ }
+
+ stream = kzalloc(sizeof(*stream), GFP_KERNEL);
+ if (stream == NULL)
+ goto failed;
+ stream->input = vmalloc(block_size);
+ if (stream->input == NULL)
+ goto failed2;
+ stream->output = vmalloc(block_size);
+ if (stream->output == NULL)
+ goto failed3;
+
+ return stream;
+
+failed3:
+ vfree(stream->input);
+failed2:
+ kfree(stream);
+failed:
+ ERROR("Failed to initialise LZ4 decompressor\n");
+ return ERR_PTR(err);
+}
+
+
+static void lz4_free(void *strm)
+{
+ struct squashfs_lz4 *stream = strm;
+
+ if (stream) {
+ vfree(stream->input);
+ vfree(stream->output);
+ }
+ kfree(stream);
+}
+
+
+static int lz4_uncompress(struct squashfs_sb_info *msblk, void **buffer,
+ struct buffer_head **bh, int b, int offset, int length, int srclength,
+ int pages)
+{
+ struct squashfs_lz4 *stream = msblk->stream;
+ void *buff = stream->input;
+ int avail, i, bytes = length, res;
+ size_t dest_len = srclength;
+
+ mutex_lock(&msblk->read_data_mutex);
+
+ for (i = 0; i < b; i++) {
+ wait_on_buffer(bh[i]);
+ if (!buffer_uptodate(bh[i]))
+ goto block_release;
+
+ avail = min(bytes, msblk->devblksize - offset);
+ memcpy(buff, bh[i]->b_data + offset, avail);
+ buff += avail;
+ bytes -= avail;
+ offset = 0;
+ put_bh(bh[i]);
+ }
+
+ res = lz4_decompress_unknownoutputsize(stream->input, length,
+ stream->output, &dest_len);
+ if (res)
+ goto failed;
+
+ bytes = dest_len;
+ for (i = 0, buff = stream->output; bytes && i < pages; i++) {
+ avail = min_t(int, bytes, PAGE_CACHE_SIZE);
+ memcpy(buffer[i], buff, avail);
+ buff += avail;
+ bytes -= avail;
+ }
+ if (bytes)
+ goto failed;
+
+ mutex_unlock(&msblk->read_data_mutex);
+ return dest_len;
+
+block_release:
+ for (; i < b; i++)
+ put_bh(bh[i]);
+
+failed:
+ mutex_unlock(&msblk->read_data_mutex);
+
+ ERROR("lz4 decompression failed, data probably corrupt\n");
+ return -EIO;
+}
+
+const struct squashfs_decompressor squashfs_lz4_comp_ops = {
+ .init = lz4_init,
+ .free = lz4_free,
+ .decompress = lz4_uncompress,
+ .id = LZ4_COMPRESSION,
+ .name = "lz4",
+ .supported = 1
+};
diff --git a/fs/squashfs/squashfs_fs.h b/fs/squashfs/squashfs_fs.h
index 9e2349d..ee0be5c 100644
--- a/fs/squashfs/squashfs_fs.h
+++ b/fs/squashfs/squashfs_fs.h
@@ -237,6 +237,7 @@ struct meta_index {
#define LZMA_COMPRESSION 2
#define LZO_COMPRESSION 3
#define XZ_COMPRESSION 4
+#define LZ4_COMPRESSION 5

struct squashfs_super_block {
__le32 s_magic;
--
1.7.10.4

2013-07-22 04:00:10

by Gu Zheng

[permalink] [raw]
Subject: Re: [PATCH 0/2] Squashfs: add LZ4 compression

Hi Phillip,
Have some tests been carried out to confirm that Squashfs really
can get benefit from LZ4 compression, comparing with lzo?

Thanks,
Gu

On 07/22/2013 10:21 AM, Phillip Lougher wrote:

> Hi
>
> Now that LZ4 compression support is in 3.11-rc1, I have written the
> following two patches for Squashfs to use it.
>
> Phillip Lougher (2):
> Squashfs: add LZ4 compression support
> Squashfs: Add LZ4 compression configuration option
>
> Documentation/filesystems/squashfs.txt | 8 +-
> fs/squashfs/Kconfig | 15 +++
> fs/squashfs/Makefile | 1 +
> fs/squashfs/decompressor.c | 7 ++
> fs/squashfs/decompressor.h | 4 +
> fs/squashfs/lz4_wrapper.c | 163 ++++++++++++++++++++++++++++++++
> fs/squashfs/squashfs_fs.h | 1 +
> 7 files changed, 195 insertions(+), 4 deletions(-)
> create mode 100644 fs/squashfs/lz4_wrapper.c
>
> These patches are also available in the git tree here:
>
> browse: https://git.kernel.org/cgit/linux/kernel/git/pkl/squashfs-lz4.git
> git clone: git://git.kernel.org/pub/scm/linux/kernel/git/pkl/squashfs-lz4.git
>
> LZ4 support has (obviously) also been added to the squashfs-tools
> (Mksquashfs and Unsquashfs). This is available from the Squashfs-tools
> git repository here:
>
> browse: https://git.kernel.org/cgit/fs/squashfs/squashfs-tools.git
> git clone: git://git.kernel.org/pub/scm/fs/squashfs/squashfs-tools.git
>
> When building the squashfs-tools edit the Makefile to enable LZ4
> support (by default it is disabled).
>
> LZ4 compression can be specified by using the -comp option, e.g.
> % mksquashfs xxx img.sqsh -comp lz4
>
> The use of LZ4 high compression can be specified using -Xhc, e.g.
>
> % mksquashfs xxx img.sqsh -comp lz4 -Xhc
>
> Phillip
> --
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to [email protected]
> More majordomo info at http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at http://www.tux.org/lkml/
>

2013-07-22 04:36:04

by Joe Perches

[permalink] [raw]
Subject: Re: [PATCH 1/2] Squashfs: add LZ4 compression support

On Mon, 2013-07-22 at 03:21 +0100, Phillip Lougher wrote:
> Add support for reading file systems compressed with the
> LZ4 compression algorithm.

Some whitespace trivia and a naming comment.

> diff --git a/fs/squashfs/lz4_wrapper.c b/fs/squashfs/lz4_wrapper.c
[]
> +static void *lz4_init(struct squashfs_sb_info *msblk, void *buff, int len)
[]
> + /* LZ4 compressed filesystems always have compression options */
> + if(comp_opts == NULL || len < sizeof(*comp_opts)) {

space after ifs please.

> + if(le32_to_cpu(comp_opts->version) != LZ4_LEGACY) {

> +
> +
> +static void lz4_free(void *strm)

Single blank line between functions

> +static int lz4_uncompress(struct squashfs_sb_info *msblk, void **buffer,
> + struct buffer_head **bh, int b, int offset, int length, int srclength,
> + int pages)
> +{
> + struct squashfs_lz4 *stream = msblk->stream;
> + void *buff = stream->input;

It's not particularly nice to have both buffer and buff
in the same function.

Maybe void *input though char *input would be better.

> + int avail, i, bytes = length, res;
> + size_t dest_len = srclength;
> +
> + mutex_lock(&msblk->read_data_mutex);
> +
> + for (i = 0; i < b; i++) {
> + wait_on_buffer(bh[i]);
> + if (!buffer_uptodate(bh[i]))
> + goto block_release;
> +
> + avail = min(bytes, msblk->devblksize - offset);
> + memcpy(buff, bh[i]->b_data + offset, avail);
> + buff += avail;
> + bytes -= avail;
> + offset = 0;
> + put_bh(bh[i]);
> + }

2013-07-22 05:07:55

by Phillip Lougher

[permalink] [raw]
Subject: Re: [PATCH 0/2] Squashfs: add LZ4 compression

On 22 July 2013 04:05, Gu Zheng <[email protected]> wrote:
> Hi Phillip,
> Have some tests been carried out to confirm that Squashfs really
> can get benefit from LZ4 compression, comparing with lzo?

This seems to be a loaded question, in that it seems to be trying to
reopen the "why add lz4 when we already have lzo" debate all over
again. As LZ4 has been merged to mainline, this appears to be a
question that has already been answered.

As far as Squashfs is concerned, I believe it is important to give
people the choice of using LZ4 to compress Squashfs filesystems now
its been mainlined. As far as expected benefits are concerned,
Squashfs' use in embedded systems is very similar to compressing
kernels and initramfs data, in that it tends to be used to compress
root filesystems. As such the benefits of using LZ4 in Squashfs
should be broadly similar to using LZ4 to compress kernels and
initramfs data. Ultimately it is up to people to experiment and
choose whatever compression is best for their systems.

People are welcome to try the patches out and report their findings.

Phillip

>
> Thanks,
> Gu
>
> On 07/22/2013 10:21 AM, Phillip Lougher wrote:
>
>> Hi
>>
>> Now that LZ4 compression support is in 3.11-rc1, I have written the
>> following two patches for Squashfs to use it.
>>
>> Phillip Lougher (2):
>> Squashfs: add LZ4 compression support
>> Squashfs: Add LZ4 compression configuration option
>>
>> Documentation/filesystems/squashfs.txt | 8 +-
>> fs/squashfs/Kconfig | 15 +++
>> fs/squashfs/Makefile | 1 +
>> fs/squashfs/decompressor.c | 7 ++
>> fs/squashfs/decompressor.h | 4 +
>> fs/squashfs/lz4_wrapper.c | 163 ++++++++++++++++++++++++++++++++
>> fs/squashfs/squashfs_fs.h | 1 +
>> 7 files changed, 195 insertions(+), 4 deletions(-)
>> create mode 100644 fs/squashfs/lz4_wrapper.c
>>
>> These patches are also available in the git tree here:
>>
>> browse: https://git.kernel.org/cgit/linux/kernel/git/pkl/squashfs-lz4.git
>> git clone: git://git.kernel.org/pub/scm/linux/kernel/git/pkl/squashfs-lz4.git
>>
>> LZ4 support has (obviously) also been added to the squashfs-tools
>> (Mksquashfs and Unsquashfs). This is available from the Squashfs-tools
>> git repository here:
>>
>> browse: https://git.kernel.org/cgit/fs/squashfs/squashfs-tools.git
>> git clone: git://git.kernel.org/pub/scm/fs/squashfs/squashfs-tools.git
>>
>> When building the squashfs-tools edit the Makefile to enable LZ4
>> support (by default it is disabled).
>>
>> LZ4 compression can be specified by using the -comp option, e.g.
>> % mksquashfs xxx img.sqsh -comp lz4
>>
>> The use of LZ4 high compression can be specified using -Xhc, e.g.
>>
>> % mksquashfs xxx img.sqsh -comp lz4 -Xhc
>>
>> Phillip
>> --
>> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
>> the body of a message to [email protected]
>> More majordomo info at http://vger.kernel.org/majordomo-info.html
>> Please read the FAQ at http://www.tux.org/lkml/
>>
>
>

2013-07-22 06:08:40

by Gu Zheng

[permalink] [raw]
Subject: Re: [PATCH 0/2] Squashfs: add LZ4 compression

On 07/22/2013 01:07 PM, Phillip Lougher wrote:

> On 22 July 2013 04:05, Gu Zheng <[email protected]> wrote:
>> Hi Phillip,
>> Have some tests been carried out to confirm that Squashfs really
>> can get benefit from LZ4 compression, comparing with lzo?
>
> This seems to be a loaded question, in that it seems to be trying to
> reopen the "why add lz4 when we already have lzo" debate all over
> again. As LZ4 has been merged to mainline, this appears to be a
> question that has already been answered.

No, they are different. LZ4 can be merged to mainline, because we can
see the benefit(faster compressing speed under the enabled unaligned
memory access) it brings to us comparing with lzo.
But it's hard to say that it also really can bring benefit to Squashfs.

>
> As far as Squashfs is concerned, I believe it is important to give
> people the choice of using LZ4 to compress Squashfs filesystems now
> its been mainlined. As far as expected benefits are concerned,
> Squashfs' use in embedded systems is very similar to compressing
> kernels and initramfs data, in that it tends to be used to compress
> root filesystems. As such the benefits of using LZ4 in Squashfs
> should be broadly similar to using LZ4 to compress kernels and
> initramfs data. Ultimately it is up to people to experiment and
> choose whatever compression is best for their systems.

Yes, but the premise is that using LZ4 in Squashfs is better than lzo
in at least one actual situation.

>
> People are welcome to try the patches out and report their findings.

Let's look and see other guys' feedbacks, they are more persuasive.:)

Regards,
Gu

>
> Phillip
>
>>
>> Thanks,
>> Gu
>>
>> On 07/22/2013 10:21 AM, Phillip Lougher wrote:
>>
>>> Hi
>>>
>>> Now that LZ4 compression support is in 3.11-rc1, I have written the
>>> following two patches for Squashfs to use it.
>>>
>>> Phillip Lougher (2):
>>> Squashfs: add LZ4 compression support
>>> Squashfs: Add LZ4 compression configuration option
>>>
>>> Documentation/filesystems/squashfs.txt | 8 +-
>>> fs/squashfs/Kconfig | 15 +++
>>> fs/squashfs/Makefile | 1 +
>>> fs/squashfs/decompressor.c | 7 ++
>>> fs/squashfs/decompressor.h | 4 +
>>> fs/squashfs/lz4_wrapper.c | 163 ++++++++++++++++++++++++++++++++
>>> fs/squashfs/squashfs_fs.h | 1 +
>>> 7 files changed, 195 insertions(+), 4 deletions(-)
>>> create mode 100644 fs/squashfs/lz4_wrapper.c
>>>
>>> These patches are also available in the git tree here:
>>>
>>> browse: https://git.kernel.org/cgit/linux/kernel/git/pkl/squashfs-lz4.git
>>> git clone: git://git.kernel.org/pub/scm/linux/kernel/git/pkl/squashfs-lz4.git
>>>
>>> LZ4 support has (obviously) also been added to the squashfs-tools
>>> (Mksquashfs and Unsquashfs). This is available from the Squashfs-tools
>>> git repository here:
>>>
>>> browse: https://git.kernel.org/cgit/fs/squashfs/squashfs-tools.git
>>> git clone: git://git.kernel.org/pub/scm/fs/squashfs/squashfs-tools.git
>>>
>>> When building the squashfs-tools edit the Makefile to enable LZ4
>>> support (by default it is disabled).
>>>
>>> LZ4 compression can be specified by using the -comp option, e.g.
>>> % mksquashfs xxx img.sqsh -comp lz4
>>>
>>> The use of LZ4 high compression can be specified using -Xhc, e.g.
>>>
>>> % mksquashfs xxx img.sqsh -comp lz4 -Xhc
>>>
>>> Phillip
>>> --
>>> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
>>> the body of a message to [email protected]
>>> More majordomo info at http://vger.kernel.org/majordomo-info.html
>>> Please read the FAQ at http://www.tux.org/lkml/
>>>
>>
>>
>

2013-07-22 13:38:31

by Phillip Lougher

[permalink] [raw]
Subject: Re: [PATCH 0/2] Squashfs: add LZ4 compression

On 22 July 2013 07:04, Gu Zheng <[email protected]> wrote:
> On 07/22/2013 01:07 PM, Phillip Lougher wrote:
>
>> On 22 July 2013 04:05, Gu Zheng <[email protected]> wrote:
>>> Hi Phillip,
>>> Have some tests been carried out to confirm that Squashfs really
>>> can get benefit from LZ4 compression, comparing with lzo?
>>
>> This seems to be a loaded question, in that it seems to be trying to
>> reopen the "why add lz4 when we already have lzo" debate all over
>> again. As LZ4 has been merged to mainline, this appears to be a
>> question that has already been answered.
>
> No, they are different. LZ4 can be merged to mainline, because we can
> see the benefit(faster compressing speed under the enabled unaligned
> memory access) it brings to us comparing with lzo.

The users of LZ4 that has been merged is for decompression of kernel
and initramfs, not compression. So far I don't see any users of the
LZ4 compression code in the kernel. So you're saying it was merged
for fast compression despite there being no users of it?

> But it's hard to say that it also really can bring benefit to Squashfs.

Prejudiced statement without any evidence, if that's your contention prove it.

>
>>
>> As far as Squashfs is concerned, I believe it is important to give
>> people the choice of using LZ4 to compress Squashfs filesystems now
>> its been mainlined. As far as expected benefits are concerned,
>> Squashfs' use in embedded systems is very similar to compressing
>> kernels and initramfs data, in that it tends to be used to compress
>> root filesystems. As such the benefits of using LZ4 in Squashfs
>> should be broadly similar to using LZ4 to compress kernels and
>> initramfs data. Ultimately it is up to people to experiment and
>> choose whatever compression is best for their systems.
>
> Yes, but the premise is that using LZ4 in Squashfs is better than lzo
> in at least one actual situation.
>

No. All it takes is for LZ4 to be better/faster at decompressing the
kernel or initramfs to make it advantageous to use LZ4 for Squashfs,
thus avoiding the overhead of another decompressor in the kernel..

>>
>> People are welcome to try the patches out and report their findings.
>
> Let's look and see other guys' feedbacks, they are more persuasive.:)

Suit yourself, maybe when you start using evidence rather than
unsubstantiated assertions, you'll be more persuasive too. So far all
I see is wind.

Phillip

>
> Regards,
> Gu
>
>>
>> Phillip
>>
>>>
>>> Thanks,
>>> Gu
>>>
>>> On 07/22/2013 10:21 AM, Phillip Lougher wrote:
>>>
>>>> Hi
>>>>
>>>> Now that LZ4 compression support is in 3.11-rc1, I have written the
>>>> following two patches for Squashfs to use it.
>>>>
>>>> Phillip Lougher (2):
>>>> Squashfs: add LZ4 compression support
>>>> Squashfs: Add LZ4 compression configuration option
>>>>
>>>> Documentation/filesystems/squashfs.txt | 8 +-
>>>> fs/squashfs/Kconfig | 15 +++
>>>> fs/squashfs/Makefile | 1 +
>>>> fs/squashfs/decompressor.c | 7 ++
>>>> fs/squashfs/decompressor.h | 4 +
>>>> fs/squashfs/lz4_wrapper.c | 163 ++++++++++++++++++++++++++++++++
>>>> fs/squashfs/squashfs_fs.h | 1 +
>>>> 7 files changed, 195 insertions(+), 4 deletions(-)
>>>> create mode 100644 fs/squashfs/lz4_wrapper.c
>>>>
>>>> These patches are also available in the git tree here:
>>>>
>>>> browse: https://git.kernel.org/cgit/linux/kernel/git/pkl/squashfs-lz4.git
>>>> git clone: git://git.kernel.org/pub/scm/linux/kernel/git/pkl/squashfs-lz4.git
>>>>
>>>> LZ4 support has (obviously) also been added to the squashfs-tools
>>>> (Mksquashfs and Unsquashfs). This is available from the Squashfs-tools
>>>> git repository here:
>>>>
>>>> browse: https://git.kernel.org/cgit/fs/squashfs/squashfs-tools.git
>>>> git clone: git://git.kernel.org/pub/scm/fs/squashfs/squashfs-tools.git
>>>>
>>>> When building the squashfs-tools edit the Makefile to enable LZ4
>>>> support (by default it is disabled).
>>>>
>>>> LZ4 compression can be specified by using the -comp option, e.g.
>>>> % mksquashfs xxx img.sqsh -comp lz4
>>>>
>>>> The use of LZ4 high compression can be specified using -Xhc, e.g.
>>>>
>>>> % mksquashfs xxx img.sqsh -comp lz4 -Xhc
>>>>
>>>> Phillip
>>>> --
>>>> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
>>>> the body of a message to [email protected]
>>>> More majordomo info at http://vger.kernel.org/majordomo-info.html
>>>> Please read the FAQ at http://www.tux.org/lkml/
>>>>
>>>
>>>
>>
>
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to [email protected]
> More majordomo info at http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at http://www.tux.org/lkml/

2013-07-23 15:18:15

by Bruno Wolff III

[permalink] [raw]
Subject: Re: [PATCH 0/2] Squashfs: add LZ4 compression

On Mon, Jul 22, 2013 at 03:21:01 +0100,
Phillip Lougher <[email protected]> wrote:
>Hi
>
>Now that LZ4 compression support is in 3.11-rc1, I have written the
>following two patches for Squashfs to use it.

If this gets accepted are you going to move the LZ4 changes to squashfs-tools
into the stable branch? I'd like to make LZ4 work in mksquashfs in at least
rawhide once LZ4 is usable for squashfs file systems in the kernel. So I
was wondering whether to expect this to appear in stable shortly or to expect
to start doing builds using the master branch.

2013-07-23 16:17:34

by Phillip Lougher

[permalink] [raw]
Subject: Re: [PATCH 0/2] Squashfs: add LZ4 compression

On 23 July 2013 16:10, Bruno Wolff III <[email protected]> wrote:
> On Mon, Jul 22, 2013 at 03:21:01 +0100,
> Phillip Lougher <[email protected]> wrote:
>>
>> Hi
>>
>> Now that LZ4 compression support is in 3.11-rc1, I have written the
>> following two patches for Squashfs to use it.
>
>
> If this gets accepted are you going to move the LZ4 changes to
> squashfs-tools into the stable branch? I'd like to make LZ4 work in
> mksquashfs in at least rawhide once LZ4 is usable for squashfs file systems
> in the kernel. So I was wondering whether to expect this to appear in stable
> shortly or to expect to start doing builds using the master branch.

Hmm, good point.... I was intending to merge the LZ4 work onto stable
yesterday or today, but, I've received more resistance to the idea of
LZ4 in Squashfs than I expected.... I'm not sure that merging LZ4
onto stable now gives the right message, because if it does not go
into mainline, it will effectively be experimental or abandoned.

In otherwords I don't think it's wise yet to merge LZ4 onto stable,
not until at least there's some positive feedback on the mailing list.

Thoughts? Maybe some positive feedback? :-)

A V2 of the patches will be coming ASAP hopefully with some performance stats.


Thanks

Phillip

2013-07-23 16:30:39

by Bruno Wolff III

[permalink] [raw]
Subject: Re: [PATCH 0/2] Squashfs: add LZ4 compression

On Tue, Jul 23, 2013 at 17:17:30 +0100,
Phillip Lougher <[email protected]> wrote:
>
>In otherwords I don't think it's wise yet to merge LZ4 onto stable,
>not until at least there's some positive feedback on the mailing list.
>
>Thoughts? Maybe some positive feedback? :-)

I think it makes sense to tie inclusion in the kernel with inclusion
into the stable branch. If this gets into the 3.11 kernel, I'm going
to want to get it into Fedora releases that use that kernel. This
will initially be Fedora 20 (which will branch from rawhide in a couple
of weeks) and will eventually be in Fedora 19 and probably Fedora 18.
So I'd like to see it in stable, since I would feel less comfortable
using the master branch.

If LZ4 support isn't in the kernel I think that there isn't a lot of
need for support in Fedora since I don't think many people use it
for archiving. It mostly gets used for live images. I'll make sure
that LZ4 can be used for them, but I suspect most people will still
prefer xz for them. But probably at least some people would prefer
faster decompression rather than minimal size. As flash drives get
bigger (for the same cost) more people will probably prefer speed over
size.

2013-07-26 22:01:00

by Rob Landley

[permalink] [raw]
Subject: Re: [PATCH 0/2] Squashfs: add LZ4 compression

On 07/22/2013 01:04:59 AM, Gu Zheng wrote:
> On 07/22/2013 01:07 PM, Phillip Lougher wrote:
>
> > On 22 July 2013 04:05, Gu Zheng <[email protected]> wrote:
> >> Hi Phillip,
> >> Have some tests been carried out to confirm that Squashfs
> really
> >> can get benefit from LZ4 compression, comparing with lzo?
> >
> > This seems to be a loaded question, in that it seems to be trying to
> > reopen the "why add lz4 when we already have lzo" debate all over
> > again. As LZ4 has been merged to mainline, this appears to be a
> > question that has already been answered.
>
> No, they are different. LZ4 can be merged to mainline, because we can
> see the benefit(faster compressing speed under the enabled unaligned
> memory access) it brings to us comparing with lzo.
> But it's hard to say that it also really can bring benefit to
> Squashfs.

A compression format was added to the kernel. Philip hooked up the code
that was already in the kernel to a filesystem that was already in the
kernel.

You consider this action controversial...

Rob-