On Tue, Nov 21, 2023 at 08:49:45AM -0700, Keith Busch wrote: > On Tue, Nov 21, 2023 at 04:37:01PM +0800, Ming Lei wrote: > > On Mon, Nov 20, 2023 at 02:40:54PM -0800, Keith Busch wrote: > > > From: Keith Busch <kbusch@xxxxxxxxxx> > > > > > > Some bio_vec iterators can handle physically contiguous memory and have > > > no need to split bvec consideration on page boundaries. > > > > Then I am wondering why this helper is needed, and you can use each bvec > > directly, which is supposed to be physically contiguous. > > It's just a helper function to iterate a generic bvec. I just look into patch 3 about the use, seems what you need is for_each_bvec_all(), which is safe & efficient to use when freeing the host data(bio or bip), but can't be used in split bio/bip, in which the generic iterator is needed. And you can open-code it in bio_integrity_unmap_user(): for (i = 0; i < bip->bip_vcnt; i++) { struct bio_vec *v = &bip->bip_vec[i]; ... } Thanks, Ming