* [PATCH liburing v2 0/5] IORING_OP_BIND/LISTEN support @ 2024-07-23 23:17 Gabriel Krisman Bertazi 2024-07-23 23:17 ` [PATCH liburing v2 1/5] liburing: Add helper to prepare IORING_OP_BIND command Gabriel Krisman Bertazi ` (5 more replies) 0 siblings, 6 replies; 7+ messages in thread From: Gabriel Krisman Bertazi @ 2024-07-23 23:17 UTC (permalink / raw) To: axboe; +Cc: io-uring, asml.silence, Gabriel Krisman Bertazi This is the v2 of userspace support for OP_BIND/OP_LISTEN with wrappers, manpages and tests. Beyond the requested fixes in v1, I completely rewrote the testcase to avoid pthreads and introduced more test cases. It also ensures the testcase is properly skipped for older kernels. Gabriel Krisman Bertazi (5): liburing: Add helper to prepare IORING_OP_BIND command liburing: Add helper to prepare IORING_OP_LISTEN command tests: Add test for bind/listen commands man/io_uring_prep_bind.3: Document the IORING_OP_BIND operation man/io_uring_prep_listen.3: Document IORING_OP_LISTEN operation man/io_uring_prep_bind.3 | 54 +++++ man/io_uring_prep_listen.3 | 52 +++++ src/include/liburing.h | 13 ++ src/include/liburing/io_uring.h | 2 + src/liburing-ffi.map | 2 + test/Makefile | 1 + test/bind-listen.c | 381 ++++++++++++++++++++++++++++++++ 7 files changed, 505 insertions(+) create mode 100644 man/io_uring_prep_bind.3 create mode 100644 man/io_uring_prep_listen.3 create mode 100644 test/bind-listen.c -- 2.45.2 ^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH liburing v2 1/5] liburing: Add helper to prepare IORING_OP_BIND command 2024-07-23 23:17 [PATCH liburing v2 0/5] IORING_OP_BIND/LISTEN support Gabriel Krisman Bertazi @ 2024-07-23 23:17 ` Gabriel Krisman Bertazi 2024-07-23 23:17 ` [PATCH liburing v2 2/5] liburing: Add helper to prepare IORING_OP_LISTEN command Gabriel Krisman Bertazi ` (4 subsequent siblings) 5 siblings, 0 replies; 7+ messages in thread From: Gabriel Krisman Bertazi @ 2024-07-23 23:17 UTC (permalink / raw) To: axboe; +Cc: io-uring, asml.silence, Gabriel Krisman Bertazi Signed-off-by: Gabriel Krisman Bertazi <[email protected]> --- src/include/liburing.h | 7 +++++++ src/include/liburing/io_uring.h | 1 + src/liburing-ffi.map | 1 + 3 files changed, 9 insertions(+) diff --git a/src/include/liburing.h b/src/include/liburing.h index e8626f0..04cb65c 100644 --- a/src/include/liburing.h +++ b/src/include/liburing.h @@ -669,6 +669,13 @@ IOURINGINLINE void io_uring_prep_connect(struct io_uring_sqe *sqe, int fd, io_uring_prep_rw(IORING_OP_CONNECT, sqe, fd, addr, 0, addrlen); } +IOURINGINLINE void io_uring_prep_bind(struct io_uring_sqe *sqe, int fd, + struct sockaddr *addr, + socklen_t addrlen) +{ + io_uring_prep_rw(IORING_OP_BIND, sqe, fd, addr, 0, addrlen); +} + IOURINGINLINE void io_uring_prep_files_update(struct io_uring_sqe *sqe, int *fds, unsigned nr_fds, int offset) diff --git a/src/include/liburing/io_uring.h b/src/include/liburing/io_uring.h index 9330733..177ace6 100644 --- a/src/include/liburing/io_uring.h +++ b/src/include/liburing/io_uring.h @@ -257,6 +257,7 @@ enum io_uring_op { IORING_OP_FUTEX_WAITV, IORING_OP_FIXED_FD_INSTALL, IORING_OP_FTRUNCATE, + IORING_OP_BIND, /* this goes last, obviously */ IORING_OP_LAST, diff --git a/src/liburing-ffi.map b/src/liburing-ffi.map index 0e4bd9d..de2cb09 100644 --- a/src/liburing-ffi.map +++ b/src/liburing-ffi.map @@ -201,4 +201,5 @@ LIBURING_2.6 { LIBURING_2.7 { io_uring_prep_fadvise64; io_uring_prep_madvise64; + io_uring_prep_bind; } LIBURING_2.6; -- 2.45.2 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH liburing v2 2/5] liburing: Add helper to prepare IORING_OP_LISTEN command 2024-07-23 23:17 [PATCH liburing v2 0/5] IORING_OP_BIND/LISTEN support Gabriel Krisman Bertazi 2024-07-23 23:17 ` [PATCH liburing v2 1/5] liburing: Add helper to prepare IORING_OP_BIND command Gabriel Krisman Bertazi @ 2024-07-23 23:17 ` Gabriel Krisman Bertazi 2024-07-23 23:17 ` [PATCH liburing v2 3/5] tests: Add test for bind/listen commands Gabriel Krisman Bertazi ` (3 subsequent siblings) 5 siblings, 0 replies; 7+ messages in thread From: Gabriel Krisman Bertazi @ 2024-07-23 23:17 UTC (permalink / raw) To: axboe; +Cc: io-uring, asml.silence, Gabriel Krisman Bertazi Signed-off-by: Gabriel Krisman Bertazi <[email protected]> --- src/include/liburing.h | 6 ++++++ src/include/liburing/io_uring.h | 1 + src/liburing-ffi.map | 1 + 3 files changed, 8 insertions(+) diff --git a/src/include/liburing.h b/src/include/liburing.h index 04cb65c..c935efa 100644 --- a/src/include/liburing.h +++ b/src/include/liburing.h @@ -676,6 +676,12 @@ IOURINGINLINE void io_uring_prep_bind(struct io_uring_sqe *sqe, int fd, io_uring_prep_rw(IORING_OP_BIND, sqe, fd, addr, 0, addrlen); } +IOURINGINLINE void io_uring_prep_listen(struct io_uring_sqe *sqe, int fd, + int backlog) +{ + io_uring_prep_rw(IORING_OP_LISTEN, sqe, fd, 0, backlog, 0); +} + IOURINGINLINE void io_uring_prep_files_update(struct io_uring_sqe *sqe, int *fds, unsigned nr_fds, int offset) diff --git a/src/include/liburing/io_uring.h b/src/include/liburing/io_uring.h index 177ace6..f99d41f 100644 --- a/src/include/liburing/io_uring.h +++ b/src/include/liburing/io_uring.h @@ -258,6 +258,7 @@ enum io_uring_op { IORING_OP_FIXED_FD_INSTALL, IORING_OP_FTRUNCATE, IORING_OP_BIND, + IORING_OP_LISTEN, /* this goes last, obviously */ IORING_OP_LAST, diff --git a/src/liburing-ffi.map b/src/liburing-ffi.map index de2cb09..0cbf14c 100644 --- a/src/liburing-ffi.map +++ b/src/liburing-ffi.map @@ -202,4 +202,5 @@ LIBURING_2.7 { io_uring_prep_fadvise64; io_uring_prep_madvise64; io_uring_prep_bind; + io_uring_prep_listen; } LIBURING_2.6; -- 2.45.2 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH liburing v2 3/5] tests: Add test for bind/listen commands 2024-07-23 23:17 [PATCH liburing v2 0/5] IORING_OP_BIND/LISTEN support Gabriel Krisman Bertazi 2024-07-23 23:17 ` [PATCH liburing v2 1/5] liburing: Add helper to prepare IORING_OP_BIND command Gabriel Krisman Bertazi 2024-07-23 23:17 ` [PATCH liburing v2 2/5] liburing: Add helper to prepare IORING_OP_LISTEN command Gabriel Krisman Bertazi @ 2024-07-23 23:17 ` Gabriel Krisman Bertazi 2024-07-23 23:17 ` [PATCH liburing v2 4/5] man/io_uring_prep_bind.3: Document the IORING_OP_BIND operation Gabriel Krisman Bertazi ` (2 subsequent siblings) 5 siblings, 0 replies; 7+ messages in thread From: Gabriel Krisman Bertazi @ 2024-07-23 23:17 UTC (permalink / raw) To: axboe; +Cc: io-uring, asml.silence, Gabriel Krisman Bertazi This test implements verification for bind/listen commands. First, it creates a TCP connection with itself only using io_uring and verify it works by sending data over it. Then, some unit test verifies some failed cases of malformed bind and listen operations. Signed-off-by: Gabriel Krisman Bertazi <[email protected]> --- test/Makefile | 1 + test/bind-listen.c | 381 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 382 insertions(+) create mode 100644 test/bind-listen.c diff --git a/test/Makefile b/test/Makefile index fcf6554..a47ca6f 100644 --- a/test/Makefile +++ b/test/Makefile @@ -52,6 +52,7 @@ test_srcs := \ across-fork.c \ b19062a56726.c \ b5837bd5311d.c \ + bind-listen.c \ buf-ring.c \ buf-ring-nommap.c \ buf-ring-put.c \ diff --git a/test/bind-listen.c b/test/bind-listen.c new file mode 100644 index 0000000..1fa3b54 --- /dev/null +++ b/test/bind-listen.c @@ -0,0 +1,381 @@ +/* SPDX-License-Identifier: MIT */ +/* + * Configure and operate a TCP socket solely with io_uring. + */ +#include <stdio.h> +#include <string.h> +#include <liburing.h> +#include <err.h> +#include <sys/mman.h> +#include <sys/wait.h> +#include <sys/socket.h> +#include <unistd.h> +#include <stdlib.h> +#include <netinet/ip.h> +#include "liburing.h" +#include "helpers.h" + +static void msec_to_ts(struct __kernel_timespec *ts, unsigned int msec) +{ + ts->tv_sec = msec / 1000; + ts->tv_nsec = (msec % 1000) * 1000000; +} + +const char *magic = "Hello World!"; + +enum { + SRV_INDEX = 0, + CLI_INDEX, + CONN_INDEX, +}; + +static int connect_client(struct io_uring *ring, unsigned short peer_port) +{ + + struct __kernel_timespec ts; + struct io_uring_sqe *sqe; + struct io_uring_cqe *cqe; + int head, ret, submitted = 0; + struct sockaddr_in peer_addr; + socklen_t addr_len = sizeof(peer_addr); + + peer_addr.sin_family = AF_INET; + peer_addr.sin_port = peer_port; + peer_addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK); + + sqe = io_uring_get_sqe(ring); + io_uring_prep_socket_direct(sqe, AF_INET, SOCK_STREAM, 0, + CLI_INDEX, 0); + sqe->flags |= IOSQE_IO_LINK; + + sqe = io_uring_get_sqe(ring); + io_uring_prep_connect(sqe, CLI_INDEX, (struct sockaddr*) &peer_addr, addr_len); + sqe->flags |= IOSQE_FIXED_FILE | IOSQE_IO_LINK; + + sqe = io_uring_get_sqe(ring); + io_uring_prep_send(sqe, CLI_INDEX, magic, strlen(magic), 0); + sqe->flags |= IOSQE_FIXED_FILE | IOSQE_IO_LINK; + + submitted = ret = io_uring_submit(ring); + if (ret < 0) + return T_SETUP_SKIP; + + msec_to_ts(&ts, 300); + ret = io_uring_wait_cqes(ring, &cqe, submitted, &ts, NULL); + if (ret < 0) + return T_SETUP_SKIP; + + io_uring_for_each_cqe(ring, head, cqe) { + ret = cqe->res; + if (ret < 0) + return T_SETUP_SKIP; + } io_uring_cq_advance(ring, submitted); + + return T_SETUP_OK; +} + +static int setup_srv(struct io_uring *ring, struct sockaddr_in *server_addr) +{ + int val; + int submitted; + struct io_uring_sqe *sqe; + struct io_uring_cqe *cqe; + struct __kernel_timespec ts; + int head; + + int ret; + + memset(server_addr, 0, sizeof(struct sockaddr_in)); + server_addr->sin_family = AF_INET; + server_addr->sin_port = htons(8000); + server_addr->sin_addr.s_addr = htons(INADDR_ANY); + + sqe = io_uring_get_sqe(ring); + io_uring_prep_socket_direct(sqe, AF_INET, SOCK_STREAM, 0, SRV_INDEX, 0); + sqe->flags |= IOSQE_IO_LINK; + + sqe = io_uring_get_sqe(ring); + val = 1; + io_uring_prep_cmd_sock(sqe, SOCKET_URING_OP_SETSOCKOPT, 0, SOL_SOCKET, + SO_REUSEADDR, &val, sizeof(val)); + sqe->flags |= IOSQE_FIXED_FILE | IOSQE_IO_LINK; + + sqe = io_uring_get_sqe(ring); + io_uring_prep_bind(sqe, SRV_INDEX, (struct sockaddr *) server_addr, + sizeof(struct sockaddr_in)); + sqe->flags |= IOSQE_FIXED_FILE | IOSQE_IO_LINK; + + sqe = io_uring_get_sqe(ring); + io_uring_prep_listen(sqe, SRV_INDEX, 1); + sqe->flags |= IOSQE_FIXED_FILE; + + submitted = ret = io_uring_submit(ring); + if (ret < 0) { + fprintf(stderr, "submission failed. %d\n", ret); + return T_EXIT_FAIL; + } + + msec_to_ts(&ts, 300); + ret = io_uring_wait_cqes(ring, &cqe, ret, &ts, NULL); + if (ret < 0) { + fprintf(stderr, "submission failed. %d\n", ret); + return T_EXIT_FAIL; + } + + io_uring_for_each_cqe(ring, head, cqe) { + ret = cqe->res; + if (ret < 0) { + fprintf(stderr, "Server startup failed. step %d got %d \n", head, ret); + return T_EXIT_FAIL; + } + } io_uring_cq_advance(ring, submitted); + + return T_SETUP_OK; +} + +static int test_good_server() +{ + struct sockaddr_in server_addr; + struct __kernel_timespec ts; + struct io_uring_sqe *sqe; + struct io_uring_cqe *cqe; + struct io_uring ring; + int ret; + int fds[3]; + char buf[1024]; + + memset(fds, -1, sizeof(fds)); + + ret = t_create_ring(10, &ring, IORING_SETUP_SUBMIT_ALL); + if (ret < 0) { + fprintf(stderr, "queue_init: %s\n", strerror(-ret)); + return T_SETUP_SKIP; + } + + ret = io_uring_register_files(&ring, fds, 3); + if (ret) { + fprintf(stderr, "server file register %d\n", ret); + return T_SETUP_SKIP; + } + + ret = setup_srv(&ring, &server_addr); + if (ret != T_SETUP_OK) { + fprintf(stderr, "srv startup failed.\n"); + return T_EXIT_FAIL; + } + + if (connect_client(&ring, server_addr.sin_port) != T_SETUP_OK) { + fprintf(stderr, "cli startup failed.\n"); + return T_SETUP_SKIP; + } + + /* Wait for a request */ + sqe = io_uring_get_sqe(&ring); + io_uring_prep_accept_direct(sqe, SRV_INDEX, NULL, NULL, 0, CONN_INDEX); + sqe->flags |= IOSQE_FIXED_FILE; + + io_uring_submit(&ring); + io_uring_wait_cqe(&ring, &cqe); + if (cqe->res < 0) { + fprintf(stderr, "accept failed. %d\n", cqe->res); + return T_EXIT_FAIL; + } + io_uring_cqe_seen(&ring, cqe); + + sqe = io_uring_get_sqe(&ring); + io_uring_prep_recv(sqe, CONN_INDEX, buf, BUFSIZ, 0); + sqe->flags |= IOSQE_FIXED_FILE; + + io_uring_submit(&ring); + io_uring_wait_cqe_timeout(&ring, &cqe, &ts); + + if (cqe->res < 0) { + fprintf(stderr, "bad receive cqe. %d\n", cqe->res); + return T_EXIT_FAIL; + } + ret = cqe->res; + + io_uring_queue_exit(&ring); + + if (ret != strlen(magic) || strncmp(buf, magic, ret)) { + fprintf(stderr, "didn't receive expected string. Got %d '%s'\n", ret, buf); + return T_EXIT_FAIL; + } + fprintf(stderr, "expected string. Got %d '%s'\n", ret, buf); + return T_EXIT_PASS; +} + +int test_bad_bind() +{ + int sock; + struct sockaddr_in server_addr; + struct io_uring_sqe *sqe; + struct io_uring_cqe *cqe; + struct io_uring ring; + int err; + int ret = T_EXIT_FAIL; + + memset(&server_addr, 0, sizeof(struct sockaddr_in)); + server_addr.sin_family = AF_INET; + server_addr.sin_port = htons(8001); + server_addr.sin_addr.s_addr = htons(INADDR_ANY); + + err = t_create_ring(1, &ring, 0); + if (err < 0) { + fprintf(stderr, "queue_init: %s\n", strerror(-ret)); + return T_SETUP_SKIP; + } + + sock = socket(AF_INET, SOCK_STREAM, 0); + + /* Bind with size 0 */ + sqe = io_uring_get_sqe(&ring); + io_uring_prep_bind(sqe, sock, (struct sockaddr *) &server_addr, 0); + err = io_uring_submit(&ring); + if (err < 0) + goto fail; + + err = io_uring_wait_cqe(&ring, &cqe); + if (err) + goto fail; + + if (cqe->res != -EINVAL) + goto fail; + io_uring_cqe_seen(&ring, cqe); + + /* Bind with bad fd */ + sqe = io_uring_get_sqe(&ring); + io_uring_prep_bind(sqe, 0, (struct sockaddr *) &server_addr, sizeof(struct sockaddr_in)); + err = io_uring_submit(&ring); + if (err < 0) + goto fail; + + err = io_uring_wait_cqe(&ring, &cqe); + if (err) + goto fail; + if (cqe->res != -ENOTSOCK) + goto fail; + io_uring_cqe_seen(&ring, cqe); + + ret = T_EXIT_PASS; + + /* bind with weird value */ + sqe = io_uring_get_sqe(&ring); + io_uring_prep_bind(sqe, sock, (struct sockaddr *) &server_addr, sizeof(struct sockaddr_in)); + sqe->rw_flags = 1; + err = io_uring_submit(&ring); + if (err < 0) + goto fail; + + err = io_uring_wait_cqe(&ring, &cqe); + if (err) + goto fail; + if (cqe->res != -EINVAL) + goto fail; + io_uring_cqe_seen(&ring, cqe); + + ret = T_EXIT_PASS; + +fail: + io_uring_queue_exit(&ring); + if (sock) + close(sock); + return ret; +} + +int test_bad_listen() +{ + int sock; + struct sockaddr_in server_addr; + struct io_uring_sqe *sqe; + struct io_uring_cqe *cqe; + struct io_uring ring; + int err; + int ret = T_EXIT_FAIL; + + memset(&server_addr, 0, sizeof(struct sockaddr_in)); + server_addr.sin_family = AF_INET; + server_addr.sin_port = htons(8001); + server_addr.sin_addr.s_addr = htons(INADDR_ANY); + + err = t_create_ring(1, &ring, 0); + if (err < 0) { + fprintf(stderr, "queue_init: %d\n", err); + return T_SETUP_SKIP; + } + + sock = socket(AF_INET, SOCK_STREAM, 0); + if (!sock) { + fprintf(stderr, "bad sock\n"); + goto fail; + } + if (bind(sock, (struct sockaddr *) &server_addr, sizeof(struct sockaddr_in))) { + fprintf(stderr, "bad bind\n"); + goto fail; + } + + /* listen on bad sock */ + sqe = io_uring_get_sqe(&ring); + io_uring_prep_listen(sqe, 0, 1); + err = io_uring_submit(&ring); + if (err < 0) + goto fail; + + err = io_uring_wait_cqe(&ring, &cqe); + if (err) + goto fail; + + if (cqe->res != -ENOTSOCK) + goto fail; + io_uring_cqe_seen(&ring, cqe); + + /* listen with weird parameters */ + sqe = io_uring_get_sqe(&ring); + io_uring_prep_listen(sqe, sock, 1); + sqe->addr2 = 0xffffff; + err = io_uring_submit(&ring); + if (err < 0) + goto fail; + + err = io_uring_wait_cqe(&ring, &cqe); + if (err) + goto fail; + + if (cqe->res != -EINVAL) + goto fail; + io_uring_cqe_seen(&ring, cqe); + + ret = T_EXIT_PASS; +fail: + io_uring_queue_exit(&ring); + if (sock) + close(sock); + return ret; +} + +int main(int argc, char *argv[]) +{ + struct io_uring_probe *probe; + int failures = 0; + if (argc > 1) + return 0; + + /* + * This test is not supported in older kernels. Check for + * OP_LISTEN, since that is the last feature required to support + * it. + */ + probe = io_uring_get_probe(); + if (!probe) + return 1; + if (!io_uring_opcode_supported(probe, IORING_OP_LISTEN)) + return T_EXIT_SKIP; + + failures += test_good_server(); + failures += test_bad_bind(); + failures += test_bad_listen(); + + if (!failures) + return T_EXIT_PASS; + return T_EXIT_FAIL; +} -- 2.45.2 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH liburing v2 4/5] man/io_uring_prep_bind.3: Document the IORING_OP_BIND operation 2024-07-23 23:17 [PATCH liburing v2 0/5] IORING_OP_BIND/LISTEN support Gabriel Krisman Bertazi ` (2 preceding siblings ...) 2024-07-23 23:17 ` [PATCH liburing v2 3/5] tests: Add test for bind/listen commands Gabriel Krisman Bertazi @ 2024-07-23 23:17 ` Gabriel Krisman Bertazi 2024-07-23 23:17 ` [PATCH liburing v2 5/5] man/io_uring_prep_listen.3: Document IORING_OP_LISTEN operation Gabriel Krisman Bertazi 2024-07-24 0:22 ` [PATCH liburing v2 0/5] IORING_OP_BIND/LISTEN support Jens Axboe 5 siblings, 0 replies; 7+ messages in thread From: Gabriel Krisman Bertazi @ 2024-07-23 23:17 UTC (permalink / raw) To: axboe; +Cc: io-uring, asml.silence, Gabriel Krisman Bertazi Signed-off-by: Gabriel Krisman Bertazi <[email protected]> --- man/io_uring_prep_bind.3 | 54 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 man/io_uring_prep_bind.3 diff --git a/man/io_uring_prep_bind.3 b/man/io_uring_prep_bind.3 new file mode 100644 index 0000000..e2a1cf9 --- /dev/null +++ b/man/io_uring_prep_bind.3 @@ -0,0 +1,54 @@ +.\" Copyright (C) 2024 SUSE LLC +.\" +.\" SPDX-License-Identifier: LGPL-2.0-or-later +.\" +.TH io_uring_prep_bind 3 "Jun 3, 2024" "liburing-2.7" "liburing Manual" +.SH NAME +io_uring_prep_bind \- prepare a bind request +.SH SYNOPSIS +.nf +.B #include <sys/socket.h> +.B #include <liburing.h> +.PP +.BI "void io_uring_prep_bind(struct io_uring_sqe *" sqe "," +.BI " int " sockfd "," +.BI " struct sockaddr *" addr "," +.BI " socklen_t " addrlen ");" +.fi +.SH DESCRIPTION +The +.BR io_uring_prep_bind (3) +function prepares a bind request. The submission queue entry +.I sqe +is setup to assign the network address at +.IR addr , +of length +.IR addrlen , +to the socket descriptor +.IR sockfd. + +This function prepares an async +.BR bind (2) +request. See that man page for details. + +.SH RETURN VALUE +None +.SH ERRORS +The CQE +.I res +field will contain the result of the operation. See the related man page for +details on possible values. Note that where synchronous system calls will return +.B -1 +on failure and set +.I errno +to the actual error value, io_uring never uses +.IR errno . +Instead it returns the negated +.I errno +directly in the CQE +.I res +field. +.SH SEE ALSO +.BR io_uring_get_sqe (3), +.BR io_uring_submit (3), +.BR bind (2) -- 2.45.2 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH liburing v2 5/5] man/io_uring_prep_listen.3: Document IORING_OP_LISTEN operation 2024-07-23 23:17 [PATCH liburing v2 0/5] IORING_OP_BIND/LISTEN support Gabriel Krisman Bertazi ` (3 preceding siblings ...) 2024-07-23 23:17 ` [PATCH liburing v2 4/5] man/io_uring_prep_bind.3: Document the IORING_OP_BIND operation Gabriel Krisman Bertazi @ 2024-07-23 23:17 ` Gabriel Krisman Bertazi 2024-07-24 0:22 ` [PATCH liburing v2 0/5] IORING_OP_BIND/LISTEN support Jens Axboe 5 siblings, 0 replies; 7+ messages in thread From: Gabriel Krisman Bertazi @ 2024-07-23 23:17 UTC (permalink / raw) To: axboe; +Cc: io-uring, asml.silence, Gabriel Krisman Bertazi Signed-off-by: Gabriel Krisman Bertazi <[email protected]> --- man/io_uring_prep_listen.3 | 52 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 man/io_uring_prep_listen.3 diff --git a/man/io_uring_prep_listen.3 b/man/io_uring_prep_listen.3 new file mode 100644 index 0000000..b765298 --- /dev/null +++ b/man/io_uring_prep_listen.3 @@ -0,0 +1,52 @@ +.\" Copyright (C) 2024 SUSE LLC. +.\" +.\" SPDX-License-Identifier: LGPL-2.0-or-later +.\" +.TH io_uring_prep_listen 3 "Jun 3, 2024" "liburing-2.7" "liburing Manual" +.SH NAME +io_uring_prep_listen \- prepare a listen request +.SH SYNOPSIS +.nf +.B #include <sys/socket.h> +.B #include <liburing.h> +.PP +.BI "void io_uring_prep_listen(struct io_uring_sqe *" sqe "," +.BI " int " sockfd "," +.BI " int" backlog ");" +.fi +.SH DESCRIPTION +The +.BR io_uring_prep_listen (3) +function prepares a listen request. The submission queue entry +.I sqe +is setup to place the socket file descriptor pointed by +.IR sockfd +into a state to accept incoming connections. The parameter +.IR backlog , +defines the maximum length of the queue of pending connections. + +This function prepares an async +.BR listen (2) +request. See that man page for details. + +.SH RETURN VALUE +None +.SH ERRORS +The CQE +.I res +field will contain the result of the operation. See the related man page for +details on possible values. Note that where synchronous system calls will return +.B -1 +on failure and set +.I errno +to the actual error value, io_uring never uses +.IR errno . +Instead it returns the negated +.I errno +directly in the CQE +.I res +field. +.SH SEE ALSO +.BR io_uring_get_sqe (3), +.BR io_uring_submit (3), +.BR listen (2) -- 2.45.2 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH liburing v2 0/5] IORING_OP_BIND/LISTEN support 2024-07-23 23:17 [PATCH liburing v2 0/5] IORING_OP_BIND/LISTEN support Gabriel Krisman Bertazi ` (4 preceding siblings ...) 2024-07-23 23:17 ` [PATCH liburing v2 5/5] man/io_uring_prep_listen.3: Document IORING_OP_LISTEN operation Gabriel Krisman Bertazi @ 2024-07-24 0:22 ` Jens Axboe 5 siblings, 0 replies; 7+ messages in thread From: Jens Axboe @ 2024-07-24 0:22 UTC (permalink / raw) To: Gabriel Krisman Bertazi; +Cc: io-uring, asml.silence On Tue, 23 Jul 2024 19:17:28 -0400, Gabriel Krisman Bertazi wrote: > This is the v2 of userspace support for OP_BIND/OP_LISTEN with wrappers, > manpages and tests. > > Beyond the requested fixes in v1, I completely rewrote the testcase to > avoid pthreads and introduced more test cases. It also ensures the > testcase is properly skipped for older kernels. > > [...] Applied, thanks! [1/5] liburing: Add helper to prepare IORING_OP_BIND command commit: bf7c4f6b817c040bcc0215b43c64f95f1f50172a [2/5] liburing: Add helper to prepare IORING_OP_LISTEN command commit: 7d515bb6a639efc64849223e179ea5d54ceaad0b [3/5] tests: Add test for bind/listen commands commit: 3815f772333c81409b95903ea7382ec8c687c0f9 [4/5] man/io_uring_prep_bind.3: Document the IORING_OP_BIND operation commit: 7e9707fc3432b7c94fd2d59ad21bf105071660d8 [5/5] man/io_uring_prep_listen.3: Document IORING_OP_LISTEN operation commit: a877fb11036d7fd025f6129f54848363dc3b5b31 Best regards, -- Jens Axboe ^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2024-07-24 0:22 UTC | newest] Thread overview: 7+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2024-07-23 23:17 [PATCH liburing v2 0/5] IORING_OP_BIND/LISTEN support Gabriel Krisman Bertazi 2024-07-23 23:17 ` [PATCH liburing v2 1/5] liburing: Add helper to prepare IORING_OP_BIND command Gabriel Krisman Bertazi 2024-07-23 23:17 ` [PATCH liburing v2 2/5] liburing: Add helper to prepare IORING_OP_LISTEN command Gabriel Krisman Bertazi 2024-07-23 23:17 ` [PATCH liburing v2 3/5] tests: Add test for bind/listen commands Gabriel Krisman Bertazi 2024-07-23 23:17 ` [PATCH liburing v2 4/5] man/io_uring_prep_bind.3: Document the IORING_OP_BIND operation Gabriel Krisman Bertazi 2024-07-23 23:17 ` [PATCH liburing v2 5/5] man/io_uring_prep_listen.3: Document IORING_OP_LISTEN operation Gabriel Krisman Bertazi 2024-07-24 0:22 ` [PATCH liburing v2 0/5] IORING_OP_BIND/LISTEN support Jens Axboe
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox