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@xxxxxxxxxxxxx> ..... > - /* 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@xxxxxxxxxxxxx