On Tue, Apr 29, 2025 at 02:15:29PM +0200, Christoph Hellwig wrote: > On Tue, Apr 29, 2025 at 09:38:28AM +0800, Yu Kuai wrote: > > Hi, > > > > 在 2025/04/29 2:07, Keith Busch 写道: > >> On Mon, Apr 28, 2025 at 07:09:50AM -0700, Christoph Hellwig wrote: > >>> A lot of complexity in brd stems from the fact that it tries to handle > >>> I/O spanning two backing pages. Instead limit the size of a single > >>> bvec iteration so that it never crosses a page boundary and remove all > >>> the now unneeded code. > >> > >> Doesn't bio_for_each_segment() already limit bvecs on page boundaries? > >> You'd need to use bio_for_each_bvec() to get multi-page bvecs. > > > > I think it only limit bvecs on page boundaries on the issue side, not > > disk side. > > > > For example, if user issue an IO (2k + 4k), will bio_for_each_segment() > > split this IO into (2k + 2k) and (4k + 2k), I do not test yet, but I > > think the answer is no. > > Exactly. I got this wrong with zram, where it only triggers with larger > than 4k page sizes, and I got this wrong here on my first attempt as > well. Fortunately testing found it quickly. I thought the comment and > commit message document the issue well enough, but I'm open to better > wording. Ah, it just clicked for me that you're talking about the pages returned from brd_lookup_page (the "backing pages", as you said), not the bio's pages. Sorry about that.