Messages in this thread | | | Date | Sat, 7 May 2022 14:43:01 +0800 | Subject | Re: [PATCH 4/5] io_uring: add a helper for poll clean | From | Hao Xu <> |
| |
在 2022/5/7 上午12:22, Pavel Begunkov 写道: > On 5/6/22 08:01, Hao Xu wrote: >> From: Hao Xu <howeyxu@tencent.com> >> >> Add a helper for poll clean, it will be used in the multishot accept in >> the later patches. >> >> Signed-off-by: Hao Xu <howeyxu@tencent.com> >> --- >> fs/io_uring.c | 23 ++++++++++++++++++----- >> 1 file changed, 18 insertions(+), 5 deletions(-) >> >> diff --git a/fs/io_uring.c b/fs/io_uring.c >> index d33777575faf..0a83ecc457d1 100644 >> --- a/fs/io_uring.c >> +++ b/fs/io_uring.c >> @@ -5711,6 +5711,23 @@ static int io_accept_prep(struct io_kiocb *req, >> const struct io_uring_sqe *sqe) >> return 0; >> } >> +static inline void __io_poll_clean(struct io_kiocb *req) >> +{ >> + struct io_ring_ctx *ctx = req->ctx; >> + >> + io_poll_remove_entries(req); >> + spin_lock(&ctx->completion_lock); >> + hash_del(&req->hash_node); >> + spin_unlock(&ctx->completion_lock); >> +} >> + >> +#define REQ_F_APOLL_MULTI_POLLED (REQ_F_APOLL_MULTISHOT | REQ_F_POLLED) >> +static inline void io_poll_clean(struct io_kiocb *req) >> +{ >> + if ((req->flags & REQ_F_APOLL_MULTI_POLLED) == >> REQ_F_APOLL_MULTI_POLLED) > > So it triggers for apoll multishot only when REQ_F_POLLED is _not_ set, > but if it's not set it did never go through arm_poll / etc. and there is > nothing to clean up. What is the catch?
No, it is triggered for apoll multishot only when REQ_F_POLLED is set.. > > btw, don't see the function used in this patch, better to add it later > or at least mark with attribute unused, or some may get build failures. Gotcha. > > >> + __io_poll_clean(req); >> +} >> + >> static int io_accept(struct io_kiocb *req, unsigned int issue_flags) >> { >> struct io_accept *accept = &req->accept; >> @@ -6041,17 +6058,13 @@ static void io_poll_task_func(struct io_kiocb >> *req, bool *locked) >> static void io_apoll_task_func(struct io_kiocb *req, bool *locked) >> { >> - struct io_ring_ctx *ctx = req->ctx; >> int ret; >> ret = io_poll_check_events(req, locked); >> if (ret > 0) >> return; >> - io_poll_remove_entries(req); >> - spin_lock(&ctx->completion_lock); >> - hash_del(&req->hash_node); >> - spin_unlock(&ctx->completion_lock); >> + __io_poll_clean(req); >> if (!ret) >> io_req_task_submit(req, locked); >
| |