On Mon, Jan 22, 2024 at 05:18:58AM -0800, Christoph Hellwig wrote: > On Mon, Jan 22, 2024 at 11:05:20PM +1100, Dave Chinner wrote: > > I haven't looked at what using vmalloc means for packing the buffer > > into a bio - we currently use bio_add_page(), so does that mean we > > have to use some variant of virt_to_page() to break the vmalloc > > region up into it's backing pages to feed them to the bio? Or is > > there some helper that I'm unaware of that does it all for us > > magically? > > We have a kmem_to_page helper for chuking any kind of kernel virtual > address space into pages. xfs_rw_bdev in fs/xfs/xfs_bio_io.c uses > that for a bio, we should probably hav an async version of that > and maybe move it to the block layer instead of duplicating the > logic in various places. Yeah, OK, as I expected. I'd forgotten that we already play that game with xfs_rw_bdev(). I think we can trivially factor out an async version and call that from the xfs_buf.c code fo vmalloc()d ranges, so I think I'll work towards that and actually remove the bio packing loop from xfs_buf.c altogether. > > Yeah, that's kind of where I'm going with this. Large folios already > > turn off unmapped buffers, and I'd really like to get rid of that > > page straddling mess that unmapped buffers require in the buffer > > item dirty region tracking. That means we have to get rid of > > unmapped buffers.... > > I actually have an old series to kill unmapped buffers and use > vmalloc, but decided I'd need use folios for the fast path instead > of paying the vmalloc overhead. I can dust it off and you can decide > if you want to pick up parts of it. I wouldn't worry about it too much - the rest of it is pretty straight forward once we know inode cluster buffers are working correctly with single large folios and we always fall back to vmalloc(). Cheers, Dave. -- Dave Chinner david@xxxxxxxxxxxxx