[dpdk-dev] examples/ipsec-secgw: improve ipsec dequeue logic

Message ID 20171214071923.10087-1-akhil.goyal@nxp.com (mailing list archive)
State Accepted, archived
Delegated to: Pablo de Lara Guarch
Headers

Checks

Context Check Description
ci/checkpatch success coding style OK
ci/Intel-compilation success Compilation OK

Commit Message

Akhil Goyal Dec. 14, 2017, 7:19 a.m. UTC
  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 <akhil.goyal@nxp.com>
---
 examples/ipsec-secgw/ipsec.c | 19 ++++++++++++++-----
 1 file changed, 14 insertions(+), 5 deletions(-)
  

Comments

Radu Nicolau Jan. 16, 2018, 4:12 p.m. UTC | #1
> -----Original Message-----
> From: Akhil Goyal [mailto:akhil.goyal@nxp.com]
> Sent: Thursday, December 14, 2017 7:19 AM
> To: dev@dpdk.org
> Cc: De Lara Guarch, Pablo <pablo.de.lara.guarch@intel.com>;
> hemant.agrawal@nxp.com; Gonzalez Monroy, Sergio
> <sergio.gonzalez.monroy@intel.com>; Nicolau, Radu
> <radu.nicolau@intel.com>; Akhil Goyal <akhil.goyal@nxp.com>
> 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 <akhil.goyal@nxp.com>

Acked-by: Radu Nicolau <radu.nicolau@intel.com>
  
De Lara Guarch, Pablo Jan. 17, 2018, 4:54 p.m. UTC | #2
> -----Original Message-----
> From: Nicolau, Radu
> Sent: Tuesday, January 16, 2018 4:13 PM
> To: Akhil Goyal <akhil.goyal@nxp.com>; dev@dpdk.org
> Cc: De Lara Guarch, Pablo <pablo.de.lara.guarch@intel.com>;
> hemant.agrawal@nxp.com; Gonzalez Monroy, Sergio
> <sergio.gonzalez.monroy@intel.com>
> Subject: RE: [PATCH] examples/ipsec-secgw: improve ipsec dequeue logic
> 
> 
> > -----Original Message-----
> > From: Akhil Goyal [mailto:akhil.goyal@nxp.com]
> > Sent: Thursday, December 14, 2017 7:19 AM
> > To: dev@dpdk.org
> > Cc: De Lara Guarch, Pablo <pablo.de.lara.guarch@intel.com>;
> > hemant.agrawal@nxp.com; Gonzalez Monroy, Sergio
> > <sergio.gonzalez.monroy@intel.com>; Nicolau, Radu
> > <radu.nicolau@intel.com>; Akhil Goyal <akhil.goyal@nxp.com>
> > 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 <akhil.goyal@nxp.com>
> 
> Acked-by: Radu Nicolau <radu.nicolau@intel.com>

Applied to dpdk-next-crypto.
Thanks,

Pablo
  

Patch

diff --git a/examples/ipsec-secgw/ipsec.c b/examples/ipsec-secgw/ipsec.c
index 70ed227..69ffc3b 100644
--- a/examples/ipsec-secgw/ipsec.c
+++ b/examples/ipsec-secgw/ipsec.c
@@ -369,12 +369,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];
@@ -389,8 +387,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);
@@ -414,6 +417,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++;
+			}
 		}
 	}