Use skb_to_sgvec() to set scatter list, and sometime we would get a sg->offset which is more than PAGE_SIZE. Call sg_pcopy_to_buffer() with this scatter list would get wrong data.
In sg_miter_get_next_page(), you would get wrong miter->__remaining, when the sg->offset is more than PAGE_SIZE. static bool sg_miter_get_next_page(struct sg_mapping_iter *miter) { if (!miter->__remaining) { struct scatterlist *sg; unsigned long pgoffset; if (!__sg_page_iter_next(&miter->piter)) return false; sg = miter->piter.sg; pgoffset = miter->piter.sg_pgoffset; miter->__offset = pgoffset ? 0 : sg->offset; miter->__remaining = sg->offset + sg->length - (pgoffset << PAGE_SHIFT) - miter->__offset; miter->__remaining = min_t(unsigned long, miter->__remaining, PAGE_SIZE - miter->__offset); } return true; } Best Regards, Hayes