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:
parent
1b76257147
commit
69db3b3b29
1 changed files with 24 additions and 39 deletions
63
tcp_splice.c
63
tcp_splice.c
|
@ -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);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue