diff --git a/lib/std/os/linux/IoUring.zig b/lib/std/os/linux/IoUring.zig index 2e43709075..f26b2ce8bf 100644 --- a/lib/std/os/linux/IoUring.zig +++ b/lib/std/os/linux/IoUring.zig @@ -1186,6 +1186,28 @@ pub fn register_files_update(self: *IoUring, offset: u32, fds: []const posix.fd_ try handle_registration_result(res); } +/// Registers an empty (-1) file table of `nr_files` number of file descriptors. +pub fn register_files_sparse(self: *IoUring, nr_files: u32) !void { + assert(self.fd >= 0); + + const reg = &linux.io_uring_rsrc_register{ + .nr = nr_files, + .flags = linux.IORING_RSRC_REGISTER_SPARSE, + .resv2 = 0, + .data = 0, + .tags = 0, + }; + + const res = linux.io_uring_register( + self.fd, + .REGISTER_FILES2, + @ptrCast(reg), + @as(u32, @sizeOf(linux.io_uring_rsrc_register)), + ); + + return handle_registration_result(res); +} + /// Registers the file descriptor for an eventfd that will be notified of completion events on /// an io_uring instance. /// Only a single a eventfd can be registered at any given point in time. diff --git a/lib/std/os/linux/io_uring_sqe.zig b/lib/std/os/linux/io_uring_sqe.zig index 71be7a1f99..19dae3e8fa 100644 --- a/lib/std/os/linux/io_uring_sqe.zig +++ b/lib/std/os/linux/io_uring_sqe.zig @@ -436,6 +436,15 @@ pub const io_uring_sqe = extern struct { sqe.rw_flags = flags; } + pub fn prep_cancel_fd( + sqe: *linux.io_uring_sqe, + fd: linux.fd_t, + flags: u32, + ) void { + sqe.prep_rw(.ASYNC_CANCEL, fd, 0, 0, 0); + sqe.rw_flags = flags | linux.IORING_ASYNC_CANCEL_FD; + } + pub fn prep_shutdown( sqe: *linux.io_uring_sqe, sockfd: linux.socket_t, @@ -516,6 +525,21 @@ pub const io_uring_sqe = extern struct { sqe.rw_flags = flags; } + pub fn prep_files_update( + sqe: *linux.io_uring_sqe, + fds: []const linux.fd_t, + offset: u32, + ) void { + sqe.prep_rw(.FILES_UPDATE, -1, @intFromPtr(fds.ptr), fds.len, @intCast(offset)); + } + + pub fn prep_files_update_alloc( + sqe: *linux.io_uring_sqe, + fds: []linux.fd_t, + ) void { + sqe.prep_rw(.FILES_UPDATE, -1, @intFromPtr(fds.ptr), fds.len, linux.IORING_FILE_INDEX_ALLOC); + } + pub fn prep_provide_buffers( sqe: *linux.io_uring_sqe, buffers: [*]u8,