On Wed, Jan 6, 2016 at 11:18 PM, Keith Busch <keith.busch@xxxxxxxxx> wrote: > On Wed, Jan 06, 2016 at 02:53:22PM +0800, Ming Lei wrote: >> On Wed, Jan 6, 2016 at 2:29 PM, Ming Lei <tom.leiming@xxxxxxxxx> wrote: >> > >> > bvec_iter_advance() can split anywhere, but the splitted bios may >> > cross one same bvec, which may cause trouble, > > Cross? One starts where the other starts. Could you please explain what's > wrong? Suppose bio is splitted as bio1 and bio2, then the last bvec of bio1 is same with the first bvec of bio2. > >> > for example, >> > BIOVEC_PHYS_MERGEABLE() may not work well and >> > blk_phys_contig_segment() too. > > Could you please explain why it may not work well? I have no idea what > concern you have with BIOVEC_PHYS_MERGEABLE in this case. > > The only place blk_phys_contig_segment is called from is > ll_merge_requests, and the first req of the split bio wouldn't even go > through here because it's marked REQ_NOMERGE. OK, looks I forget this change. > >> blk_rq_map_sg() isn't ready for splitting in the middle of bvec too. > > Could you please explain? It just uses the bio iterator, which I'm pretty > sure is not broken. Please see the 1st line code of __blk_segment_map_sg(), in which only one whole bvec is handled, and partial bvec can't be figured out there. Think of it further, drivers often use bv.bv_len directly in the iterator, for example: bio_for_each_segment(bvec, bio, iter) memcpy(page_address(bvec.bv_page) + bvec.bv_offset, addr + offset, bvec.bv_len); So your patch will break these drivers, won't it? -- Ming Lei -- To unsubscribe from this list: send the line "unsubscribe linux-block" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html