Lines Matching defs:miter

745  * @miter: sg mapping iter to be started
750 * Starts mapping iterator @miter.
755 void sg_miter_start(struct sg_mapping_iter *miter, struct scatterlist *sgl,
758 memset(miter, 0, sizeof(struct sg_mapping_iter));
760 __sg_page_iter_start(&miter->piter, sgl, nents, 0);
762 miter->__flags = flags;
766 static bool sg_miter_get_next_page(struct sg_mapping_iter *miter)
768 if (!miter->__remaining) {
771 if (!__sg_page_iter_next(&miter->piter))
774 sg = miter->piter.sg;
776 miter->__offset = miter->piter.sg_pgoffset ? 0 : sg->offset;
777 miter->piter.sg_pgoffset += miter->__offset >> PAGE_SHIFT;
778 miter->__offset &= PAGE_SIZE - 1;
779 miter->__remaining = sg->offset + sg->length -
780 (miter->piter.sg_pgoffset << PAGE_SHIFT) -
781 miter->__offset;
782 miter->__remaining = min_t(unsigned long, miter->__remaining,
783 PAGE_SIZE - miter->__offset);
791 * @miter: sg mapping iter to be skipped
795 * Sets the offset of @miter to its current location plus @offset bytes.
796 * If mapping iterator @miter has been proceeded by sg_miter_next(), this
797 * stops @miter.
800 * Don't care if @miter is stopped, or not proceeded yet.
804 * true if @miter contains the valid mapping. false if end of sg
807 bool sg_miter_skip(struct sg_mapping_iter *miter, off_t offset)
809 sg_miter_stop(miter);
814 if (!sg_miter_get_next_page(miter))
817 consumed = min_t(off_t, offset, miter->__remaining);
818 miter->__offset += consumed;
819 miter->__remaining -= consumed;
829 * @miter: sg mapping iter to proceed
832 * Proceeds @miter to the next mapping. @miter should have been started
833 * using sg_miter_start(). On successful return, @miter->page,
834 * @miter->addr and @miter->length point to the current mapping.
838 * till @miter is stopped. May sleep if !SG_MITER_ATOMIC.
841 * true if @miter contains the next mapping. false if end of sg
844 bool sg_miter_next(struct sg_mapping_iter *miter)
846 sg_miter_stop(miter);
852 if (!sg_miter_get_next_page(miter))
855 miter->page = sg_page_iter_page(&miter->piter);
856 miter->consumed = miter->length = miter->__remaining;
858 if (miter->__flags & SG_MITER_ATOMIC)
859 miter->addr = kmap_atomic(miter->page) + miter->__offset;
861 miter->addr = kmap(miter->page) + miter->__offset;
869 * @miter: sg mapping iter to be stopped
872 * Stops mapping iterator @miter. @miter should have been started
881 void sg_miter_stop(struct sg_mapping_iter *miter)
883 WARN_ON(miter->consumed > miter->length);
886 if (miter->addr) {
887 miter->__offset += miter->consumed;
888 miter->__remaining -= miter->consumed;
890 if ((miter->__flags & SG_MITER_TO_SG) &&
891 !PageSlab(miter->page))
892 flush_kernel_dcache_page(miter->page);
894 if (miter->__flags & SG_MITER_ATOMIC) {
896 kunmap_atomic(miter->addr);
898 kunmap(miter->page);
900 miter->page = NULL;
901 miter->addr = NULL;
902 miter->length = 0;
903 miter->consumed = 0;
925 struct sg_mapping_iter miter;
933 sg_miter_start(&miter, sgl, nents, sg_flags);
935 if (!sg_miter_skip(&miter, skip))
938 while ((offset < buflen) && sg_miter_next(&miter)) {
941 len = min(miter.length, buflen - offset);
944 memcpy(buf + offset, miter.addr, len);
946 memcpy(miter.addr, buf + offset, len);
951 sg_miter_stop(&miter);
1040 struct sg_mapping_iter miter;
1043 sg_miter_start(&miter, sgl, nents, sg_flags);
1045 if (!sg_miter_skip(&miter, skip))
1048 while (offset < buflen && sg_miter_next(&miter)) {
1051 len = min(miter.length, buflen - offset);
1052 memset(miter.addr, 0, len);
1057 sg_miter_stop(&miter);