diff options
author | Luke Hsiao <lukehsiao@google.com> | 2020-08-21 21:41:05 -0700 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2020-08-24 16:16:06 -0700 |
commit | 901341bb9718884f337a92e6c4541227597d1f48 (patch) | |
tree | f9e5675fe92fc9074cad0ff0bbe763ed9ba7c7de /fs/io_uring.c | |
parent | 583bbf0624dfd8fc45f1049be1d4980be59451ff (diff) | |
download | lwn-901341bb9718884f337a92e6c4541227597d1f48.tar.gz lwn-901341bb9718884f337a92e6c4541227597d1f48.zip |
io_uring: ignore POLLIN for recvmsg on MSG_ERRQUEUE
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.
Signed-off-by: Arjun Roy <arjunroy@google.com>
Signed-off-by: Soheil Hassas Yeganeh <soheil@google.com>
Acked-by: Eric Dumazet <edumazet@google.com>
Reviewed-by: Jens Axboe <axboe@kernel.dk>
Signed-off-by: Luke Hsiao <lukehsiao@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'fs/io_uring.c')
-rw-r--r-- | fs/io_uring.c | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/fs/io_uring.c b/fs/io_uring.c index 91e2cc8414f9..1fd03a38400c 100644 --- a/fs/io_uring.c +++ b/fs/io_uring.c @@ -4898,6 +4898,12 @@ 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) && + (req->sr_msg.msg_flags & MSG_ERRQUEUE)) + mask &= ~POLLIN; + mask |= POLLERR | POLLPRI; ipt.pt._qproc = io_async_queue_proc; |