The mapping has an underlying blocksize (by virtue of mapping->host->i_blkbits), so if the mapping blocksize is larger than the pagesize we should allocate folios in the correct order. Signed-off-by: Hannes Reinecke <hare@xxxxxxx> --- include/linux/pagemap.h | 7 +++++++ mm/filemap.c | 7 ++++--- mm/readahead.c | 6 +++--- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/include/linux/pagemap.h b/include/linux/pagemap.h index 716953ee1ebd..9ea1a9724d64 100644 --- a/include/linux/pagemap.h +++ b/include/linux/pagemap.h @@ -494,6 +494,13 @@ static inline gfp_t readahead_gfp_mask(struct address_space *x) return mapping_gfp_mask(x) | __GFP_NORETRY | __GFP_NOWARN; } +static inline int mapping_get_order(struct address_space *x) +{ + if (x->host->i_blkbits > PAGE_SHIFT) + return x->host->i_blkbits - PAGE_SHIFT; + return 0; +} + typedef int filler_t(struct file *, struct folio *); pgoff_t page_cache_next_miss(struct address_space *mapping, diff --git a/mm/filemap.c b/mm/filemap.c index 4be20e82e4c3..6f08d04995d9 100644 --- a/mm/filemap.c +++ b/mm/filemap.c @@ -1936,7 +1936,7 @@ struct folio *__filemap_get_folio(struct address_space *mapping, pgoff_t index, gfp |= GFP_NOWAIT | __GFP_NOWARN; } - folio = filemap_alloc_folio(gfp, 0); + folio = filemap_alloc_folio(gfp, mapping_get_order(mapping)); if (!folio) return ERR_PTR(-ENOMEM); @@ -2495,7 +2495,8 @@ static int filemap_create_folio(struct file *file, struct folio *folio; int error; - folio = filemap_alloc_folio(mapping_gfp_mask(mapping), 0); + folio = filemap_alloc_folio(mapping_gfp_mask(mapping), + mapping_get_order(mapping)); if (!folio) return -ENOMEM; @@ -3646,7 +3647,7 @@ static struct folio *do_read_cache_folio(struct address_space *mapping, repeat: folio = filemap_get_folio(mapping, index); if (IS_ERR(folio)) { - folio = filemap_alloc_folio(gfp, 0); + folio = filemap_alloc_folio(gfp, mapping_get_order(mapping)); if (!folio) return ERR_PTR(-ENOMEM); err = filemap_add_folio(mapping, folio, index, gfp); diff --git a/mm/readahead.c b/mm/readahead.c index 47afbca1d122..031935b78af7 100644 --- a/mm/readahead.c +++ b/mm/readahead.c @@ -245,7 +245,7 @@ void page_cache_ra_unbounded(struct readahead_control *ractl, continue; } - folio = filemap_alloc_folio(gfp_mask, 0); + folio = filemap_alloc_folio(gfp_mask, mapping_get_order(mapping)); if (!folio) break; if (filemap_add_folio(mapping, folio, index + i, @@ -806,7 +806,7 @@ void readahead_expand(struct readahead_control *ractl, if (folio && !xa_is_value(folio)) return; /* Folio apparently present */ - folio = filemap_alloc_folio(gfp_mask, 0); + folio = filemap_alloc_folio(gfp_mask, mapping_get_order(mapping)); if (!folio) return; if (filemap_add_folio(mapping, folio, index, gfp_mask) < 0) { @@ -833,7 +833,7 @@ void readahead_expand(struct readahead_control *ractl, if (folio && !xa_is_value(folio)) return; /* Folio apparently present */ - folio = filemap_alloc_folio(gfp_mask, 0); + folio = filemap_alloc_folio(gfp_mask, mapping_get_order(mapping)); if (!folio) return; if (filemap_add_folio(mapping, folio, index, gfp_mask) < 0) { -- 2.35.3