tcp: Fix for non-blocking splice() on older kernels

For some reason, on 4.19, splice() doesn't honour SOCK_NONBLOCK from
accept4() while reading from a TCP socket. Pass SPLICE_F_NONBLOCK
explicitly in all cases.

Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
This commit is contained in:
Stefano Brivio 2021-10-19 09:19:50 +02:00
parent 9e065b1448
commit 1bddcf3dd7

4
tcp.c
View file

@ -3075,7 +3075,7 @@ swap:
retry:
read = splice(move_from, NULL, pipes[1], NULL, c->tcp.pipe_size,
SPLICE_F_MOVE);
SPLICE_F_MOVE | SPLICE_F_NONBLOCK);
if (read < 0) {
if (errno == EINTR)
goto retry;
@ -3099,7 +3099,7 @@ retry:
eintr:
written = splice(pipes[0], NULL, move_to, NULL, to_write,
SPLICE_F_MOVE | more);
SPLICE_F_MOVE | more | SPLICE_F_NONBLOCK);
/* Most common case: skip updating counters. */
if (read > 0 && read == written) {