io_uring: propagate locking state to poll cancel
authorPavel Begunkov <asml.silence@gmail.com>
Thu, 16 Jun 2022 09:22:11 +0000 (10:22 +0100)
committerJens Axboe <axboe@kernel.dk>
Mon, 25 Jul 2022 00:39:13 +0000 (18:39 -0600)
Poll cancellation will be soon need to grab ->uring_lock inside, pass
the locking state, i.e. issue_flags, inside the cancellation functions.

Signed-off-by: Pavel Begunkov <asml.silence@gmail.com>
Link: https://lore.kernel.org/r/b86781d047727c07163443b57551a3fa57c7c5e1.1655371007.git.asml.silence@gmail.com
Reviewed-by: Hao Xu <howeyxu@tencent.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
io_uring/cancel.c
io_uring/cancel.h
io_uring/poll.c
io_uring/poll.h
io_uring/timeout.c

index f28f0a7d127240dc65be01a666f1d3048b761249..f07bfd27c98ac2f7813d6e44b63119152f144d48 100644 (file)
@@ -78,7 +78,8 @@ static int io_async_cancel_one(struct io_uring_task *tctx,
        return ret;
 }
 
-int io_try_cancel(struct io_kiocb *req, struct io_cancel_data *cd)
+int io_try_cancel(struct io_kiocb *req, struct io_cancel_data *cd,
+                 unsigned issue_flags)
 {
        struct io_ring_ctx *ctx = req->ctx;
        int ret;
@@ -93,7 +94,7 @@ int io_try_cancel(struct io_kiocb *req, struct io_cancel_data *cd)
        if (!ret)
                return 0;
 
-       ret = io_poll_cancel(ctx, cd);
+       ret = io_poll_cancel(ctx, cd, issue_flags);
        if (ret != -ENOENT)
                return ret;
 
@@ -136,7 +137,7 @@ static int __io_async_cancel(struct io_cancel_data *cd, struct io_kiocb *req,
        int ret, nr = 0;
 
        do {
-               ret = io_try_cancel(req, cd);
+               ret = io_try_cancel(req, cd, issue_flags);
                if (ret == -ENOENT)
                        break;
                if (!all)
index fd4cb1a2595de5171aeb95ed9a41620d19fb3245..8dd259dc383e2c33e7eea85ed375954b6160dd2c 100644 (file)
@@ -3,5 +3,6 @@
 int io_async_cancel_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe);
 int io_async_cancel(struct io_kiocb *req, unsigned int issue_flags);
 
-int io_try_cancel(struct io_kiocb *req, struct io_cancel_data *cd);
+int io_try_cancel(struct io_kiocb *req, struct io_cancel_data *cd,
+                 unsigned int issue_flags);
 void init_hash_table(struct io_hash_table *table, unsigned size);
index ea6466388ed9efd139f3ae25deed6aee9f0fe2f9..c4edf8794538c8b90cbd261d1d225bf1defe69f0 100644 (file)
@@ -649,7 +649,8 @@ static int __io_poll_cancel(struct io_ring_ctx *ctx, struct io_cancel_data *cd,
        return req ? 0 : -ENOENT;
 }
 
-int io_poll_cancel(struct io_ring_ctx *ctx, struct io_cancel_data *cd)
+int io_poll_cancel(struct io_ring_ctx *ctx, struct io_cancel_data *cd,
+                  unsigned issue_flags)
 {
        return __io_poll_cancel(ctx, cd, &ctx->cancel_table);
 }
index cc75c1567a84ae42bd274d7ac5879eb13c47f1cb..fa3e19790281b286cc1ce812fabe492380394297 100644 (file)
@@ -24,7 +24,8 @@ int io_poll_add(struct io_kiocb *req, unsigned int issue_flags);
 int io_poll_remove_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe);
 int io_poll_remove(struct io_kiocb *req, unsigned int issue_flags);
 
-int io_poll_cancel(struct io_ring_ctx *ctx, struct io_cancel_data *cd);
+int io_poll_cancel(struct io_ring_ctx *ctx, struct io_cancel_data *cd,
+                  unsigned issue_flags);
 int io_arm_poll_handler(struct io_kiocb *req, unsigned issue_flags);
 bool io_poll_remove_all(struct io_ring_ctx *ctx, struct task_struct *tsk,
                        bool cancel_all);
index 69cca42d6835b4b30ed6c8e122761f7f9faa0e84..526fc8b2e3b65deb3ca9b98664b850e94c0966ae 100644 (file)
@@ -262,6 +262,7 @@ int io_timeout_cancel(struct io_ring_ctx *ctx, struct io_cancel_data *cd)
 
 static void io_req_task_link_timeout(struct io_kiocb *req, bool *locked)
 {
+       unsigned issue_flags = *locked ? 0 : IO_URING_F_UNLOCKED;
        struct io_timeout *timeout = io_kiocb_to_cmd(req);
        struct io_kiocb *prev = timeout->prev;
        int ret = -ENOENT;
@@ -273,7 +274,7 @@ static void io_req_task_link_timeout(struct io_kiocb *req, bool *locked)
                                .data           = prev->cqe.user_data,
                        };
 
-                       ret = io_try_cancel(req, &cd);
+                       ret = io_try_cancel(req, &cd, issue_flags);
                }
                io_req_set_res(req, ret ?: -ETIME, 0);
                io_req_complete_post(req);