MINOR: muxes/applet: Simplify checks on options to disable zero-copy forwarding
authorChristopher Faulet <cfaulet@haproxy.com>
Wed, 14 Feb 2024 14:17:17 +0000 (15:17 +0100)
committerChristopher Faulet <cfaulet@haproxy.com>
Wed, 14 Feb 2024 15:39:46 +0000 (16:39 +0100)
Global options to disable for zero-copy forwarding are now tested outside
callbacks responsible to perform the forwarding itself. It is cleaner this
way because we don't try at all zero-copy forwarding if at least one side
does not support it. It is equivalent to what was performed before, but it
is simplier this way.

(cherry picked from commit 081022a0c5877fde06910c02eb58a9a1a3f8c3a8)
[cf: changes about cache and stats applets were removed]
Signed-off-by: Christopher Faulet <cfaulet@haproxy.com>

src/mux_h1.c
src/mux_h2.c
src/mux_pt.c
src/mux_quic.c

index c3c988c..455ebeb 100644 (file)
@@ -1923,7 +1923,8 @@ static size_t h1_process_demux(struct h1c *h1c, struct buffer *buf, size_t count
        /* Here h1s_sc(h1s) is always defined */
        if (!(h1c->flags & H1C_F_CANT_FASTFWD) &&
            (!(h1m->flags & H1_MF_RESP) || !(h1s->flags & H1S_F_BODYLESS_RESP)) &&
-           (h1m->state == H1_MSG_DATA || h1m->state == H1_MSG_TUNNEL)) {
+           (h1m->state == H1_MSG_DATA || h1m->state == H1_MSG_TUNNEL) &&
+           !(global.tune.no_zero_copy_fwd & NO_ZERO_COPY_FWD_H1_RCV)) {
                TRACE_STATE("notify the mux can use fast-forward", H1_EV_RX_DATA|H1_EV_RX_BODY, h1c->conn, h1s);
                se_fl_set(h1s->sd, SE_FL_MAY_FASTFWD_PROD);
        }
@@ -4583,11 +4584,6 @@ static int h1_fastfwd(struct stconn *sc, unsigned int count, unsigned int flags)
 
        TRACE_ENTER(H1_EV_STRM_RECV, h1c->conn, h1s, 0, (size_t[]){count});
 
-       if (global.tune.no_zero_copy_fwd & NO_ZERO_COPY_FWD_H1_RCV) {
-               h1c->flags = (h1c->flags & ~H1C_F_WANT_FASTFWD) | H1C_F_CANT_FASTFWD;
-               goto end;
-       }
-
        if (h1m->state != H1_MSG_DATA && h1m->state != H1_MSG_TUNNEL) {
                h1c->flags &= ~H1C_F_WANT_FASTFWD;
                TRACE_STATE("Cannot fast-forwad data now !(msg_data|msg_tunnel)", H1_EV_STRM_RECV, h1c->conn, h1s);
index 44fc2a8..0db90a0 100644 (file)
@@ -6981,11 +6981,6 @@ static size_t h2_nego_ff(struct stconn *sc, struct buffer *input, size_t count,
 
        TRACE_ENTER(H2_EV_H2S_SEND|H2_EV_STRM_SEND, h2s->h2c->conn, h2s);
 
-       if (global.tune.no_zero_copy_fwd & NO_ZERO_COPY_FWD_H2_SND) {
-               h2s->sd->iobuf.flags |= IOBUF_FL_NO_FF;
-               goto end;
-       }
-
        /* If we were not just woken because we wanted to send but couldn't,
         * and there's somebody else that is waiting to send, do nothing,
         * we will subscribe later and be put at the end of the list
index 080c55b..3cca6a1 100644 (file)
@@ -324,7 +324,7 @@ static int mux_pt_init(struct connection *conn, struct proxy *prx, struct sessio
        }
        conn->ctx = ctx;
        se_fl_set(ctx->sd, SE_FL_RCV_MORE);
-       if (global.tune.options & GTUNE_USE_SPLICE)
+       if ((global.tune.options & GTUNE_USE_SPLICE) && !(global.tune.no_zero_copy_fwd & NO_ZERO_COPY_FWD_PT))
                se_fl_set(ctx->sd, SE_FL_MAY_FASTFWD_PROD|SE_FL_MAY_FASTFWD_CONS);
 
        TRACE_LEAVE(PT_EV_CONN_NEW, conn);
@@ -391,6 +391,8 @@ static int mux_pt_attach(struct connection *conn, struct sedesc *sd, struct sess
                return -1;
        ctx->sd = sd;
        se_fl_set(ctx->sd, SE_FL_RCV_MORE);
+       if ((global.tune.options & GTUNE_USE_SPLICE) && !(global.tune.no_zero_copy_fwd & NO_ZERO_COPY_FWD_PT))
+               se_fl_set(ctx->sd, SE_FL_MAY_FASTFWD_PROD|SE_FL_MAY_FASTFWD_CONS);
 
        TRACE_LEAVE(PT_EV_STRM_NEW, conn, sd->sc);
        return 0;
@@ -655,11 +657,6 @@ static int mux_pt_fastfwd(struct stconn *sc, unsigned int count, unsigned int fl
 
        TRACE_ENTER(PT_EV_RX_DATA, conn, sc, 0, (size_t[]){count});
 
-       if (global.tune.no_zero_copy_fwd & NO_ZERO_COPY_FWD_PT) {
-               se_fl_clr(ctx->sd, SE_FL_MAY_FASTFWD_PROD);
-               goto end;
-       }
-
        se_fl_clr(ctx->sd, SE_FL_RCV_MORE | SE_FL_WANT_ROOM);
        conn->flags &= ~CO_FL_WAIT_ROOM;
        sdo = mux_pt_opposite_sd(ctx);
index 2cbca3e..de87368 100644 (file)
@@ -2835,11 +2835,6 @@ static size_t qmux_nego_ff(struct stconn *sc, struct buffer *input, size_t count
        /* stream layer has been detached so no transfer must occur after. */
        BUG_ON_HOT(qcs->flags & QC_SF_DETACH);
 
-       if (global.tune.no_zero_copy_fwd & NO_ZERO_COPY_FWD_QUIC_SND) {
-               qcs->sd->iobuf.flags |= IOBUF_FL_NO_FF;
-               goto end;
-       }
-
        if (!qcs->qcc->app_ops->nego_ff || !qcs->qcc->app_ops->done_ff) {
                /* Fast forwading is not supported by the QUIC application layer */
                qcs->sd->iobuf.flags |= IOBUF_FL_NO_FF;