[PATCH] erofs: introduce nolargefolio mount option
Chao Yu
chao at kernel.org
Tue Mar 10 17:43:25 AEDT 2026
Xiang,
On 3/9/26 11:03, Gao Xiang wrote:
> Hi Chao,
>
> (+cc -fsdevel, willy, Jan kara)
>
> On 2026/3/9 10:30, Chao Yu wrote:
>> This patch introduces a new mount option 'nolargefolio' for EROFS.
>> When this option is specified, large folio will be disabled by
>> default for all inodes, this option can be used for environments
>> where large folio resources are limited, it's necessary to only
>> let specified user to allocate large folios on demand.
>
> For this kind of options, I think more real backgrounds
> about avoiding high-order allocations are needed in the
> commit message (at least for later reference) also like
> what I observed in:
> https://android-review.googlesource.com/c/kernel/common/+/3877981
Basically, the background is about contention scenario on large folio allocation,
it's among multiple users including EROFS in Android-system, as it's related to
internal scene of product, so I can not provide more details now, I'm sorry
about that, but I'm glad to discuss based on the background and pain point once
if I can share more, let's see. :)
>
> because the entire community tends to enable large folios
> unconditionally if possible. Without enough clarification,
> even I merge this, there will be endless questions again
> and again about this.
>
> And Jan once raised up if it should be a user interface
> or auto-tuning one:
> https://lore.kernel.org/r/z2ule3ilnnpoevo5mvt3intvjtuyud7vg3pbfauon47fhr4owa@giaehpbie4a5
Thanks for sharing this anyway, I didn't notice this previously...
Thanks,
> > My question is that if the needs are real, I wonder if
> it should be a vfs generic decision instead (because
> it's not due to the filesystem restriction but due to
> real system memory pressure or heavy workload for
> example). However, if the answer is that others don't
> really care about this, I'm fine to leave it as an
> erofs-specific option as long as the actual case is
> clear in the commit message.
> > Thanks,
> Gao Xiang
>
>
>>
>> Signed-off-by: Chao Yu <chao at kernel.org>
>> ---
>> Documentation/filesystems/erofs.rst | 1 +
>> fs/erofs/inode.c | 3 ++-
>> fs/erofs/internal.h | 1 +
>> fs/erofs/super.c | 8 +++++++-
>> 4 files changed, 11 insertions(+), 2 deletions(-)
>>
>> diff --git a/Documentation/filesystems/erofs.rst b/Documentation/filesystems/erofs.rst
>> index fe06308e546c..d692a1d9f32c 100644
>> --- a/Documentation/filesystems/erofs.rst
>> +++ b/Documentation/filesystems/erofs.rst
>> @@ -137,6 +137,7 @@ fsoffset=%llu Specify block-aligned filesystem offset for the primary d
>> inode_share Enable inode page sharing for this filesystem. Inodes with
>> identical content within the same domain ID can share the
>> page cache.
>> +nolargefolio Disable large folio support for all files.
>> =================== =========================================================
>> Sysfs Entries
>> diff --git a/fs/erofs/inode.c b/fs/erofs/inode.c
>> index 4b3d21402e10..26361e86a354 100644
>> --- a/fs/erofs/inode.c
>> +++ b/fs/erofs/inode.c
>> @@ -254,7 +254,8 @@ static int erofs_fill_inode(struct inode *inode)
>> return 0;
>> }
>> - mapping_set_large_folios(inode->i_mapping);
>> + if (!test_opt(&EROFS_SB(inode->i_sb)->opt, NO_LARGE_FOLIO))
>> + mapping_set_large_folios(inode->i_mapping);
>> aops = erofs_get_aops(inode, false);
>> if (IS_ERR(aops))
>> return PTR_ERR(aops);
>> diff --git a/fs/erofs/internal.h b/fs/erofs/internal.h
>> index a4f0a42cf8c3..b5d98410c699 100644
>> --- a/fs/erofs/internal.h
>> +++ b/fs/erofs/internal.h
>> @@ -177,6 +177,7 @@ struct erofs_sb_info {
>> #define EROFS_MOUNT_DAX_NEVER 0x00000080
>> #define EROFS_MOUNT_DIRECT_IO 0x00000100
>> #define EROFS_MOUNT_INODE_SHARE 0x00000200
>> +#define EROFS_MOUNT_NO_LARGE_FOLIO 0x00000400
>> #define clear_opt(opt, option) ((opt)->mount_opt &= ~EROFS_MOUNT_##option)
>> #define set_opt(opt, option) ((opt)->mount_opt |= EROFS_MOUNT_##option)
>> diff --git a/fs/erofs/super.c b/fs/erofs/super.c
>> index 972a0c82198d..a353369d4db8 100644
>> --- a/fs/erofs/super.c
>> +++ b/fs/erofs/super.c
>> @@ -390,7 +390,7 @@ static void erofs_default_options(struct erofs_sb_info *sbi)
>> enum {
>> Opt_user_xattr, Opt_acl, Opt_cache_strategy, Opt_dax, Opt_dax_enum,
>> Opt_device, Opt_fsid, Opt_domain_id, Opt_directio, Opt_fsoffset,
>> - Opt_inode_share,
>> + Opt_inode_share, Opt_nolargefolio,
>> };
>> static const struct constant_table erofs_param_cache_strategy[] = {
>> @@ -419,6 +419,7 @@ static const struct fs_parameter_spec erofs_fs_parameters[] = {
>> fsparam_flag_no("directio", Opt_directio),
>> fsparam_u64("fsoffset", Opt_fsoffset),
>> fsparam_flag("inode_share", Opt_inode_share),
>> + fsparam_flag("nolargefolio", Opt_nolargefolio),
>> {}
>> };
>> @@ -541,6 +542,9 @@ static int erofs_fc_parse_param(struct fs_context *fc,
>> else
>> set_opt(&sbi->opt, INODE_SHARE);
>> break;
>> + case Opt_nolargefolio:
>> + set_opt(&sbi->opt, NO_LARGE_FOLIO);
>> + break;
>> }
>> return 0;
>> }
>> @@ -1105,6 +1109,8 @@ static int erofs_show_options(struct seq_file *seq, struct dentry *root)
>> seq_printf(seq, ",fsoffset=%llu", sbi->dif0.fsoff);
>> if (test_opt(opt, INODE_SHARE))
>> seq_puts(seq, ",inode_share");
>> + if (test_opt(opt, NO_LARGE_FOLIO))
>> + seq_puts(seq, ",nolargefolio");
>> return 0;
>> }
>>
>
More information about the Linux-erofs
mailing list