1 #include <linux/export.h>
3 #include <linux/pagemap.h>
4 #include <linux/slab.h>
5 #include <linux/vmalloc.h>
7 static size_t copy_page_to_iter_iovec(struct page
*page
, size_t offset
, size_t bytes
,
10 size_t skip
, copy
, left
, wanted
;
11 const struct iovec
*iov
;
15 if (unlikely(bytes
> i
->count
))
24 buf
= iov
->iov_base
+ skip
;
25 copy
= min(bytes
, iov
->iov_len
- skip
);
27 if (!fault_in_pages_writeable(buf
, copy
)) {
28 kaddr
= kmap_atomic(page
);
29 from
= kaddr
+ offset
;
31 /* first chunk, usually the only one */
32 left
= __copy_to_user_inatomic(buf
, from
, copy
);
38 while (unlikely(!left
&& bytes
)) {
41 copy
= min(bytes
, iov
->iov_len
);
42 left
= __copy_to_user_inatomic(buf
, from
, copy
);
52 offset
= from
- kaddr
;
55 copy
= min(bytes
, iov
->iov_len
- skip
);
57 /* Too bad - revert to non-atomic kmap */
59 from
= kaddr
+ offset
;
60 left
= __copy_to_user(buf
, from
, copy
);
65 while (unlikely(!left
&& bytes
)) {
68 copy
= min(bytes
, iov
->iov_len
);
69 left
= __copy_to_user(buf
, from
, copy
);
77 if (skip
== iov
->iov_len
) {
81 i
->count
-= wanted
- bytes
;
82 i
->nr_segs
-= iov
- i
->iov
;
85 return wanted
- bytes
;
88 static size_t copy_page_from_iter_iovec(struct page
*page
, size_t offset
, size_t bytes
,
91 size_t skip
, copy
, left
, wanted
;
92 const struct iovec
*iov
;
96 if (unlikely(bytes
> i
->count
))
104 skip
= i
->iov_offset
;
105 buf
= iov
->iov_base
+ skip
;
106 copy
= min(bytes
, iov
->iov_len
- skip
);
108 if (!fault_in_pages_readable(buf
, copy
)) {
109 kaddr
= kmap_atomic(page
);
112 /* first chunk, usually the only one */
113 left
= __copy_from_user_inatomic(to
, buf
, copy
);
119 while (unlikely(!left
&& bytes
)) {
122 copy
= min(bytes
, iov
->iov_len
);
123 left
= __copy_from_user_inatomic(to
, buf
, copy
);
129 if (likely(!bytes
)) {
130 kunmap_atomic(kaddr
);
135 kunmap_atomic(kaddr
);
136 copy
= min(bytes
, iov
->iov_len
- skip
);
138 /* Too bad - revert to non-atomic kmap */
141 left
= __copy_from_user(to
, buf
, copy
);
146 while (unlikely(!left
&& bytes
)) {
149 copy
= min(bytes
, iov
->iov_len
);
150 left
= __copy_from_user(to
, buf
, copy
);
158 if (skip
== iov
->iov_len
) {
162 i
->count
-= wanted
- bytes
;
163 i
->nr_segs
-= iov
- i
->iov
;
165 i
->iov_offset
= skip
;
166 return wanted
- bytes
;
169 static size_t __iovec_copy_from_user_inatomic(char *vaddr
,
170 const struct iovec
*iov
, size_t base
, size_t bytes
)
172 size_t copied
= 0, left
= 0;
175 char __user
*buf
= iov
->iov_base
+ base
;
176 int copy
= min(bytes
, iov
->iov_len
- base
);
179 left
= __copy_from_user_inatomic(vaddr
, buf
, copy
);
188 return copied
- left
;
192 * Copy as much as we can into the page and return the number of bytes which
193 * were successfully copied. If a fault is encountered then return the number of
194 * bytes which were copied.
196 static size_t copy_from_user_atomic_iovec(struct page
*page
,
197 struct iov_iter
*i
, unsigned long offset
, size_t bytes
)
202 kaddr
= kmap_atomic(page
);
203 if (likely(i
->nr_segs
== 1)) {
205 char __user
*buf
= i
->iov
->iov_base
+ i
->iov_offset
;
206 left
= __copy_from_user_inatomic(kaddr
+ offset
, buf
, bytes
);
207 copied
= bytes
- left
;
209 copied
= __iovec_copy_from_user_inatomic(kaddr
+ offset
,
210 i
->iov
, i
->iov_offset
, bytes
);
212 kunmap_atomic(kaddr
);
217 static void advance_iovec(struct iov_iter
*i
, size_t bytes
)
219 BUG_ON(i
->count
< bytes
);
221 if (likely(i
->nr_segs
== 1)) {
222 i
->iov_offset
+= bytes
;
225 const struct iovec
*iov
= i
->iov
;
226 size_t base
= i
->iov_offset
;
227 unsigned long nr_segs
= i
->nr_segs
;
230 * The !iov->iov_len check ensures we skip over unlikely
231 * zero-length segments (without overruning the iovec).
233 while (bytes
|| unlikely(i
->count
&& !iov
->iov_len
)) {
236 copy
= min(bytes
, iov
->iov_len
- base
);
237 BUG_ON(!i
->count
|| i
->count
< copy
);
241 if (iov
->iov_len
== base
) {
248 i
->iov_offset
= base
;
249 i
->nr_segs
= nr_segs
;
254 * Fault in the first iovec of the given iov_iter, to a maximum length
255 * of bytes. Returns 0 on success, or non-zero if the memory could not be
256 * accessed (ie. because it is an invalid address).
258 * writev-intensive code may want this to prefault several iovecs -- that
259 * would be possible (callers must not rely on the fact that _only_ the
260 * first iovec will be faulted with the current implementation).
262 int iov_iter_fault_in_readable(struct iov_iter
*i
, size_t bytes
)
264 if (!(i
->type
& ITER_BVEC
)) {
265 char __user
*buf
= i
->iov
->iov_base
+ i
->iov_offset
;
266 bytes
= min(bytes
, i
->iov
->iov_len
- i
->iov_offset
);
267 return fault_in_pages_readable(buf
, bytes
);
271 EXPORT_SYMBOL(iov_iter_fault_in_readable
);
273 static unsigned long alignment_iovec(const struct iov_iter
*i
)
275 const struct iovec
*iov
= i
->iov
;
277 size_t size
= i
->count
;
283 res
= (unsigned long)iov
->iov_base
+ i
->iov_offset
;
284 n
= iov
->iov_len
- i
->iov_offset
;
289 while (size
> (++iov
)->iov_len
) {
290 res
|= (unsigned long)iov
->iov_base
| iov
->iov_len
;
291 size
-= iov
->iov_len
;
293 res
|= (unsigned long)iov
->iov_base
| size
;
297 void iov_iter_init(struct iov_iter
*i
, int direction
,
298 const struct iovec
*iov
, unsigned long nr_segs
,
301 /* It will get better. Eventually... */
302 if (segment_eq(get_fs(), KERNEL_DS
))
303 direction
|= ITER_KVEC
;
306 i
->nr_segs
= nr_segs
;
310 EXPORT_SYMBOL(iov_iter_init
);
312 static ssize_t
get_pages_iovec(struct iov_iter
*i
,
313 struct page
**pages
, size_t maxsize
,
316 size_t offset
= i
->iov_offset
;
317 const struct iovec
*iov
= i
->iov
;
323 len
= iov
->iov_len
- offset
;
328 addr
= (unsigned long)iov
->iov_base
+ offset
;
329 len
+= *start
= addr
& (PAGE_SIZE
- 1);
330 addr
&= ~(PAGE_SIZE
- 1);
331 n
= (len
+ PAGE_SIZE
- 1) / PAGE_SIZE
;
332 res
= get_user_pages_fast(addr
, n
, (i
->type
& WRITE
) != WRITE
, pages
);
333 if (unlikely(res
< 0))
335 return (res
== n
? len
: res
* PAGE_SIZE
) - *start
;
338 static ssize_t
get_pages_alloc_iovec(struct iov_iter
*i
,
339 struct page
***pages
, size_t maxsize
,
342 size_t offset
= i
->iov_offset
;
343 const struct iovec
*iov
= i
->iov
;
350 len
= iov
->iov_len
- offset
;
355 addr
= (unsigned long)iov
->iov_base
+ offset
;
356 len
+= *start
= addr
& (PAGE_SIZE
- 1);
357 addr
&= ~(PAGE_SIZE
- 1);
358 n
= (len
+ PAGE_SIZE
- 1) / PAGE_SIZE
;
360 p
= kmalloc(n
* sizeof(struct page
*), GFP_KERNEL
);
362 p
= vmalloc(n
* sizeof(struct page
*));
366 res
= get_user_pages_fast(addr
, n
, (i
->type
& WRITE
) != WRITE
, p
);
367 if (unlikely(res
< 0)) {
372 return (res
== n
? len
: res
* PAGE_SIZE
) - *start
;
375 static int iov_iter_npages_iovec(const struct iov_iter
*i
, int maxpages
)
377 size_t offset
= i
->iov_offset
;
378 size_t size
= i
->count
;
379 const struct iovec
*iov
= i
->iov
;
383 for (n
= 0; size
&& n
< i
->nr_segs
; n
++, iov
++) {
384 unsigned long addr
= (unsigned long)iov
->iov_base
+ offset
;
385 size_t len
= iov
->iov_len
- offset
;
387 if (unlikely(!len
)) /* empty segment */
391 npages
+= (addr
+ len
+ PAGE_SIZE
- 1) / PAGE_SIZE
393 if (npages
>= maxpages
) /* don't bother going further */
398 return min(npages
, maxpages
);
401 static void memcpy_from_page(char *to
, struct page
*page
, size_t offset
, size_t len
)
403 char *from
= kmap_atomic(page
);
404 memcpy(to
, from
+ offset
, len
);
408 static void memcpy_to_page(struct page
*page
, size_t offset
, char *from
, size_t len
)
410 char *to
= kmap_atomic(page
);
411 memcpy(to
+ offset
, from
, len
);
415 static size_t copy_page_to_iter_bvec(struct page
*page
, size_t offset
, size_t bytes
,
418 size_t skip
, copy
, wanted
;
419 const struct bio_vec
*bvec
;
422 if (unlikely(bytes
> i
->count
))
425 if (unlikely(!bytes
))
430 skip
= i
->iov_offset
;
431 copy
= min_t(size_t, bytes
, bvec
->bv_len
- skip
);
433 kaddr
= kmap_atomic(page
);
434 from
= kaddr
+ offset
;
435 memcpy_to_page(bvec
->bv_page
, skip
+ bvec
->bv_offset
, from
, copy
);
441 copy
= min(bytes
, (size_t)bvec
->bv_len
);
442 memcpy_to_page(bvec
->bv_page
, bvec
->bv_offset
, from
, copy
);
447 kunmap_atomic(kaddr
);
448 if (skip
== bvec
->bv_len
) {
452 i
->count
-= wanted
- bytes
;
453 i
->nr_segs
-= bvec
- i
->bvec
;
455 i
->iov_offset
= skip
;
456 return wanted
- bytes
;
459 static size_t copy_page_from_iter_bvec(struct page
*page
, size_t offset
, size_t bytes
,
462 size_t skip
, copy
, wanted
;
463 const struct bio_vec
*bvec
;
466 if (unlikely(bytes
> i
->count
))
469 if (unlikely(!bytes
))
474 skip
= i
->iov_offset
;
476 kaddr
= kmap_atomic(page
);
480 copy
= min(bytes
, bvec
->bv_len
- skip
);
482 memcpy_from_page(to
, bvec
->bv_page
, bvec
->bv_offset
+ skip
, copy
);
490 copy
= min(bytes
, (size_t)bvec
->bv_len
);
491 memcpy_from_page(to
, bvec
->bv_page
, bvec
->bv_offset
, copy
);
496 kunmap_atomic(kaddr
);
497 if (skip
== bvec
->bv_len
) {
502 i
->nr_segs
-= bvec
- i
->bvec
;
504 i
->iov_offset
= skip
;
508 static size_t copy_from_user_bvec(struct page
*page
,
509 struct iov_iter
*i
, unsigned long offset
, size_t bytes
)
513 const struct bio_vec
*bvec
;
514 size_t base
= i
->iov_offset
;
516 kaddr
= kmap_atomic(page
);
517 for (left
= bytes
, bvec
= i
->bvec
; left
; bvec
++, base
= 0) {
518 size_t copy
= min(left
, bvec
->bv_len
- base
);
521 memcpy_from_page(kaddr
+ offset
, bvec
->bv_page
,
522 bvec
->bv_offset
+ base
, copy
);
526 kunmap_atomic(kaddr
);
530 static void advance_bvec(struct iov_iter
*i
, size_t bytes
)
532 BUG_ON(i
->count
< bytes
);
534 if (likely(i
->nr_segs
== 1)) {
535 i
->iov_offset
+= bytes
;
538 const struct bio_vec
*bvec
= i
->bvec
;
539 size_t base
= i
->iov_offset
;
540 unsigned long nr_segs
= i
->nr_segs
;
543 * The !iov->iov_len check ensures we skip over unlikely
544 * zero-length segments (without overruning the iovec).
546 while (bytes
|| unlikely(i
->count
&& !bvec
->bv_len
)) {
549 copy
= min(bytes
, bvec
->bv_len
- base
);
550 BUG_ON(!i
->count
|| i
->count
< copy
);
554 if (bvec
->bv_len
== base
) {
561 i
->iov_offset
= base
;
562 i
->nr_segs
= nr_segs
;
566 static unsigned long alignment_bvec(const struct iov_iter
*i
)
568 const struct bio_vec
*bvec
= i
->bvec
;
570 size_t size
= i
->count
;
576 res
= bvec
->bv_offset
+ i
->iov_offset
;
577 n
= bvec
->bv_len
- i
->iov_offset
;
582 while (size
> (++bvec
)->bv_len
) {
583 res
|= bvec
->bv_offset
| bvec
->bv_len
;
584 size
-= bvec
->bv_len
;
586 res
|= bvec
->bv_offset
| size
;
590 static ssize_t
get_pages_bvec(struct iov_iter
*i
,
591 struct page
**pages
, size_t maxsize
,
594 const struct bio_vec
*bvec
= i
->bvec
;
595 size_t len
= bvec
->bv_len
- i
->iov_offset
;
600 *start
= bvec
->bv_offset
+ i
->iov_offset
;
602 get_page(*pages
= bvec
->bv_page
);
607 static ssize_t
get_pages_alloc_bvec(struct iov_iter
*i
,
608 struct page
***pages
, size_t maxsize
,
611 const struct bio_vec
*bvec
= i
->bvec
;
612 size_t len
= bvec
->bv_len
- i
->iov_offset
;
617 *start
= bvec
->bv_offset
+ i
->iov_offset
;
619 *pages
= kmalloc(sizeof(struct page
*), GFP_KERNEL
);
623 get_page(**pages
= bvec
->bv_page
);
628 static int iov_iter_npages_bvec(const struct iov_iter
*i
, int maxpages
)
630 size_t offset
= i
->iov_offset
;
631 size_t size
= i
->count
;
632 const struct bio_vec
*bvec
= i
->bvec
;
636 for (n
= 0; size
&& n
< i
->nr_segs
; n
++, bvec
++) {
637 size_t len
= bvec
->bv_len
- offset
;
639 if (unlikely(!len
)) /* empty segment */
644 if (npages
>= maxpages
) /* don't bother going further */
649 return min(npages
, maxpages
);
652 size_t copy_page_to_iter(struct page
*page
, size_t offset
, size_t bytes
,
655 if (i
->type
& ITER_BVEC
)
656 return copy_page_to_iter_bvec(page
, offset
, bytes
, i
);
658 return copy_page_to_iter_iovec(page
, offset
, bytes
, i
);
660 EXPORT_SYMBOL(copy_page_to_iter
);
662 size_t copy_page_from_iter(struct page
*page
, size_t offset
, size_t bytes
,
665 if (i
->type
& ITER_BVEC
)
666 return copy_page_from_iter_bvec(page
, offset
, bytes
, i
);
668 return copy_page_from_iter_iovec(page
, offset
, bytes
, i
);
670 EXPORT_SYMBOL(copy_page_from_iter
);
672 size_t iov_iter_copy_from_user_atomic(struct page
*page
,
673 struct iov_iter
*i
, unsigned long offset
, size_t bytes
)
675 if (i
->type
& ITER_BVEC
)
676 return copy_from_user_bvec(page
, i
, offset
, bytes
);
678 return copy_from_user_atomic_iovec(page
, i
, offset
, bytes
);
680 EXPORT_SYMBOL(iov_iter_copy_from_user_atomic
);
682 void iov_iter_advance(struct iov_iter
*i
, size_t size
)
684 if (i
->type
& ITER_BVEC
)
685 advance_bvec(i
, size
);
687 advance_iovec(i
, size
);
689 EXPORT_SYMBOL(iov_iter_advance
);
692 * Return the count of just the current iov_iter segment.
694 size_t iov_iter_single_seg_count(const struct iov_iter
*i
)
698 else if (i
->type
& ITER_BVEC
)
699 return min(i
->count
, i
->iov
->iov_len
- i
->iov_offset
);
701 return min(i
->count
, i
->bvec
->bv_len
- i
->iov_offset
);
703 EXPORT_SYMBOL(iov_iter_single_seg_count
);
705 unsigned long iov_iter_alignment(const struct iov_iter
*i
)
707 if (i
->type
& ITER_BVEC
)
708 return alignment_bvec(i
);
710 return alignment_iovec(i
);
712 EXPORT_SYMBOL(iov_iter_alignment
);
714 ssize_t
iov_iter_get_pages(struct iov_iter
*i
,
715 struct page
**pages
, size_t maxsize
,
718 if (i
->type
& ITER_BVEC
)
719 return get_pages_bvec(i
, pages
, maxsize
, start
);
721 return get_pages_iovec(i
, pages
, maxsize
, start
);
723 EXPORT_SYMBOL(iov_iter_get_pages
);
725 ssize_t
iov_iter_get_pages_alloc(struct iov_iter
*i
,
726 struct page
***pages
, size_t maxsize
,
729 if (i
->type
& ITER_BVEC
)
730 return get_pages_alloc_bvec(i
, pages
, maxsize
, start
);
732 return get_pages_alloc_iovec(i
, pages
, maxsize
, start
);
734 EXPORT_SYMBOL(iov_iter_get_pages_alloc
);
736 int iov_iter_npages(const struct iov_iter
*i
, int maxpages
)
738 if (i
->type
& ITER_BVEC
)
739 return iov_iter_npages_bvec(i
, maxpages
);
741 return iov_iter_npages_iovec(i
, maxpages
);
743 EXPORT_SYMBOL(iov_iter_npages
);