public inbox for [email protected]
 help / color / mirror / Atom feed
From: Dylan Yudaken <[email protected]>
To: Jens Axboe <[email protected]>,
	Pavel Begunkov <[email protected]>,
	<[email protected]>
Cc: <[email protected]>, Dylan Yudaken <[email protected]>
Subject: [PATCH liburing v2 03/12] add io_uring_submit_and_get_events and io_uring_get_events
Date: Thu, 1 Sep 2022 02:32:54 -0700	[thread overview]
Message-ID: <[email protected]> (raw)
In-Reply-To: <[email protected]>

With deferred task running, we would like to be able to combine submit
with get events (regardless of if there are CQE's available), or if there
is nothing to submit then simply do an enter with IORING_ENTER_GETEVENTS
set, in order to process any available work.

Expose these APIs

Signed-off-by: Dylan Yudaken <[email protected]>
---
 src/include/liburing.h |  2 ++
 src/queue.c            | 26 ++++++++++++++++++--------
 2 files changed, 20 insertions(+), 8 deletions(-)

diff --git a/src/include/liburing.h b/src/include/liburing.h
index 6e868472b77a..3c5097b255de 100644
--- a/src/include/liburing.h
+++ b/src/include/liburing.h
@@ -202,6 +202,8 @@ int io_uring_register_file_alloc_range(struct io_uring *ring,
 int io_uring_register_notifications(struct io_uring *ring, unsigned nr,
 				    struct io_uring_notification_slot *slots);
 int io_uring_unregister_notifications(struct io_uring *ring);
+int io_uring_get_events(struct io_uring *ring);
+int io_uring_submit_and_get_events(struct io_uring *ring);
 
 /*
  * io_uring syscalls.
diff --git a/src/queue.c b/src/queue.c
index a670a8ecd20d..b012a3dd950b 100644
--- a/src/queue.c
+++ b/src/queue.c
@@ -130,6 +130,15 @@ int __io_uring_get_cqe(struct io_uring *ring, struct io_uring_cqe **cqe_ptr,
 	return _io_uring_get_cqe(ring, cqe_ptr, &data);
 }
 
+int io_uring_get_events(struct io_uring *ring)
+{
+	int flags = IORING_ENTER_GETEVENTS;
+
+	if (ring->int_flags & INT_FLAG_REG_RING)
+		flags |= IORING_ENTER_REGISTERED_RING;
+	return __sys_io_uring_enter(ring->enter_ring_fd, 0, 0, flags, NULL);
+}
+
 /*
  * Fill in an array of IO completions up to count, if any are available.
  * Returns the amount of IO completions filled.
@@ -164,11 +173,7 @@ again:
 		return 0;
 
 	if (cq_ring_needs_flush(ring)) {
-		int flags = IORING_ENTER_GETEVENTS;
-
-		if (ring->int_flags & INT_FLAG_REG_RING)
-			flags |= IORING_ENTER_REGISTERED_RING;
-		__sys_io_uring_enter(ring->enter_ring_fd, 0, 0, flags, NULL);
+		io_uring_get_events(ring);
 		overflow_checked = true;
 		goto again;
 	}
@@ -340,9 +345,9 @@ int io_uring_wait_cqe_timeout(struct io_uring *ring,
  * Returns number of sqes submitted
  */
 static int __io_uring_submit(struct io_uring *ring, unsigned submitted,
-			     unsigned wait_nr)
+			     unsigned wait_nr, bool getevents)
 {
-	bool cq_needs_enter = wait_nr || cq_ring_needs_enter(ring);
+	bool cq_needs_enter = getevents || wait_nr || cq_ring_needs_enter(ring);
 	unsigned flags;
 	int ret;
 
@@ -363,7 +368,7 @@ static int __io_uring_submit(struct io_uring *ring, unsigned submitted,
 
 static int __io_uring_submit_and_wait(struct io_uring *ring, unsigned wait_nr)
 {
-	return __io_uring_submit(ring, __io_uring_flush_sq(ring), wait_nr);
+	return __io_uring_submit(ring, __io_uring_flush_sq(ring), wait_nr, false);
 }
 
 /*
@@ -386,6 +391,11 @@ int io_uring_submit_and_wait(struct io_uring *ring, unsigned wait_nr)
 	return __io_uring_submit_and_wait(ring, wait_nr);
 }
 
+int io_uring_submit_and_get_events(struct io_uring *ring)
+{
+	return __io_uring_submit(ring, __io_uring_flush_sq(ring), 0, true);
+}
+
 #ifdef LIBURING_INTERNAL
 struct io_uring_sqe *io_uring_get_sqe(struct io_uring *ring)
 {
-- 
2.30.2


  parent reply	other threads:[~2022-09-01  9:33 UTC|newest]

Thread overview: 18+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-09-01  9:32 [PATCH liburing v2 00/12] Defer taskrun changes Dylan Yudaken
2022-09-01  9:32 ` [PATCH liburing v2 01/12] Copy defer task run definition from kernel Dylan Yudaken
2022-09-01  9:32 ` [PATCH liburing v2 02/12] Add documentation for IORING_SETUP_DEFER_TASKRUN flag Dylan Yudaken
2022-09-01  9:32 ` Dylan Yudaken [this message]
2022-09-01 18:36   ` [PATCH liburing v2 03/12] add io_uring_submit_and_get_events and io_uring_get_events Jens Axboe
2022-09-05  8:31     ` Dylan Yudaken
2022-09-01  9:32 ` [PATCH liburing v2 04/12] add a t_probe_defer_taskrun helper function for tests Dylan Yudaken
2022-09-01  9:32 ` [PATCH liburing v2 05/12] update existing tests for defer taskrun Dylan Yudaken
2022-09-01  9:32 ` [PATCH liburing v2 06/12] add a defer-taskrun test Dylan Yudaken
2022-09-01  9:32 ` [PATCH liburing v2 07/12] update io_uring_enter.2 docs for IORING_FEAT_NODROP Dylan Yudaken
2022-09-01  9:32 ` [PATCH liburing v2 08/12] add docs for overflow lost errors Dylan Yudaken
2022-09-01  9:33 ` [PATCH liburing v2 09/12] expose CQ ring overflow state Dylan Yudaken
2022-09-01  9:33 ` [PATCH liburing v2 10/12] overflow: add tests Dylan Yudaken
2022-09-01  9:33 ` [PATCH liburing v2 11/12] file-verify test: log if short read Dylan Yudaken
2022-09-01  9:33 ` [PATCH liburing v2 12/12] shutdown test: bind to ephemeral port Dylan Yudaken
2022-09-01 11:44   ` Ammar Faizi
2022-09-01 12:54     ` Dylan Yudaken
2022-09-01 13:03       ` Ammar Faizi

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