
hulk inclusion category: feature bugzilla: https://gitee.com/openeuler/kernel/issues/ICLL1L -------------------------------- Add copy_mc_page_to_kvec_iter for ITER_KVEC to support machine safe. Signed-off-by: Wupeng Ma <mawupeng1@huawei.com> --- include/linux/uio.h | 2 ++ lib/iov_iter.c | 18 ++++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/include/linux/uio.h b/include/linux/uio.h index cedb68e49e4f..1bf0a426ef02 100644 --- a/include/linux/uio.h +++ b/include/linux/uio.h @@ -141,6 +141,8 @@ size_t _copy_from_iter(void *addr, size_t bytes, struct iov_iter *i); bool _copy_from_iter_full(void *addr, size_t bytes, struct iov_iter *i); size_t _copy_from_iter_nocache(void *addr, size_t bytes, struct iov_iter *i); bool _copy_from_iter_full_nocache(void *addr, size_t bytes, struct iov_iter *i); +size_t copy_mc_page_to_kvec_iter(struct page *page, size_t offset, size_t bytes, + struct iov_iter *i); static __always_inline __must_check size_t copy_to_iter(const void *addr, size_t bytes, struct iov_iter *i) diff --git a/lib/iov_iter.c b/lib/iov_iter.c index ce8c225237f5..15b373f2e508 100644 --- a/lib/iov_iter.c +++ b/lib/iov_iter.c @@ -908,6 +908,24 @@ static inline bool page_copy_sane(struct page *page, size_t offset, size_t n) return false; } +size_t copy_mc_page_to_kvec_iter(struct page *page, size_t offset, size_t bytes, + struct iov_iter *i) +{ + size_t wanted; + void *kaddr; + + if (unlikely(!page_copy_sane(page, offset, bytes))) + return 0; + + if (!(i->type & ITER_KVEC)) + return 0; + + kaddr = kmap_atomic(page); + wanted = copy_mc_to_iter(kaddr + offset, bytes, i); + kunmap_atomic(kaddr); + return wanted; +} + size_t copy_page_to_iter(struct page *page, size_t offset, size_t bytes, struct iov_iter *i) { -- 2.43.0