On 30/06/2020 15:41, Xuan Zhuo wrote: > For example, there are multiple sqes recv with the same connection. > When there is no data in the connection, the reqs of these sqes will > be armed poll. Then if only a little data is received, only one req > receives the data, and the other reqs get EAGAIN again. However, > due to this flags REQ_F_POLLED, these reqs cannot enter the > io_arm_poll_handler function. These reqs will be put into wq by > io_queue_async_work, and the flags passed by io_wqe_worker when recv > is called are BLOCK, which may make io_wqe_worker enter schedule in the > network protocol stack. When the main process of io_uring exits, > these io_wqe_workers still cannot exit. The connection will not be > actively released until the connection is closed by the peer. It's a problem unrelated to polling, though it may be a nice optimisation. E.g. requests submitted with IOSQE_ASYNC will always get into io-wq. Have you seen it yourself? When, io_uring is going away, it calls io_wq_cancel_all(), which do send_sig(SIGINT) for all its workers. The question is why this doesn't halt inflight send/recv down in the network stack? > > So we should allow req to arm poll again. > > Signed-off-by: Xuan Zhuo <xuanzhuo@xxxxxxxxxxxxxxxxx> > --- > fs/io_uring.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/fs/io_uring.c b/fs/io_uring.c > index e507737..a309832 100644 > --- a/fs/io_uring.c > +++ b/fs/io_uring.c > @@ -4406,7 +4406,7 @@ static bool io_arm_poll_handler(struct io_kiocb *req) > > if (!req->file || !file_can_poll(req->file)) > return false; > - if (req->flags & (REQ_F_MUST_PUNT | REQ_F_POLLED)) > + if (req->flags & REQ_F_MUST_PUNT) You have a bit outdated sources. > return false; > if (!def->pollin && !def->pollout) > return false; > -- Pavel Begunkov