On Fri, Oct 27, 2023 at 05:41:10PM +0200, Pankaj Raghav wrote: > On 27/10/2023 12:47, Matthew Wilcox wrote: > > On Fri, Oct 27, 2023 at 10:03:15AM +0200, Pankaj Raghav wrote: > >> I also noticed this pattern in fscrypt_zeroout_range_inline_crypt(). > >> Probably there are more places which could use a ZERO_FOLIO directly > >> instead of iterating with ZERO_PAGE. > >> > >> Chinner also had a similar comment. It would be nice if we can reserve > >> a zero huge page that is the size of MAX_PAGECACHE_ORDER and add it as > >> one folio to the bio. > > > > i'm on holiday atm. start looking at mm_get_huge_zero_page() > > Thanks for the pointer. I made a rough version of how it might > look like if I use that API: useful thing to do. i think this shows we need a new folio api wrapping it. happy to do that when i'm back, or you can have a crack at it. your point about it possibly failing is correct. so i think we need an api which definitely returns a folio, but it might be of arbitrary order. > bio->bi_iter.bi_sector = iomap_sector(&iter->iomap, pos); > bio->bi_private = dio; > bio->bi_end_io = iomap_dio_bio_end_io; > > - __bio_add_page(bio, page, len, 0); > + if (!fallback) { > + bio_add_folio_nofail(bio, page_folio(page), len, 0); > + } else { > + while (len) { > + unsigned int io_len = > + min_t(unsigned int, len, PAGE_SIZE); > + > + __bio_add_page(bio, page, io_len, 0); > + len -= io_len; > + } > + } > + > iomap_dio_submit_bio(iter, dio, bio, pos); then this can look something like: while (len) { size_t size = min(len, folio_size(folio)); __bio_add_folio(bio, folio, size, 0); len -= size; } > PS: Enjoy your holidays :) cheers ;-)