io_uring/eventfd: move actual signaling part into separate helper
authorJens Axboe <axboe@kernel.dk>
Sat, 21 Sep 2024 07:59:49 +0000 (01:59 -0600)
committerJens Axboe <axboe@kernel.dk>
Tue, 29 Oct 2024 19:43:26 +0000 (13:43 -0600)
In preparation for using this from multiple spots, move the signaling
into a helper.

Link: https://lore.kernel.org/r/20240921080307.185186-4-axboe@kernel.dk
Signed-off-by: Jens Axboe <axboe@kernel.dk>
io_uring/eventfd.c

index 829873806f9f0f17cd498b9710de7002d95a69f3..58e76f4d1e0055cbd368e561890a11987f926ab2 100644 (file)
@@ -47,6 +47,22 @@ static void io_eventfd_put(struct io_ev_fd *ev_fd)
                call_rcu(&ev_fd->rcu, io_eventfd_free);
 }
 
+/*
+ * Returns true if the caller should put the ev_fd reference, false if not.
+ */
+static bool __io_eventfd_signal(struct io_ev_fd *ev_fd)
+{
+       if (eventfd_signal_allowed()) {
+               eventfd_signal_mask(ev_fd->cq_ev_fd, EPOLL_URING_WAKE);
+               return true;
+       }
+       if (!atomic_fetch_or(BIT(IO_EVENTFD_OP_SIGNAL_BIT), &ev_fd->ops)) {
+               call_rcu_hurry(&ev_fd->rcu, io_eventfd_do_signal);
+               return false;
+       }
+       return true;
+}
+
 void io_eventfd_signal(struct io_ring_ctx *ctx)
 {
        struct io_ev_fd *ev_fd = NULL;
@@ -73,16 +89,8 @@ void io_eventfd_signal(struct io_ring_ctx *ctx)
                return;
        if (!refcount_inc_not_zero(&ev_fd->refs))
                return;
-
-       if (likely(eventfd_signal_allowed())) {
-               eventfd_signal_mask(ev_fd->cq_ev_fd, EPOLL_URING_WAKE);
-       } else {
-               if (!atomic_fetch_or(BIT(IO_EVENTFD_OP_SIGNAL_BIT), &ev_fd->ops)) {
-                       call_rcu_hurry(&ev_fd->rcu, io_eventfd_do_signal);
-                       return;
-               }
-       }
-       io_eventfd_put(ev_fd);
+       if (__io_eventfd_signal(ev_fd))
+               io_eventfd_put(ev_fd);
 }
 
 void io_eventfd_flush_signal(struct io_ring_ctx *ctx)