[Buildroot] [PATCH] fs/erofs: add big pcluster support

Yann E. MORIN yann.morin.1998 at free.fr
Mon Jul 19 20:35:17 UTC 2021


Gao, All,

On 2021-07-14 22:55 +0800, Gao Xiang via buildroot spake thusly:
> This enables EROFS big pcluster images for buildroot.
> 
> Signed-off-by: Gao Xiang <hsiangkao at aol.com>
> ---
>  fs/erofs/Config.in | 10 ++++++++++
>  fs/erofs/erofs.mk  |  4 ++++
>  2 files changed, 14 insertions(+)
> 
> diff --git a/fs/erofs/Config.in b/fs/erofs/Config.in
> index d7360edeabfd..7619037c4775 100644
> --- a/fs/erofs/Config.in
> +++ b/fs/erofs/Config.in
> @@ -11,4 +11,14 @@ config BR2_TARGET_ROOTFS_EROFS_LZ4HC
>  	help
>  	  Use lz4 high-compression to compress data in the filesystem.
>  
> +config BR2_TARGET_ROOTFS_EROFS_PCLUSTERSIZE
> +	int "pcluster size"
> +	default 0
> +	help
> +	  Specify the maximum size of physical cluster in bytes for
> +	  the big pcluster feature in order to get much better
> +	  compression ratios (thus better sequential read performance
> +	  for common storage devices), which has been introduced since
> +	  Linux 5.13.

I was wondering if we had to constrain that variable somehow, so I
looked at the code.

As far as I understand, this must be a multiple of EROFS_BLKSIZ:

  297         case 'C':
  298             i = strtoull(optarg, &endptr, 0);
  299             if (*endptr != '\0' ||
  300                 i < EROFS_BLKSIZ || i % EROFS_BLKSIZ) {
  301                 erofs_err("invalid physical clustersize %s",

EROFS_BLKSIZ is defined as (1U << LOG_BLOCK_SIZE)

LOG_BLOCK_SIZE is defined as (12).

So BR2_TARGET_ROOTFS_EROFS_PCLUSTERSIZE must be a multiple of 4KiB.

Which happens to look awfully like PAGE_SIZE on most architectures.

And bingo, there is this:

   34 /* no obvious reason to support explicit PAGE_SIZE != 4096 for now */
   35 #if PAGE_SIZE != 4096
   36 #error incompatible PAGE_SIZE is already defined
   37 #endif

OK, so guess what? Here are a few good reasons to support page size !=
4096 ;-)

In Buildroot at least, I knew of:

    BR2_ARC_PAGE_SIZE_8K
    BR2_ARC_PAGE_SIZE_16K

And if one goes to the kernel tree:

    config ARM64_PAGE_SHIFT
        int
        default 16 if ARM64_64K_PAGES
        default 14 if ARM64_16K_PAGES
        default 12

mips has even more page sizes available:

    arch/mips/include/asm/page.h:#define PAGE_SHIFT 12
    arch/mips/include/asm/page.h:#define PAGE_SHIFT 13
    arch/mips/include/asm/page.h:#define PAGE_SHIFT 14
    arch/mips/include/asm/page.h:#define PAGE_SHIFT 15
    arch/mips/include/asm/page.h:#define PAGE_SHIFT 16

And so on... ;-)

However, except for ARC, we do not have other page-size settings in
Buildroot (ARC is special); for all other achs, we do not have the info,
and if it exists, it is confined to the kernel configuration.

So, for Buildroot, we have one (really, two) cases where erofs would not
be usable: non-4K ARC settings.

And thus I was wondering is we should exclude erofs from the selection
in that case:

    config BR2_TARGET_ROOTFS_EROFS
        depends on !BR2_arc || BR2_ARC_PAGE_SIZE_4K

However, this is not related to this patch, as the situation is already
broken in such a case already...

So: applied to master, thanks.

Regards,
Yann E. MORIN.

>  endif # BR2_TARGET_ROOTFS_EROFS
> diff --git a/fs/erofs/erofs.mk b/fs/erofs/erofs.mk
> index 58559d483340..0e9d4401a939 100644
> --- a/fs/erofs/erofs.mk
> +++ b/fs/erofs/erofs.mk
> @@ -10,6 +10,10 @@ ifeq ($(BR2_TARGET_ROOTFS_EROFS_LZ4HC),y)
>  ROOTFS_EROFS_ARGS += -zlz4hc
>  endif
>  
> +ifneq ($(BR2_TARGET_ROOTFS_EROFS_PCLUSTERSIZE),0)
> +ROOTFS_EROFS_ARGS += -C$(strip $(BR2_TARGET_ROOTFS_EROFS_PCLUSTERSIZE))
> +endif
> +
>  define ROOTFS_EROFS_CMD
>  	$(HOST_DIR)/bin/mkfs.erofs $(ROOTFS_EROFS_ARGS) $@ $(TARGET_DIR)
>  endef
> -- 
> 2.20.1
> 
> _______________________________________________
> buildroot mailing list
> buildroot at busybox.net
> http://lists.busybox.net/mailman/listinfo/buildroot

-- 
.-----------------.--------------------.------------------.--------------------.
|  Yann E. MORIN  | Real-Time Embedded | /"\ ASCII RIBBON | Erics' conspiracy: |
| +33 662 376 056 | Software  Designer | \ / CAMPAIGN     |  ___               |
| +33 561 099 427 `------------.-------:  X  AGAINST      |  \e/  There is no  |
| http://ymorin.is-a-geek.org/ | _/*\_ | / \ HTML MAIL    |   v   conspiracy.  |
'------------------------------^-------^------------------^--------------------'



More information about the buildroot mailing list