authorgravatar for joran@ronomon.comJoran Dirk Greef <joran@ronomon.com> 2020-09-19 15:07:10+02:00
committergravatar for joran@ronomon.comJoran Dirk Greef <joran@ronomon.com> 2020-09-19 15:07:10+02:00
logb2a54b95814eeeb657ca953cb0547e3169893d2d
treeb4c481f533d8d035a1bb13606cd313b9cbfdba07
parent5df0d284d05c5aeb4b721d124b55f40031d93f88

Test IORING_REGISTER_FILES but avoid sparse fd sets


1 files changed, 16 insertions(+), 1 deletions(-)

lib/std/io_uring.zig+16-1
......@@ -741,9 +741,22 @@ test "queue_readv" {
741741 const fd = try os.openZ("/dev/zero", os.O_RDONLY | os.O_CLOEXEC, 0);
742742 defer os.close(fd);
743743
744 // Linux Kernel 5.4 supports IORING_REGISTER_FILES but not sparse fd sets (i.e. an fd of -1).
745 // Linux Kernel 5.5 adds support for sparse fd sets.
746 // Compare:
747 // https://github.com/torvalds/linux/blob/v5.4/fs/io_uring.c#L3119-L3124 vs
748 // https://github.com/torvalds/linux/blob/v5.8/fs/io_uring.c#L6687-L6691
749 // We therefore avoid stressing sparse fd sets here:
750 var registered_fds = [_]i32{0} ** 1;
751 const fd_index = 0;
752 registered_fds[fd_index] = fd;
753 try ring.register_files(registered_fds[0..]);
754
744755 var buffer = [_]u8{42} ** 128;
745756 var iovecs = [_]os.iovec{ os.iovec { .iov_base = &buffer, .iov_len = buffer.len } };
746 var sqe = try ring.queue_readv(0xcccccccc, fd, iovecs[0..], 0);
757 var sqe = try ring.queue_readv(0xcccccccc, fd_index, iovecs[0..], 0);
758 ring.use_registered_fd(sqe);
759 testing.expectEqual(@as(u8, linux.IOSQE_FIXED_FILE), sqe.flags);
747760
748761 testing.expectError(error.IO_UringSubmissionQueueFull, ring.queue_nop(0));
749762 testing.expectEqual(@as(u32, 1), try ring.submit());
......@@ -753,6 +766,8 @@ test "queue_readv" {
753766 .flags = 0,
754767 }, try ring.copy_cqe());
755768 testing.expectEqualSlices(u8, &([_]u8{0} ** buffer.len), buffer[0..]);
769
770 try ring.unregister_files();
756771}
757772
758773test "queue_writev/queue_fsync" {