authorgravatar for kenta@lithdew.netKenta Iwasaki <kenta@lithdew.net> 2021-07-09 07:10:10+09:00
committergravatar for mail@isaacfreund.comIsaac Freund <mail@isaacfreund.com> 2021-07-11 09:15:54+00:00
logaa2a31612fa677ddb747f8fa730f6a5732b3afa9
treeee0043a0a6cd0ca2267aba9fab768c146804a9f6
parent75d1b113aa6adf983497a78a0a0e61ecac7aaa54

io_uring: add sqe prep methods for epoll_ctl, poll_add, and poll_remove

Implement io_uring submission queue entry preparation methods for epoll_ctl, poll_add and poll_remove. Poll masks are designated as 32-bit little-endian integers as specified in liburing's definitions. Updated io_uring_prep_rw to take in an unsigned 64-bit address instead of an anytype. io_uring_sqe by default assumes that the address specified in a submission queue entry is an unsigned 64-bit integer.

1 files changed, 81 insertions(+), 12 deletions(-)

lib/std/os/linux/io_uring.zig+81-12
......@@ -457,6 +457,22 @@ pub const IO_Uring = struct {
457457 return sqe;
458458 }
459459
460 /// Queues (but does not submit) an SQE to perform a `epoll_ctl(2)`.
461 /// Returns a pointer to the SQE.
462 pub fn epoll_ctl(
463 self: *IO_Uring,
464 user_data: u64,
465 epfd: os.fd_t,
466 fd: os.fd_t,
467 op: u32,
468 ev: ?*linux.epoll_event,
469 ) !*io_uring_sqe {
470 const sqe = try self.get_sqe();
471 io_uring_prep_epoll_ctl(sqe, epfd, fd, op, ev);
472 sqe.user_data = user_data;
473 return sqe;
474 }
475
460476 /// Queues (but does not submit) an SQE to perform a `recv(2)`.
461477 /// Returns a pointer to the SQE.
462478 pub fn recv(
......@@ -558,6 +574,33 @@ pub const IO_Uring = struct {
558574 return sqe;
559575 }
560576
577 /// Queues (but does not submit) an SQE to perform a `poll(2)`.
578 /// Returns a pointer to the SQE.
579 pub fn poll_add(
580 self: *IO_Uring,
581 user_data: u64,
582 fd: os.fd_t,
583 poll_mask: u32,
584 ) !*io_uring_sqe {
585 const sqe = try self.get_sqe();
586 io_uring_prep_poll_add(sqe, fd, poll_mask);
587 sqe.user_data = user_data;
588 return sqe;
589 }
590
591 /// Queues (but does not submit) an SQE to remove an existing poll operation.
592 /// Returns a pointer to the SQE.
593 pub fn poll_remove(
594 self: *IO_Uring,
595 user_data: u64,
596 target_user_data: u64,
597 ) !*io_uring_sqe {
598 const sqe = try self.get_sqe();
599 io_uring_prep_poll_remove(sqe, target_user_data);
600 sqe.user_data = user_data;
601 return sqe;
602 }
603
561604 /// Queues (but does not submit) an SQE to perform an `fallocate(2)`.
562605 /// Returns a pointer to the SQE.
563606 pub fn fallocate(
......@@ -776,7 +819,7 @@ pub fn io_uring_prep_rw(
776819 op: linux.IORING_OP,
777820 sqe: *io_uring_sqe,
778821 fd: os.fd_t,
779 addr: anytype,
822 addr: u64,
780823 len: usize,
781824 offset: u64,
782825) void {
......@@ -786,7 +829,7 @@ pub fn io_uring_prep_rw(
786829 .ioprio = 0,
787830 .fd = fd,
788831 .off = offset,
789 .addr = @ptrToInt(addr),
832 .addr = addr,
790833 .len = @intCast(u32, len),
791834 .rw_flags = 0,
792835 .user_data = 0,
......@@ -798,11 +841,11 @@ pub fn io_uring_prep_rw(
798841}
799842
800843pub fn io_uring_prep_read(sqe: *io_uring_sqe, fd: os.fd_t, buffer: []u8, offset: u64) void {
801 io_uring_prep_rw(.READ, sqe, fd, buffer.ptr, buffer.len, offset);
844 io_uring_prep_rw(.READ, sqe, fd, @ptrToInt(buffer.ptr), buffer.len, offset);
802845}
803846
804847pub fn io_uring_prep_write(sqe: *io_uring_sqe, fd: os.fd_t, buffer: []const u8, offset: u64) void {
805 io_uring_prep_rw(.WRITE, sqe, fd, buffer.ptr, buffer.len, offset);
848 io_uring_prep_rw(.WRITE, sqe, fd, @ptrToInt(buffer.ptr), buffer.len, offset);
806849}
807850
808851pub fn io_uring_prep_readv(
......@@ -811,7 +854,7 @@ pub fn io_uring_prep_readv(
811854 iovecs: []const os.iovec,
812855 offset: u64,
813856) void {
814 io_uring_prep_rw(.READV, sqe, fd, iovecs.ptr, iovecs.len, offset);
857 io_uring_prep_rw(.READV, sqe, fd, @ptrToInt(iovecs.ptr), iovecs.len, offset);
815858}
816859
817860pub fn io_uring_prep_writev(
......@@ -820,7 +863,7 @@ pub fn io_uring_prep_writev(
820863 iovecs: []const os.iovec_const,
821864 offset: u64,
822865) void {
823 io_uring_prep_rw(.WRITEV, sqe, fd, iovecs.ptr, iovecs.len, offset);
866 io_uring_prep_rw(.WRITEV, sqe, fd, @ptrToInt(iovecs.ptr), iovecs.len, offset);
824867}
825868
826869pub fn io_uring_prep_accept(
......@@ -832,7 +875,7 @@ pub fn io_uring_prep_accept(
832875) void {
833876 // `addr` holds a pointer to `sockaddr`, and `addr2` holds a pointer to socklen_t`.
834877 // `addr2` maps to `sqe.off` (u64) instead of `sqe.len` (which is only a u32).
835 io_uring_prep_rw(.ACCEPT, sqe, fd, addr, 0, @ptrToInt(addrlen));
878 io_uring_prep_rw(.ACCEPT, sqe, fd, @ptrToInt(addr), 0, @ptrToInt(addrlen));
836879 sqe.rw_flags = flags;
837880}
838881
......@@ -843,16 +886,26 @@ pub fn io_uring_prep_connect(
843886 addrlen: os.socklen_t,
844887) void {
845888 // `addrlen` maps to `sqe.off` (u64) instead of `sqe.len` (which is only a u32).
846 io_uring_prep_rw(.CONNECT, sqe, fd, addr, 0, addrlen);
889 io_uring_prep_rw(.CONNECT, sqe, fd, @ptrToInt(addr), 0, addrlen);
890}
891
892pub fn io_uring_prep_epoll_ctl(
893 sqe: *io_uring_sqe,
894 epfd: os.fd_t,
895 fd: os.fd_t,
896 op: u32,
897 ev: ?*linux.epoll_event,
898) void {
899 io_uring_prep_rw(.EPOLL_CTL, sqe, epfd, @ptrToInt(ev), op, @intCast(u64, fd));
847900}
848901
849902pub fn io_uring_prep_recv(sqe: *io_uring_sqe, fd: os.fd_t, buffer: []u8, flags: u32) void {
850 io_uring_prep_rw(.RECV, sqe, fd, buffer.ptr, buffer.len, 0);
903 io_uring_prep_rw(.RECV, sqe, fd, @ptrToInt(buffer.ptr), buffer.len, 0);
851904 sqe.rw_flags = flags;
852905}
853906
854907pub fn io_uring_prep_send(sqe: *io_uring_sqe, fd: os.fd_t, buffer: []const u8, flags: u32) void {
855 io_uring_prep_rw(.SEND, sqe, fd, buffer.ptr, buffer.len, 0);
908 io_uring_prep_rw(.SEND, sqe, fd, @ptrToInt(buffer.ptr), buffer.len, 0);
856909 sqe.rw_flags = flags;
857910}
858911
......@@ -863,7 +916,7 @@ pub fn io_uring_prep_openat(
863916 flags: u32,
864917 mode: os.mode_t,
865918) void {
866 io_uring_prep_rw(.OPENAT, sqe, fd, path, mode, 0);
919 io_uring_prep_rw(.OPENAT, sqe, fd, @ptrToInt(path), mode, 0);
867920 sqe.rw_flags = flags;
868921}
869922
......@@ -891,7 +944,7 @@ pub fn io_uring_prep_timeout(
891944 count: u32,
892945 flags: u32,
893946) void {
894 io_uring_prep_rw(.TIMEOUT, sqe, -1, ts, 1, count);
947 io_uring_prep_rw(.TIMEOUT, sqe, -1, @ptrToInt(ts), 1, count);
895948 sqe.rw_flags = flags;
896949}
897950
......@@ -913,6 +966,22 @@ pub fn io_uring_prep_timeout_remove(sqe: *io_uring_sqe, timeout_user_data: u64,
913966 };
914967}
915968
969pub fn io_uring_prep_poll_add(
970 sqe: *io_uring_sqe,
971 fd: os.fd_t,
972 poll_mask: u32,
973) void {
974 io_uring_prep_rw(.POLL_ADD, sqe, fd, @ptrToInt(@as(?*c_void, null)), 0, 0);
975 sqe.rw_flags = std.mem.nativeToLittle(u32, poll_mask);
976}
977
978pub fn io_uring_prep_poll_remove(
979 sqe: *io_uring_sqe,
980 target_user_data: u64,
981) void {
982 io_uring_prep_rw(.POLL_REMOVE, sqe, -1, target_user_data, 0, 0);
983}
984
916985pub fn io_uring_prep_fallocate(
917986 sqe: *io_uring_sqe,
918987 fd: os.fd_t,