On 7/10/25 16:04, Gao Xiang wrote: > > > On 2025/7/10 15:59, Chao Yu wrote: >> On 7/10/25 15:46, Gao Xiang wrote: >>> Hi Chao, >>> >>> On 2025/7/10 15:36, Chao Yu wrote: >>>> This patch supports to readahead more blocks in erofs_readdir(), >>>> it can enhance performance in large direcotry. >>>> >>>> readdir test in a large directory which contains 12000 sub-files. >>>> >>>> files_per_second >>>> Before: 926385.54 >>>> After: 2380435.562 >>>> >>>> Signed-off-by: Chao Yu <[email protected]> >>>> --- >>>> fs/erofs/dir.c | 8 ++++++++ >>>> fs/erofs/internal.h | 3 +++ >>>> 2 files changed, 11 insertions(+) >>>> >>>> diff --git a/fs/erofs/dir.c b/fs/erofs/dir.c >>>> index cff61c5a172b..04113851fc0f 100644 >>>> --- a/fs/erofs/dir.c >>>> +++ b/fs/erofs/dir.c >>>> @@ -47,8 +47,10 @@ static int erofs_readdir(struct file *f, struct >>>> dir_context *ctx) >>>> struct inode *dir = file_inode(f); >>>> struct erofs_buf buf = __EROFS_BUF_INITIALIZER; >>>> struct super_block *sb = dir->i_sb; >>>> + struct file_ra_state *ra = &f->f_ra; >>>> unsigned long bsz = sb->s_blocksize; >>>> unsigned int ofs = erofs_blkoff(sb, ctx->pos); >>>> + unsigned long nr_pages = DIV_ROUND_UP_POW2(dir->i_size, PAGE_SIZE); >>>> int err = 0; >>>> bool initial = true; >>>> @@ -65,6 +67,12 @@ static int erofs_readdir(struct file *f, struct >>>> dir_context *ctx) >>>> } >>>> cond_resched(); >>>> + /* readahead blocks to enhance performance in large directory >>>> */ >>>> + if (nr_pages - dbstart > 1 && !ra_has_index(ra, dbstart)) >>>> + page_cache_sync_readahead(dir->i_mapping, ra, f, >>>> + dbstart, min(nr_pages - dbstart, >>>> + (pgoff_t)MAX_DIR_RA_PAGES)); >>>> + >>>> de = erofs_bread(&buf, dbstart, true); >>>> if (IS_ERR(de)) { >>>> erofs_err(sb, "failed to readdir of logical block %llu of >>>> nid %llu", >>>> diff --git a/fs/erofs/internal.h b/fs/erofs/internal.h >>>> index a32c03a80c70..ef9d1ee8c688 100644 >>>> --- a/fs/erofs/internal.h >>>> +++ b/fs/erofs/internal.h >>>> @@ -238,6 +238,9 @@ EROFS_FEATURE_FUNCS(xattr_filter, compat, >>>> COMPAT_XATTR_FILTER) >>>> #define EROFS_I_BL_XATTR_BIT (BITS_PER_LONG - 1) >>>> #define EROFS_I_BL_Z_BIT (BITS_PER_LONG - 2) >>>> +/* maximum readahead pages of directory */ >>>> +#define MAX_DIR_RA_PAGES 4 >>> >>> Could we set it as a per-sb sysfs configuration for users to config? >> >> Xiang, >> >> Oh, that will be better, how about introducing new sysfs in separated patch? > > Hi Chao, > > Thanks for your interest but in that case it could cause some bisect > issue anyway, could we just use one patch to add this optimization > for slow devices?
Xiang, Yeah, one patch includes all these looks fine to me, anyway, let me update v2. Thanks, > > Thanks, > Gao Xiang > >> >> Thanks, >> >>> >>> Thanks, >>> Gao Xiang >> >
