First: as mentioned in the previous patches I really hate the name scheme with the _sp and _mp postfixes. To be clear and understandable we should always name the versions that iterate over segments *segment* and the ones that iterate over pages *page*. To make sure we have a clean compile break for code using the old _segment name I'd suggest to move to pass the bvec_iter argument by reference, which is the right thing to do anyway. As far as the implementation goes I don't think we actually need to pass the mp argument down. Instead we always call the full-segment version of bvec_iter_len / __bvec_iter_advance and then have an inner loop that moves the fake bvecs forward inside each full-segment one - that is implement the per-page version on top of the per-segment one.