Lines Matching refs:miter

484 void sg_miter_start(struct sg_mapping_iter *miter, struct scatterlist *sgl,  in sg_miter_start()  argument
487 memset(miter, 0, sizeof(struct sg_mapping_iter)); in sg_miter_start()
489 __sg_page_iter_start(&miter->piter, sgl, nents, 0); in sg_miter_start()
491 miter->__flags = flags; in sg_miter_start()
495 static bool sg_miter_get_next_page(struct sg_mapping_iter *miter) in sg_miter_get_next_page() argument
497 if (!miter->__remaining) { in sg_miter_get_next_page()
501 if (!__sg_page_iter_next(&miter->piter)) in sg_miter_get_next_page()
504 sg = miter->piter.sg; in sg_miter_get_next_page()
505 pgoffset = miter->piter.sg_pgoffset; in sg_miter_get_next_page()
507 miter->__offset = pgoffset ? 0 : sg->offset; in sg_miter_get_next_page()
508 miter->__remaining = sg->offset + sg->length - in sg_miter_get_next_page()
509 (pgoffset << PAGE_SHIFT) - miter->__offset; in sg_miter_get_next_page()
510 miter->__remaining = min_t(unsigned long, miter->__remaining, in sg_miter_get_next_page()
511 PAGE_SIZE - miter->__offset); in sg_miter_get_next_page()
535 bool sg_miter_skip(struct sg_mapping_iter *miter, off_t offset) in sg_miter_skip() argument
537 sg_miter_stop(miter); in sg_miter_skip()
542 if (!sg_miter_get_next_page(miter)) in sg_miter_skip()
545 consumed = min_t(off_t, offset, miter->__remaining); in sg_miter_skip()
546 miter->__offset += consumed; in sg_miter_skip()
547 miter->__remaining -= consumed; in sg_miter_skip()
572 bool sg_miter_next(struct sg_mapping_iter *miter) in sg_miter_next() argument
574 sg_miter_stop(miter); in sg_miter_next()
580 if (!sg_miter_get_next_page(miter)) in sg_miter_next()
583 miter->page = sg_page_iter_page(&miter->piter); in sg_miter_next()
584 miter->consumed = miter->length = miter->__remaining; in sg_miter_next()
586 if (miter->__flags & SG_MITER_ATOMIC) in sg_miter_next()
587 miter->addr = kmap_atomic(miter->page) + miter->__offset; in sg_miter_next()
589 miter->addr = kmap(miter->page) + miter->__offset; in sg_miter_next()
609 void sg_miter_stop(struct sg_mapping_iter *miter) in sg_miter_stop() argument
611 WARN_ON(miter->consumed > miter->length); in sg_miter_stop()
614 if (miter->addr) { in sg_miter_stop()
615 miter->__offset += miter->consumed; in sg_miter_stop()
616 miter->__remaining -= miter->consumed; in sg_miter_stop()
618 if ((miter->__flags & SG_MITER_TO_SG) && in sg_miter_stop()
619 !PageSlab(miter->page)) in sg_miter_stop()
620 flush_kernel_dcache_page(miter->page); in sg_miter_stop()
622 if (miter->__flags & SG_MITER_ATOMIC) { in sg_miter_stop()
624 kunmap_atomic(miter->addr); in sg_miter_stop()
626 kunmap(miter->page); in sg_miter_stop()
628 miter->page = NULL; in sg_miter_stop()
629 miter->addr = NULL; in sg_miter_stop()
630 miter->length = 0; in sg_miter_stop()
631 miter->consumed = 0; in sg_miter_stop()
653 struct sg_mapping_iter miter; in sg_copy_buffer() local
662 sg_miter_start(&miter, sgl, nents, sg_flags); in sg_copy_buffer()
664 if (!sg_miter_skip(&miter, skip)) in sg_copy_buffer()
669 while (sg_miter_next(&miter) && offset < buflen) { in sg_copy_buffer()
672 len = min(miter.length, buflen - offset); in sg_copy_buffer()
675 memcpy(buf + offset, miter.addr, len); in sg_copy_buffer()
677 memcpy(miter.addr, buf + offset, len); in sg_copy_buffer()
682 sg_miter_stop(&miter); in sg_copy_buffer()