From c09ef0c5fcfaf9cce9d7e0dd072e6e04e3db2bc9 Mon Sep 17 00:00:00 2001 From: Amaury Denoyelle Date: Mon, 8 Aug 2022 18:15:24 +0200 Subject: [PATCH] MINOR: quic: skip sending if no frame to send in io-cb Check on quic_conn_io_cb() if sending is required. This allows to skip over Tx buffer allocation if not needed. To implement this, we check if frame lists on current and next encryption level are empty. We also need to check if there is no need to send ACK, PROBE or CONNECTION_CLOSE. This has been isolated in a new function qc_need_sending() which may be reuse in some other functions in the future. --- src/xprt_quic.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/xprt_quic.c b/src/xprt_quic.c index cc2afd1fe..076d93699 100644 --- a/src/xprt_quic.c +++ b/src/xprt_quic.c @@ -3837,6 +3837,15 @@ static struct task *quic_conn_app_io_cb(struct task *t, void *context, unsigned return t; } +/* Returns a boolean if needs to emit frames for encryption level. */ +static int qc_need_sending(struct quic_conn *qc, struct quic_enc_level *qel) +{ + return (qc->flags & QUIC_FL_CONN_IMMEDIATE_CLOSE) || + (qel->pktns->flags & QUIC_FL_PKTNS_ACK_REQUIRED) || + qel->pktns->tx.pto_probe || + !LIST_ISEMPTY(&qel->pktns->tx.frms); +} + /* QUIC connection packet handler task. */ struct task *quic_conn_io_cb(struct task *t, void *context, unsigned int state) { @@ -3952,6 +3961,9 @@ struct task *quic_conn_io_cb(struct task *t, void *context, unsigned int state) if (!quic_get_tls_enc_levels(&tel, &next_tel, st, 0)) goto err; + if (!qc_need_sending(qc, qel) && !qc_need_sending(qc, next_qel)) + goto skip_send; + buf = qc_txb_alloc(qc); if (!buf) goto err;