On 13 Jan 2020, at 12:40, Matthew Wilcox wrote: > On Mon, Jan 13, 2020 at 04:42:10PM +0000, Chris Mason wrote: > > I did do a couple of helpers for lists for iomap before deciding the > whole thing was too painful. I didn't look at btrfs until just now, > but, um ... > > int extent_readpages(struct address_space *mapping, struct list_head > *pages, > unsigned nr_pages) > .. > struct page *pagepool[16]; > .. > while (!list_empty(pages)) { > .. > list_del(&page->lru); > if (add_to_page_cache_lru(page, mapping, > page->index, > .. > pagepool[nr++] = page; > > you're basically doing exactly what i'm proposing to be the new > interface! > OK, you get one extra page per batch ;-P This is true, I didn't explain that part well ;) Depending on compression etc we might end up poking the xarray inside the actual IO functions, but the main difference is that btrfs is building a single bio. You're moving the plug so you'll merge into single bio, but I'd rather build 2MB bios than merge them. I guess it doesn't feel like enough of a win to justify the churn. If we find a way to do much larger pagevecs, I think this makes more sense. -chris