From: Frédéric Lécaille Date: Wed, 24 Aug 2022 15:57:09 +0000 (+0200) Subject: BUG/MINOR: quic: Stalled connections (missing I/O handler wakeup) X-Git-Tag: v2.7-dev5~59 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=15773f2101e7c56e6e21bf06cb7b35788c3a1647;p=thirdparty%2Fhaproxy.git BUG/MINOR: quic: Stalled connections (missing I/O handler wakeup) This was due to a missing I/O handler tasklet wakeup in process_timer() when detecting packet loss. As, qc_release_lost_pkts() could remove the lost packets from the in flight packets count, qc_set_timer() could cancel the timer used to wakeup the connection I/O handler. Then the connection could remain idle until it ends. Must be backported to 2.6. --- diff --git a/src/xprt_quic.c b/src/xprt_quic.c index 33daf7c5c5..2dbb4cba07 100644 --- a/src/xprt_quic.c +++ b/src/xprt_quic.c @@ -4545,6 +4545,8 @@ static struct task *process_timer(struct task *task, void *ctx, unsigned int sta struct list lost_pkts = LIST_HEAD_INIT(lost_pkts); qc_packet_loss_lookup(pktns, qc, &lost_pkts); + if (!LIST_ISEMPTY(&lost_pkts)) + tasklet_wakeup(conn_ctx->wait_event.tasklet); qc_release_lost_pkts(qc, pktns, &lost_pkts, now_ms); qc_set_timer(qc); goto out;