diff options
Diffstat (limited to 'include/linux/uio.h')
-rw-r--r-- | include/linux/uio.h | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/include/linux/uio.h b/include/linux/uio.h index 243e2362fe1a..342d2dc225b9 100644 --- a/include/linux/uio.h +++ b/include/linux/uio.h @@ -144,6 +144,27 @@ bool copy_from_iter_full_nocache(void *addr, size_t bytes, struct iov_iter *i) return _copy_from_iter_full_nocache(addr, bytes, i); } +#ifdef CONFIG_ARCH_HAS_UACCESS_FLUSHCACHE +/* + * Note, users like pmem that depend on the stricter semantics of + * copy_from_iter_flushcache() than copy_from_iter_nocache() must check for + * IS_ENABLED(CONFIG_ARCH_HAS_UACCESS_FLUSHCACHE) before assuming that the + * destination is flushed from the cache on return. + */ +size_t _copy_from_iter_flushcache(void *addr, size_t bytes, struct iov_iter *i); +#else +#define _copy_from_iter_flushcache _copy_from_iter_nocache +#endif + +static __always_inline __must_check +size_t copy_from_iter_flushcache(void *addr, size_t bytes, struct iov_iter *i) +{ + if (unlikely(!check_copy_size(addr, bytes, false))) + return bytes; + else + return _copy_from_iter_flushcache(addr, bytes, i); +} + size_t iov_iter_zero(size_t bytes, struct iov_iter *); unsigned long iov_iter_alignment(const struct iov_iter *i); unsigned long iov_iter_gap_alignment(const struct iov_iter *i); |