Now both O_NONBLOCK and SPLICE_F_NONBLOCK will trigger non-blocking
behavior.

The spice man page is unclear about the exact semantics:

First it says splice may still block if SPLICE_F_NONBLOCK is set but
O_NONBLOCK isn't.

Then it says it might return EAGAIN if one or the other is set (and on
my debian system it says EAGAIN can only be returned if
SPLICE_F_NONBLOCK was set).

Signed-off-by: Stefan Bühler <[email protected]>
---
 net/ipv4/tcp.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c
index 6baa6dc1b13b..65f9917ed8ca 100644
--- a/net/ipv4/tcp.c
+++ b/net/ipv4/tcp.c
@@ -784,6 +784,8 @@ ssize_t tcp_splice_read(struct socket *sock, loff_t *ppos,
        long timeo;
        ssize_t spliced;
        int ret;
+       bool noblock = (sock->file->f_flags & O_NONBLOCK) ||
+                      (flags & SPLICE_F_NONBLOCK);
 
        sock_rps_record_flow(sk);
        /*
@@ -796,7 +798,7 @@ ssize_t tcp_splice_read(struct socket *sock, loff_t *ppos,
 
        lock_sock(sk);
 
-       timeo = sock_rcvtimeo(sk, sock->file->f_flags & O_NONBLOCK);
+       timeo = sock_rcvtimeo(sk, noblock);
        while (tss.len) {
                ret = __tcp_splice_read(sk, &tss);
                if (ret < 0)
-- 
2.20.1

Reply via email to