Messages in this thread | | | Date | Sat, 7 May 2022 10:29:58 +0100 | Subject | Re: [PATCH 4/5] io_uring: add a helper for poll clean | From | Pavel Begunkov <> |
| |
On 5/7/22 07:43, Hao Xu wrote: > 在 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..
Ok, see it now, probably confused REQ_F_APOLL_MULTI_POLLED on the right hand side with something else
>> 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); >> >
-- Pavel Begunkov
| |