On 3/26/2019 9:13 PM, Konstantin Ananyev wrote: > As was pointed in one of previous reviews - we can avoid updating > contents of mbuf array for successfully processed packets. > Instead store indexes of failed packets, to move them beyond the good > ones later. > > Signed-off-by: Konstantin Ananyev <konstantin.anan...@intel.com> > --- > lib/librte_ipsec/sa.c | 166 +++++++++++++++++++++++------------------- > 1 file changed, 93 insertions(+), 73 deletions(-) > > diff --git a/lib/librte_ipsec/sa.c b/lib/librte_ipsec/sa.c > index 97c0f8c61..009efd1d3 100644 > --- a/lib/librte_ipsec/sa.c > +++ b/lib/librte_ipsec/sa.c > @@ -450,14 +450,31 @@ rte_ipsec_sa_init(struct rte_ipsec_sa *sa, const struct > rte_ipsec_sa_prm *prm, > return sz; > } > > -static inline void > -mbuf_bulk_copy(struct rte_mbuf *dst[], struct rte_mbuf * const src[], > - uint32_t num) > +/* > + * Move bad (unprocessed) mbufs beyond the good (processed) ones. > + * dr[] contains the indexes of bad mbufs insinde the mb[]. spell check.
dr[],drb,drn looks cryptic can we have better naming which is more readable. > + */ > +static void > +mbuf_bad_move(struct rte_mbuf *mb[], const uint32_t dr[], uint32_t num, move_bad_mbufs() would be better. > + uint32_t drn) > { > - uint32_t i; > + uint32_t i, j, k; > + struct rte_mbuf *drb[drn]; > + > + j = 0; > + k = 0; > > - for (i = 0; i != num; i++) > - dst[i] = src[i]; > + /* copy bad ones into a temp place */ > + for (i = 0; i != num; i++) { > + if (j != drn && i == dr[j]) > + drb[j++] = mb[i]; > + else > + mb[k++] = mb[i]; > + } > + > + /* copy bad ones after the good ones */ > + for (i = 0; i != drn; i++) > + mb[k + i] = drb[i]; > } > Apart from that Acked-by: Akhil Goyal <akhil.go...@nxp.com>