* [PATCH liburing v2 0/5] liburing: add helpers to enable/disable eventfd notifications
@ 2020-05-20 17:07 Stefano Garzarella
2020-05-20 17:07 ` [PATCH liburing v2 1/5] Add CQ ring 'flags' field Stefano Garzarella
` (5 more replies)
0 siblings, 6 replies; 7+ messages in thread
From: Stefano Garzarella @ 2020-05-20 17:07 UTC (permalink / raw)
To: Jens Axboe; +Cc: linux-kernel, io-uring
This series is based on top of a new IORING_CQ_EVENTFD_DISABLED
flag available in the CQ ring flags.
I added io_uring_cq_eventfd_enabled() to get the status of eventfd
notifications, and io_uring_cq_eventfd_toggle() to disable/enabled
eventfd notifications.
I updated man pages and I added a eventfd-disable.c test case.
v1 -> v2:
- renamed io_uring_cq_eventfd_toggle()
- return EOPNOTSUPP only if we need to change the flag
Stefano Garzarella (5):
Add CQ ring 'flags' field
man/io_uring_setup.2: add 'flags' field in the struct
io_cqring_offsets
Add helpers to set and get eventfd notification status
man/io_uring_register.2: add IORING_CQ_EVENTFD_DISABLED description
Add test/eventfd-disable.c test case
.gitignore | 1 +
man/io_uring_register.2 | 8 ++
man/io_uring_setup.2 | 3 +-
src/include/liburing.h | 34 ++++++++
src/include/liburing/io_uring.h | 11 ++-
src/setup.c | 2 +
test/Makefile | 6 +-
test/eventfd-disable.c | 148 ++++++++++++++++++++++++++++++++
8 files changed, 209 insertions(+), 4 deletions(-)
create mode 100644 test/eventfd-disable.c
--
2.25.4
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH liburing v2 1/5] Add CQ ring 'flags' field
2020-05-20 17:07 [PATCH liburing v2 0/5] liburing: add helpers to enable/disable eventfd notifications Stefano Garzarella
@ 2020-05-20 17:07 ` Stefano Garzarella
2020-05-20 17:07 ` [PATCH liburing v2 2/5] man/io_uring_setup.2: add 'flags' field in the struct io_cqring_offsets Stefano Garzarella
` (4 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: Stefano Garzarella @ 2020-05-20 17:07 UTC (permalink / raw)
To: Jens Axboe; +Cc: linux-kernel, io-uring
io_uring provides the new CQ ring 'flags' field if 'cq_off.flags'
is not zero. In this case we set the 'cq->kflags' pointer, otherwise
it will be NULL.
Signed-off-by: Stefano Garzarella <[email protected]>
---
src/include/liburing.h | 1 +
src/include/liburing/io_uring.h | 4 +++-
src/setup.c | 2 ++
3 files changed, 6 insertions(+), 1 deletion(-)
diff --git a/src/include/liburing.h b/src/include/liburing.h
index 4311325..adc8db9 100644
--- a/src/include/liburing.h
+++ b/src/include/liburing.h
@@ -41,6 +41,7 @@ struct io_uring_cq {
unsigned *ktail;
unsigned *kring_mask;
unsigned *kring_entries;
+ unsigned *kflags;
unsigned *koverflow;
struct io_uring_cqe *cqes;
diff --git a/src/include/liburing/io_uring.h b/src/include/liburing/io_uring.h
index a279151..9860a8a 100644
--- a/src/include/liburing/io_uring.h
+++ b/src/include/liburing/io_uring.h
@@ -205,7 +205,9 @@ struct io_cqring_offsets {
__u32 ring_entries;
__u32 overflow;
__u32 cqes;
- __u64 resv[2];
+ __u32 flags;
+ __u32 resv1;
+ __u64 resv2;
};
/*
diff --git a/src/setup.c b/src/setup.c
index f783b6a..860c112 100644
--- a/src/setup.c
+++ b/src/setup.c
@@ -76,6 +76,8 @@ err:
cq->kring_entries = cq->ring_ptr + p->cq_off.ring_entries;
cq->koverflow = cq->ring_ptr + p->cq_off.overflow;
cq->cqes = cq->ring_ptr + p->cq_off.cqes;
+ if (p->cq_off.flags)
+ cq->kflags = cq->ring_ptr + p->cq_off.flags;
return 0;
}
--
2.25.4
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH liburing v2 2/5] man/io_uring_setup.2: add 'flags' field in the struct io_cqring_offsets
2020-05-20 17:07 [PATCH liburing v2 0/5] liburing: add helpers to enable/disable eventfd notifications Stefano Garzarella
2020-05-20 17:07 ` [PATCH liburing v2 1/5] Add CQ ring 'flags' field Stefano Garzarella
@ 2020-05-20 17:07 ` Stefano Garzarella
2020-05-20 17:07 ` [PATCH liburing v2 3/5] Add helpers to set and get eventfd notification status Stefano Garzarella
` (3 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: Stefano Garzarella @ 2020-05-20 17:07 UTC (permalink / raw)
To: Jens Axboe; +Cc: linux-kernel, io-uring
Signed-off-by: Stefano Garzarella <[email protected]>
---
man/io_uring_setup.2 | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/man/io_uring_setup.2 b/man/io_uring_setup.2
index d48bb32..c929cb7 100644
--- a/man/io_uring_setup.2
+++ b/man/io_uring_setup.2
@@ -325,7 +325,8 @@ struct io_cqring_offsets {
__u32 ring_entries;
__u32 overflow;
__u32 cqes;
- __u32 resv[4];
+ __u32 flags;
+ __u32 resv[3];
};
.EE
.in
--
2.25.4
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH liburing v2 3/5] Add helpers to set and get eventfd notification status
2020-05-20 17:07 [PATCH liburing v2 0/5] liburing: add helpers to enable/disable eventfd notifications Stefano Garzarella
2020-05-20 17:07 ` [PATCH liburing v2 1/5] Add CQ ring 'flags' field Stefano Garzarella
2020-05-20 17:07 ` [PATCH liburing v2 2/5] man/io_uring_setup.2: add 'flags' field in the struct io_cqring_offsets Stefano Garzarella
@ 2020-05-20 17:07 ` Stefano Garzarella
2020-05-20 17:07 ` [PATCH liburing v2 4/5] man/io_uring_register.2: add IORING_CQ_EVENTFD_DISABLED description Stefano Garzarella
` (2 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: Stefano Garzarella @ 2020-05-20 17:07 UTC (permalink / raw)
To: Jens Axboe; +Cc: linux-kernel, io-uring
This patch adds the new IORING_CQ_EVENTFD_DISABLED flag. It can be
used to disable/enable notifications from the kernel when a
request is completed and queued to the CQ ring.
We also add two helpers function to check if the notifications are
enabled and to toggle them.
If the kernel doesn't provide CQ ring flags, the notifications are
always enabled if an eventfd is registered.
Signed-off-by: Stefano Garzarella <[email protected]>
---
v1 -> v2:
- renamed io_uring_cq_eventfd_toggle()
- return EOPNOTSUPP only if we need to change the flag
---
src/include/liburing.h | 33 +++++++++++++++++++++++++++++++++
src/include/liburing/io_uring.h | 7 +++++++
2 files changed, 40 insertions(+)
diff --git a/src/include/liburing.h b/src/include/liburing.h
index adc8db9..0192b47 100644
--- a/src/include/liburing.h
+++ b/src/include/liburing.h
@@ -9,7 +9,9 @@ extern "C" {
#include <sys/socket.h>
#include <sys/uio.h>
#include <sys/stat.h>
+#include <errno.h>
#include <signal.h>
+#include <stdbool.h>
#include <inttypes.h>
#include <time.h>
#include "liburing/compat.h"
@@ -445,6 +447,37 @@ static inline unsigned io_uring_cq_ready(struct io_uring *ring)
return io_uring_smp_load_acquire(ring->cq.ktail) - *ring->cq.khead;
}
+static inline bool io_uring_cq_eventfd_enabled(struct io_uring *ring)
+{
+ if (!ring->cq.kflags)
+ return true;
+
+ return !(*ring->cq.kflags & IORING_CQ_EVENTFD_DISABLED);
+}
+
+static inline int io_uring_cq_eventfd_toggle(struct io_uring *ring,
+ bool enabled)
+{
+ uint32_t flags;
+
+ if (!!enabled == io_uring_cq_eventfd_enabled(ring))
+ return 0;
+
+ if (!ring->cq.kflags)
+ return -EOPNOTSUPP;
+
+ flags = *ring->cq.kflags;
+
+ if (enabled)
+ flags &= ~IORING_CQ_EVENTFD_DISABLED;
+ else
+ flags |= IORING_CQ_EVENTFD_DISABLED;
+
+ IO_URING_WRITE_ONCE(*ring->cq.kflags, flags);
+
+ return 0;
+}
+
/*
* Return an IO completion, waiting for 'wait_nr' completions if one isn't
* readily available. Returns 0 with cqe_ptr filled in on success, -errno on
diff --git a/src/include/liburing/io_uring.h b/src/include/liburing/io_uring.h
index 9860a8a..92c2269 100644
--- a/src/include/liburing/io_uring.h
+++ b/src/include/liburing/io_uring.h
@@ -210,6 +210,13 @@ struct io_cqring_offsets {
__u64 resv2;
};
+/*
+ * cq_ring->flags
+ */
+
+/* disable eventfd notifications */
+#define IORING_CQ_EVENTFD_DISABLED (1U << 0)
+
/*
* io_uring_enter(2) flags
*/
--
2.25.4
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH liburing v2 4/5] man/io_uring_register.2: add IORING_CQ_EVENTFD_DISABLED description
2020-05-20 17:07 [PATCH liburing v2 0/5] liburing: add helpers to enable/disable eventfd notifications Stefano Garzarella
` (2 preceding siblings ...)
2020-05-20 17:07 ` [PATCH liburing v2 3/5] Add helpers to set and get eventfd notification status Stefano Garzarella
@ 2020-05-20 17:07 ` Stefano Garzarella
2020-05-20 17:07 ` [PATCH liburing v2 5/5] Add test/eventfd-disable.c test case Stefano Garzarella
2020-05-20 17:12 ` [PATCH liburing v2 0/5] liburing: add helpers to enable/disable eventfd notifications Jens Axboe
5 siblings, 0 replies; 7+ messages in thread
From: Stefano Garzarella @ 2020-05-20 17:07 UTC (permalink / raw)
To: Jens Axboe; +Cc: linux-kernel, io-uring
Signed-off-by: Stefano Garzarella <[email protected]>
---
man/io_uring_register.2 | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/man/io_uring_register.2 b/man/io_uring_register.2
index e64f688..5022c03 100644
--- a/man/io_uring_register.2
+++ b/man/io_uring_register.2
@@ -168,6 +168,14 @@ must contain a pointer to the eventfd file descriptor, and
.I nr_args
must be 1. Available since 5.2.
+An application can temporarily disable notifications, coming through the
+registered eventfd, by setting the
+.B IORING_CQ_EVENTFD_DISABLED
+bit in the
+.I flags
+field of the CQ ring.
+Available since 5.8.
+
.TP
.B IORING_REGISTER_EVENTFD_ASYNC
This works just like
--
2.25.4
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH liburing v2 5/5] Add test/eventfd-disable.c test case
2020-05-20 17:07 [PATCH liburing v2 0/5] liburing: add helpers to enable/disable eventfd notifications Stefano Garzarella
` (3 preceding siblings ...)
2020-05-20 17:07 ` [PATCH liburing v2 4/5] man/io_uring_register.2: add IORING_CQ_EVENTFD_DISABLED description Stefano Garzarella
@ 2020-05-20 17:07 ` Stefano Garzarella
2020-05-20 17:12 ` [PATCH liburing v2 0/5] liburing: add helpers to enable/disable eventfd notifications Jens Axboe
5 siblings, 0 replies; 7+ messages in thread
From: Stefano Garzarella @ 2020-05-20 17:07 UTC (permalink / raw)
To: Jens Axboe; +Cc: linux-kernel, io-uring
This new test checks if the mechanism to enable/disable notifications
through eventfd when a request is completed works correctly.
Signed-off-by: Stefano Garzarella <[email protected]>
---
v1 -> v2:
- renamed io_uring_cq_eventfd_toggle()
---
.gitignore | 1 +
test/Makefile | 6 +-
test/eventfd-disable.c | 148 +++++++++++++++++++++++++++++++++++++++++
3 files changed, 153 insertions(+), 2 deletions(-)
create mode 100644 test/eventfd-disable.c
diff --git a/.gitignore b/.gitignore
index 19c47d9..fee76e8 100644
--- a/.gitignore
+++ b/.gitignore
@@ -40,6 +40,7 @@
/test/defer
/test/eeed8b54e0df-test
/test/eventfd
+/test/eventfd-disable
/test/eventfd-ring
/test/fadvise
/test/fallocate
diff --git a/test/Makefile b/test/Makefile
index 61825d1..7df550d 100644
--- a/test/Makefile
+++ b/test/Makefile
@@ -21,7 +21,8 @@ all_targets += poll poll-cancel ring-leak fsync io_uring_setup io_uring_register
file-update accept-reuse poll-v-poll fadvise madvise \
short-read openat2 probe shared-wq personality eventfd \
send_recv eventfd-ring across-fork sq-poll-kthread splice \
- lfs-openat lfs-openat-write iopoll d4ae271dfaae-test
+ lfs-openat lfs-openat-write iopoll d4ae271dfaae-test \
+ eventfd-disable
include ../Makefile.quiet
@@ -53,7 +54,8 @@ test_srcs := poll.c poll-cancel.c ring-leak.c fsync.c io_uring_setup.c \
file-update.c accept-reuse.c poll-v-poll.c fadvise.c \
madvise.c short-read.c openat2.c probe.c shared-wq.c \
personality.c eventfd.c eventfd-ring.c across-fork.c sq-poll-kthread.c \
- splice.c lfs-openat.c lfs-openat-write.c iopoll.c d4ae271dfaae-test.c
+ splice.c lfs-openat.c lfs-openat-write.c iopoll.c d4ae271dfaae-test.c \
+ eventfd-disable.c
ifdef CONFIG_HAVE_STATX
test_srcs += statx.c
diff --git a/test/eventfd-disable.c b/test/eventfd-disable.c
new file mode 100644
index 0000000..ad086d4
--- /dev/null
+++ b/test/eventfd-disable.c
@@ -0,0 +1,148 @@
+/* SPDX-License-Identifier: MIT */
+/*
+ * Description: test disable/enable notifications through eventfd
+ *
+ */
+#include <errno.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <string.h>
+#include <fcntl.h>
+#include <sys/poll.h>
+#include <sys/eventfd.h>
+
+#include "liburing.h"
+
+int main(int argc, char *argv[])
+{
+ struct io_uring_params p = {};
+ struct io_uring_sqe *sqe;
+ struct io_uring_cqe *cqe;
+ struct io_uring ring;
+ uint64_t ptr;
+ struct iovec vec = {
+ .iov_base = &ptr,
+ .iov_len = sizeof(ptr)
+ };
+ int ret, evfd, i;
+
+ ret = io_uring_queue_init_params(64, &ring, &p);
+ if (ret) {
+ fprintf(stderr, "ring setup failed: %d\n", ret);
+ return 1;
+ }
+
+ evfd = eventfd(0, EFD_CLOEXEC);
+ if (evfd < 0) {
+ perror("eventfd");
+ return 1;
+ }
+
+ ret = io_uring_register_eventfd(&ring, evfd);
+ if (ret) {
+ fprintf(stderr, "failed to register evfd: %d\n", ret);
+ return 1;
+ }
+
+ if (!io_uring_cq_eventfd_enabled(&ring)) {
+ fprintf(stderr, "eventfd disabled\n");
+ return 1;
+ }
+
+ ret = io_uring_cq_eventfd_toggle(&ring, false);
+ if (ret) {
+ fprintf(stdout, "Skipping, CQ flags not available!\n");
+ return 0;
+ }
+
+ sqe = io_uring_get_sqe(&ring);
+ io_uring_prep_readv(sqe, evfd, &vec, 1, 0);
+ sqe->user_data = 1;
+
+ ret = io_uring_submit(&ring);
+ if (ret != 1) {
+ fprintf(stderr, "submit: %d\n", ret);
+ return 1;
+ }
+
+ for (i = 0; i < 63; i++) {
+ sqe = io_uring_get_sqe(&ring);
+ io_uring_prep_nop(sqe);
+ sqe->user_data = 2;
+ }
+
+ ret = io_uring_submit(&ring);
+ if (ret != 63) {
+ fprintf(stderr, "submit: %d\n", ret);
+ return 1;
+ }
+
+ for (i = 0; i < 63; i++) {
+ ret = io_uring_wait_cqe(&ring, &cqe);
+ if (ret) {
+ fprintf(stderr, "wait: %d\n", ret);
+ return 1;
+ }
+
+ switch (cqe->user_data) {
+ case 1: /* eventfd */
+ fprintf(stderr, "eventfd unexpected: %d\n", (int)ptr);
+ return 1;
+ case 2:
+ if (cqe->res) {
+ fprintf(stderr, "nop: %d\n", cqe->res);
+ return 1;
+ }
+ break;
+ }
+ io_uring_cqe_seen(&ring, cqe);
+ }
+
+ ret = io_uring_cq_eventfd_toggle(&ring, true);
+ if (ret) {
+ fprintf(stderr, "io_uring_cq_eventfd_toggle: %d\n", ret);
+ return 1;
+ }
+
+ sqe = io_uring_get_sqe(&ring);
+ io_uring_prep_nop(sqe);
+ sqe->user_data = 2;
+
+ ret = io_uring_submit(&ring);
+ if (ret != 1) {
+ fprintf(stderr, "submit: %d\n", ret);
+ return 1;
+ }
+
+ for (i = 0; i < 2; i++) {
+ ret = io_uring_wait_cqe(&ring, &cqe);
+ if (ret) {
+ fprintf(stderr, "wait: %d\n", ret);
+ return 1;
+ }
+
+ switch (cqe->user_data) {
+ case 1: /* eventfd */
+ if (cqe->res != sizeof(ptr)) {
+ fprintf(stderr, "read res: %d\n", cqe->res);
+ return 1;
+ }
+
+ if (ptr != 1) {
+ fprintf(stderr, "eventfd: %d\n", (int)ptr);
+ return 1;
+ }
+ break;
+ case 2:
+ if (cqe->res) {
+ fprintf(stderr, "nop: %d\n", cqe->res);
+ return 1;
+ }
+ break;
+ }
+ io_uring_cqe_seen(&ring, cqe);
+ }
+
+ return 0;
+}
--
2.25.4
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH liburing v2 0/5] liburing: add helpers to enable/disable eventfd notifications
2020-05-20 17:07 [PATCH liburing v2 0/5] liburing: add helpers to enable/disable eventfd notifications Stefano Garzarella
` (4 preceding siblings ...)
2020-05-20 17:07 ` [PATCH liburing v2 5/5] Add test/eventfd-disable.c test case Stefano Garzarella
@ 2020-05-20 17:12 ` Jens Axboe
5 siblings, 0 replies; 7+ messages in thread
From: Jens Axboe @ 2020-05-20 17:12 UTC (permalink / raw)
To: Stefano Garzarella; +Cc: linux-kernel, io-uring
On 5/20/20 11:07 AM, Stefano Garzarella wrote:
> This series is based on top of a new IORING_CQ_EVENTFD_DISABLED
> flag available in the CQ ring flags.
>
> I added io_uring_cq_eventfd_enabled() to get the status of eventfd
> notifications, and io_uring_cq_eventfd_toggle() to disable/enabled
> eventfd notifications.
>
> I updated man pages and I added a eventfd-disable.c test case.
>
> v1 -> v2:
> - renamed io_uring_cq_eventfd_toggle()
> - return EOPNOTSUPP only if we need to change the flag
Applied, thanks.
--
Jens Axboe
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2020-05-20 17:14 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2020-05-20 17:07 [PATCH liburing v2 0/5] liburing: add helpers to enable/disable eventfd notifications Stefano Garzarella
2020-05-20 17:07 ` [PATCH liburing v2 1/5] Add CQ ring 'flags' field Stefano Garzarella
2020-05-20 17:07 ` [PATCH liburing v2 2/5] man/io_uring_setup.2: add 'flags' field in the struct io_cqring_offsets Stefano Garzarella
2020-05-20 17:07 ` [PATCH liburing v2 3/5] Add helpers to set and get eventfd notification status Stefano Garzarella
2020-05-20 17:07 ` [PATCH liburing v2 4/5] man/io_uring_register.2: add IORING_CQ_EVENTFD_DISABLED description Stefano Garzarella
2020-05-20 17:07 ` [PATCH liburing v2 5/5] Add test/eventfd-disable.c test case Stefano Garzarella
2020-05-20 17:12 ` [PATCH liburing v2 0/5] liburing: add helpers to enable/disable eventfd notifications Jens Axboe
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox