[PATCH 2/3] Workaround for short read from io_uring on aarch64

Valerie Aurora <[email protected]> Tue, 24 Feb 2026 17:33:25 +0100
Newsgroups dev.linux.lists.rpdfs-devel
Message-ID <[email protected]>
For some reason, io_uring returns a short read even with MSG_WAITALL -
but on aarch64 and not x86_64. Work around that with an outer loop
---
 utask/net.c | 14 +++++++++++---
 1 file changed, 11 insertions(+), 3 deletions(-)

diff --git a/utask/net.c b/utask/net.c
index 7f21e4c..35919fd 100644
--- a/utask/net.c
+++ b/utask/net.c
@@ -265,11 +265,19 @@ static ssize_t recv_waiter(int fd, void *buf, size_t size, int flags)
 {
 	struct utask_cqe_waiter waiter;
 	struct io_uring_sqe *sqe;
+	size_t len = 0;
 	int ret;
 
-	sqe = utask_get_sqe_waiter(&waiter);
-	io_uring_prep_recv(sqe, fd, buf, size, flags | MSG_WAITALL);
-	ret = utask_wait_event_task(waiter.completed);
+	/* TODO: Figure out why io_uring returns a short read on aarch64 */
+	while (len < size) {
+		sqe = utask_get_sqe_waiter(&waiter);
+		io_uring_prep_recv(sqe, fd, buf + len, size - len, flags | MSG_WAITALL);
+		ret = utask_wait_event_task(waiter.completed);
+
+		if (waiter.res < 0)
+			break;
+		len += waiter.res;
+	}
 
 	/* == 0 when fd is shutdown/disconnected */
 	BUG_ON(ret == 0 && waiter.res > 0 && waiter.res != size);
-- 
2.49.0