Re: [PATCH v3 6/8] filemap: Allow __filemap_get_folio to allocate large folios

Dave Chinner
2023-06-12T22:49:13Z

On Mon, Jun 12, 2023 at 09:39:08PM +0100, Matthew Wilcox (Oracle) wrote:
> Allow callers of __filemap_get_folio() to specify a preferred folio
> order in the FGP flags. This is only honoured in the FGP_CREATE path;
> if there is already a folio in the page cache that covers the index,
> we will return it, no matter what its order is. No create-around is
> attempted; we will only create folios which start at the specified index.
> Unmodified callers will continue to allocate order 0 folios.
>
> Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
.....
> - /* Init accessed so avoid atomic mark_page_accessed later */
> - if (fgp_flags & FGP_ACCESSED)
> - __folio_set_referenced(folio);
> + if (!mapping_large_folio_support(mapping))
> + order = 0;
> + if (order > MAX_PAGECACHE_ORDER)
> + order = MAX_PAGECACHE_ORDER;
> + /* If we're not aligned, allocate a smaller folio */
> + if (index & ((1UL << order) - 1))
> + order = __ffs(index);

If I read this right, if we pass in an unaligned index, we won't get
the size of the folio we ask for?

e.g. if we want an order-4 folio (64kB) because we have a 64kB block
size in the filesystem, then we have to pass in an index that
order-4 aligned, yes?

I ask this, because the later iomap code that asks for large folios
only passes in "pos >> PAGE_SHIFT" so it looks to me like it won't
allocate large folios for anything other than large folio aligned
writes, even if we need them.

What am I missing?

-Dave.
--
Dave Chinner
david@fromorbit.com