diff options
author | Gao Xiang <hsiangkao@linux.alibaba.com> | 2021-10-08 23:08:39 +0300 |
---|---|---|
committer | Gao Xiang <hsiangkao@linux.alibaba.com> | 2021-10-19 18:44:30 +0300 |
commit | 386292919c255da42ff6d6d3c51594f796ac146a (patch) | |
tree | 091b5ad7c47dd5350335d45dd7dc3f529a21d6ab /fs/erofs/internal.h | |
parent | 72bb52620fdffca95a14ee52188a33cd84e574e2 (diff) | |
download | linux-386292919c255da42ff6d6d3c51594f796ac146a.tar.xz |
erofs: introduce readmore decompression strategy
Previously, the readahead window was strictly followed by EROFS
decompression strategy in order to minimize extra memory footprint.
However, it could become inefficient if just reading the partial
requested data for much big LZ4 pclusters and the upcoming LZMA
implementation.
Let's try to request the leading data in a pcluster without
triggering memory reclaiming instead for the LZ4 approach first
to boost up 100% randread of large big pclusters, and it has no real
impact on low memory scenarios.
It also introduces a way to expand read lengths in order to decompress
the whole pcluster, which is useful for LZMA since the algorithm
itself is relatively slow and causes CPU bound, but LZ4 is not.
Link: https://lore.kernel.org/r/20211008200839.24541-4-xiang@kernel.org
Reviewed-by: Chao Yu <chao@kernel.org>
Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
Diffstat (limited to 'fs/erofs/internal.h')
-rw-r--r-- | fs/erofs/internal.h | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/fs/erofs/internal.h b/fs/erofs/internal.h index f8537ffdefeb..354ce3cb2b32 100644 --- a/fs/erofs/internal.h +++ b/fs/erofs/internal.h @@ -332,6 +332,19 @@ static inline unsigned int erofs_inode_datalayout(unsigned int value) EROFS_I_DATALAYOUT_BITS); } +/* + * Different from grab_cache_page_nowait(), reclaiming is never triggered + * when allocating new pages. + */ +static inline +struct page *erofs_grab_cache_page_nowait(struct address_space *mapping, + pgoff_t index) +{ + return pagecache_get_page(mapping, index, + FGP_LOCK|FGP_CREAT|FGP_NOFS|FGP_NOWAIT, + readahead_gfp_mask(mapping) & ~__GFP_RECLAIM); +} + extern const struct super_operations erofs_sops; extern const struct address_space_operations erofs_raw_access_aops; |