tcp_splice: Exploit side symmetry in tcp_splice_connect_finish()

tcp_splice_connect_finish() has two very similar blocks opening the two
pipes for each direction of the connection.  We can deduplicate this with
a loop across the two sides.

Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
This commit is contained in:
David Gibson 2023-11-07 13:42:48 +11:00 committed by Stefano Brivio
parent 1b76257147
commit 69db3b3b29

View file

@ -299,50 +299,35 @@ void tcp_splice_destroy(struct ctx *c, union tcp_conn *conn_union)
static int tcp_splice_connect_finish(const struct ctx *c, static int tcp_splice_connect_finish(const struct ctx *c,
struct tcp_splice_conn *conn) struct tcp_splice_conn *conn)
{ {
int i; int i = 0;
int side;
conn->pipe[0][0] = conn->pipe[1][0] = -1; for (side = 0; side < SIDES; side++) {
conn->pipe[0][1] = conn->pipe[1][1] = -1; conn->pipe[side][0] = conn->pipe[side][1] = -1;
for (i = 0; i < TCP_SPLICE_PIPE_POOL_SIZE; i++) { for (; i < TCP_SPLICE_PIPE_POOL_SIZE; i++) {
if (splice_pipe_pool[i][0] >= 0) { if (splice_pipe_pool[i][0] >= 0) {
SWAP(conn->pipe[0][0], splice_pipe_pool[i][0]); SWAP(conn->pipe[side][0],
SWAP(conn->pipe[0][1], splice_pipe_pool[i][1]); splice_pipe_pool[i][0]);
break; SWAP(conn->pipe[side][1],
} splice_pipe_pool[i][1]);
} break;
if (conn->pipe[0][0] < 0) { }
if (pipe2(conn->pipe[0], O_NONBLOCK | O_CLOEXEC)) {
err("TCP (spliced): cannot create 0->1 pipe: %s",
strerror(errno));
conn_flag(c, conn, CLOSING);
return -EIO;
} }
if (fcntl(conn->pipe[0][0], F_SETPIPE_SZ, c->tcp.pipe_size)) { if (conn->pipe[side][0] < 0) {
trace("TCP (spliced): cannot set 0->1 pipe size to %lu", if (pipe2(conn->pipe[side], O_NONBLOCK | O_CLOEXEC)) {
c->tcp.pipe_size); err("TCP (spliced): cannot create %d->%d pipe: %s",
} side, !side, strerror(errno));
} conn_flag(c, conn, CLOSING);
return -EIO;
}
for (; i < TCP_SPLICE_PIPE_POOL_SIZE; i++) { if (fcntl(conn->pipe[side][0], F_SETPIPE_SZ,
if (splice_pipe_pool[i][0] >= 0) { c->tcp.pipe_size)) {
SWAP(conn->pipe[1][0], splice_pipe_pool[i][0]); trace("TCP (spliced): cannot set %d->%d pipe size to %lu",
SWAP(conn->pipe[1][1], splice_pipe_pool[i][1]); side, !side, c->tcp.pipe_size);
break; }
}
}
if (conn->pipe[1][0] < 0) {
if (pipe2(conn->pipe[1], O_NONBLOCK | O_CLOEXEC)) {
err("TCP (spliced): cannot create 1->0 pipe: %s",
strerror(errno));
conn_flag(c, conn, CLOSING);
return -EIO;
}
if (fcntl(conn->pipe[1][0], F_SETPIPE_SZ, c->tcp.pipe_size)) {
trace("TCP (spliced): cannot set 1->0 pipe size to %lu",
c->tcp.pipe_size);
} }
} }