lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening PHC | |
Open Source and information security mailing list archives
| ||
|
Date: Fri, 21 Aug 2020 20:08:55 -0600 From: Jens Axboe <axboe@...nel.dk> To: Luke Hsiao <luke.w.hsiao@...il.com>, David Miller <davem@...emloft.net> Cc: netdev@...r.kernel.org, Jakub Kicinski <kuba@...nel.org>, Luke Hsiao <lukehsiao@...gle.com>, Arjun Roy <arjunroy@...gle.com>, Soheil Hassas Yeganeh <soheil@...gle.com>, Eric Dumazet <edumazet@...gle.com> Subject: Re: [PATCH net-next v2 2/2] io_uring: ignore POLLIN for recvmsg on MSG_ERRQUEUE On 8/21/20 8:04 PM, Luke Hsiao wrote: > From: Luke Hsiao <lukehsiao@...gle.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
Powered by blists - more mailing lists