Hi Pablo,

> -----Original Message-----
> From: dev [mailto:dev-boun...@dpdk.org] On Behalf Of Pablo de Lara
> Sent: Thursday, March 29, 2018 4:56 PM
> To: dev@dpdk.org
> Cc: De Lara Guarch, Pablo <pablo.de.lara.gua...@intel.com>; sta...@dpdk.org
> Subject: [dpdk-dev] [PATCH 3/3] crypto/zuc: batch ops with same transform
> 
> The ZUC API to encrypt packets does not require the operations
> to share the same key. Currently, the operations were being
> batched only when they shared the same key, but this is not needed.
> 
> Instead, now operations will be batched based on the transform
> (cipher only, auth only...).
> 
> Fixes: cf7685d68f00 ("crypto/zuc: add driver for ZUC library")
> Cc: sta...@dpdk.org
> 
> Signed-off-by: Pablo de Lara <pablo.de.lara.gua...@intel.com>

[Fiona] A couple of comments need updating - see below
Apart from that 
Acked-by: Fiona Trahe <fiona.tr...@intel.com>

> ---
>  drivers/crypto/zuc/rte_zuc_pmd.c | 97 
> +++++++++++++++++++++++++---------------
>  1 file changed, 60 insertions(+), 37 deletions(-)
> 
> diff --git a/drivers/crypto/zuc/rte_zuc_pmd.c 
> b/drivers/crypto/zuc/rte_zuc_pmd.c
> index 568c593ae..ea0efcf6b 100644
> --- a/drivers/crypto/zuc/rte_zuc_pmd.c
> +++ b/drivers/crypto/zuc/rte_zuc_pmd.c
> @@ -12,7 +12,7 @@
> 
>  #include "rte_zuc_pmd_private.h"
> 
> -#define ZUC_MAX_BURST 8
> +#define ZUC_MAX_BURST 4
>  #define BYTE_LEN 8
> 
>  static uint8_t cryptodev_driver_id;
> @@ -171,7 +171,7 @@ zuc_get_session(struct zuc_qp *qp, struct rte_crypto_op 
> *op)
>  /** Encrypt/decrypt mbufs with same cipher key. */
[Fiona] Not necessarily same key

>  static uint8_t
>  process_zuc_cipher_op(struct rte_crypto_op **ops,
> -             struct zuc_session *session,
> +             struct zuc_session **sessions,
>               uint8_t num_ops)
>  {
>       unsigned i;
> @@ -180,6 +180,7 @@ process_zuc_cipher_op(struct rte_crypto_op **ops,
>       uint8_t *iv[ZUC_MAX_BURST];
>       uint32_t num_bytes[ZUC_MAX_BURST];
>       uint8_t *cipher_keys[ZUC_MAX_BURST];
> +     struct zuc_session *sess;
> 
>       for (i = 0; i < num_ops; i++) {
>               if (((ops[i]->sym->cipher.data.length % BYTE_LEN) != 0)
> @@ -190,6 +191,8 @@ process_zuc_cipher_op(struct rte_crypto_op **ops,
>                       break;
>               }
> 
> +             sess = sessions[i];
> +
>  #ifdef RTE_LIBRTE_PMD_ZUC_DEBUG
>               if (!rte_pktmbuf_is_contiguous(ops[i]->sym->m_src) ||
>                               (ops[i]->sym->m_dst != NULL &&
> @@ -211,10 +214,10 @@ process_zuc_cipher_op(struct rte_crypto_op **ops,
>                       rte_pktmbuf_mtod(ops[i]->sym->m_src, uint8_t *) +
>                               (ops[i]->sym->cipher.data.offset >> 3);
>               iv[i] = rte_crypto_op_ctod_offset(ops[i], uint8_t *,
> -                             session->cipher_iv_offset);
> +                             sess->cipher_iv_offset);
>               num_bytes[i] = ops[i]->sym->cipher.data.length >> 3;
> 
> -             cipher_keys[i] = session->pKey_cipher;
> +             cipher_keys[i] = sess->pKey_cipher;
> 
>               processed_ops++;
>       }
> @@ -228,7 +231,7 @@ process_zuc_cipher_op(struct rte_crypto_op **ops,
>  /** Generate/verify hash from mbufs with same hash key. */
[Fiona] Not necessarily same key

>  static int
>  process_zuc_hash_op(struct zuc_qp *qp, struct rte_crypto_op **ops,
> -             struct zuc_session *session,
> +             struct zuc_session **sessions,
>               uint8_t num_ops)
>  {
>       unsigned i;
> @@ -237,6 +240,7 @@ process_zuc_hash_op(struct zuc_qp *qp, struct 
> rte_crypto_op **ops,
>       uint32_t *dst;
>       uint32_t length_in_bits;
>       uint8_t *iv;
> +     struct zuc_session *sess;
> 
>       for (i = 0; i < num_ops; i++) {
>               /* Data must be byte aligned */
> @@ -246,17 +250,19 @@ process_zuc_hash_op(struct zuc_qp *qp, struct 
> rte_crypto_op **ops,
>                       break;
>               }
> 
> +             sess = sessions[i];
> +
>               length_in_bits = ops[i]->sym->auth.data.length;
> 
>               src = rte_pktmbuf_mtod(ops[i]->sym->m_src, uint8_t *) +
>                               (ops[i]->sym->auth.data.offset >> 3);
>               iv = rte_crypto_op_ctod_offset(ops[i], uint8_t *,
> -                             session->auth_iv_offset);
> +                             sess->auth_iv_offset);
> 
> -             if (session->auth_op == RTE_CRYPTO_AUTH_OP_VERIFY) {
> +             if (sess->auth_op == RTE_CRYPTO_AUTH_OP_VERIFY) {
>                       dst = (uint32_t *)qp->temp_digest;
> 
> -                     sso_zuc_eia3_1_buffer(session->pKey_hash,
> +                     sso_zuc_eia3_1_buffer(sess->pKey_hash,
>                                       iv, src,
>                                       length_in_bits, dst);
>                       /* Verify digest. */
> @@ -266,7 +272,7 @@ process_zuc_hash_op(struct zuc_qp *qp, struct 
> rte_crypto_op **ops,
>               } else  {
>                       dst = (uint32_t *)ops[i]->sym->auth.digest.data;
> 
> -                     sso_zuc_eia3_1_buffer(session->pKey_hash,
> +                     sso_zuc_eia3_1_buffer(sess->pKey_hash,
>                                       iv, src,
>                                       length_in_bits, dst);
>               }
> @@ -278,31 +284,32 @@ process_zuc_hash_op(struct zuc_qp *qp, struct 
> rte_crypto_op **ops,
> 
>  /** Process a batch of crypto ops which shares the same session. */
[Fiona] same type, not same session

>  static int
> -process_ops(struct rte_crypto_op **ops, struct zuc_session *session,
> +process_ops(struct rte_crypto_op **ops, enum zuc_operation op_type,
> +             struct zuc_session **sessions,
>               struct zuc_qp *qp, uint8_t num_ops,
>               uint16_t *accumulated_enqueued_ops)
>  {
>       unsigned i;
>       unsigned enqueued_ops, processed_ops;
> 
> -     switch (session->op) {
> +     switch (op_type) {
>       case ZUC_OP_ONLY_CIPHER:
>               processed_ops = process_zuc_cipher_op(ops,
> -                             session, num_ops);
> +                             sessions, num_ops);
>               break;
>       case ZUC_OP_ONLY_AUTH:
> -             processed_ops = process_zuc_hash_op(qp, ops, session,
> +             processed_ops = process_zuc_hash_op(qp, ops, sessions,
>                               num_ops);
>               break;
>       case ZUC_OP_CIPHER_AUTH:
> -             processed_ops = process_zuc_cipher_op(ops, session,
> +             processed_ops = process_zuc_cipher_op(ops, sessions,
>                               num_ops);
> -             process_zuc_hash_op(qp, ops, session, processed_ops);
> +             process_zuc_hash_op(qp, ops, sessions, processed_ops);
>               break;
>       case ZUC_OP_AUTH_CIPHER:
> -             processed_ops = process_zuc_hash_op(qp, ops, session,
> +             processed_ops = process_zuc_hash_op(qp, ops, sessions,
>                               num_ops);
> -             process_zuc_cipher_op(ops, session, processed_ops);
> +             process_zuc_cipher_op(ops, sessions, processed_ops);
>               break;
>       default:
>               /* Operation not supported. */
> @@ -318,10 +325,10 @@ process_ops(struct rte_crypto_op **ops, struct 
> zuc_session *session,
>                       ops[i]->status = RTE_CRYPTO_OP_STATUS_SUCCESS;
>               /* Free session if a session-less crypto op. */
>               if (ops[i]->sess_type == RTE_CRYPTO_OP_SESSIONLESS) {
> -                     memset(session, 0, sizeof(struct zuc_session));
> +                     memset(sessions[i], 0, sizeof(struct zuc_session));
>                       memset(ops[i]->sym->session, 0,
>                                       
> rte_cryptodev_get_header_session_size());
> -                     rte_mempool_put(qp->sess_mp, session);
> +                     rte_mempool_put(qp->sess_mp, sessions[i]);
>                       rte_mempool_put(qp->sess_mp, ops[i]->sym->session);
>                       ops[i]->sym->session = NULL;
>               }
> @@ -342,7 +349,10 @@ zuc_pmd_enqueue_burst(void *queue_pair, struct 
> rte_crypto_op **ops,
>       struct rte_crypto_op *c_ops[ZUC_MAX_BURST];
>       struct rte_crypto_op *curr_c_op;
> 
> -     struct zuc_session *prev_sess = NULL, *curr_sess = NULL;
> +     struct zuc_session *curr_sess;
> +     struct zuc_session *sessions[ZUC_MAX_BURST];
> +     enum zuc_operation prev_zuc_op = ZUC_OP_NOT_SUPPORTED;
> +     enum zuc_operation curr_zuc_op;
>       struct zuc_qp *qp = queue_pair;
>       unsigned i;
>       uint8_t burst_size = 0;
> @@ -359,50 +369,63 @@ zuc_pmd_enqueue_burst(void *queue_pair, struct 
> rte_crypto_op **ops,
>                       break;
>               }
> 
> -             /* Batch ops that share the same session. */
> -             if (prev_sess == NULL) {
> -                     prev_sess = curr_sess;
> -                     c_ops[burst_size++] = curr_c_op;
> -             } else if (curr_sess == prev_sess) {
> -                     c_ops[burst_size++] = curr_c_op;
> +             curr_zuc_op = curr_sess->op;
> +
> +             /*
> +              * Batch ops that share the same operation type
> +              * (cipher only, auth only...).
> +              */
> +             if (burst_size == 0) {
> +                     prev_zuc_op = curr_zuc_op;
> +                     c_ops[0] = curr_c_op;
> +                     sessions[0] = curr_sess;
> +                     burst_size++;
> +             } else if (curr_zuc_op == prev_zuc_op) {
> +                     c_ops[burst_size] = curr_c_op;
> +                     sessions[burst_size] = curr_sess;
> +                     burst_size++;
>                       /*
>                        * When there are enough ops to process in a batch,
>                        * process them, and start a new batch.
>                        */
>                       if (burst_size == ZUC_MAX_BURST) {
> -                             processed_ops = process_ops(c_ops, prev_sess,
> -                                             qp, burst_size, &enqueued_ops);
> +                             processed_ops = process_ops(c_ops, curr_zuc_op,
> +                                             sessions, qp, burst_size,
> +                                             &enqueued_ops);
>                               if (processed_ops < burst_size) {
>                                       burst_size = 0;
>                                       break;
>                               }
> 
>                               burst_size = 0;
> -                             prev_sess = NULL;
>                       }
>               } else {
>                       /*
> -                      * Different session, process the ops
> -                      * of the previous session.
> +                      * Different operation type, process the ops
> +                      * of the previous type.
>                        */
> -                     processed_ops = process_ops(c_ops, prev_sess,
> -                                     qp, burst_size, &enqueued_ops);
> +                     processed_ops = process_ops(c_ops, prev_zuc_op,
> +                                     sessions, qp, burst_size,
> +                                     &enqueued_ops);
>                       if (processed_ops < burst_size) {
>                               burst_size = 0;
>                               break;
>                       }
> 
>                       burst_size = 0;
> -                     prev_sess = curr_sess;
> +                     prev_zuc_op = curr_zuc_op;
> 
> -                     c_ops[burst_size++] = curr_c_op;
> +                     c_ops[0] = curr_c_op;
> +                     sessions[0] = curr_sess;
> +                     burst_size++;
>               }
>       }
> 
>       if (burst_size != 0) {
>               /* Process the crypto ops of the last session. */
[Fiona] ...of the last op_type

> -             processed_ops = process_ops(c_ops, prev_sess,
> -                             qp, burst_size, &enqueued_ops);
> +             processed_ops = process_ops(c_ops, prev_zuc_op,
> +                             sessions, qp, burst_size,
> +                             &enqueued_ops);
>       }
> 
>       qp->qp_stats.enqueue_err_count += nb_ops - enqueued_ops;
> --
> 2.14.3

Reply via email to