From ef6a9a624df0a00687037474025a3608472f722a Mon Sep 17 00:00:00 2001 From: Santiago Gimeno Date: Fri, 19 May 2023 11:03:17 +0200 Subject: [PATCH] linux: fix WRITEV with lots of bufs using io_uring (#4004) In the case of trying to write more than `IOV_MAX` buffers, the `IORING_OP_WRITEV` operation will return `EINVAL`. As a temporal fix, fallback to the old ways. In the future we might implement this by linking multiple `IORING_OP_WRITEV` requests using `IOSQE_IO_LINK`. --- src/unix/linux.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/unix/linux.c b/src/unix/linux.c index e7e7a111..a3439184 100644 --- a/src/unix/linux.c +++ b/src/unix/linux.c @@ -782,6 +782,11 @@ int uv__iou_fs_read_or_write(uv_loop_t* loop, struct uv__io_uring_sqe* sqe; struct uv__iou* iou; + /* For the moment, if iovcnt is greater than IOV_MAX, fallback to the + * threadpool. In the future we might take advantage of IOSQE_IO_LINK. */ + if (req->nbufs > IOV_MAX) + return 0; + iou = &uv__get_internal_fields(loop)->iou; sqe = uv__iou_get_sqe(iou, loop, req);