MEDIUM: quic: Mark copies of acknowledged frames as acknowledged

We call qc_release_frm() to do so from this function everywhere a frame
is released.
This commit is contained in:
Frédéric Lécaille 2022-04-25 10:28:49 +02:00 committed by Amaury Denoyelle
parent 1809c33d6e
commit da342556c3
3 changed files with 11 additions and 33 deletions

View File

@ -1250,5 +1250,7 @@ int qc_send_app_pkts(struct quic_conn *qc, int old_data, struct list *frms);
void qc_notify_close(struct quic_conn *qc); void qc_notify_close(struct quic_conn *qc);
void qc_release_frm(struct quic_conn *qc, struct quic_frame *frm);
#endif /* USE_QUIC */ #endif /* USE_QUIC */
#endif /* _HAPROXY_XPRT_QUIC_H */ #endif /* _HAPROXY_XPRT_QUIC_H */

View File

@ -185,9 +185,7 @@ void qc_stream_desc_free(struct qc_stream_desc *stream)
eb64_delete(&strm->offset); eb64_delete(&strm->offset);
frm = container_of(strm, struct quic_frame, stream); frm = container_of(strm, struct quic_frame, stream);
LIST_DELETE(&frm->list); qc_release_frm(qc, frm);
quic_tx_packet_refdec(frm->pkt);
pool_free(pool_head_quic_frame, frm);
} }
eb64_delete(&stream->by_id); eb64_delete(&stream->by_id);

View File

@ -1445,7 +1445,7 @@ static void qc_frm_unref(struct quic_conn *qc, struct quic_frame *frm)
} }
/* Release <frm> frame and mark its copies as acknowledged */ /* Release <frm> frame and mark its copies as acknowledged */
static void qc_release_frm(struct quic_conn *qc, struct quic_frame *frm) void qc_release_frm(struct quic_conn *qc, struct quic_frame *frm)
{ {
uint64_t pn; uint64_t pn;
struct quic_frame *origin, *f, *tmp; struct quic_frame *origin, *f, *tmp;
@ -1519,9 +1519,7 @@ static int quic_stream_try_to_consume(struct quic_conn *qc,
eb64_delete(&strm->offset); eb64_delete(&strm->offset);
frm = container_of(strm, struct quic_frame, stream); frm = container_of(strm, struct quic_frame, stream);
LIST_DELETE(&frm->list); qc_release_frm(qc, frm);
quic_tx_packet_refdec(frm->pkt);
pool_free(pool_head_quic_frame, frm);
} }
return ret; return ret;
@ -1532,7 +1530,6 @@ static inline void qc_treat_acked_tx_frm(struct quic_conn *qc,
struct quic_frame *frm) struct quic_frame *frm)
{ {
int stream_acked; int stream_acked;
uint64_t pn;
TRACE_PROTO("Removing frame", QUIC_EV_CONN_PRSAFRM, qc, frm); TRACE_PROTO("Removing frame", QUIC_EV_CONN_PRSAFRM, qc, frm);
stream_acked = 0; stream_acked = 0;
@ -1555,13 +1552,7 @@ static inline void qc_treat_acked_tx_frm(struct quic_conn *qc,
node = eb64_lookup(&qc->streams_by_id, strm_frm->id); node = eb64_lookup(&qc->streams_by_id, strm_frm->id);
if (!node) { if (!node) {
TRACE_PROTO("acked stream for released stream", QUIC_EV_CONN_ACKSTRM, qc, strm_frm); TRACE_PROTO("acked stream for released stream", QUIC_EV_CONN_ACKSTRM, qc, strm_frm);
LIST_DELETE(&frm->list); qc_release_frm(qc, frm);
pn = frm->pkt->pn_node.key;
quic_tx_packet_refdec(frm->pkt);
TRACE_PROTO("freeing frame from packet",
QUIC_EV_CONN_PRSAFRM, qc, frm, &pn);
pool_free(pool_head_quic_frame, frm);
/* early return */ /* early return */
return; return;
} }
@ -1578,21 +1569,13 @@ static inline void qc_treat_acked_tx_frm(struct quic_conn *qc,
if (!stream) { if (!stream) {
/* no need to continue if stream freed. */ /* no need to continue if stream freed. */
TRACE_PROTO("stream released and freed", QUIC_EV_CONN_ACKSTRM, qc); TRACE_PROTO("stream released and freed", QUIC_EV_CONN_ACKSTRM, qc);
LIST_DELETE(&frm->list); qc_release_frm(qc, frm);
pn = frm->pkt->pn_node.key;
quic_tx_packet_refdec(frm->pkt);
TRACE_PROTO("freeing frame from packet",
QUIC_EV_CONN_PRSAFRM, qc, frm, &pn);
pool_free(pool_head_quic_frame, frm);
break; break;
} }
LIST_DELETE(&frm->list); TRACE_PROTO("stream consumed", QUIC_EV_CONN_ACKSTRM,
pn = frm->pkt->pn_node.key; qc, strm_frm, stream);
quic_tx_packet_refdec(frm->pkt); qc_release_frm(qc, frm);
TRACE_PROTO("freeing frame from packet",
QUIC_EV_CONN_PRSAFRM, qc, frm, &pn);
pool_free(pool_head_quic_frame, frm);
} }
else { else {
eb64_insert(&stream->acked_frms, &strm_frm->offset); eb64_insert(&stream->acked_frms, &strm_frm->offset);
@ -1602,12 +1585,7 @@ static inline void qc_treat_acked_tx_frm(struct quic_conn *qc,
} }
break; break;
default: default:
LIST_DELETE(&frm->list); qc_release_frm(qc, frm);
pn = frm->pkt->pn_node.key;
quic_tx_packet_refdec(frm->pkt);
TRACE_PROTO("freeing frame from packet",
QUIC_EV_CONN_PRSAFRM, qc, frm, &pn);
pool_free(pool_head_quic_frame, frm);
} }
if (stream_acked && qc->mux_state == QC_MUX_READY) { if (stream_acked && qc->mux_state == QC_MUX_READY) {