diff --git a/lib/std/io_uring.zig b/lib/std/io_uring.zig index e1db6d141ceeb54d0e13c67650a8c5d440105f1e..099b368abd4d0c65246028cc304d4d4838aaf06d 100644 --- a/lib/std/io_uring.zig +++ b/lib/std/io_uring.zig @@ -741,9 +741,22 @@ test "queue_readv" { const fd = try os.openZ("/dev/zero", os.O_RDONLY | os.O_CLOEXEC, 0); defer os.close(fd); + // Linux Kernel 5.4 supports IORING_REGISTER_FILES but not sparse fd sets (i.e. an fd of -1). + // Linux Kernel 5.5 adds support for sparse fd sets. + // Compare: + // https://github.com/torvalds/linux/blob/v5.4/fs/io_uring.c#L3119-L3124 vs + // https://github.com/torvalds/linux/blob/v5.8/fs/io_uring.c#L6687-L6691 + // We therefore avoid stressing sparse fd sets here: + var registered_fds = [_]i32{0} ** 1; + const fd_index = 0; + registered_fds[fd_index] = fd; + try ring.register_files(registered_fds[0..]); + var buffer = [_]u8{42} ** 128; var iovecs = [_]os.iovec{ os.iovec { .iov_base = &buffer, .iov_len = buffer.len } }; - var sqe = try ring.queue_readv(0xcccccccc, fd, iovecs[0..], 0); + var sqe = try ring.queue_readv(0xcccccccc, fd_index, iovecs[0..], 0); + ring.use_registered_fd(sqe); + testing.expectEqual(@as(u8, linux.IOSQE_FIXED_FILE), sqe.flags); testing.expectError(error.IO_UringSubmissionQueueFull, ring.queue_nop(0)); testing.expectEqual(@as(u32, 1), try ring.submit()); @@ -753,6 +766,8 @@ test "queue_readv" { .flags = 0, }, try ring.copy_cqe()); testing.expectEqualSlices(u8, &([_]u8{0} ** buffer.len), buffer[0..]); + + try ring.unregister_files(); } test "queue_writev/queue_fsync" {