[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