Lines Matching refs:miter

801 void sg_miter_start(struct sg_mapping_iter *miter, struct scatterlist *sgl,  in sg_miter_start()  argument
804 memset(miter, 0, sizeof(struct sg_mapping_iter)); in sg_miter_start()
806 __sg_page_iter_start(&miter->piter, sgl, nents, 0); in sg_miter_start()
808 miter->__flags = flags; in sg_miter_start()
812 static bool sg_miter_get_next_page(struct sg_mapping_iter *miter) in sg_miter_get_next_page() argument
814 if (!miter->__remaining) { in sg_miter_get_next_page()
817 if (!__sg_page_iter_next(&miter->piter)) in sg_miter_get_next_page()
820 sg = miter->piter.sg; in sg_miter_get_next_page()
822 miter->__offset = miter->piter.sg_pgoffset ? 0 : sg->offset; in sg_miter_get_next_page()
823 miter->piter.sg_pgoffset += miter->__offset >> PAGE_SHIFT; in sg_miter_get_next_page()
824 miter->__offset &= PAGE_SIZE - 1; in sg_miter_get_next_page()
825 miter->__remaining = sg->offset + sg->length - in sg_miter_get_next_page()
826 (miter->piter.sg_pgoffset << PAGE_SHIFT) - in sg_miter_get_next_page()
827 miter->__offset; in sg_miter_get_next_page()
828 miter->__remaining = min_t(unsigned long, miter->__remaining, in sg_miter_get_next_page()
829 PAGE_SIZE - miter->__offset); in sg_miter_get_next_page()
852 bool sg_miter_skip(struct sg_mapping_iter *miter, off_t offset) in sg_miter_skip() argument
854 sg_miter_stop(miter); in sg_miter_skip()
859 if (!sg_miter_get_next_page(miter)) in sg_miter_skip()
862 consumed = min_t(off_t, offset, miter->__remaining); in sg_miter_skip()
863 miter->__offset += consumed; in sg_miter_skip()
864 miter->__remaining -= consumed; in sg_miter_skip()
888 bool sg_miter_next(struct sg_mapping_iter *miter) in sg_miter_next() argument
890 sg_miter_stop(miter); in sg_miter_next()
896 if (!sg_miter_get_next_page(miter)) in sg_miter_next()
899 miter->page = sg_page_iter_page(&miter->piter); in sg_miter_next()
900 miter->consumed = miter->length = miter->__remaining; in sg_miter_next()
902 if (miter->__flags & SG_MITER_ATOMIC) in sg_miter_next()
903 miter->addr = kmap_atomic(miter->page) + miter->__offset; in sg_miter_next()
904 else if (miter->__flags & SG_MITER_LOCAL) in sg_miter_next()
905 miter->addr = kmap_local_page(miter->page) + miter->__offset; in sg_miter_next()
907 miter->addr = kmap(miter->page) + miter->__offset; in sg_miter_next()
926 void sg_miter_stop(struct sg_mapping_iter *miter) in sg_miter_stop() argument
928 WARN_ON(miter->consumed > miter->length); in sg_miter_stop()
931 if (miter->addr) { in sg_miter_stop()
932 miter->__offset += miter->consumed; in sg_miter_stop()
933 miter->__remaining -= miter->consumed; in sg_miter_stop()
935 if (miter->__flags & SG_MITER_TO_SG) in sg_miter_stop()
936 flush_dcache_page(miter->page); in sg_miter_stop()
938 if (miter->__flags & SG_MITER_ATOMIC) { in sg_miter_stop()
940 kunmap_atomic(miter->addr); in sg_miter_stop()
941 } else if (miter->__flags & SG_MITER_LOCAL) in sg_miter_stop()
942 kunmap_local(miter->addr); in sg_miter_stop()
944 kunmap(miter->page); in sg_miter_stop()
946 miter->page = NULL; in sg_miter_stop()
947 miter->addr = NULL; in sg_miter_stop()
948 miter->length = 0; in sg_miter_stop()
949 miter->consumed = 0; in sg_miter_stop()
971 struct sg_mapping_iter miter; in sg_copy_buffer() local
979 sg_miter_start(&miter, sgl, nents, sg_flags); in sg_copy_buffer()
981 if (!sg_miter_skip(&miter, skip)) in sg_copy_buffer()
984 while ((offset < buflen) && sg_miter_next(&miter)) { in sg_copy_buffer()
987 len = min(miter.length, buflen - offset); in sg_copy_buffer()
990 memcpy(buf + offset, miter.addr, len); in sg_copy_buffer()
992 memcpy(miter.addr, buf + offset, len); in sg_copy_buffer()
997 sg_miter_stop(&miter); in sg_copy_buffer()
1086 struct sg_mapping_iter miter; in sg_zero_buffer() local
1089 sg_miter_start(&miter, sgl, nents, sg_flags); in sg_zero_buffer()
1091 if (!sg_miter_skip(&miter, skip)) in sg_zero_buffer()
1094 while (offset < buflen && sg_miter_next(&miter)) { in sg_zero_buffer()
1097 len = min(miter.length, buflen - offset); in sg_zero_buffer()
1098 memset(miter.addr, 0, len); in sg_zero_buffer()
1103 sg_miter_stop(&miter); in sg_zero_buffer()