[dpdk-dev] [PATCH 1/3] cryptodev: add new APIs to assist PMD initialisation

Tomasz Duszynski tdu at semihalf.com
Tue Oct 24 16:09:19 CEST 2017


Hi Declan,

Some comments inline.

On Fri, Oct 20, 2017 at 10:21:11PM +0100, Declan Doherty wrote:
> Adds new PMD assist functions which are bus independent for driver to
> create and destroy new device instances.
>
> Also includes function to parse parameters which can be passed to
> driver on device initialisation.
>
> Signed-off-by: Declan Doherty <declan.doherty at intel.com>
> ---
>  lib/librte_cryptodev/rte_cryptodev.h           |   8 +-
>  lib/librte_cryptodev/rte_cryptodev_pmd.c       | 169 +++++++++++++++++++++++++
>  lib/librte_cryptodev/rte_cryptodev_pmd.h       |  88 +++++++++++++
>  lib/librte_cryptodev/rte_cryptodev_version.map |   3 +
>  4 files changed, 264 insertions(+), 4 deletions(-)
>
> diff --git a/lib/librte_cryptodev/rte_cryptodev.h b/lib/librte_cryptodev/rte_cryptodev.h
> index fd0e3f1..86257b0 100644
> --- a/lib/librte_cryptodev/rte_cryptodev.h
> +++ b/lib/librte_cryptodev/rte_cryptodev.h
> @@ -60,10 +60,10 @@ extern const char **rte_cyptodev_names;
>  		RTE_FMT("%s() line %u: " RTE_FMT_HEAD(__VA_ARGS__,) "\n", \
>  			__func__, __LINE__, RTE_FMT_TAIL(__VA_ARGS__,)))
>
> -#define CDEV_PMD_LOG_ERR(dev, ...) \
> -	RTE_LOG(ERR, CRYPTODEV, \
> -		RTE_FMT("[%s] %s() line %u: " RTE_FMT_HEAD(__VA_ARGS__,) "\n", \
> -			dev, __func__, __LINE__, RTE_FMT_TAIL(__VA_ARGS__,)))
> +#define CDEV_LOG_INFO(...) \
> +	RTE_LOG(INFO, CRYPTODEV, \
> +		RTE_FMT("%s() line %u: " RTE_FMT_HEAD(__VA_ARGS__,) "\n", \
> +			__func__, __LINE__, RTE_FMT_TAIL(__VA_ARGS__,)))
>
>  #ifdef RTE_LIBRTE_CRYPTODEV_DEBUG
>  #define CDEV_LOG_DEBUG(...) \
> diff --git a/lib/librte_cryptodev/rte_cryptodev_pmd.c b/lib/librte_cryptodev/rte_cryptodev_pmd.c
> index a57faad..6cb4419 100644
> --- a/lib/librte_cryptodev/rte_cryptodev_pmd.c
> +++ b/lib/librte_cryptodev/rte_cryptodev_pmd.c
> @@ -40,6 +40,175 @@
>   * Parse name from argument
>   */
>  static int
> +rte_cryptodev_pmd_parse_name_arg(const char *key __rte_unused,
> +		const char *value, void *extra_args)
> +{
> +	struct rte_cryptodev_pmd_init_params *params = extra_args;
> +
> +	if (strlen(value) >= RTE_CRYPTODEV_NAME_MAX_LEN - 1) {
> +		CDEV_LOG_ERR("Invalid name %s, should be less than "
> +				"%u bytes", value,
> +				RTE_CRYPTODEV_NAME_MAX_LEN - 1);
> +		return -1;
> +	}
> +
> +	strncpy(params->name, value, RTE_CRYPTODEV_NAME_MAX_LEN);

Would strcpy() do here? At this point we already know that name will
fit into params->name.

> +
> +	return 0;
> +}
> +
> +/**
> + * Parse integer from argument
> + */
> +static int
> +rte_cryptodev_pmd_parse_integer_arg(const char *key __rte_unused,
> +		const char *value, void *extra_args)
> +{
> +	int *i = extra_args;
> +
> +	*i = atoi(value);
> +	if (*i < 0) {
> +		CDEV_LOG_ERR("Argument has to be positive.");

Perhaps s/positive/non-negative ?
Number 0 looks like a valid argument.

> +		return -1;
> +	}
> +
> +	return 0;
> +}
> +
> +int
> +rte_cryptodev_pmd_parse_input_args(
> +		struct rte_cryptodev_pmd_init_params *params,
> +		const char *args)
> +{
> +	struct rte_kvargs *kvlist = NULL;
> +	int ret = 0;
> +
> +	if (params == NULL)
> +		return -EINVAL;
> +
> +	if (args) {
> +		kvlist = rte_kvargs_parse(args,	cryptodev_pmd_valid_params);
> +		if (kvlist == NULL)
> +			return -EINVAL;
> +
> +		ret = rte_kvargs_process(kvlist,
> +				RTE_CRYPTODEV_PMD_MAX_NB_QP_ARG,
> +				&rte_cryptodev_pmd_parse_integer_arg,
> +				&params->max_nb_queue_pairs);
> +		if (ret < 0)
> +			goto free_kvlist;
> +
> +		ret = rte_kvargs_process(kvlist,
> +				RTE_CRYPTODEV_PMD_MAX_NB_SESS_ARG,
> +				&rte_cryptodev_pmd_parse_integer_arg,
> +				&params->max_nb_sessions);
> +		if (ret < 0)
> +			goto free_kvlist;
> +
> +		ret = rte_kvargs_process(kvlist,
> +				RTE_CRYPTODEV_PMD_SOCKET_ID_ARG,
> +				&rte_cryptodev_pmd_parse_integer_arg,
> +				&params->socket_id);
> +		if (ret < 0)
> +			goto free_kvlist;
> +
> +		ret = rte_kvargs_process(kvlist,
> +				RTE_CRYPTODEV_PMD_NAME_ARG,
> +				&rte_cryptodev_pmd_parse_name_arg,
> +				params);
> +		if (ret < 0)
> +			goto free_kvlist;
> +	}
> +
> +free_kvlist:
> +	rte_kvargs_free(kvlist);
> +	return ret;
> +}
> +
> +struct rte_cryptodev *
> +rte_cryptodev_pmd_create(const char *name,
> +		struct rte_device *device,
> +		struct rte_cryptodev_pmd_init_params *params)
> +{
> +	struct rte_cryptodev *cryptodev;
> +
> +	if (params->name[0] != '\0') {
> +		CDEV_LOG_INFO("[%s] User specified device name = %s\n",
> +				device->driver->name, params->name);
> +		name = params->name;
> +	}
> +
> +	CDEV_LOG_INFO("[%s] Creating cryptodev %s\n",
> +			device->driver->name, name);
> +
> +	CDEV_LOG_INFO("[%s] Initialisation parameters [ name: %s, "
> +			"private data size:  %zu, "
> +			"socket id: %d,"
> +			"max queue pairs: %u, "
> +			"max sessions: %u ]\n",
> +			device->driver->name, name, params->private_data_size,
> +			params->socket_id, params->max_nb_queue_pairs,
> +			params->max_nb_sessions);
> +
> +	/* allocate device structure */
> +	cryptodev = rte_cryptodev_pmd_allocate(name, params->socket_id);
> +	if (cryptodev == NULL) {
> +		CDEV_LOG_ERR("[%s] Failed to allocate crypto device for %s",
> +				device->driver->name, name);
> +		return NULL;
> +	}
> +
> +	/* allocate private device structure */
> +	if (rte_eal_process_type() == RTE_PROC_PRIMARY) {
> +		cryptodev->data->dev_private =
> +				rte_zmalloc_socket("cryptodev device private",
> +						params->private_data_size,
> +						RTE_CACHE_LINE_SIZE,
> +						params->socket_id);
> +
> +		if (cryptodev->data->dev_private == NULL) {
> +			CDEV_LOG_ERR("[%s] Cannot allocate memory for "
> +					"cryptodev %s private data",
> +					device->driver->name, name);
> +
> +			rte_cryptodev_pmd_release_device(cryptodev);
> +			return NULL;
> +		}
> +	}
> +
> +	cryptodev->device = device;
> +
> +	/* initialise user call-back tail queue */
> +	TAILQ_INIT(&(cryptodev->link_intr_cbs));
> +
> +	return cryptodev;
> +}
> +
> +
> +
> +int
> +rte_cryptodev_pmd_destroy(struct rte_cryptodev *cryptodev)
> +{
> +	CDEV_LOG_INFO("Closing crypto device %s [%s]", cryptodev->data->name,
> +			cryptodev->device->name);
> +
> +	/* free crypto device */
> +	rte_cryptodev_pmd_release_device(cryptodev);
> +
> +	if (rte_eal_process_type() == RTE_PROC_PRIMARY)
> +		rte_free(cryptodev->data->dev_private);
> +
> +
> +	cryptodev->device = NULL;
> +	cryptodev->data = NULL;
> +
> +	return 0;
> +}
> +
> +/**
> + * Parse name from argument
> + */
> +static int
>  rte_cryptodev_vdev_parse_name_arg(const char *key __rte_unused,
>  		const char *value, void *extra_args)
>  {
> diff --git a/lib/librte_cryptodev/rte_cryptodev_pmd.h b/lib/librte_cryptodev/rte_cryptodev_pmd.h
> index ba074e1..be9eb80 100644
> --- a/lib/librte_cryptodev/rte_cryptodev_pmd.h
> +++ b/lib/librte_cryptodev/rte_cryptodev_pmd.h
> @@ -56,6 +56,35 @@ extern "C" {
>  #include "rte_crypto.h"
>  #include "rte_cryptodev.h"
>
> +
> +#define RTE_CRYPTODEV_PMD_DEFAULT_MAX_NB_QUEUE_PAIRS	8
> +#define RTE_CRYPTODEV_PMD_DEFAULT_MAX_NB_SESSIONS	2048
> +
> +#define RTE_CRYPTODEV_PMD_NAME_ARG			("name")
> +#define RTE_CRYPTODEV_PMD_MAX_NB_QP_ARG			("max_nb_queue_pairs")
> +#define RTE_CRYPTODEV_PMD_MAX_NB_SESS_ARG		("max_nb_sessions")
> +#define RTE_CRYPTODEV_PMD_SOCKET_ID_ARG			("socket_id")
> +
> +
> +static const char * const cryptodev_pmd_valid_params[] = {
> +	RTE_CRYPTODEV_PMD_NAME_ARG,
> +	RTE_CRYPTODEV_PMD_MAX_NB_QP_ARG,
> +	RTE_CRYPTODEV_PMD_MAX_NB_SESS_ARG,
> +	RTE_CRYPTODEV_PMD_SOCKET_ID_ARG
> +};
> +
> +/**
> + * @internal
> + * Initialisation parameters for crypto devices
> + */
> +struct rte_cryptodev_pmd_init_params {
> +	char name[RTE_CRYPTODEV_NAME_MAX_LEN];
> +	size_t private_data_size;
> +	int socket_id;
> +	unsigned int max_nb_queue_pairs;
> +	unsigned int max_nb_sessions;
> +};
> +
>  /** Global structure used for maintaining state of allocated crypto devices */
>  struct rte_cryptodev_global {
>  	struct rte_cryptodev *devs;	/**< Device information array */
> @@ -392,6 +421,65 @@ rte_cryptodev_pmd_allocate(const char *name, int socket_id);
>  extern int
>  rte_cryptodev_pmd_release_device(struct rte_cryptodev *cryptodev);
>
> +
> +/**
> + * @internal
> + *
> + * PMD assist function to parse initialisation arguments for crypto driver
> + * when creating a new crypto PMD device instance.
> + *
> + * PMD driver should set default values for that PMD before calling function,
> + * these default values will be over-written with successfully parsed values
> + * from args string.
> + *
> + * @param	params	parsed PMD initialisation parameters
> + * @param	args	input argument string to parse
> + *
> + * @return
> + *  - 0 on success
> + *  - errno on failure
> + */
> +int
> +rte_cryptodev_pmd_parse_input_args(
> +		struct rte_cryptodev_pmd_init_params *params,
> +		const char *args);
> +
> +/**
> + * @internal
> + *
> + * PMD assist function to provide boiler plate code for crypto driver to create
> + * and allocate resources for a new crypto PMD device instance.
> + *
> + * @param	name	crypto device name.
> + * @param	device	base device instance
> + * @param	params	PMD initialisation parameters
> + *
> + * @return
> + *  - crypto device instance on success
> + *  - NULL on creation failure
> + */
> +struct rte_cryptodev *
> +rte_cryptodev_pmd_create(const char *name,
> +		struct rte_device *device,
> +		struct rte_cryptodev_pmd_init_params *params);
> +
> +/**
> + * @internal
> + *
> + * PMD assist function to provide boiler plate code for crypto driver to
> + * destroy and free resources associated with a crypto PMD device instance.
> + *
> + * @param	name	crypto device name.
> + * @param	device	base device instance
> + * @param	params	PMD initialisation parameters
> + *
> + * @return
> + *  - crypto device instance on success
> + *  - NULL on creation failure
> + */
> +int
> +rte_cryptodev_pmd_destroy(struct rte_cryptodev *cryptodev);
> +
>  /**
>   * Executes all the user application registered callbacks for the specific
>   * device.
> diff --git a/lib/librte_cryptodev/rte_cryptodev_version.map b/lib/librte_cryptodev/rte_cryptodev_version.map
> index 919b6cc..a0ea7bf 100644
> --- a/lib/librte_cryptodev/rte_cryptodev_version.map
> +++ b/lib/librte_cryptodev/rte_cryptodev_version.map
> @@ -84,5 +84,8 @@ DPDK_17.11 {
>  	global:
>
>  	rte_cryptodev_name_get;
> +	rte_cryptodev_pmd_create;
> +	rte_cryptodev_pmd_destroy;
> +	rte_cryptodev_pmd_parse_input_args;
>
>  } DPDK_17.08;
> --
> 2.9.4
>

--
- Tomasz Duszyński


More information about the dev mailing list