From 84d4b5e4ec48bc89814a5c46749775a933c382d6 Mon Sep 17 00:00:00 2001 From: Akhil Goyal Date: Thu, 14 Dec 2017 12:49:23 +0530 Subject: [PATCH] examples/ipsec-secgw: improve IPsec dequeue logic Since the processing of crypto operations may take time due to hardware offload, all the packets may not be available in the single dequeue command. So it may happen that there is leakage of cops, and there is nobody to dequeue the packets because dequeue of crypto ops is done only once for a particular queue pair even if it has more packets in flight. This patch dequeue the packets again if the inflight packets are more than the max packet burst. Signed-off-by: Akhil Goyal Acked-by: Radu Nicolau --- examples/ipsec-secgw/ipsec.c | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/examples/ipsec-secgw/ipsec.c b/examples/ipsec-secgw/ipsec.c index d7641356b0..b2493bb01c 100644 --- a/examples/ipsec-secgw/ipsec.c +++ b/examples/ipsec-secgw/ipsec.c @@ -423,12 +423,10 @@ ipsec_dequeue(ipsec_xform_fn xform_func, struct ipsec_ctx *ipsec_ctx, struct ipsec_sa *sa; struct rte_mbuf *pkt; - for (i = 0; i < ipsec_ctx->nb_qps && nb_pkts < max_pkts; i++) { + for (i = 0; i < ipsec_ctx->nb_qps && nb_pkts < max_pkts;) { struct cdev_qp *cqp; - cqp = &ipsec_ctx->tbl[ipsec_ctx->last_qp++]; - if (ipsec_ctx->last_qp == ipsec_ctx->nb_qps) - ipsec_ctx->last_qp %= ipsec_ctx->nb_qps; + cqp = &ipsec_ctx->tbl[ipsec_ctx->last_qp]; while (cqp->ol_pkts_cnt > 0 && nb_pkts < max_pkts) { pkt = cqp->ol_pkts[--cqp->ol_pkts_cnt]; @@ -443,8 +441,13 @@ ipsec_dequeue(ipsec_xform_fn xform_func, struct ipsec_ctx *ipsec_ctx, pkts[nb_pkts++] = pkt; } - if (cqp->in_flight == 0) + if (cqp->in_flight == 0) { + ipsec_ctx->last_qp++; + if (ipsec_ctx->last_qp == ipsec_ctx->nb_qps) + ipsec_ctx->last_qp %= ipsec_ctx->nb_qps; + i++; continue; + } nb_cops = rte_cryptodev_dequeue_burst(cqp->id, cqp->qp, cops, max_pkts - nb_pkts); @@ -468,6 +471,12 @@ ipsec_dequeue(ipsec_xform_fn xform_func, struct ipsec_ctx *ipsec_ctx, } } pkts[nb_pkts++] = pkt; + if (cqp->in_flight < max_pkts) { + ipsec_ctx->last_qp++; + if (ipsec_ctx->last_qp == ipsec_ctx->nb_qps) + ipsec_ctx->last_qp %= ipsec_ctx->nb_qps; + i++; + } } }