From: hexue <[email protected]>
To: [email protected], [email protected]
Cc: [email protected], [email protected],
hexue <[email protected]>
Subject: [PATCH liburing v2] test: add test cases for hybrid iopoll
Date: Thu, 14 Nov 2024 13:03:30 +0800 [thread overview]
Message-ID: <[email protected]> (raw)
In-Reply-To: CGME20241114050337epcas5p174214fb58aedefee4077447fa71b70f0@epcas5p1.samsung.com
Add a test file for hybrid iopoll to make sure it works safe.Test case
include basic read/write tests, and run in normal iopoll mode and
passthrough mode respectively.
--
changes since v1:
- remove iopoll-hybridpoll.c
- test hybrid poll with exsiting iopoll and io_uring_passthrough
- add a misconfiguration check
Signed-off-by: hexue <[email protected]>
---
man/io_uring_setup.2 | 10 +++++++++-
src/include/liburing/io_uring.h | 3 +++
src/setup.c | 4 ++++
test/io_uring_passthrough.c | 14 +++++++++-----
test/iopoll.c | 22 +++++++++++++---------
5 files changed, 38 insertions(+), 15 deletions(-)
diff --git a/man/io_uring_setup.2 b/man/io_uring_setup.2
index 2f87783..fa928fa 100644
--- a/man/io_uring_setup.2
+++ b/man/io_uring_setup.2
@@ -78,7 +78,15 @@ in question. For NVMe devices, the nvme driver must be loaded with the
parameter set to the desired number of polling queues. The polling queues
will be shared appropriately between the CPUs in the system, if the number
is less than the number of online CPU threads.
-
+.TP
+.B IORING_SETUP_HYBRID_IOPOLL
+This flag must setup with
+.B IORING_SETUP_IOPOLL
+flag. hybrid poll is a new
+feature baed on iopoll, this could be a suboptimal solution when running
+on a single thread, it offers higher performance than IRQ and lower CPU
+utilization than polling. Similarly, this feature also requires the devices
+to support polling configuration.
.TP
.B IORING_SETUP_SQPOLL
When this flag is specified, a kernel thread is created to perform
diff --git a/src/include/liburing/io_uring.h b/src/include/liburing/io_uring.h
index 20bc570..d16364c 100644
--- a/src/include/liburing/io_uring.h
+++ b/src/include/liburing/io_uring.h
@@ -200,6 +200,9 @@ enum io_uring_sqe_flags_bit {
*/
#define IORING_SETUP_NO_SQARRAY (1U << 16)
+/* Use hybrid poll in iopoll process */
+#define IORING_SETUP_HYBRID_IOPOLL (1U << 17)
+
enum io_uring_op {
IORING_OP_NOP,
IORING_OP_READV,
diff --git a/src/setup.c b/src/setup.c
index 073de50..d1a87aa 100644
--- a/src/setup.c
+++ b/src/setup.c
@@ -320,6 +320,10 @@ int __io_uring_queue_init_params(unsigned entries, struct io_uring *ring,
ring->int_flags |= INT_FLAG_APP_MEM;
}
+ if ((p->flags & (IORING_SETUP_IOPOLL|IORING_SETUP_HYBRID_IOPOLL)) ==
+ IORING_SETUP_HYBRID_IOPOLL)
+ return -EINVAL;
+
fd = __sys_io_uring_setup(entries, p);
if (fd < 0) {
if ((p->flags & IORING_SETUP_NO_MMAP) &&
diff --git a/test/io_uring_passthrough.c b/test/io_uring_passthrough.c
index f18a186..8604c42 100644
--- a/test/io_uring_passthrough.c
+++ b/test/io_uring_passthrough.c
@@ -254,7 +254,7 @@ err:
}
static int test_io(const char *file, int tc, int read, int sqthread,
- int fixed, int nonvec)
+ int fixed, int nonvec, int hybrid)
{
struct io_uring ring;
int ret, ring_flags = 0;
@@ -265,6 +265,9 @@ static int test_io(const char *file, int tc, int read, int sqthread,
if (sqthread)
ring_flags |= IORING_SETUP_SQPOLL;
+ if (hybrid)
+ ring_flags |= IORING_SETUP_IOPOLL | IORING_SETUP_HYBRID_IOPOLL;
+
ret = t_create_ring(64, &ring, ring_flags);
if (ret == T_SETUP_SKIP)
return 0;
@@ -449,18 +452,19 @@ int main(int argc, char *argv[])
vecs = t_create_buffers(BUFFERS, BS);
- for (i = 0; i < 16; i++) {
+ for (i = 0; i < 32; i++) {
int read = (i & 1) != 0;
int sqthread = (i & 2) != 0;
int fixed = (i & 4) != 0;
int nonvec = (i & 8) != 0;
+ int hybrid = (i & 16) != 0;
- ret = test_io(fname, i, read, sqthread, fixed, nonvec);
+ ret = test_io(fname, i, read, sqthread, fixed, nonvec, hybrid);
if (no_pt)
break;
if (ret) {
- fprintf(stderr, "test_io failed %d/%d/%d/%d\n",
- read, sqthread, fixed, nonvec);
+ fprintf(stderr, "test_io failed %d/%d/%d/%d%d\n",
+ read, sqthread, fixed, nonvec, hybrid);
goto err;
}
}
diff --git a/test/iopoll.c b/test/iopoll.c
index 2e0f7ea..0d7bd77 100644
--- a/test/iopoll.c
+++ b/test/iopoll.c
@@ -351,7 +351,7 @@ ok:
}
static int test_io(const char *file, int write, int sqthread, int fixed,
- int buf_select, int defer)
+ int hybrid, int buf_select, int defer)
{
struct io_uring ring;
int ret, ring_flags = IORING_SETUP_IOPOLL;
@@ -363,6 +363,9 @@ static int test_io(const char *file, int write, int sqthread, int fixed,
ring_flags |= IORING_SETUP_SINGLE_ISSUER |
IORING_SETUP_DEFER_TASKRUN;
+ if (hybrid)
+ ring_flags |= IORING_SETUP_HYBRID_IOPOLL;
+
ret = t_create_ring(64, &ring, ring_flags);
if (ret == T_SETUP_SKIP)
return 0;
@@ -418,22 +421,23 @@ int main(int argc, char *argv[])
vecs = t_create_buffers(BUFFERS, BS);
- nr = 32;
+ nr = 64;
if (no_buf_select)
- nr = 8;
- else if (!t_probe_defer_taskrun())
nr = 16;
+ else if (!t_probe_defer_taskrun())
+ nr = 32;
for (i = 0; i < nr; i++) {
int write = (i & 1) != 0;
int sqthread = (i & 2) != 0;
int fixed = (i & 4) != 0;
- int buf_select = (i & 8) != 0;
- int defer = (i & 16) != 0;
+ int hybrid = (i & 8) != 0;
+ int buf_select = (i & 16) != 0;
+ int defer = (i & 32) != 0;
- ret = test_io(fname, write, sqthread, fixed, buf_select, defer);
+ ret = test_io(fname, write, sqthread, fixed, hybrid, buf_select, defer);
if (ret) {
- fprintf(stderr, "test_io failed %d/%d/%d/%d/%d\n",
- write, sqthread, fixed, buf_select, defer);
+ fprintf(stderr, "test_io failed %d/%d/%d/%d/%d%d\n",
+ write, sqthread, fixed, hybrid, buf_select, defer);
goto err;
}
if (no_iopoll)
--
2.34.1
next parent reply other threads:[~2024-11-14 5:04 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <CGME20241114050337epcas5p174214fb58aedefee4077447fa71b70f0@epcas5p1.samsung.com>
2024-11-14 5:03 ` hexue [this message]
2024-11-14 15:21 ` [PATCH liburing v2] test: add test cases for hybrid iopoll Jens Axboe
[not found] ` <CGME20241115033450epcas5p10bdbbfa584b483d8822535d43da868d2@epcas5p1.samsung.com>
2024-11-15 3:34 ` Re: [PATCH liburing] " hexue
2024-11-15 15:40 ` Jens Axboe
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
[email protected] \
[email protected] \
[email protected] \
[email protected] \
[email protected] \
[email protected] \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox