[v2] erofs: enable large folios for iomap mode
Commit Message
Enable large folios for iomap mode. Then the readahead routine will
pass down large folios containing multiple pages.
Let's enable this for non-compressed format for now, until the
compression part supports large folios later.
When large folios supported, the iomap routine will allocate iomap_page
for each large folio and thus we need iomap_release_folio() and
iomap_invalidate_folio() to free iomap_page when these folios get
recalimed or invalidated.
Signed-off-by: Jingbo Xu <jefflexu@linux.alibaba.com>
---
v2:
- add calling for iomap_release_folio() and iomap_invalidate_folio() to
support large folios
v1: https://lore.kernel.org/all/20221110074023.8059-1-jefflexu@linux.alibaba.com/
---
fs/erofs/data.c | 2 ++
fs/erofs/inode.c | 2 ++
2 files changed, 4 insertions(+)
Comments
On 11/30/22 2:04 PM, Jingbo Xu wrote:
> Enable large folios for iomap mode. Then the readahead routine will
> pass down large folios containing multiple pages.
>
> Let's enable this for non-compressed format for now, until the
> compression part supports large folios later.
>
> When large folios supported, the iomap routine will allocate iomap_page
> for each large folio and thus we need iomap_release_folio() and
> iomap_invalidate_folio() to free iomap_page when these folios get
> recalimed or invalidated. ^
reclaimed
On 2022/11/30 14:04, Jingbo Xu wrote:
> Enable large folios for iomap mode. Then the readahead routine will
> pass down large folios containing multiple pages.
>
> Let's enable this for non-compressed format for now, until the
> compression part supports large folios later.
>
> When large folios supported, the iomap routine will allocate iomap_page
> for each large folio and thus we need iomap_release_folio() and
> iomap_invalidate_folio() to free iomap_page when these folios get
> recalimed or invalidated.
>
> Signed-off-by: Jingbo Xu <jefflexu@linux.alibaba.com>
Reviewed-by: Chao Yu <chao@kernel.org>
Thanks,
@@ -403,6 +403,8 @@ const struct address_space_operations erofs_raw_access_aops = {
.readahead = erofs_readahead,
.bmap = erofs_bmap,
.direct_IO = noop_direct_IO,
+ .release_folio = iomap_release_folio,
+ .invalidate_folio = iomap_invalidate_folio,
};
#ifdef CONFIG_FS_DAX
@@ -295,6 +295,8 @@ static int erofs_fill_inode(struct inode *inode)
goto out_unlock;
}
inode->i_mapping->a_ops = &erofs_raw_access_aops;
+ if (!erofs_is_fscache_mode(inode->i_sb))
+ mapping_set_large_folios(inode->i_mapping);
#ifdef CONFIG_EROFS_FS_ONDEMAND
if (erofs_is_fscache_mode(inode->i_sb))
inode->i_mapping->a_ops = &erofs_fscache_access_aops;