io_uring: tweak iopoll CQE_SKIP event counting
authorPavel Begunkov <asml.silence@gmail.com>
Sun, 5 Dec 2021 14:37:59 +0000 (14:37 +0000)
committerJens Axboe <axboe@kernel.dk>
Sun, 5 Dec 2021 15:56:24 +0000 (08:56 -0700)
When iopolling the userspace specifies the minimum number of "events" it
expects. Previously, we had one CQE per request, so the definition of
an "event" was unequivocal, but that's not more the case anymore with
REQ_F_CQE_SKIP.

Currently it counts the number of completed requests, replace it with
the number of posted CQEs. This allows users of the "one CQE per link"
scheme to wait for all N links in a single syscall, which is not
possible without the patch and requires extra context switches.

Signed-off-by: Pavel Begunkov <asml.silence@gmail.com>
Link: https://lore.kernel.org/r/d5a965c4d2249827392037bbd0186f87fea49c55.1638714983.git.asml.silence@gmail.com
Signed-off-by: Jens Axboe <axboe@kernel.dk>
fs/io_uring.c

index 64add8260abba89ce522c8122e9d4ed86b902ef5..ea7a0daa0b3bdc241fd8493a28027b4b3df5a5c3 100644 (file)
@@ -2538,10 +2538,10 @@ static int io_do_iopoll(struct io_ring_ctx *ctx, bool force_nonspin)
                /* order with io_complete_rw_iopoll(), e.g. ->result updates */
                if (!smp_load_acquire(&req->iopoll_completed))
                        break;
+               if (unlikely(req->flags & REQ_F_CQE_SKIP))
+                       continue;
 
-               if (!(req->flags & REQ_F_CQE_SKIP))
-                       __io_fill_cqe(ctx, req->user_data, req->result,
-                                     io_put_kbuf(req));
+               __io_fill_cqe(ctx, req->user_data, req->result, io_put_kbuf(req));
                nr_events++;
        }