Hi Ciara,

+1 to the overall approach. Few comments inline.

Thanks,
Anoob

> -----Original Message-----
> From: Ciara Power <ciara.po...@intel.com>
> Sent: Monday, December 13, 2021 8:34 PM
> To: dev@dpdk.org
> Cc: roy.fan.zh...@intel.com; Akhil Goyal <gak...@marvell.com>; Ciara
> Power <ciara.po...@intel.com>; Declan Doherty
> <declan.dohe...@intel.com>; Ankur Dwivedi <adwiv...@marvell.com>;
> Anoob Joseph <ano...@marvell.com>; Tejasree Kondoj
> <ktejas...@marvell.com>; John Griffin <john.grif...@intel.com>; Fiona
> Trahe <fiona.tr...@intel.com>; Deepak Kumar Jain
> <deepak.k.j...@intel.com>; Ray Kinsella <m...@ashroe.eu>
> Subject: [EXT] [PATCH] crypto: use single buffer for asymmetric session
> 
> External Email
> 
> ----------------------------------------------------------------------
> Rather than using a session buffer that contains pointers to private session
> data elsewhere, have a single session buffer.
> This session is created for a driver ID, and the mempool element contains
> space for the max session private data needed for any driver.
> 
> Signed-off-by: Ciara Power <ciara.po...@intel.com>
> 
> ---
> Hiding the asym session structure by moving it to an internal header will be
> implemented in a later version of this patch.
> ---
>  app/test-crypto-perf/cperf_ops.c              |  14 +-
>  app/test/test_cryptodev_asym.c                | 204 ++++--------------
>  drivers/crypto/cnxk/cn10k_cryptodev_ops.c     |   6 +-
>  drivers/crypto/cnxk/cn9k_cryptodev_ops.c      |   6 +-
>  drivers/crypto/cnxk/cnxk_cryptodev_ops.c      |  11 +-
>  drivers/crypto/octeontx/otx_cryptodev_ops.c   |  29 +--
>  drivers/crypto/octeontx2/otx2_cryptodev_ops.c |  25 +--
>  drivers/crypto/openssl/rte_openssl_pmd.c      |   5 +-
>  drivers/crypto/openssl/rte_openssl_pmd_ops.c  |  23 +-
>  drivers/crypto/qat/qat_asym.c                 |  35 +--
>  lib/cryptodev/cryptodev_pmd.h                 |  11 +-
>  lib/cryptodev/cryptodev_trace_points.c        |   3 +
>  lib/cryptodev/rte_cryptodev.c                 | 199 +++++++++++------
>  lib/cryptodev/rte_cryptodev.h                 | 107 ++++++---
>  lib/cryptodev/rte_cryptodev_trace.h           |  12 ++
>  lib/cryptodev/version.map                     |   6 +-
>  16 files changed, 302 insertions(+), 394 deletions(-)
> 

[snip]

> diff --git a/lib/cryptodev/rte_cryptodev.h b/lib/cryptodev/rte_cryptodev.h
> index 59ea5a54df..11a62bb555 100644
> --- a/lib/cryptodev/rte_cryptodev.h
> +++ b/lib/cryptodev/rte_cryptodev.h
> @@ -919,9 +919,15 @@ struct rte_cryptodev_sym_session {  };
> 
>  /** Cryptodev asymmetric crypto session */ -struct
> rte_cryptodev_asym_session {
> -     __extension__ void *sess_private_data[0];
> -     /**< Private asymmetric session material */
> +__extension__ struct rte_cryptodev_asym_session {
> +     uint8_t driver_id;
> +     /**< Session driver ID. */
> +     uint8_t max_priv_session_sz;
> +     /**< size of private session data used when creating mempool */
> +     uint16_t user_data_sz;
> +     /**< session user data will be placed after sess_data */
> +     uint8_t padding[4];
> +     uint8_t sess_private_data[0];
>  };

[Anoob] Should we add a uint64_t member to hold IOVA address of, may be, 
rte_cryptodev_asym_session()? IOVA address could be required for hardware PMDs. 
And typically rte_mempool_virt2iova() used to help in that. Also, did you 
consider whether this layout of crypto session can be kept uniform across sym, 
asym & security? There is no asym specific field in this struct, right?

> 
>  /**
> @@ -956,6 +962,31 @@ rte_cryptodev_sym_session_pool_create(const
> char *name, uint32_t nb_elts,
>       uint32_t elt_size, uint32_t cache_size, uint16_t priv_size,
>       int socket_id);
> 
> +/**
> + * Create an asymmetric session mempool.
> + *
> + * @param name
> + *   The unique mempool name.
> + * @param nb_elts
> + *   The number of elements in the mempool.
> + * @param cache_size
> + *   The number of per-lcore cache elements
> + * @param user_data_size
> + *   The size of user data to be placed after session private data.
> + * @param socket_id
> + *   The *socket_id* argument is the socket identifier in the case of
> + *   NUMA. The value can be *SOCKET_ID_ANY* if there is no NUMA
> + *   constraint for the reserved zone.
> + *
> + * @return
> + *  - On success return size of the session
> + *  - On failure returns 0
> + */
> +__rte_experimental
> +struct rte_mempool *
> +rte_cryptodev_asym_session_pool_create(const char *name, uint32_t
> nb_elts,
> +     uint32_t cache_size, uint16_t user_data_size, int socket_id);
> +
>  /**
>   * Create symmetric crypto session header (generic with no private data)
>   *
> @@ -973,13 +1004,17 @@ rte_cryptodev_sym_session_create(struct
> rte_mempool *mempool);
>   *
>   * @param   mempool    mempool to allocate asymmetric session
>   *                     objects from
> + * @param   dev_id   ID of device that we want the session to be used on
> + * @param   xforms   Asymmetric crypto transform operations to apply on
> flow
> + *                   processed with this session
>   * @return
>   *  - On success return pointer to asym-session
>   *  - On failure returns NULL
>   */
>  __rte_experimental
>  struct rte_cryptodev_asym_session *
> -rte_cryptodev_asym_session_create(struct rte_mempool *mempool);
> +rte_cryptodev_asym_session_create(struct rte_mempool *mempool,
> +             uint8_t dev_id, struct rte_crypto_asym_xform *xforms);
> 
>  /**
>   * Frees symmetric crypto session header, after checking that all @@ -
> 1034,28 +1069,6 @@ rte_cryptodev_sym_session_init(uint8_t dev_id,
>                       struct rte_crypto_sym_xform *xforms,
>                       struct rte_mempool *mempool);
> 
> -/**
> - * Initialize asymmetric session on a device with specific asymmetric xform
> - *
> - * @param   dev_id   ID of device that we want the session to be used on
> - * @param   sess     Session to be set up on a device
> - * @param   xforms   Asymmetric crypto transform operations to apply on
> flow
> - *                   processed with this session
> - * @param   mempool  Mempool to be used for internal allocation.
> - *
> - * @return
> - *  - On success, zero.
> - *  - -EINVAL if input parameters are invalid.
> - *  - -ENOTSUP if crypto device does not support the crypto transform.

[Anoob] API rte_cryptodev_asym_session_create() returning NULL is treated as an 
error. But error can be either due to -EINVAL/-ENOMEM/-ENOTSUP, in which 
-ENOTSUP is typically used by PMD to declare unsupported combinations of 
xforms. Should we clarify this in the API description? 

Also, none of rte_cryptodev_asym_session_create() calls in validation tests 
consider the API returning NULL due to -ENOTSUP. For sym crypto test cases, API 
returning -ENOTSUP was used to skip the test. Can you update the tests such 
that returning NULL would mean test is skipped? Agreed that current code also 
doesn't handle -ENOTSUP case returned by init API.
 
> - *  - -ENOMEM if the private session could not be allocated.
> - */
> -__rte_experimental
> -int
> -rte_cryptodev_asym_session_init(uint8_t dev_id,
> -                     struct rte_cryptodev_asym_session *sess,
> -                     struct rte_crypto_asym_xform *xforms,
> -                     struct rte_mempool *mempool);
> -
>  /**
>   * Frees private data for the device id, based on its device type,
>   * returning it to its mempool. It is the application's responsibility @@ -
> 1075,14 +1088,13 @@ rte_cryptodev_sym_session_clear(uint8_t dev_id,
>                       struct rte_cryptodev_sym_session *sess);
> 

[snip]

> diff --git a/lib/cryptodev/version.map b/lib/cryptodev/version.map index
> c50745fa8c..00b1c9ae35 100644
> --- a/lib/cryptodev/version.map
> +++ b/lib/cryptodev/version.map
> @@ -58,7 +58,6 @@ EXPERIMENTAL {
>       rte_cryptodev_asym_session_clear;
>       rte_cryptodev_asym_session_create;
>       rte_cryptodev_asym_session_free;
> -     rte_cryptodev_asym_session_init;
>       rte_cryptodev_asym_xform_capability_check_modlen;
>       rte_cryptodev_asym_xform_capability_check_optype;
>       rte_cryptodev_sym_cpu_crypto_process;
> @@ -104,6 +103,11 @@ EXPERIMENTAL {
>       rte_cryptodev_remove_deq_callback;
>       rte_cryptodev_remove_enq_callback;
> 
> +     # added 22.03

+1 for get & set user_data API. Ideally it should have been a separate series 
but I agree that it's better getting addressed along with the session rework.

> +     rte_cryptodev_asym_session_pool_create;
> +     rte_cryptodev_asym_session_get_user_data;
> +     rte_cryptodev_asym_session_set_user_data;
> +     __rte_cryptodev_trace_asym_session_pool_create;
>  };
> 
>  INTERNAL {
> --
> 2.25.1

Reply via email to