Lines Matching +full:page +full:- +full:based

1 /* SPDX-License-Identifier: GPL-2.0 */
17 struct page;
20 * struct bio_vec - a contiguous range of physical memory addresses
21 * @bv_page: First page associated with the address range.
32 struct page *bv_page;
38 * bvec_set_page - initialize a bvec based off a struct page
40 * @page: page the bvec should point to
42 * @offset: offset into the page
44 static inline void bvec_set_page(struct bio_vec *bv, struct page *page, in bvec_set_page() argument
47 bv->bv_page = page; in bvec_set_page()
48 bv->bv_len = len; in bvec_set_page()
49 bv->bv_offset = offset; in bvec_set_page()
53 * bvec_set_folio - initialize a bvec based off a struct folio
62 bvec_set_page(bv, &folio->page, len, offset); in bvec_set_folio()
66 * bvec_set_virt - initialize a bvec based on a virtual address
96 * on highmem page vectors
100 /* multi-page (mp_bvec) helpers */
102 (__bvec_iter_bvec((bvec), (iter))->bv_page)
106 __bvec_iter_bvec((bvec), (iter))->bv_len - (iter).bi_bvec_done)
109 (__bvec_iter_bvec((bvec), (iter))->bv_offset + (iter).bi_bvec_done)
121 /* For building single-page bvec in flight */
127 PAGE_SIZE - bvec_iter_offset((bvec), (iter)))
143 unsigned int idx = iter->bi_idx; in bvec_iter_advance()
145 if (WARN_ONCE(bytes > iter->bi_size, in bvec_iter_advance()
147 iter->bi_size = 0; in bvec_iter_advance()
151 iter->bi_size -= bytes; in bvec_iter_advance()
152 bytes += iter->bi_bvec_done; in bvec_iter_advance()
155 bytes -= bv[idx].bv_len; in bvec_iter_advance()
159 iter->bi_idx = idx; in bvec_iter_advance()
160 iter->bi_bvec_done = bytes; in bvec_iter_advance()
166 * across multiple bvec entries, i.e. bytes <= bv[i->bi_idx].bv_len
171 unsigned int done = iter->bi_bvec_done + bytes; in bvec_iter_advance_single()
173 if (done == bv[iter->bi_idx].bv_len) { in bvec_iter_advance_single()
175 iter->bi_idx++; in bvec_iter_advance_single()
177 iter->bi_bvec_done = done; in bvec_iter_advance_single()
178 iter->bi_size -= bytes; in bvec_iter_advance_single()
198 iter_all->done = 0; in bvec_init_iter_all()
199 iter_all->idx = 0; in bvec_init_iter_all()
201 return &iter_all->bv; in bvec_init_iter_all()
207 struct bio_vec *bv = &iter_all->bv; in bvec_advance()
209 if (iter_all->done) { in bvec_advance()
210 bv->bv_page++; in bvec_advance()
211 bv->bv_offset = 0; in bvec_advance()
213 bv->bv_page = bvec->bv_page + (bvec->bv_offset >> PAGE_SHIFT); in bvec_advance()
214 bv->bv_offset = bvec->bv_offset & ~PAGE_MASK; in bvec_advance()
216 bv->bv_len = min_t(unsigned int, PAGE_SIZE - bv->bv_offset, in bvec_advance()
217 bvec->bv_len - iter_all->done); in bvec_advance()
218 iter_all->done += bv->bv_len; in bvec_advance()
220 if (iter_all->done == bvec->bv_len) { in bvec_advance()
221 iter_all->idx++; in bvec_advance()
222 iter_all->done = 0; in bvec_advance()
227 * bvec_kmap_local - map a bvec into the kernel virtual address space
230 * Must be called on single-page bvecs only. Call kunmap_local on the returned
235 return kmap_local_page(bvec->bv_page) + bvec->bv_offset; in bvec_kmap_local()
239 * memcpy_from_bvec - copy data from a bvec
242 * Must be called on single-page bvecs only.
246 memcpy_from_page(to, bvec->bv_page, bvec->bv_offset, bvec->bv_len); in memcpy_from_bvec()
250 * memcpy_to_bvec - copy data to a bvec
253 * Must be called on single-page bvecs only.
257 memcpy_to_page(bvec->bv_page, bvec->bv_offset, from, bvec->bv_len); in memcpy_to_bvec()
261 * memzero_bvec - zero all data in a bvec
264 * Must be called on single-page bvecs only.
268 memzero_page(bvec->bv_page, bvec->bv_offset, bvec->bv_len); in memzero_bvec()
272 * bvec_virt - return the virtual address for a bvec
275 * Note: the caller must ensure that @bvec->bv_page is not a highmem page.
279 WARN_ON_ONCE(PageHighMem(bvec->bv_page)); in bvec_virt()
280 return page_address(bvec->bv_page) + bvec->bv_offset; in bvec_virt()
284 * bvec_phys - return the physical address for a bvec
289 return page_to_phys(bvec->bv_page) + bvec->bv_offset; in bvec_phys()