| ... | @@ -741,9 +741,22 @@ test "queue_readv" { | ... | @@ -741,9 +741,22 @@ test "queue_readv" { |
| 741 | const fd = try os.openZ("/dev/zero", os.O_RDONLY | os.O_CLOEXEC, 0); | 741 | const fd = try os.openZ("/dev/zero", os.O_RDONLY | os.O_CLOEXEC, 0); |
| 742 | defer os.close(fd); | 742 | defer os.close(fd); |
| 743 | | 743 | |
| | 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 | |
| 744 | var buffer = [_]u8{42} ** 128; | 755 | var buffer = [_]u8{42} ** 128; |
| 745 | var iovecs = [_]os.iovec{ os.iovec { .iov_base = &buffer, .iov_len = buffer.len } }; | 756 | 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); |
| 747 | | 760 | |
| 748 | testing.expectError(error.IO_UringSubmissionQueueFull, ring.queue_nop(0)); | 761 | testing.expectError(error.IO_UringSubmissionQueueFull, ring.queue_nop(0)); |
| 749 | testing.expectEqual(@as(u32, 1), try ring.submit()); | 762 | testing.expectEqual(@as(u32, 1), try ring.submit()); |
| ... | @@ -753,6 +766,8 @@ test "queue_readv" { | ... | @@ -753,6 +766,8 @@ test "queue_readv" { |
| 753 | .flags = 0, | 766 | .flags = 0, |
| 754 | }, try ring.copy_cqe()); | 767 | }, try ring.copy_cqe()); |
| 755 | testing.expectEqualSlices(u8, &([_]u8{0} ** buffer.len), buffer[0..]); | 768 | testing.expectEqualSlices(u8, &([_]u8{0} ** buffer.len), buffer[0..]); |
| | 769 | |
| | 770 | try ring.unregister_files(); |
| 756 | } | 771 | } |
| 757 | | 772 | |
| 758 | test "queue_writev/queue_fsync" { | 773 | test "queue_writev/queue_fsync" { |