[PATCH 06/29] iov_iter: Split copy_mc_to_iter()

From: David Howells
Date: Sat Nov 21 2020 - 09:14:24 EST


Split copy_mc_to_iter() by type.

Signed-off-by: David Howells <dhowells@xxxxxxxxxx>
---

lib/iov_iter.c | 54 +++++++++++++++++++++++++++++++++---------------------
1 file changed, 33 insertions(+), 21 deletions(-)

diff --git a/lib/iov_iter.c b/lib/iov_iter.c
index 0865e0b6eee9..7c1d92f7d020 100644
--- a/lib/iov_iter.c
+++ b/lib/iov_iter.c
@@ -758,7 +758,7 @@ static unsigned long copy_mc_to_page(struct page *page, size_t offset,
return ret;
}

-static size_t copy_mc_pipe_to_iter(const void *addr, size_t bytes,
+static size_t pipe_copy_mc_to_iter(const void *addr, size_t bytes,
struct iov_iter *i)
{
struct pipe_inode_info *pipe = i->pipe;
@@ -815,18 +815,23 @@ static size_t copy_mc_pipe_to_iter(const void *addr, size_t bytes,
* Compare to copy_to_iter() where only ITER_IOVEC attempts might return
* a short copy.
*/
-static size_t xxx_copy_mc_to_iter(const void *addr, size_t bytes, struct iov_iter *i)
+static size_t iovec_copy_mc_to_iter(const void *addr, size_t bytes, struct iov_iter *i)
{
const char *from = addr;
- unsigned long rem, curr_addr, s_addr = (unsigned long) addr;

- if (unlikely(iov_iter_is_pipe(i)))
- return copy_mc_pipe_to_iter(addr, bytes, i);
- if (iter_is_iovec(i))
- might_fault();
- iterate_and_advance(i, bytes, v,
+ might_fault();
+ iterate_and_advance_iovec(i, bytes, v,
copyout_mc(v.iov_base, (from += v.iov_len) - v.iov_len,
- v.iov_len),
+ v.iov_len));
+ return bytes;
+}
+
+static size_t bvec_copy_mc_to_iter(const void *addr, size_t bytes, struct iov_iter *i)
+{
+ const char *from = addr;
+ unsigned long rem, curr_addr, s_addr = (unsigned long) addr;
+
+ iterate_and_advance_bvec(i, bytes, v,
({
rem = copy_mc_to_page(v.bv_page, v.bv_offset,
(from += v.bv_len) - v.bv_len, v.bv_len);
@@ -835,18 +840,25 @@ static size_t xxx_copy_mc_to_iter(const void *addr, size_t bytes, struct iov_ite
bytes = curr_addr - s_addr - rem;
return bytes;
}
- }),
- ({
- rem = copy_mc_to_kernel(v.iov_base, (from += v.iov_len)
- - v.iov_len, v.iov_len);
+ }))
+ return bytes;
+}
+
+static size_t kvec_copy_mc_to_iter(const void *addr, size_t bytes, struct iov_iter *i)
+{
+ const char *from = addr;
+ unsigned long rem, curr_addr, s_addr = (unsigned long) addr;
+
+ iterate_and_advance_kvec(i, bytes, v, ({
+ rem = copy_mc_to_kernel(v.iov_base,
+ (from += v.iov_len) - v.iov_len,
+ v.iov_len);
if (rem) {
curr_addr = (unsigned long) from;
bytes = curr_addr - s_addr - rem;
return bytes;
}
- })
- )
-
+ }));
return bytes;
}
#endif /* CONFIG_ARCH_HAS_COPY_MC */
@@ -1939,7 +1951,7 @@ static const struct iov_iter_ops iovec_iter_ops = {
.copy_from_iter_flushcache = xxx_copy_from_iter_flushcache,
#endif
#ifdef CONFIG_ARCH_HAS_COPY_MC
- .copy_mc_to_iter = xxx_copy_mc_to_iter,
+ .copy_mc_to_iter = iovec_copy_mc_to_iter,
#endif
.csum_and_copy_to_iter = xxx_csum_and_copy_to_iter,
.csum_and_copy_from_iter = xxx_csum_and_copy_from_iter,
@@ -1973,7 +1985,7 @@ static const struct iov_iter_ops kvec_iter_ops = {
.copy_from_iter_flushcache = xxx_copy_from_iter_flushcache,
#endif
#ifdef CONFIG_ARCH_HAS_COPY_MC
- .copy_mc_to_iter = xxx_copy_mc_to_iter,
+ .copy_mc_to_iter = kvec_copy_mc_to_iter,
#endif
.csum_and_copy_to_iter = xxx_csum_and_copy_to_iter,
.csum_and_copy_from_iter = xxx_csum_and_copy_from_iter,
@@ -2007,7 +2019,7 @@ static const struct iov_iter_ops bvec_iter_ops = {
.copy_from_iter_flushcache = xxx_copy_from_iter_flushcache,
#endif
#ifdef CONFIG_ARCH_HAS_COPY_MC
- .copy_mc_to_iter = xxx_copy_mc_to_iter,
+ .copy_mc_to_iter = bvec_copy_mc_to_iter,
#endif
.csum_and_copy_to_iter = xxx_csum_and_copy_to_iter,
.csum_and_copy_from_iter = xxx_csum_and_copy_from_iter,
@@ -2041,7 +2053,7 @@ static const struct iov_iter_ops pipe_iter_ops = {
.copy_from_iter_flushcache = xxx_copy_from_iter_flushcache,
#endif
#ifdef CONFIG_ARCH_HAS_COPY_MC
- .copy_mc_to_iter = xxx_copy_mc_to_iter,
+ .copy_mc_to_iter = pipe_copy_mc_to_iter,
#endif
.csum_and_copy_to_iter = xxx_csum_and_copy_to_iter,
.csum_and_copy_from_iter = xxx_csum_and_copy_from_iter,
@@ -2075,7 +2087,7 @@ static const struct iov_iter_ops discard_iter_ops = {
.copy_from_iter_flushcache = xxx_copy_from_iter_flushcache,
#endif
#ifdef CONFIG_ARCH_HAS_COPY_MC
- .copy_mc_to_iter = xxx_copy_mc_to_iter,
+ .copy_mc_to_iter = discard_copy_to_iter,
#endif
.csum_and_copy_to_iter = xxx_csum_and_copy_to_iter,
.csum_and_copy_from_iter = xxx_csum_and_copy_from_iter,