On 8/21/20 8:04 PM, Luke Hsiao wrote: > From: Luke Hsiao <lukehs...@google.com> > > Currently, io_uring's recvmsg subscribes to both POLLERR and POLLIN. In > the context of TCP tx zero-copy, this is inefficient since we are only > reading the error queue and not using recvmsg to read POLLIN responses. > > This patch was tested by using a simple sending program to call recvmsg > using io_uring with MSG_ERRQUEUE set and verifying with printks that the > POLLIN is correctly unset when the msg flags are MSG_ERRQUEUE.
Sorry, one more minor thing to fix up: > @@ -4932,6 +4934,11 @@ static bool io_arm_poll_handler(struct io_kiocb *req) > mask |= POLLIN | POLLRDNORM; > if (def->pollout) > mask |= POLLOUT | POLLWRNORM; > + > + /* If reading from MSG_ERRQUEUE using recvmsg, ignore POLLIN */ > + if (req->opcode == IORING_OP_RECVMSG && (sqe->msg_flags & MSG_ERRQUEUE)) > + mask &= ~POLLIN; > + Don't pass in the sqe here, but use req->sr_msg.msg_flags for this check. This is actually really important, as you don't want to re-read anything from the sqe. I'm actually surprised this one got past Jann :-) > @@ -6146,7 +6153,7 @@ static void __io_queue_sqe(struct io_kiocb *req, const > struct io_uring_sqe *sqe, > * doesn't support non-blocking read/write attempts > */ > if (ret == -EAGAIN && !(req->flags & REQ_F_NOWAIT)) { > - if (!io_arm_poll_handler(req)) { > + if (!io_arm_poll_handler(req, sqe)) { Also means you can drop this part. -- Jens Axboe