summaryrefslogtreecommitdiffstats
path: root/io_uring/poll.c
diff options
context:
space:
mode:
authorPavel Begunkov <asml.silence@gmail.com>2022-06-23 15:24:47 +0200
committerJens Axboe <axboe@kernel.dk>2022-07-25 02:39:16 +0200
commit063a007996bf725ba4c7d8741701670be9858300 (patch)
tree30c07b559342b3e7201f4993886936d9c9db5789 /io_uring/poll.c
parentio_uring: add a helper for apoll alloc (diff)
downloadlinux-063a007996bf725ba4c7d8741701670be9858300.tar.xz
linux-063a007996bf725ba4c7d8741701670be9858300.zip
io_uring: change arm poll return values
The rules for __io_arm_poll_handler()'s result parsing are complicated, as the first step don't pass return a mask but pass back a positive return code and fill ipt->result_mask. Signed-off-by: Pavel Begunkov <asml.silence@gmail.com> Link: https://lore.kernel.org/r/529e29e9f97f2e6e383ccd44234d8b576a83a921.1655990418.git.asml.silence@gmail.com Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'io_uring/poll.c')
-rw-r--r--io_uring/poll.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/io_uring/poll.c b/io_uring/poll.c
index aef77f2a8a9a..80113b036c88 100644
--- a/io_uring/poll.c
+++ b/io_uring/poll.c
@@ -34,6 +34,8 @@ struct io_poll_table {
struct io_kiocb *req;
int nr_entries;
int error;
+ /* output value, set only if arm poll returns >0 */
+ __poll_t result_mask;
};
#define IO_POLL_CANCEL_FLAG BIT(31)
@@ -462,8 +464,9 @@ static int __io_arm_poll_handler(struct io_kiocb *req,
if (mask &&
((poll->events & (EPOLLET|EPOLLONESHOT)) == (EPOLLET|EPOLLONESHOT))) {
io_poll_remove_entries(req);
+ ipt->result_mask = mask;
/* no one else has access to the req, forget about the ref */
- return mask;
+ return 1;
}
if (!mask && unlikely(ipt->error || !ipt->nr_entries)) {
@@ -813,7 +816,7 @@ int io_poll_add(struct io_kiocb *req, unsigned int issue_flags)
ret = __io_arm_poll_handler(req, poll, &ipt, poll->events);
if (ret) {
- io_req_set_res(req, ret, 0);
+ io_req_set_res(req, ipt.result_mask, 0);
return IOU_OK;
}
if (ipt.error) {