diff options
author | Stefano Brivio <sbrivio@redhat.com> | 2021-10-19 09:19:50 +0200 |
---|---|---|
committer | Stefano Brivio <sbrivio@redhat.com> | 2021-10-19 09:19:50 +0200 |
commit | 1bddcf3dd72fe3924b8ad473579daeb922dbf669 (patch) | |
tree | da4dc955ac7ebfc7507ba03adb6e3ef393693a69 | |
parent | 9e065b1448bc4df2c031916ef2317e22485ea599 (diff) | |
download | passt-1bddcf3dd72fe3924b8ad473579daeb922dbf669.tar passt-1bddcf3dd72fe3924b8ad473579daeb922dbf669.tar.gz passt-1bddcf3dd72fe3924b8ad473579daeb922dbf669.tar.bz2 passt-1bddcf3dd72fe3924b8ad473579daeb922dbf669.tar.lz passt-1bddcf3dd72fe3924b8ad473579daeb922dbf669.tar.xz passt-1bddcf3dd72fe3924b8ad473579daeb922dbf669.tar.zst passt-1bddcf3dd72fe3924b8ad473579daeb922dbf669.zip |
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>
-rw-r--r-- | tcp.c | 4 |
1 files changed, 2 insertions, 2 deletions
@@ -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) { |