On Fri, Nov 03, 2023 at 05:22:13PM +0100, Stefano Brivio wrote: > On Thu, 12 Oct 2023 12:51:13 +1100 > David Gibson wrote: > > > tcp_splice_destroy() has some close-to-duplicated logic handling closing of > > the socket and ipies for each side of the connection. We can use a loop > ^^^^^ pipes Oops, fixed. > > across the sides to reduce the duplication. > > > > Signed-off-by: David Gibson > > --- > > tcp_splice.c | 32 ++++++++++++++------------------ > > 1 file changed, 14 insertions(+), 18 deletions(-) > > > > diff --git a/tcp_splice.c b/tcp_splice.c > > index 99ef8a4..239f6d2 100644 > > --- a/tcp_splice.c > > +++ b/tcp_splice.c > > @@ -258,30 +258,26 @@ void tcp_splice_conn_update(const struct ctx *c, struct tcp_splice_conn *new) > > void tcp_splice_destroy(struct ctx *c, union tcp_conn *conn_union) > > { > > struct tcp_splice_conn *conn = &conn_union->splice; > > + int side; > > > > - if (conn->events & SPLICE_ESTABLISHED) { > > - /* Flushing might need to block: don't recycle them. */ > > - if (conn->pipe[0][0] != -1) { > > - close(conn->pipe[0][0]); > > - close(conn->pipe[0][1]); > > - conn->pipe[0][0] = conn->pipe[0][1] = -1; > > + for (side = 0; side < SIDES; side++) { > > + if (conn->events & SPLICE_ESTABLISHED) { > > + /* Flushing might need to block: don't recycle them. */ > > + if (conn->pipe[side][0] != -1) { > > + close(conn->pipe[side][0]); > > + close(conn->pipe[side][1]); > > + conn->pipe[side][0] = conn->pipe[side][1] = -1; > > + } > > } > > - if (conn->pipe[1][0] != -1) { > > - close(conn->pipe[1][0]); > > - close(conn->pipe[1][1]); > > - conn->pipe[1][0] = conn->pipe[1][1] = -1; > > + > > + if (side == 0 || conn->events & SPLICE_CONNECT) { > > + close(conn->s[side]); > > + conn->s[side] = -1; > > } > > - } > > > > - if (conn->events & SPLICE_CONNECT) { > > - close(conn->s[1]); > > - conn->s[1] = -1; > > + conn->read[side] = conn->written[side] = 0; > > } > > > > - close(conn->s[0]); > > - conn->s[0] = -1; > > - conn->read[0] = conn->written[0] = conn->read[1] = conn->written[1] = 0; > > With this, on SPLICE_CONNECT, we would close the [0] side, but not the > [1] side. SPLICE_CONNECT means we already have an open socket for [1], > though. I think it should be: > > [loop on sides] > > if (side == 1 || conn->events & SPLICE_CONNECT) { > close(conn->s[side]); > conn->s[1] = -1; > } > } > > and then we still need to unconditionally close conn->s[0]. Perhaps we could > take both parts outside of the loop: Uh.. I think you're misreading. In the updated code we have: if (side == 0 || conn->events & SPLICE_CONNECT) { close(conn->s[side]); conn->s[side] = -1; } That's an OR, so we always close side 0, and we close side 1 iff we have SPLICE_CONNECT, which matches what you're describing. > if (conn->events & SPLICE_CONNECT) { > close(conn->s[1]); > conn->s[1] = -1; > } > > close(conn->s[0]); > conn->s[0] = -1; > conn->read[side] = conn->written[side] = 0; > > The handling for the SPLICE_ESTABLISHED case looks correct to me. We are relying on the fact that setting SPLICE_ESTABLISHED doesn't clear SPLICE_CONNECT. -- David Gibson | I'll have my music baroque, and my code david AT gibson.dropbear.id.au | minimalist, thank you. NOT _the_ _other_ | _way_ _around_! http://www.ozlabs.org/~dgibson