Commit b2a54b9581
Changed files (1)
lib
std
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" {