Commit b2a54b9581

Joran Dirk Greef <joran@ronomon.com>
2020-09-19 15:07:10
Test IORING_REGISTER_FILES but avoid sparse fd sets
1 parent 5df0d28
Changed files (1)
lib
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" {