public inbox for [email protected]
 help / color / mirror / Atom feed
* [PATCH liburing v2 0/3] single-issuer and poll benchmark
@ 2022-06-14 15:27 Pavel Begunkov
  2022-06-14 15:27 ` [PATCH liburing v2 1/3] io_uring: update headers with IORING_SETUP_SINGLE_ISSUER Pavel Begunkov
                   ` (3 more replies)
  0 siblings, 4 replies; 9+ messages in thread
From: Pavel Begunkov @ 2022-06-14 15:27 UTC (permalink / raw)
  To: io-uring; +Cc: Jens Axboe, asml.silence

Add some tests to check the kernel enforcing single-issuer right, and
add a simple poll benchmark, might be useful if we do poll changes.

v2:
    remove copy-pasted test comments
    fix poll-bench 'argc' build problem

Pavel Begunkov (3):
  io_uring: update headers with IORING_SETUP_SINGLE_ISSUER
  examples: add a simple single-shot poll benchmark
  tests: test IORING_SETUP_SINGLE_ISSUER

 examples/Makefile               |   3 +-
 examples/poll-bench.c           | 101 +++++++++++++++++++
 src/include/liburing/io_uring.h |   5 +-
 test/Makefile                   |   1 +
 test/single-issuer.c            | 169 ++++++++++++++++++++++++++++++++
 5 files changed, 277 insertions(+), 2 deletions(-)
 create mode 100644 examples/poll-bench.c
 create mode 100644 test/single-issuer.c

-- 
2.36.1


^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH liburing v2 1/3] io_uring: update headers with IORING_SETUP_SINGLE_ISSUER
  2022-06-14 15:27 [PATCH liburing v2 0/3] single-issuer and poll benchmark Pavel Begunkov
@ 2022-06-14 15:27 ` Pavel Begunkov
  2022-06-14 15:27 ` [PATCH liburing v2 2/3] examples: add a simple single-shot poll benchmark Pavel Begunkov
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 9+ messages in thread
From: Pavel Begunkov @ 2022-06-14 15:27 UTC (permalink / raw)
  To: io-uring; +Cc: Jens Axboe, asml.silence

Signed-off-by: Pavel Begunkov <[email protected]>
---
 src/include/liburing/io_uring.h | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/src/include/liburing/io_uring.h b/src/include/liburing/io_uring.h
index 15d9fbd..ee6ccc9 100644
--- a/src/include/liburing/io_uring.h
+++ b/src/include/liburing/io_uring.h
@@ -137,9 +137,12 @@ enum {
  * IORING_SQ_TASKRUN in the sq ring flags. Not valid with COOP_TASKRUN.
  */
 #define IORING_SETUP_TASKRUN_FLAG	(1U << 9)
-
 #define IORING_SETUP_SQE128		(1U << 10) /* SQEs are 128 byte */
 #define IORING_SETUP_CQE32		(1U << 11) /* CQEs are 32 byte */
+/*
+ * Only one task is allowed to submit requests
+ */
+#define IORING_SETUP_SINGLE_ISSUER	(1U << 12)
 
 enum io_uring_op {
 	IORING_OP_NOP,
-- 
2.36.1


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH liburing v2 2/3] examples: add a simple single-shot poll benchmark
  2022-06-14 15:27 [PATCH liburing v2 0/3] single-issuer and poll benchmark Pavel Begunkov
  2022-06-14 15:27 ` [PATCH liburing v2 1/3] io_uring: update headers with IORING_SETUP_SINGLE_ISSUER Pavel Begunkov
@ 2022-06-14 15:27 ` Pavel Begunkov
  2022-06-14 15:27 ` [PATCH liburing v2 3/3] tests: test IORING_SETUP_SINGLE_ISSUER Pavel Begunkov
  2022-06-14 15:30 ` [PATCH liburing v2 0/3] single-issuer and poll benchmark Jens Axboe
  3 siblings, 0 replies; 9+ messages in thread
From: Pavel Begunkov @ 2022-06-14 15:27 UTC (permalink / raw)
  To: io-uring; +Cc: Jens Axboe, asml.silence

Signed-off-by: Pavel Begunkov <[email protected]>
---
 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..66fd9e3
--- /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 = 30000;
+
+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.36.1


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH liburing v2 3/3] tests: test IORING_SETUP_SINGLE_ISSUER
  2022-06-14 15:27 [PATCH liburing v2 0/3] single-issuer and poll benchmark Pavel Begunkov
  2022-06-14 15:27 ` [PATCH liburing v2 1/3] io_uring: update headers with IORING_SETUP_SINGLE_ISSUER Pavel Begunkov
  2022-06-14 15:27 ` [PATCH liburing v2 2/3] examples: add a simple single-shot poll benchmark Pavel Begunkov
@ 2022-06-14 15:27 ` Pavel Begunkov
  2022-06-14 15:30 ` [PATCH liburing v2 0/3] single-issuer and poll benchmark Jens Axboe
  3 siblings, 0 replies; 9+ messages in thread
From: Pavel Begunkov @ 2022-06-14 15:27 UTC (permalink / raw)
  To: io-uring; +Cc: Jens Axboe, asml.silence

Signed-off-by: Pavel Begunkov <[email protected]>
---
 test/Makefile        |   1 +
 test/single-issuer.c | 169 +++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 170 insertions(+)
 create mode 100644 test/single-issuer.c

diff --git a/test/Makefile b/test/Makefile
index ab031e0..0750996 100644
--- a/test/Makefile
+++ b/test/Makefile
@@ -169,6 +169,7 @@ test_srcs := \
 	wakeup-hang.c \
 	xattr.c \
 	skip-cqe.c \
+	single-issuer.c \
 	# EOL
 
 
diff --git a/test/single-issuer.c b/test/single-issuer.c
new file mode 100644
index 0000000..a688626
--- /dev/null
+++ b/test/single-issuer.c
@@ -0,0 +1,169 @@
+/* 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"
+
+static pid_t pid;
+
+static pid_t fork_t(void)
+{
+	pid = fork();
+	if (pid == -1) {
+		fprintf(stderr, "fork failed\n");
+		exit(1);
+	}
+	return pid;
+}
+
+static int wait_child_t(void)
+{
+	int wstatus;
+
+	if (waitpid(pid, &wstatus, 0) == (pid_t)-1) {
+		perror("waitpid()");
+		exit(1);
+	}
+	if (!WIFEXITED(wstatus)) {
+		fprintf(stderr, "child failed %i\n", WEXITSTATUS(wstatus));
+		exit(1);
+	}
+
+	return WEXITSTATUS(wstatus);
+}
+
+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 0;
+
+	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 0;
+	} else if (ret) {
+		error(1, ret, "ring init (1) %i", ret);
+	}
+
+	/* 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 1;
+	}
+
+	/* 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);
+			exit(1);
+		}
+		exit(0);
+	} else {
+		if (wait_child_t())
+			return 1;
+	}
+	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);
+			exit(1);
+		}
+		exit(0);
+	} else {
+		if (wait_child_t())
+			return 1;
+	}
+	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);
+		exit(1);
+	}
+
+	if (!fork_t()) {
+		ret = try_submit(&ring);
+		if (ret) {
+			fprintf(stderr, "SQPOLL submit failed (child) %i\n", ret);
+			exit(1);
+		}
+		exit(0);
+	} else {
+		if (wait_child_t())
+			return 1;
+	}
+	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);
+			exit(1);
+		}
+		exit(0);
+	} else {
+		if (wait_child_t())
+			return 1;
+	}
+	io_uring_queue_exit(&ring);
+
+	return 0;
+}
-- 
2.36.1


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* Re: [PATCH liburing v2 0/3] single-issuer and poll benchmark
  2022-06-14 15:27 [PATCH liburing v2 0/3] single-issuer and poll benchmark Pavel Begunkov
                   ` (2 preceding siblings ...)
  2022-06-14 15:27 ` [PATCH liburing v2 3/3] tests: test IORING_SETUP_SINGLE_ISSUER Pavel Begunkov
@ 2022-06-14 15:30 ` Jens Axboe
  2022-06-14 15:48   ` Pavel Begunkov
  3 siblings, 1 reply; 9+ messages in thread
From: Jens Axboe @ 2022-06-14 15:30 UTC (permalink / raw)
  To: Pavel Begunkov, io-uring

On 6/14/22 9:27 AM, Pavel Begunkov wrote:
> Add some tests to check the kernel enforcing single-issuer right, and
> add a simple poll benchmark, might be useful if we do poll changes.

Should we add a benchmark/ or something directory rather than use
examples/ ?

I know Dylan was looking at that at one point. I don't feel too
strongly, as long as it doesn't go into test/.

-- 
Jens Axboe


^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH liburing v2 0/3] single-issuer and poll benchmark
  2022-06-14 15:30 ` [PATCH liburing v2 0/3] single-issuer and poll benchmark Jens Axboe
@ 2022-06-14 15:48   ` Pavel Begunkov
  2022-06-14 15:51     ` Jens Axboe
  0 siblings, 1 reply; 9+ messages in thread
From: Pavel Begunkov @ 2022-06-14 15:48 UTC (permalink / raw)
  To: Jens Axboe, io-uring

On 6/14/22 16:30, Jens Axboe wrote:
> On 6/14/22 9:27 AM, Pavel Begunkov wrote:
>> Add some tests to check the kernel enforcing single-issuer right, and
>> add a simple poll benchmark, might be useful if we do poll changes.
> 
> Should we add a benchmark/ or something directory rather than use
> examples/ ?
> 
> I know Dylan was looking at that at one point. I don't feel too
> strongly, as long as it doesn't go into test/.

I don't care much myself, I can respin it once (if) the kernel
side is queued.

-- 
Pavel Begunkov

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH liburing v2 0/3] single-issuer and poll benchmark
  2022-06-14 15:48   ` Pavel Begunkov
@ 2022-06-14 15:51     ` Jens Axboe
  2022-06-14 18:23       ` Dylan Yudaken
  0 siblings, 1 reply; 9+ messages in thread
From: Jens Axboe @ 2022-06-14 15:51 UTC (permalink / raw)
  To: Pavel Begunkov, io-uring; +Cc: Dylan Yudaken

On 6/14/22 9:48 AM, Pavel Begunkov wrote:
> On 6/14/22 16:30, Jens Axboe wrote:
>> On 6/14/22 9:27 AM, Pavel Begunkov wrote:
>>> Add some tests to check the kernel enforcing single-issuer right, and
>>> add a simple poll benchmark, might be useful if we do poll changes.
>>
>> Should we add a benchmark/ or something directory rather than use
>> examples/ ?
>>
>> I know Dylan was looking at that at one point. I don't feel too
>> strongly, as long as it doesn't go into test/.
> 
> I don't care much myself, I can respin it once (if) the kernel
> side is queued.

I'm leaning towards just using examples/ - but maybe Dylan had some
reasoning for the new directory. CC'ed.

-- 
Jens Axboe


^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH liburing v2 0/3] single-issuer and poll benchmark
  2022-06-14 15:51     ` Jens Axboe
@ 2022-06-14 18:23       ` Dylan Yudaken
  2022-06-15  6:24         ` Hao Xu
  0 siblings, 1 reply; 9+ messages in thread
From: Dylan Yudaken @ 2022-06-14 18:23 UTC (permalink / raw)
  To: [email protected], [email protected], [email protected]

On Tue, 2022-06-14 at 09:51 -0600, Jens Axboe wrote:
> On 6/14/22 9:48 AM, Pavel Begunkov wrote:
> > On 6/14/22 16:30, Jens Axboe wrote:
> > > On 6/14/22 9:27 AM, Pavel Begunkov wrote:
> > > > Add some tests to check the kernel enforcing single-issuer
> > > > right, and
> > > > add a simple poll benchmark, might be useful if we do poll
> > > > changes.
> > > 
> > > Should we add a benchmark/ or something directory rather than use
> > > examples/ ?
> > > 
> > > I know Dylan was looking at that at one point. I don't feel too
> > > strongly, as long as it doesn't go into test/.
> > 
> > I don't care much myself, I can respin it once (if) the kernel
> > side is queued.
> 
> I'm leaning towards just using examples/ - but maybe Dylan had some
> reasoning for the new directory. CC'ed.
> 

I wanted to have some common framework for benchmarks to make it easy
to write new ones and get some nice numbers. In that case it would make
sense for them to be in one place.

But I haven't finished it yet, so probably for now examples/ is best
and if/when I finish it I can port these over.


^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH liburing v2 0/3] single-issuer and poll benchmark
  2022-06-14 18:23       ` Dylan Yudaken
@ 2022-06-15  6:24         ` Hao Xu
  0 siblings, 0 replies; 9+ messages in thread
From: Hao Xu @ 2022-06-15  6:24 UTC (permalink / raw)
  To: Dylan Yudaken, [email protected], [email protected],
	[email protected]

On 6/15/22 02:23, Dylan Yudaken wrote:
> On Tue, 2022-06-14 at 09:51 -0600, Jens Axboe wrote:
>> On 6/14/22 9:48 AM, Pavel Begunkov wrote:
>>> On 6/14/22 16:30, Jens Axboe wrote:
>>>> On 6/14/22 9:27 AM, Pavel Begunkov wrote:
>>>>> Add some tests to check the kernel enforcing single-issuer
>>>>> right, and
>>>>> add a simple poll benchmark, might be useful if we do poll
>>>>> changes.
>>>>
>>>> Should we add a benchmark/ or something directory rather than use
>>>> examples/ ?
>>>>
>>>> I know Dylan was looking at that at one point. I don't feel too
>>>> strongly, as long as it doesn't go into test/.
>>>
>>> I don't care much myself, I can respin it once (if) the kernel
>>> side is queued.
>>
>> I'm leaning towards just using examples/ - but maybe Dylan had some
>> reasoning for the new directory. CC'ed.
>>
> 
> I wanted to have some common framework for benchmarks to make it easy
> to write new ones and get some nice numbers. In that case it would make
> sense for them to be in one place.

This sounds great, it's really nice to have a series of standard
performance tests rather than temporary tests created along with new
kernel patches. A framework is something nicer. Actually there are
people doing this though just a simple one, FWIW:

https://gitee.com/anolis/perf-test-for-io_uring

> 
> But I haven't finished it yet, so probably for now examples/ is best
> and if/when I finish it I can port these over.
> 


^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2022-06-15  6:24 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2022-06-14 15:27 [PATCH liburing v2 0/3] single-issuer and poll benchmark Pavel Begunkov
2022-06-14 15:27 ` [PATCH liburing v2 1/3] io_uring: update headers with IORING_SETUP_SINGLE_ISSUER Pavel Begunkov
2022-06-14 15:27 ` [PATCH liburing v2 2/3] examples: add a simple single-shot poll benchmark Pavel Begunkov
2022-06-14 15:27 ` [PATCH liburing v2 3/3] tests: test IORING_SETUP_SINGLE_ISSUER Pavel Begunkov
2022-06-14 15:30 ` [PATCH liburing v2 0/3] single-issuer and poll benchmark Jens Axboe
2022-06-14 15:48   ` Pavel Begunkov
2022-06-14 15:51     ` Jens Axboe
2022-06-14 18:23       ` Dylan Yudaken
2022-06-15  6:24         ` Hao Xu

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox