Thread (23 messages) 23 messages, 6 authors, 2023-09-23

Re: [PATCH v5 05/11] iov_iter: Convert iterate*() to inline funcs

From: Simon Horman <horms@kernel.org>
Date: 2023-09-22 09:33:14
Also in: linux-block, linux-fsdevel, linux-mm, lkml

On Wed, Sep 20, 2023 at 11:22:25PM +0100, David Howells wrote:

...
quoted hunk ↗ jump to hunk
@@ -312,23 +192,29 @@ size_t _copy_to_iter(const void *addr, size_t bytes, struct iov_iter *i)
 		return 0;
 	if (user_backed_iter(i))
 		might_fault();
-	iterate_and_advance(i, bytes, base, len, off,
-		copyout(base, addr + off, len),
-		memcpy(base, addr + off, len)
-	)
-
-	return bytes;
+	return iterate_and_advance(i, bytes, (void *)addr,
+				   copy_to_user_iter, memcpy_to_iter);
 }
 EXPORT_SYMBOL(_copy_to_iter);
 
 #ifdef CONFIG_ARCH_HAS_COPY_MC
-static int copyout_mc(void __user *to, const void *from, size_t n)
-{
-	if (access_ok(to, n)) {
-		instrument_copy_to_user(to, from, n);
-		n = copy_mc_to_user((__force void *) to, from, n);
+static __always_inline
+size_t copy_to_user_iter_mc(void __user *iter_to, size_t progress,
+			    size_t len, void *from, void *priv2)
+{
+	if (access_ok(iter_to, len)) {
+		from += progress;
+		instrument_copy_to_user(iter_to, from, len);
+		len = copy_mc_to_user(iter_to, from, len);
Hi David,

Sparse complains a bit about the line above, perhaps the '(__force void *)'
should be retained from the old code?

 lib/iov_iter.c:208:39: warning: incorrect type in argument 1 (different address spaces)
 lib/iov_iter.c:208:39:    expected void *to
 lib/iov_iter.c:208:39:    got void [noderef] __user *iter_to
 	}
-	return n;
+	return len;
+}
+
+static __always_inline
+size_t memcpy_to_iter_mc(void *iter_to, size_t progress,
+			 size_t len, void *from, void *priv2)
+{
+	return copy_mc_to_kernel(iter_to, from + progress, len);
 }
 
 /**
...
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help