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? Thanks, > > Thanks, > Gao Xiang
