mirror of
https://codeberg.org/ziglang/zig.git
synced 2025-12-08 06:44:27 +00:00
IoUring: fix and remove TODOs
backout from updating `pipe2` syscall to use Pipe2 flags Review if useful to implement - openat2*, f/madvice64 Signed-off-by: Bernard Assan <mega.alpha100@gmail.com>
This commit is contained in:
parent
9f6d4ae1dc
commit
6124e1431e
2 changed files with 9 additions and 70 deletions
|
|
@ -1332,7 +1332,7 @@ pub fn pipe(fd: *[2]i32) usize {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn pipe2(fd: *[2]i32, flags: Pipe2) usize {
|
pub fn pipe2(fd: *[2]i32, flags: O) usize {
|
||||||
return syscall2(.pipe2, @intFromPtr(fd), @as(u32, @bitCast(flags)));
|
return syscall2(.pipe2, @intFromPtr(fd), @as(u32, @bitCast(flags)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -3747,7 +3747,6 @@ pub const Futex2 = struct {
|
||||||
};
|
};
|
||||||
|
|
||||||
/// flags for `futex2_wait` syscall
|
/// flags for `futex2_wait` syscall
|
||||||
// COMMIT: add mpol and fix private field as its 128 not 32
|
|
||||||
pub const Wait = packed struct(u32) {
|
pub const Wait = packed struct(u32) {
|
||||||
size: Size,
|
size: Size,
|
||||||
numa: bool = false,
|
numa: bool = false,
|
||||||
|
|
@ -4467,7 +4466,6 @@ pub const Af = enum(u16) {
|
||||||
pub const MAX: u16 = @intFromEnum(Af.max);
|
pub const MAX: u16 = @intFromEnum(Af.max);
|
||||||
};
|
};
|
||||||
|
|
||||||
// COMMIT: add new Typed So enum
|
|
||||||
/// SO_* type
|
/// SO_* type
|
||||||
pub const So = if (is_mips) enum(u16) {
|
pub const So = if (is_mips) enum(u16) {
|
||||||
debug = 1,
|
debug = 1,
|
||||||
|
|
@ -4759,7 +4757,6 @@ pub const So = if (is_mips) enum(u16) {
|
||||||
pub const detach_bpf: So = .detach_filter;
|
pub const detach_bpf: So = .detach_filter;
|
||||||
};
|
};
|
||||||
|
|
||||||
// COMMIT: add SO constants
|
|
||||||
/// Backwards-compatible SO_* constants
|
/// Backwards-compatible SO_* constants
|
||||||
pub const SO = struct {
|
pub const SO = struct {
|
||||||
pub const DEBUG: u16 = @intFromEnum(So.debug);
|
pub const DEBUG: u16 = @intFromEnum(So.debug);
|
||||||
|
|
@ -5409,7 +5406,6 @@ pub const Msg = packed struct(u32) {
|
||||||
/// sendpage() internal: page may carry plain text and require encryption
|
/// sendpage() internal: page may carry plain text and require encryption
|
||||||
sendpage_decrypted: bool = false,
|
sendpage_decrypted: bool = false,
|
||||||
_22: u4 = 0,
|
_22: u4 = 0,
|
||||||
// COMMIT: new flags
|
|
||||||
/// Receive devmem skbs as cmsg
|
/// Receive devmem skbs as cmsg
|
||||||
sock_devmem: bool = false,
|
sock_devmem: bool = false,
|
||||||
/// Use user data in kernel path
|
/// Use user data in kernel path
|
||||||
|
|
@ -6025,7 +6021,6 @@ pub const Epoll = if (is_mips) packed struct(u32) {
|
||||||
rdnorm: bool = false,
|
rdnorm: bool = false,
|
||||||
/// Priority data may be read
|
/// Priority data may be read
|
||||||
rdband: bool = false,
|
rdband: bool = false,
|
||||||
// COMMIT: new flags
|
|
||||||
/// Writing is now possible (normal data)
|
/// Writing is now possible (normal data)
|
||||||
wrnorm: bool = false,
|
wrnorm: bool = false,
|
||||||
/// Priority data may be written
|
/// Priority data may be written
|
||||||
|
|
@ -7008,7 +7003,6 @@ pub const utsname = extern struct {
|
||||||
};
|
};
|
||||||
pub const HOST_NAME_MAX = 64;
|
pub const HOST_NAME_MAX = 64;
|
||||||
|
|
||||||
// COMMIT: RenameFlags
|
|
||||||
pub const Rename = packed struct(u32) {
|
pub const Rename = packed struct(u32) {
|
||||||
/// Don't overwrite target
|
/// Don't overwrite target
|
||||||
noreplace: bool = false,
|
noreplace: bool = false,
|
||||||
|
|
@ -7099,7 +7093,6 @@ pub const Statx = extern struct {
|
||||||
|
|
||||||
__pad2: [14]u64,
|
__pad2: [14]u64,
|
||||||
|
|
||||||
// COMMIT: add new StatxMask fields
|
|
||||||
// https://github.com/torvalds/linux/blob/755fa5b4fb36627796af19932a432d343220ec63/include/uapi/linux/stat.h#L203
|
// https://github.com/torvalds/linux/blob/755fa5b4fb36627796af19932a432d343220ec63/include/uapi/linux/stat.h#L203
|
||||||
/// matches STATX_* in kernel
|
/// matches STATX_* in kernel
|
||||||
pub const Mask = packed struct(u32) {
|
pub const Mask = packed struct(u32) {
|
||||||
|
|
@ -7157,7 +7150,6 @@ pub const Statx = extern struct {
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
// COMMIT: Statx as Packed Struct
|
|
||||||
// https://github.com/torvalds/linux/blob/755fa5b4fb36627796af19932a432d343220ec63/include/uapi/linux/stat.h#L248
|
// https://github.com/torvalds/linux/blob/755fa5b4fb36627796af19932a432d343220ec63/include/uapi/linux/stat.h#L248
|
||||||
/// matches STATX_ATTR_* in kernel
|
/// matches STATX_ATTR_* in kernel
|
||||||
pub const Attr = packed struct(u64) {
|
pub const Attr = packed struct(u64) {
|
||||||
|
|
@ -8575,7 +8567,6 @@ pub const rlimit = extern struct {
|
||||||
/// DEPRECATED alias for Madvise
|
/// DEPRECATED alias for Madvise
|
||||||
pub const MADV = Madvise;
|
pub const MADV = Madvise;
|
||||||
|
|
||||||
// COMMIT: update MADV_* flags and type as enum
|
|
||||||
/// advice flags for `madvise`
|
/// advice flags for `madvise`
|
||||||
/// matches MADV_* in kernel
|
/// matches MADV_* in kernel
|
||||||
pub const Madvise = enum(u32) {
|
pub const Madvise = enum(u32) {
|
||||||
|
|
|
||||||
|
|
@ -927,12 +927,9 @@ pub fn bind(
|
||||||
fd: linux.fd_t,
|
fd: linux.fd_t,
|
||||||
addr: *const linux.sockaddr,
|
addr: *const linux.sockaddr,
|
||||||
addrlen: linux.socklen_t,
|
addrlen: linux.socklen_t,
|
||||||
// liburing doesn't have this flag, hence 0 should be passed
|
|
||||||
// TODO: consider removing this and all flags like this
|
|
||||||
flags: u32,
|
|
||||||
) !*Sqe {
|
) !*Sqe {
|
||||||
const sqe = try self.get_sqe();
|
const sqe = try self.get_sqe();
|
||||||
sqe.prep_bind(fd, addr, addrlen, flags);
|
sqe.prep_bind(fd, addr, addrlen);
|
||||||
sqe.user_data = user_data;
|
sqe.user_data = user_data;
|
||||||
return sqe;
|
return sqe;
|
||||||
}
|
}
|
||||||
|
|
@ -945,12 +942,9 @@ pub fn listen(
|
||||||
user_data: u64,
|
user_data: u64,
|
||||||
fd: linux.fd_t,
|
fd: linux.fd_t,
|
||||||
backlog: u32,
|
backlog: u32,
|
||||||
// liburing doesn't have this flag, hence 0 should be passed
|
|
||||||
// TODO: consider removing this and all flags like this
|
|
||||||
flags: u32,
|
|
||||||
) !*Sqe {
|
) !*Sqe {
|
||||||
const sqe = try self.get_sqe();
|
const sqe = try self.get_sqe();
|
||||||
sqe.prep_listen(fd, backlog, flags);
|
sqe.prep_listen(fd, backlog);
|
||||||
sqe.user_data = user_data;
|
sqe.user_data = user_data;
|
||||||
return sqe;
|
return sqe;
|
||||||
}
|
}
|
||||||
|
|
@ -1031,7 +1025,6 @@ pub fn openat(
|
||||||
sqe.user_data = user_data;
|
sqe.user_data = user_data;
|
||||||
return sqe;
|
return sqe;
|
||||||
}
|
}
|
||||||
// COMMIT: ignore openat2* for now
|
|
||||||
|
|
||||||
/// Queues an openat using direct (registered) file descriptors.
|
/// Queues an openat using direct (registered) file descriptors.
|
||||||
///
|
///
|
||||||
|
|
@ -1133,7 +1126,6 @@ pub fn statx(
|
||||||
return sqe;
|
return sqe;
|
||||||
}
|
}
|
||||||
|
|
||||||
// COMMIT: don't implement f/madvice64 for now I dought it is used by a lot of people in practice
|
|
||||||
/// Queues (but does not submit) an SQE to perform an `posix_fadvise(2)`.
|
/// Queues (but does not submit) an SQE to perform an `posix_fadvise(2)`.
|
||||||
/// Returns a pointer to the SQE.
|
/// Returns a pointer to the SQE.
|
||||||
pub fn fadvice(
|
pub fn fadvice(
|
||||||
|
|
@ -1350,7 +1342,7 @@ pub fn provide_buffers(
|
||||||
user_data: u64,
|
user_data: u64,
|
||||||
/// an array of `buffers_count` buffers of len `buffer_len` laid out as a
|
/// an array of `buffers_count` buffers of len `buffer_len` laid out as a
|
||||||
/// contiguous slice of memory
|
/// contiguous slice of memory
|
||||||
buffers: [*]u8,
|
buffers: []u8,
|
||||||
/// lenght of each buffer in `buffers`
|
/// lenght of each buffer in `buffers`
|
||||||
buffer_len: u32,
|
buffer_len: u32,
|
||||||
/// count of buffer in `buffers`
|
/// count of buffer in `buffers`
|
||||||
|
|
@ -2101,7 +2093,6 @@ pub fn register_sync_msg(self: *IoUring, sqe: *Sqe) !void {
|
||||||
try handle_registration_result(res);
|
try handle_registration_result(res);
|
||||||
}
|
}
|
||||||
|
|
||||||
// COMMIT: fix register file alloc range taking @sizeOf(FileIndexRange) instead of zero in register syscall
|
|
||||||
/// Registers range for fixed file allocations.
|
/// Registers range for fixed file allocations.
|
||||||
/// Available since 6.0
|
/// Available since 6.0
|
||||||
pub fn register_file_alloc_range(self: *IoUring, offset: u32, len: u32) !void {
|
pub fn register_file_alloc_range(self: *IoUring, offset: u32, len: u32) !void {
|
||||||
|
|
@ -2338,7 +2329,6 @@ pub const Cqe = extern struct {
|
||||||
/// completions with a buffer passed back is automatically returned to
|
/// completions with a buffer passed back is automatically returned to
|
||||||
/// the application.
|
/// the application.
|
||||||
f_buf_more: bool = false,
|
f_buf_more: bool = false,
|
||||||
// COMMIT: new flags
|
|
||||||
/// IORING_CQE_F_SKIP If set, then the application/liburing must ignore
|
/// IORING_CQE_F_SKIP If set, then the application/liburing must ignore
|
||||||
/// this CQE. It's only purpose is to fill a gap in the ring, if a
|
/// this CQE. It's only purpose is to fill a gap in the ring, if a
|
||||||
/// large CQE is attempted posted when the ring has just a single small
|
/// large CQE is attempted posted when the ring has just a single small
|
||||||
|
|
@ -2464,7 +2454,6 @@ pub const Sqe = extern struct {
|
||||||
/// starting buffer ID in cqe.flags as per usual for provided buffer
|
/// starting buffer ID in cqe.flags as per usual for provided buffer
|
||||||
/// usage. The buffers will be contiguous from the starting buffer ID.
|
/// usage. The buffers will be contiguous from the starting buffer ID.
|
||||||
recvsend_bundle: bool = false,
|
recvsend_bundle: bool = false,
|
||||||
// COMMIT: new flags
|
|
||||||
/// IORING_SEND_VECTORIZED
|
/// IORING_SEND_VECTORIZED
|
||||||
/// If set, SEND[_ZC] will take a pointer to a io_vec to allow
|
/// If set, SEND[_ZC] will take a pointer to a io_vec to allow
|
||||||
/// vectorized send operations.
|
/// vectorized send operations.
|
||||||
|
|
@ -2475,7 +2464,6 @@ pub const Sqe = extern struct {
|
||||||
/// accept flags stored in sqe.ioprio
|
/// accept flags stored in sqe.ioprio
|
||||||
pub const Accept = packed struct(u16) {
|
pub const Accept = packed struct(u16) {
|
||||||
multishot: bool = false,
|
multishot: bool = false,
|
||||||
// COMMIT: new Flags
|
|
||||||
dontwait: bool = false,
|
dontwait: bool = false,
|
||||||
poll_first: bool = false,
|
poll_first: bool = false,
|
||||||
_: u13 = 0,
|
_: u13 = 0,
|
||||||
|
|
@ -2773,7 +2761,6 @@ pub const Sqe = extern struct {
|
||||||
sqe.ioprio = .{ .send_recv = .{ .recv_multishot = true } };
|
sqe.ioprio = .{ .send_recv = .{ .recv_multishot = true } };
|
||||||
}
|
}
|
||||||
|
|
||||||
// COMMIT: fix send[|recv] flag param type
|
|
||||||
pub fn prep_send(sqe: *Sqe, sockfd: linux.fd_t, buffer: []const u8, flags: linux.Msg) void {
|
pub fn prep_send(sqe: *Sqe, sockfd: linux.fd_t, buffer: []const u8, flags: linux.Msg) void {
|
||||||
sqe.prep_rw(.send, sockfd, @intFromPtr(buffer.ptr), buffer.len, 0);
|
sqe.prep_rw(.send, sockfd, @intFromPtr(buffer.ptr), buffer.len, 0);
|
||||||
sqe.rw_flags = @bitCast(flags);
|
sqe.rw_flags = @bitCast(flags);
|
||||||
|
|
@ -3296,24 +3283,19 @@ pub const Sqe = extern struct {
|
||||||
sqe.prep_rw(.files_update, -1, @intFromPtr(fds.ptr), fds.len, constants.FILE_INDEX_ALLOC);
|
sqe.prep_rw(.files_update, -1, @intFromPtr(fds.ptr), fds.len, constants.FILE_INDEX_ALLOC);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Note: It is more appropriate to use a `[*]u8` than `[]u8` slice here
|
|
||||||
// because `[]u8` would free us of the extra `buffer_len` parameter but
|
|
||||||
// would require us to alway calculate the `buffer_len` in the function
|
|
||||||
// which is redundant since the `buffer_len` and `buffers_count`
|
|
||||||
// information are alway available for any 2 dimentional array type
|
|
||||||
// .ie [buffers_count][buffer_len]u8
|
|
||||||
pub fn prep_provide_buffers(
|
pub fn prep_provide_buffers(
|
||||||
sqe: *Sqe,
|
sqe: *Sqe,
|
||||||
buffers: [*]u8,
|
buffers: []u8,
|
||||||
buffer_len: u32,
|
buffer_len: u32,
|
||||||
buffers_count: u32,
|
buffers_count: u32,
|
||||||
group_id: u32,
|
group_id: u32,
|
||||||
buffer_id: u32,
|
buffer_id: u32,
|
||||||
) void {
|
) void {
|
||||||
|
assert(buffers.len == buffer_len * buffers_count);
|
||||||
sqe.prep_rw(
|
sqe.prep_rw(
|
||||||
.provide_buffers,
|
.provide_buffers,
|
||||||
@intCast(buffers_count),
|
@intCast(buffers_count),
|
||||||
@intFromPtr(buffers),
|
@intFromPtr(buffers.ptr),
|
||||||
buffer_len,
|
buffer_len,
|
||||||
buffer_id,
|
buffer_id,
|
||||||
);
|
);
|
||||||
|
|
@ -3509,26 +3491,21 @@ pub const Sqe = extern struct {
|
||||||
sqe.set_target_fixed_file(file_index);
|
sqe.set_target_fixed_file(file_index);
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: maybe remove unused flag fields?
|
|
||||||
pub fn prep_bind(
|
pub fn prep_bind(
|
||||||
sqe: *Sqe,
|
sqe: *Sqe,
|
||||||
fd: linux.fd_t,
|
fd: linux.fd_t,
|
||||||
addr: *const linux.sockaddr,
|
addr: *const linux.sockaddr,
|
||||||
addrlen: linux.socklen_t,
|
addrlen: linux.socklen_t,
|
||||||
flags: u32, // flags is unused and does't exist in io_uring's api
|
|
||||||
) void {
|
) void {
|
||||||
sqe.prep_rw(.bind, fd, @intFromPtr(addr), 0, addrlen);
|
sqe.prep_rw(.bind, fd, @intFromPtr(addr), 0, addrlen);
|
||||||
sqe.rw_flags = flags;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn prep_listen(
|
pub fn prep_listen(
|
||||||
sqe: *Sqe,
|
sqe: *Sqe,
|
||||||
fd: linux.fd_t,
|
fd: linux.fd_t,
|
||||||
backlog: u32,
|
backlog: u32,
|
||||||
flags: u32, // flags is unused and does't exist in io_uring's api
|
|
||||||
) void {
|
) void {
|
||||||
sqe.prep_rw(.listen, fd, 0, backlog, 0);
|
sqe.prep_rw(.listen, fd, 0, backlog, 0);
|
||||||
sqe.rw_flags = flags;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn prep_cmd_sock(
|
pub fn prep_cmd_sock(
|
||||||
|
|
@ -3944,10 +3921,6 @@ pub const Params = extern struct {
|
||||||
cq_off: CqOffsets,
|
cq_off: CqOffsets,
|
||||||
};
|
};
|
||||||
|
|
||||||
// COMMIT: remove deprecated io_uring_rsrc_update struct
|
|
||||||
// deprecated, see struct io_uring_rsrc_update
|
|
||||||
|
|
||||||
// COMMIT: add new io_uring_region_desc struct
|
|
||||||
/// matches `io_uring_region_desc` in liburing
|
/// matches `io_uring_region_desc` in liburing
|
||||||
pub const RegionDesc = extern struct {
|
pub const RegionDesc = extern struct {
|
||||||
user_addr: u64,
|
user_addr: u64,
|
||||||
|
|
@ -3957,7 +3930,6 @@ pub const RegionDesc = extern struct {
|
||||||
mmap_offset: u64,
|
mmap_offset: u64,
|
||||||
__resv: [4]u64,
|
__resv: [4]u64,
|
||||||
|
|
||||||
// COMMIT: new constant
|
|
||||||
/// initialise with user provided memory pointed by user_addr
|
/// initialise with user provided memory pointed by user_addr
|
||||||
pub const Flags = packed struct(u32) {
|
pub const Flags = packed struct(u32) {
|
||||||
type_user: bool = false,
|
type_user: bool = false,
|
||||||
|
|
@ -3965,7 +3937,6 @@ pub const RegionDesc = extern struct {
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
// COMMIT: add new io_uring_mem_region_reg struct
|
|
||||||
/// matches `io_uring_mem_region_reg` in liburing
|
/// matches `io_uring_mem_region_reg` in liburing
|
||||||
pub const MemRegionRegister = extern struct {
|
pub const MemRegionRegister = extern struct {
|
||||||
/// struct io_uring_region_desc (RegionDesc in Zig)
|
/// struct io_uring_region_desc (RegionDesc in Zig)
|
||||||
|
|
@ -4049,7 +4020,6 @@ pub const Probe = extern struct {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
// COMMIT: fix defination of io_uring_restriction
|
|
||||||
// RegisterOp is actually u8
|
// RegisterOp is actually u8
|
||||||
/// matches `io_uring_restriction` in liburing
|
/// matches `io_uring_restriction` in liburing
|
||||||
pub const Restriction = extern struct {
|
pub const Restriction = extern struct {
|
||||||
|
|
@ -4066,14 +4036,12 @@ pub const Restriction = extern struct {
|
||||||
resv2: [3]u32,
|
resv2: [3]u32,
|
||||||
};
|
};
|
||||||
|
|
||||||
// COMMIT: add new struct type
|
|
||||||
/// matches `io_uring_clock_register` in liburing
|
/// matches `io_uring_clock_register` in liburing
|
||||||
pub const ClockRegister = extern struct {
|
pub const ClockRegister = extern struct {
|
||||||
clockid: u32,
|
clockid: u32,
|
||||||
__resv: [3]u32,
|
__resv: [3]u32,
|
||||||
};
|
};
|
||||||
|
|
||||||
// COMMIT: add new struct type
|
|
||||||
/// matches `io_uring_clone_buffers` in liburing
|
/// matches `io_uring_clone_buffers` in liburing
|
||||||
pub const CloneBuffers = extern struct {
|
pub const CloneBuffers = extern struct {
|
||||||
src_fd: u32,
|
src_fd: u32,
|
||||||
|
|
@ -4083,7 +4051,6 @@ pub const CloneBuffers = extern struct {
|
||||||
nr: u32,
|
nr: u32,
|
||||||
pad: [3]u32,
|
pad: [3]u32,
|
||||||
|
|
||||||
// COMMIT: new flags
|
|
||||||
pub const Flags = packed struct(u32) {
|
pub const Flags = packed struct(u32) {
|
||||||
register_src_registered: bool = false,
|
register_src_registered: bool = false,
|
||||||
register_dst_replace: bool = false,
|
register_dst_replace: bool = false,
|
||||||
|
|
@ -4168,7 +4135,6 @@ pub const BufferRegister = extern struct {
|
||||||
flags: Flags,
|
flags: Flags,
|
||||||
resv: [3]u64,
|
resv: [3]u64,
|
||||||
|
|
||||||
// COMMIT: new IORING_REGISTER_PBUF_RING flags
|
|
||||||
/// Flags for IORING_REGISTER_PBUF_RING.
|
/// Flags for IORING_REGISTER_PBUF_RING.
|
||||||
pub const Flags = packed struct(u16) {
|
pub const Flags = packed struct(u16) {
|
||||||
/// IOU_PBUF_RING_MMAP:
|
/// IOU_PBUF_RING_MMAP:
|
||||||
|
|
@ -4210,7 +4176,6 @@ pub const Napi = extern struct {
|
||||||
resv: u64,
|
resv: u64,
|
||||||
};
|
};
|
||||||
|
|
||||||
// COMMIT: new struct type
|
|
||||||
/// Argument for io_uring_enter(2) with IORING_GETEVENTS | IORING_ENTER_EXT_ARG_REG
|
/// Argument for io_uring_enter(2) with IORING_GETEVENTS | IORING_ENTER_EXT_ARG_REG
|
||||||
/// set, where the actual argument is an index into a previously registered
|
/// set, where the actual argument is an index into a previously registered
|
||||||
/// fixed wait region described by the below structure.
|
/// fixed wait region described by the below structure.
|
||||||
|
|
@ -4224,7 +4189,6 @@ pub const RegisterWait = extern struct {
|
||||||
pad: [3]u32,
|
pad: [3]u32,
|
||||||
pad2: [2]u64,
|
pad2: [2]u64,
|
||||||
|
|
||||||
// COMMIT: new constant
|
|
||||||
pub const Flags = packed struct(u32) {
|
pub const Flags = packed struct(u32) {
|
||||||
reg_wait_ts: bool = false,
|
reg_wait_ts: bool = false,
|
||||||
_: u31 = 0,
|
_: u31 = 0,
|
||||||
|
|
@ -4241,7 +4205,6 @@ pub const GetEventsArg = extern struct {
|
||||||
ts: u64,
|
ts: u64,
|
||||||
};
|
};
|
||||||
|
|
||||||
// COMMIT: fix type definition of io_uring_sync_cancel_reg
|
|
||||||
/// Argument for IORING_REGISTER_SYNC_CANCEL
|
/// Argument for IORING_REGISTER_SYNC_CANCEL
|
||||||
/// matches `io_uring_sync_cancel_reg` in liburing
|
/// matches `io_uring_sync_cancel_reg` in liburing
|
||||||
pub const SyncCancelRegister = extern struct {
|
pub const SyncCancelRegister = extern struct {
|
||||||
|
|
@ -4327,7 +4290,6 @@ pub const ZcrxIfqRegister = extern struct {
|
||||||
__resv: [3]u64,
|
__resv: [3]u64,
|
||||||
};
|
};
|
||||||
|
|
||||||
// COMMIT: move IoUring constants to Constants
|
|
||||||
pub const constants = struct {
|
pub const constants = struct {
|
||||||
/// io_uring block file commands, see IORING_OP_URING_CMD.
|
/// io_uring block file commands, see IORING_OP_URING_CMD.
|
||||||
/// It's a different number space from ioctl(), reuse the block's code 0x12.
|
/// It's a different number space from ioctl(), reuse the block's code 0x12.
|
||||||
|
|
@ -4357,7 +4319,6 @@ pub const constants = struct {
|
||||||
pub const OFF_SQ_RING = 0;
|
pub const OFF_SQ_RING = 0;
|
||||||
pub const OFF_CQ_RING = 0x8000000;
|
pub const OFF_CQ_RING = 0x8000000;
|
||||||
pub const OFF_SQES = 0x10000000;
|
pub const OFF_SQES = 0x10000000;
|
||||||
// COMMIT: new magic constants
|
|
||||||
pub const OFF_PBUF_RING = 0x80000000;
|
pub const OFF_PBUF_RING = 0x80000000;
|
||||||
pub const OFF_PBUF_SHIFT = 16;
|
pub const OFF_PBUF_SHIFT = 16;
|
||||||
pub const OFF_MMAP_MASK = 0xf8000000;
|
pub const OFF_MMAP_MASK = 0xf8000000;
|
||||||
|
|
@ -4365,7 +4326,6 @@ pub const constants = struct {
|
||||||
/// Skip updating fd indexes set to this value in the fd table
|
/// Skip updating fd indexes set to this value in the fd table
|
||||||
pub const REGISTER_FILES_SKIP = -2;
|
pub const REGISTER_FILES_SKIP = -2;
|
||||||
|
|
||||||
// COMMIT: new TX Timestamp definition
|
|
||||||
/// SOCKET_URING_OP_TX_TIMESTAMP definitions
|
/// SOCKET_URING_OP_TX_TIMESTAMP definitions
|
||||||
pub const TIMESTAMP_HW_SHIFT = 16;
|
pub const TIMESTAMP_HW_SHIFT = 16;
|
||||||
/// The cqe.flags bit from which the timestamp type is stored
|
/// The cqe.flags bit from which the timestamp type is stored
|
||||||
|
|
@ -4381,7 +4341,6 @@ pub const constants = struct {
|
||||||
pub const REGISTER_USE_REGISTERED_RING = 1 << 31;
|
pub const REGISTER_USE_REGISTERED_RING = 1 << 31;
|
||||||
};
|
};
|
||||||
|
|
||||||
// COMMIT: move IoUring flags to Flags struct
|
|
||||||
pub const uflags = struct {
|
pub const uflags = struct {
|
||||||
/// io_uring_setup() flags
|
/// io_uring_setup() flags
|
||||||
pub const Setup = packed struct(u32) {
|
pub const Setup = packed struct(u32) {
|
||||||
|
|
@ -4430,7 +4389,6 @@ pub const uflags = struct {
|
||||||
registered_fd_only: bool = false,
|
registered_fd_only: bool = false,
|
||||||
/// Removes indirection through the SQ index array.
|
/// Removes indirection through the SQ index array.
|
||||||
no_sqarray: bool = false,
|
no_sqarray: bool = false,
|
||||||
// COMMIT: new setup flags
|
|
||||||
/// Use hybrid poll in iopoll process
|
/// Use hybrid poll in iopoll process
|
||||||
hybrid_iopoll: bool = false,
|
hybrid_iopoll: bool = false,
|
||||||
/// Allow both 16b and 32b CQEs. If a 32b CQE is posted, it will have
|
/// Allow both 16b and 32b CQEs. If a 32b CQE is posted, it will have
|
||||||
|
|
@ -4466,8 +4424,7 @@ pub const uflags = struct {
|
||||||
link_timeout_update: bool = false,
|
link_timeout_update: bool = false,
|
||||||
/// Available since Linux 5.16
|
/// Available since Linux 5.16
|
||||||
timeout_etime_success: bool = false,
|
timeout_etime_success: bool = false,
|
||||||
// COMMIT: new Timeout Flag
|
/// Available since Linux 6.4
|
||||||
// TODO: add when it became available
|
|
||||||
timeout_multishot: bool = false,
|
timeout_multishot: bool = false,
|
||||||
_8: u25 = 0,
|
_8: u25 = 0,
|
||||||
};
|
};
|
||||||
|
|
@ -4487,7 +4444,6 @@ pub const uflags = struct {
|
||||||
/// Multishot poll. Sets IORING_CQE_F_MORE if the poll handler will
|
/// Multishot poll. Sets IORING_CQE_F_MORE if the poll handler will
|
||||||
/// continue to report CQEs on behalf of the same SQE.
|
/// continue to report CQEs on behalf of the same SQE.
|
||||||
add_multi: bool = false,
|
add_multi: bool = false,
|
||||||
// TODO: verify this doc comment is valid for the 2 flags below
|
|
||||||
/// IORING_POLL_UPDATE
|
/// IORING_POLL_UPDATE
|
||||||
/// Update existing poll request, matching sqe.addr as the old user_data
|
/// Update existing poll request, matching sqe.addr as the old user_data
|
||||||
/// field.
|
/// field.
|
||||||
|
|
@ -4516,7 +4472,6 @@ pub const uflags = struct {
|
||||||
/// IORING_ASYNC_CANCEL_FD_FIXED
|
/// IORING_ASYNC_CANCEL_FD_FIXED
|
||||||
/// 'fd' passed in is a fixed descriptor
|
/// 'fd' passed in is a fixed descriptor
|
||||||
cancel_fd_fixed: bool = false,
|
cancel_fd_fixed: bool = false,
|
||||||
// COMMIT: new AsyncCancel Flags
|
|
||||||
/// IORING_ASYNC_CANCEL_USERDATA
|
/// IORING_ASYNC_CANCEL_USERDATA
|
||||||
/// Match on user_data, default for no other key
|
/// Match on user_data, default for no other key
|
||||||
cancel_userdata: bool = false,
|
cancel_userdata: bool = false,
|
||||||
|
|
@ -4536,14 +4491,12 @@ pub const uflags = struct {
|
||||||
_3: u30 = 0,
|
_3: u30 = 0,
|
||||||
};
|
};
|
||||||
|
|
||||||
// COMMIT: new flag
|
|
||||||
/// IORING_OP_FIXED_FD_INSTALL flags (sqe.install_fd_flags or sqe.rw_flags in Zig Struct)
|
/// IORING_OP_FIXED_FD_INSTALL flags (sqe.install_fd_flags or sqe.rw_flags in Zig Struct)
|
||||||
pub const FixedFd = packed struct(u32) {
|
pub const FixedFd = packed struct(u32) {
|
||||||
/// IORING_FIXED_FD_NO_CLOEXEC Don't mark the fd as O_CLOEXEC
|
/// IORING_FIXED_FD_NO_CLOEXEC Don't mark the fd as O_CLOEXEC
|
||||||
no_cloexec: bool = false,
|
no_cloexec: bool = false,
|
||||||
};
|
};
|
||||||
|
|
||||||
/// COMMIT: new flags
|
|
||||||
/// IORING_OP_NOP flags (sqe.nop_flags or sqe.rw_flags in Zig Struct)
|
/// IORING_OP_NOP flags (sqe.nop_flags or sqe.rw_flags in Zig Struct)
|
||||||
pub const Nop = packed struct(u32) {
|
pub const Nop = packed struct(u32) {
|
||||||
/// IORING_NOP_INJECT_RESULT Inject result from sqe.result
|
/// IORING_NOP_INJECT_RESULT Inject result from sqe.result
|
||||||
|
|
@ -4695,7 +4648,6 @@ pub const RegisterOp = enum(u8) {
|
||||||
|
|
||||||
register_mem_region,
|
register_mem_region,
|
||||||
|
|
||||||
// COMMIT: new register opcode
|
|
||||||
// query various aspects of io_uring, see linux/io_uring/query.h
|
// query various aspects of io_uring, see linux/io_uring/query.h
|
||||||
register_query,
|
register_query,
|
||||||
|
|
||||||
|
|
@ -4716,7 +4668,6 @@ pub const SocketOp = enum(u16) {
|
||||||
siocoutq,
|
siocoutq,
|
||||||
getsockopt,
|
getsockopt,
|
||||||
setsockopt,
|
setsockopt,
|
||||||
// COMMIT: new socket op
|
|
||||||
tx_timestamp,
|
tx_timestamp,
|
||||||
_,
|
_,
|
||||||
};
|
};
|
||||||
|
|
@ -4745,7 +4696,6 @@ pub const MsgRingCmd = enum {
|
||||||
send_fd,
|
send_fd,
|
||||||
};
|
};
|
||||||
|
|
||||||
// COMMIT: OP to IoUring
|
|
||||||
/// matches `io_uring_op` in liburing
|
/// matches `io_uring_op` in liburing
|
||||||
pub const Op = enum(u8) {
|
pub const Op = enum(u8) {
|
||||||
nop,
|
nop,
|
||||||
|
|
@ -4807,8 +4757,6 @@ pub const Op = enum(u8) {
|
||||||
bind,
|
bind,
|
||||||
listen,
|
listen,
|
||||||
recv_zc,
|
recv_zc,
|
||||||
// COMMIT: new OPs
|
|
||||||
// TODO: to be implemented
|
|
||||||
epoll_wait,
|
epoll_wait,
|
||||||
readv_fixed,
|
readv_fixed,
|
||||||
writev_fixed,
|
writev_fixed,
|
||||||
|
|
@ -7525,7 +7473,7 @@ test "bind/listen/connect" {
|
||||||
(try ring.setsockopt(2, listen_fd, .socket, .reuseaddr, mem.asBytes(&optval))).link_next();
|
(try ring.setsockopt(2, listen_fd, .socket, .reuseaddr, mem.asBytes(&optval))).link_next();
|
||||||
(try ring.setsockopt(3, listen_fd, .socket, .reuseport, mem.asBytes(&optval))).link_next();
|
(try ring.setsockopt(3, listen_fd, .socket, .reuseport, mem.asBytes(&optval))).link_next();
|
||||||
(try ring.bind(4, listen_fd, addrAny(&addr), @sizeOf(linux.sockaddr.in), 0)).link_next();
|
(try ring.bind(4, listen_fd, addrAny(&addr), @sizeOf(linux.sockaddr.in), 0)).link_next();
|
||||||
_ = try ring.listen(5, listen_fd, 1, 0);
|
_ = try ring.listen(5, listen_fd, 1);
|
||||||
// Submit 4 operations
|
// Submit 4 operations
|
||||||
try testing.expectEqual(4, try ring.submit());
|
try testing.expectEqual(4, try ring.submit());
|
||||||
// Expect all to succeed
|
// Expect all to succeed
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue