* [PATCH liburing v2 0/2] single issuer tests and poll bench
@ 2022-07-22 10:37 Pavel Begunkov
2022-07-22 10:37 ` [PATCH liburing v2 1/2] examples: add a simple single-shot poll benchmark Pavel Begunkov
` (2 more replies)
0 siblings, 3 replies; 4+ messages in thread
From: Pavel Begunkov @ 2022-07-22 10:37 UTC (permalink / raw)
To: io-uring; +Cc: Jens Axboe, asml.silence
Add some IORING_SETUP_SINGLE_ISSUER testing and poll benchmark.
Pavel Begunkov (2):
examples: add a simple single-shot poll benchmark
tests: test IORING_SETUP_SINGLE_ISSUER
examples/Makefile | 3 +-
examples/poll-bench.c | 101 ++++++++++++++++++++++++++++
test/Makefile | 1 +
test/single-issuer.c | 153 ++++++++++++++++++++++++++++++++++++++++++
4 files changed, 257 insertions(+), 1 deletion(-)
create mode 100644 examples/poll-bench.c
create mode 100644 test/single-issuer.c
--
2.37.0
^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH liburing v2 1/2] examples: add a simple single-shot poll benchmark
2022-07-22 10:37 [PATCH liburing v2 0/2] single issuer tests and poll bench Pavel Begunkov
@ 2022-07-22 10:37 ` Pavel Begunkov
2022-07-22 10:37 ` [PATCH liburing v2 2/2] tests: test IORING_SETUP_SINGLE_ISSUER Pavel Begunkov
2022-07-22 15:21 ` [PATCH liburing v2 0/2] single issuer tests and poll bench Jens Axboe
2 siblings, 0 replies; 4+ messages in thread
From: Pavel Begunkov @ 2022-07-22 10:37 UTC (permalink / raw)
To: io-uring; +Cc: Jens Axboe, asml.silence
Signed-off-by: Pavel Begunkov <asml.silence@gmail.com>
---
examples/Makefile | 3 +-
examples/poll-bench.c | 101 ++++++++++++++++++++++++++++++++++++++++++
2 files changed, 103 insertions(+), 1 deletion(-)
create mode 100644 examples/poll-bench.c
diff --git a/examples/Makefile b/examples/Makefile
index 95a45f9..8e7067f 100644
--- a/examples/Makefile
+++ b/examples/Makefile
@@ -13,7 +13,8 @@ endif
example_srcs := \
io_uring-cp.c \
io_uring-test.c \
- link-cp.c
+ link-cp.c \
+ poll-bench.c
all_targets :=
diff --git a/examples/poll-bench.c b/examples/poll-bench.c
new file mode 100644
index 0000000..e3c0052
--- /dev/null
+++ b/examples/poll-bench.c
@@ -0,0 +1,101 @@
+/* SPDX-License-Identifier: MIT */
+#include <errno.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <string.h>
+#include <signal.h>
+#include <poll.h>
+#include <sys/time.h>
+#include <sys/wait.h>
+
+#include "liburing.h"
+
+static char buf[4096];
+static unsigned long runtime_ms = 10000;
+
+static unsigned long gettimeofday_ms(void)
+{
+ struct timeval tv;
+
+ gettimeofday(&tv, NULL);
+ return (tv.tv_sec * 1000) + (tv.tv_usec / 1000);
+}
+
+int main(void)
+{
+ unsigned long tstop;
+ unsigned long nr_reqs = 0;
+ struct io_uring_cqe *cqe;
+ struct io_uring_sqe *sqe;
+ struct io_uring ring;
+ int pipe1[2];
+ int ret, i, qd = 32;
+
+ if (pipe(pipe1) != 0) {
+ perror("pipe");
+ return 1;
+ }
+
+ ret = io_uring_queue_init(1024, &ring, IORING_SETUP_SINGLE_ISSUER);
+ if (ret == -EINVAL) {
+ fprintf(stderr, "can't single\n");
+ ret = io_uring_queue_init(1024, &ring, 0);
+ }
+ if (ret) {
+ fprintf(stderr, "child: ring setup failed: %d\n", ret);
+ return 1;
+ }
+
+ ret = io_uring_register_files(&ring, pipe1, 2);
+ if (ret < 0) {
+ fprintf(stderr, "io_uring_register_files failed\n");
+ return 1;
+ }
+
+ ret = io_uring_register_ring_fd(&ring);
+ if (ret < 0) {
+ fprintf(stderr, "io_uring_register_ring_fd failed\n");
+ return 1;
+ }
+
+ tstop = gettimeofday_ms() + runtime_ms;
+ do {
+ for (i = 0; i < qd; i++) {
+ sqe = io_uring_get_sqe(&ring);
+ io_uring_prep_poll_add(sqe, 0, POLLIN);
+ sqe->flags |= IOSQE_FIXED_FILE;
+ sqe->user_data = 1;
+ }
+
+ ret = io_uring_submit(&ring);
+ if (ret != qd) {
+ fprintf(stderr, "child: sqe submit failed: %d\n", ret);
+ return 1;
+ }
+
+ ret = write(pipe1[1], buf, 1);
+ if (ret != 1) {
+ fprintf(stderr, "write failed %i\n", errno);
+ return 1;
+ }
+ ret = read(pipe1[0], buf, 1);
+ if (ret != 1) {
+ fprintf(stderr, "read failed %i\n", errno);
+ return 1;
+ }
+
+ for (i = 0; i < qd; i++) {
+ ret = io_uring_wait_cqe(&ring, &cqe);
+ if (ret < 0) {
+ fprintf(stderr, "child: wait completion %d\n", ret);
+ break;
+ }
+ io_uring_cqe_seen(&ring, cqe);
+ nr_reqs++;
+ }
+ } while (gettimeofday_ms() < tstop);
+
+ fprintf(stderr, "requests/s: %lu\n", nr_reqs * 1000UL / runtime_ms);
+ return 0;
+}
--
2.37.0
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH liburing v2 2/2] tests: test IORING_SETUP_SINGLE_ISSUER
2022-07-22 10:37 [PATCH liburing v2 0/2] single issuer tests and poll bench Pavel Begunkov
2022-07-22 10:37 ` [PATCH liburing v2 1/2] examples: add a simple single-shot poll benchmark Pavel Begunkov
@ 2022-07-22 10:37 ` Pavel Begunkov
2022-07-22 15:21 ` [PATCH liburing v2 0/2] single issuer tests and poll bench Jens Axboe
2 siblings, 0 replies; 4+ messages in thread
From: Pavel Begunkov @ 2022-07-22 10:37 UTC (permalink / raw)
To: io-uring; +Cc: Jens Axboe, asml.silence
Signed-off-by: Pavel Begunkov <asml.silence@gmail.com>
---
test/Makefile | 1 +
test/single-issuer.c | 153 +++++++++++++++++++++++++++++++++++++++++++
2 files changed, 154 insertions(+)
create mode 100644 test/single-issuer.c
diff --git a/test/Makefile b/test/Makefile
index e958a35..8945368 100644
--- a/test/Makefile
+++ b/test/Makefile
@@ -174,6 +174,7 @@ test_srcs := \
wakeup-hang.c \
xattr.c \
skip-cqe.c \
+ single-issuer.c \
# EOL
all_targets :=
diff --git a/test/single-issuer.c b/test/single-issuer.c
new file mode 100644
index 0000000..3bbc6c4
--- /dev/null
+++ b/test/single-issuer.c
@@ -0,0 +1,153 @@
+/* SPDX-License-Identifier: MIT */
+#include <errno.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <string.h>
+#include <fcntl.h>
+#include <error.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+
+#include "liburing.h"
+#include "test.h"
+#include "helpers.h"
+
+static pid_t pid;
+
+static pid_t fork_t(void)
+{
+ pid = fork();
+ if (pid == -1) {
+ fprintf(stderr, "fork failed\n");
+ exit(T_EXIT_FAIL);
+ }
+ return pid;
+}
+
+static void wait_child_t(void)
+{
+ int wstatus;
+
+ if (waitpid(pid, &wstatus, 0) == (pid_t)-1) {
+ perror("waitpid()");
+ exit(T_EXIT_FAIL);
+ }
+ if (!WIFEXITED(wstatus)) {
+ fprintf(stderr, "child failed %i\n", WEXITSTATUS(wstatus));
+ exit(T_EXIT_FAIL);
+ }
+ if (WEXITSTATUS(wstatus))
+ exit(T_EXIT_FAIL);
+}
+
+static int try_submit(struct io_uring *ring)
+{
+ struct io_uring_cqe *cqe;
+ struct io_uring_sqe *sqe;
+ int ret;
+
+ sqe = io_uring_get_sqe(ring);
+ io_uring_prep_nop(sqe);
+ sqe->user_data = 42;
+
+ ret = io_uring_submit(ring);
+ if (ret < 0)
+ return ret;
+
+ if (ret != 1)
+ error(1, ret, "submit %i", ret);
+ ret = io_uring_wait_cqe(ring, &cqe);
+ if (ret)
+ error(1, ret, "wait fail %i", ret);
+
+ if (cqe->res || cqe->user_data != 42)
+ error(1, ret, "invalid cqe");
+
+ io_uring_cqe_seen(ring, cqe);
+ return 0;
+}
+
+int main(int argc, char *argv[])
+{
+ struct io_uring ring;
+ int ret;
+
+ if (argc > 1)
+ return T_EXIT_SKIP;
+
+ ret = io_uring_queue_init(8, &ring, IORING_SETUP_SINGLE_ISSUER);
+ if (ret == -EINVAL) {
+ fprintf(stderr, "SETUP_SINGLE_ISSUER is not supported, skip\n");
+ return T_EXIT_SKIP;
+ } else if (ret) {
+ fprintf(stderr, "io_uring_queue_init() failed %i\n", ret);
+ return T_EXIT_FAIL;
+ }
+
+ /* test that the creator iw allowed to submit */
+ ret = try_submit(&ring);
+ if (ret) {
+ fprintf(stderr, "the creater can't submit %i\n", ret);
+ return T_EXIT_FAIL;
+ }
+
+ /* test that a second submitter doesn't succeed */
+ if (!fork_t()) {
+ ret = try_submit(&ring);
+ if (ret != -EEXIST)
+ fprintf(stderr, "not owner child could submit %i\n", ret);
+ return ret != -EEXIST;
+ }
+ wait_child_t();
+ io_uring_queue_exit(&ring);
+
+ /* test that the first submitter but not creator can submit */
+ ret = io_uring_queue_init(8, &ring, IORING_SETUP_SINGLE_ISSUER);
+ if (ret)
+ error(1, ret, "ring init (2) %i", ret);
+
+ if (!fork_t()) {
+ ret = try_submit(&ring);
+ if (ret)
+ fprintf(stderr, "not owner child could submit %i\n", ret);
+ return !!ret;
+ }
+ wait_child_t();
+ io_uring_queue_exit(&ring);
+
+ /* test that anyone can submit to a SQPOLL|SINGLE_ISSUER ring */
+ ret = io_uring_queue_init(8, &ring, IORING_SETUP_SINGLE_ISSUER|IORING_SETUP_SQPOLL);
+ if (ret)
+ error(1, ret, "ring init (3) %i", ret);
+
+ ret = try_submit(&ring);
+ if (ret) {
+ fprintf(stderr, "SQPOLL submit failed (creator) %i\n", ret);
+ return T_EXIT_FAIL;
+ }
+
+ if (!fork_t()) {
+ ret = try_submit(&ring);
+ if (ret)
+ fprintf(stderr, "SQPOLL submit failed (child) %i\n", ret);
+ return !!ret;
+ }
+ wait_child_t();
+ io_uring_queue_exit(&ring);
+
+ /* test that IORING_ENTER_REGISTERED_RING doesn't break anything */
+ ret = io_uring_queue_init(8, &ring, IORING_SETUP_SINGLE_ISSUER);
+ if (ret)
+ error(1, ret, "ring init (4) %i", ret);
+
+ if (!fork_t()) {
+ ret = try_submit(&ring);
+ if (ret)
+ fprintf(stderr, "not owner child could submit %i\n", ret);
+ return !!ret;
+ }
+ wait_child_t();
+ io_uring_queue_exit(&ring);
+ return T_EXIT_PASS;
+}
--
2.37.0
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH liburing v2 0/2] single issuer tests and poll bench
2022-07-22 10:37 [PATCH liburing v2 0/2] single issuer tests and poll bench Pavel Begunkov
2022-07-22 10:37 ` [PATCH liburing v2 1/2] examples: add a simple single-shot poll benchmark Pavel Begunkov
2022-07-22 10:37 ` [PATCH liburing v2 2/2] tests: test IORING_SETUP_SINGLE_ISSUER Pavel Begunkov
@ 2022-07-22 15:21 ` Jens Axboe
2 siblings, 0 replies; 4+ messages in thread
From: Jens Axboe @ 2022-07-22 15:21 UTC (permalink / raw)
To: asml.silence, io-uring
On Fri, 22 Jul 2022 11:37:04 +0100, Pavel Begunkov wrote:
> Add some IORING_SETUP_SINGLE_ISSUER testing and poll benchmark.
>
> Pavel Begunkov (2):
> examples: add a simple single-shot poll benchmark
> tests: test IORING_SETUP_SINGLE_ISSUER
>
> examples/Makefile | 3 +-
> examples/poll-bench.c | 101 ++++++++++++++++++++++++++++
> test/Makefile | 1 +
> test/single-issuer.c | 153 ++++++++++++++++++++++++++++++++++++++++++
> 4 files changed, 257 insertions(+), 1 deletion(-)
> create mode 100644 examples/poll-bench.c
> create mode 100644 test/single-issuer.c
>
> [...]
Applied, thanks!
[1/2] examples: add a simple single-shot poll benchmark
commit: 8200139273363c9d30d6b2db187f33508b6cd49f
[2/2] tests: test IORING_SETUP_SINGLE_ISSUER
commit: bda30ea972839abdd1e7a0ecdef83e00ff9db7c8
Best regards,
--
Jens Axboe
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2022-07-22 15:21 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-07-22 10:37 [PATCH liburing v2 0/2] single issuer tests and poll bench Pavel Begunkov
2022-07-22 10:37 ` [PATCH liburing v2 1/2] examples: add a simple single-shot poll benchmark Pavel Begunkov
2022-07-22 10:37 ` [PATCH liburing v2 2/2] tests: test IORING_SETUP_SINGLE_ISSUER Pavel Begunkov
2022-07-22 15:21 ` [PATCH liburing v2 0/2] single issuer tests and poll bench Jens Axboe
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.