[dpdk-dev,v3,1/2] cryptodev: add user defined name initializing parameter to software PMD

Message ID 1484576095-233208-2-git-send-email-roy.fan.zhang@intel.com
State Accepted, archived
Delegated to: Pablo de Lara Guarch
Headers show

Checks

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

Commit Message

Zhang, Roy Fan Jan. 16, 2017, 2:14 p.m.
This patch adds a user defined name initializing parameter to cryptodev
library.

Originally, for software cryptodev PMD, the vdev name parameter is
treated as the driver identifier, and will create an unique name for each
device automatically, which is not necessarily as same as the vdev
parameter.

This patch allows the user to either create a unique name for his software
cryptodev, or by default, let the system creates a unique one. This should
help the user managing the created cryptodevs easily.

Examples:
CLI command fragment 1: --vdev "crypto_aesni_gcm_pmd"
The above command will result in creating a AESNI-GCM PMD with name of
"crypto_aesni_gcm_X", where postfix X is the number assigned by the system,
starting from 0. This fragment can be placed in the same CLI command
multiple times, resulting the postfixs incremented by one for each new
device.

CLI command fragment 2: --vdev "crypto_aesni_gcm_pmd,name=gcm1"
The above command will result in creating a AESNI-GCM PMD with name of
"gcm1". This fragment can be placed in the same CLI command multiple
times, as long as each having a unique name value.

Signed-off-by: Fan Zhang <roy.fan.zhang@intel.com>
---
 lib/librte_cryptodev/rte_cryptodev.c           | 51 ++++++++++++++++++++++++++
 lib/librte_cryptodev/rte_cryptodev.h           |  7 ++--
 lib/librte_cryptodev/rte_cryptodev_pmd.h       |  7 ++++
 lib/librte_cryptodev/rte_cryptodev_version.map |  7 ++++
 4 files changed, 68 insertions(+), 4 deletions(-)

Comments

Declan Doherty Jan. 16, 2017, 4:01 p.m. | #1
On 16/01/17 14:14, Fan Zhang wrote:
> This patch adds a user defined name initializing parameter to cryptodev
> library.
>
> Originally, for software cryptodev PMD, the vdev name parameter is
> treated as the driver identifier, and will create an unique name for each
> device automatically, which is not necessarily as same as the vdev
> parameter.
>
> This patch allows the user to either create a unique name for his software
> cryptodev, or by default, let the system creates a unique one. This should
> help the user managing the created cryptodevs easily.
>
> Examples:
> CLI command fragment 1: --vdev "crypto_aesni_gcm_pmd"
> The above command will result in creating a AESNI-GCM PMD with name of
> "crypto_aesni_gcm_X", where postfix X is the number assigned by the system,
> starting from 0. This fragment can be placed in the same CLI command
> multiple times, resulting the postfixs incremented by one for each new
> device.
>
> CLI command fragment 2: --vdev "crypto_aesni_gcm_pmd,name=gcm1"
> The above command will result in creating a AESNI-GCM PMD with name of
> "gcm1". This fragment can be placed in the same CLI command multiple
> times, as long as each having a unique name value.
>
> Signed-off-by: Fan Zhang <roy.fan.zhang@intel.com>
> ---
>  lib/librte_cryptodev/rte_cryptodev.c           | 51 ++++++++++++++++++++++++++
>  lib/librte_cryptodev/rte_cryptodev.h           |  7 ++--
>  lib/librte_cryptodev/rte_cryptodev_pmd.h       |  7 ++++
>  lib/librte_cryptodev/rte_cryptodev_version.map |  7 ++++
>  4 files changed, 68 insertions(+), 4 deletions(-)
>
> diff --git a/lib/librte_cryptodev/rte_cryptodev.c b/lib/librte_cryptodev/rte_cryptodev.c
> index 127e8d0..d6d7f3d 100644
> --- a/lib/librte_cryptodev/rte_cryptodev.c
> +++ b/lib/librte_cryptodev/rte_cryptodev.c
> @@ -101,11 +101,13 @@ struct rte_cryptodev_callback {
>  	uint32_t active;			/**< Callback is executing */
>  };
>
> +#define RTE_CRYPTODEV_VDEV_NAME				("name")
>  #define RTE_CRYPTODEV_VDEV_MAX_NB_QP_ARG		("max_nb_queue_pairs")
>  #define RTE_CRYPTODEV_VDEV_MAX_NB_SESS_ARG		("max_nb_sessions")
>  #define RTE_CRYPTODEV_VDEV_SOCKET_ID			("socket_id")
>
>  static const char *cryptodev_vdev_valid_params[] = {
> +	RTE_CRYPTODEV_VDEV_NAME,
>  	RTE_CRYPTODEV_VDEV_MAX_NB_QP_ARG,
>  	RTE_CRYPTODEV_VDEV_MAX_NB_SESS_ARG,
>  	RTE_CRYPTODEV_VDEV_SOCKET_ID
> @@ -143,6 +145,25 @@ parse_integer_arg(const char *key __rte_unused,
>  	return 0;
>  }
>
> +/** Parse name */
> +static int
> +parse_name_arg(const char *key __rte_unused,
> +		const char *value, void *extra_args)
> +{
> +	struct rte_crypto_vdev_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);
> +
> +	return 0;
> +}
> +
>  int
>  rte_cryptodev_parse_vdev_init_params(struct rte_crypto_vdev_init_params *params,
>  		const char *input_args)
> @@ -179,6 +200,12 @@ rte_cryptodev_parse_vdev_init_params(struct rte_crypto_vdev_init_params *params,
>  		if (ret < 0)
>  			goto free_kvlist;
>
> +		ret = rte_kvargs_process(kvlist, RTE_CRYPTODEV_VDEV_NAME,
> +					&parse_name_arg,
> +					params);
> +		if (ret < 0)
> +			goto free_kvlist;
> +
>  		if (params->socket_id >= number_of_sockets()) {
>  			CDEV_LOG_ERR("Invalid socket id specified to create "
>  				"the virtual crypto device on");
> @@ -1205,3 +1232,27 @@ rte_crypto_op_pool_create(const char *name, enum rte_crypto_op_type type,
>
>  	return mp;
>  }
> +
> +int
> +rte_cryptodev_pmd_create_dev_name(char *name, const char *dev_name_prefix)
> +{
> +	struct rte_cryptodev *dev = NULL;
> +	uint32_t i = 0;
> +
> +	if (name == NULL)
> +		return -EINVAL;
> +
> +	for (i = 0; i < RTE_CRYPTO_MAX_DEVS; i++) {
> +		int ret = snprintf(name, RTE_CRYPTODEV_NAME_MAX_LEN,
> +				"%s_%u", dev_name_prefix, i);
> +
> +		if (ret < 0)
> +			return ret;
> +
> +		dev = rte_cryptodev_pmd_get_named_dev(name);
> +		if (!dev)
> +			return 0;
> +	}
> +
> +	return -1;
> +}
> diff --git a/lib/librte_cryptodev/rte_cryptodev.h b/lib/librte_cryptodev/rte_cryptodev.h
> index 8f63e8f..b5399af 100644
> --- a/lib/librte_cryptodev/rte_cryptodev.h
> +++ b/lib/librte_cryptodev/rte_cryptodev.h
> @@ -300,6 +300,8 @@ struct rte_cryptodev_stats {
>  	/**< Total error count on operations dequeued */
>  };
>
> +#define RTE_CRYPTODEV_NAME_MAX_LEN	(64)
> +/**< Max length of name of crypto PMD */
>  #define RTE_CRYPTODEV_VDEV_DEFAULT_MAX_NB_QUEUE_PAIRS	8
>  #define RTE_CRYPTODEV_VDEV_DEFAULT_MAX_NB_SESSIONS	2048
>
> @@ -311,6 +313,7 @@ struct rte_crypto_vdev_init_params {
>  	unsigned max_nb_queue_pairs;
>  	unsigned max_nb_sessions;
>  	uint8_t socket_id;
> +	char name[RTE_CRYPTODEV_NAME_MAX_LEN];
>  };
>
>  /**
> @@ -635,10 +638,6 @@ struct rte_cryptodev {
>  	/**< Flag indicating the device is attached */
>  } __rte_cache_aligned;
>
> -
> -#define RTE_CRYPTODEV_NAME_MAX_LEN	(64)
> -/**< Max length of name of crypto PMD */
> -
>  /**
>   *
>   * The data part, with no function pointers, associated with each device.
> diff --git a/lib/librte_cryptodev/rte_cryptodev_pmd.h b/lib/librte_cryptodev/rte_cryptodev_pmd.h
> index abfe2dc..dc57bfa 100644
> --- a/lib/librte_cryptodev/rte_cryptodev_pmd.h
> +++ b/lib/librte_cryptodev/rte_cryptodev_pmd.h
> @@ -519,6 +519,13 @@ int rte_cryptodev_pci_probe(struct rte_pci_driver *pci_drv,
>   */
>  int rte_cryptodev_pci_remove(struct rte_pci_device *pci_dev);
>
> +/**
> + * @internal
> + * Create unique device name
> + */
> +int
> +rte_cryptodev_pmd_create_dev_name(char *name, const char *dev_name_prefix);
> +
>  #ifdef __cplusplus
>  }
>  #endif
> diff --git a/lib/librte_cryptodev/rte_cryptodev_version.map b/lib/librte_cryptodev/rte_cryptodev_version.map
> index 9dde0e7..c581eea 100644
> --- a/lib/librte_cryptodev/rte_cryptodev_version.map
> +++ b/lib/librte_cryptodev/rte_cryptodev_version.map
> @@ -46,3 +46,10 @@ DPDK_16.11 {
>  	rte_cryptodev_pci_remove;
>
>  } DPDK_16.07;
> +
> +DPDK_17.02 {
> +	global:
> +
> +	rte_cryptodev_pmd_create_dev_name;
> +
> +} DPDK_16.11;
>
Acked-by: Declan Doherty <declan.doherty@intel.com>

Patch

diff --git a/lib/librte_cryptodev/rte_cryptodev.c b/lib/librte_cryptodev/rte_cryptodev.c
index 127e8d0..d6d7f3d 100644
--- a/lib/librte_cryptodev/rte_cryptodev.c
+++ b/lib/librte_cryptodev/rte_cryptodev.c
@@ -101,11 +101,13 @@  struct rte_cryptodev_callback {
 	uint32_t active;			/**< Callback is executing */
 };
 
+#define RTE_CRYPTODEV_VDEV_NAME				("name")
 #define RTE_CRYPTODEV_VDEV_MAX_NB_QP_ARG		("max_nb_queue_pairs")
 #define RTE_CRYPTODEV_VDEV_MAX_NB_SESS_ARG		("max_nb_sessions")
 #define RTE_CRYPTODEV_VDEV_SOCKET_ID			("socket_id")
 
 static const char *cryptodev_vdev_valid_params[] = {
+	RTE_CRYPTODEV_VDEV_NAME,
 	RTE_CRYPTODEV_VDEV_MAX_NB_QP_ARG,
 	RTE_CRYPTODEV_VDEV_MAX_NB_SESS_ARG,
 	RTE_CRYPTODEV_VDEV_SOCKET_ID
@@ -143,6 +145,25 @@  parse_integer_arg(const char *key __rte_unused,
 	return 0;
 }
 
+/** Parse name */
+static int
+parse_name_arg(const char *key __rte_unused,
+		const char *value, void *extra_args)
+{
+	struct rte_crypto_vdev_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);
+
+	return 0;
+}
+
 int
 rte_cryptodev_parse_vdev_init_params(struct rte_crypto_vdev_init_params *params,
 		const char *input_args)
@@ -179,6 +200,12 @@  rte_cryptodev_parse_vdev_init_params(struct rte_crypto_vdev_init_params *params,
 		if (ret < 0)
 			goto free_kvlist;
 
+		ret = rte_kvargs_process(kvlist, RTE_CRYPTODEV_VDEV_NAME,
+					&parse_name_arg,
+					params);
+		if (ret < 0)
+			goto free_kvlist;
+
 		if (params->socket_id >= number_of_sockets()) {
 			CDEV_LOG_ERR("Invalid socket id specified to create "
 				"the virtual crypto device on");
@@ -1205,3 +1232,27 @@  rte_crypto_op_pool_create(const char *name, enum rte_crypto_op_type type,
 
 	return mp;
 }
+
+int
+rte_cryptodev_pmd_create_dev_name(char *name, const char *dev_name_prefix)
+{
+	struct rte_cryptodev *dev = NULL;
+	uint32_t i = 0;
+
+	if (name == NULL)
+		return -EINVAL;
+
+	for (i = 0; i < RTE_CRYPTO_MAX_DEVS; i++) {
+		int ret = snprintf(name, RTE_CRYPTODEV_NAME_MAX_LEN,
+				"%s_%u", dev_name_prefix, i);
+
+		if (ret < 0)
+			return ret;
+
+		dev = rte_cryptodev_pmd_get_named_dev(name);
+		if (!dev)
+			return 0;
+	}
+
+	return -1;
+}
diff --git a/lib/librte_cryptodev/rte_cryptodev.h b/lib/librte_cryptodev/rte_cryptodev.h
index 8f63e8f..b5399af 100644
--- a/lib/librte_cryptodev/rte_cryptodev.h
+++ b/lib/librte_cryptodev/rte_cryptodev.h
@@ -300,6 +300,8 @@  struct rte_cryptodev_stats {
 	/**< Total error count on operations dequeued */
 };
 
+#define RTE_CRYPTODEV_NAME_MAX_LEN	(64)
+/**< Max length of name of crypto PMD */
 #define RTE_CRYPTODEV_VDEV_DEFAULT_MAX_NB_QUEUE_PAIRS	8
 #define RTE_CRYPTODEV_VDEV_DEFAULT_MAX_NB_SESSIONS	2048
 
@@ -311,6 +313,7 @@  struct rte_crypto_vdev_init_params {
 	unsigned max_nb_queue_pairs;
 	unsigned max_nb_sessions;
 	uint8_t socket_id;
+	char name[RTE_CRYPTODEV_NAME_MAX_LEN];
 };
 
 /**
@@ -635,10 +638,6 @@  struct rte_cryptodev {
 	/**< Flag indicating the device is attached */
 } __rte_cache_aligned;
 
-
-#define RTE_CRYPTODEV_NAME_MAX_LEN	(64)
-/**< Max length of name of crypto PMD */
-
 /**
  *
  * The data part, with no function pointers, associated with each device.
diff --git a/lib/librte_cryptodev/rte_cryptodev_pmd.h b/lib/librte_cryptodev/rte_cryptodev_pmd.h
index abfe2dc..dc57bfa 100644
--- a/lib/librte_cryptodev/rte_cryptodev_pmd.h
+++ b/lib/librte_cryptodev/rte_cryptodev_pmd.h
@@ -519,6 +519,13 @@  int rte_cryptodev_pci_probe(struct rte_pci_driver *pci_drv,
  */
 int rte_cryptodev_pci_remove(struct rte_pci_device *pci_dev);
 
+/**
+ * @internal
+ * Create unique device name
+ */
+int
+rte_cryptodev_pmd_create_dev_name(char *name, const char *dev_name_prefix);
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/lib/librte_cryptodev/rte_cryptodev_version.map b/lib/librte_cryptodev/rte_cryptodev_version.map
index 9dde0e7..c581eea 100644
--- a/lib/librte_cryptodev/rte_cryptodev_version.map
+++ b/lib/librte_cryptodev/rte_cryptodev_version.map
@@ -46,3 +46,10 @@  DPDK_16.11 {
 	rte_cryptodev_pci_remove;
 
 } DPDK_16.07;
+
+DPDK_17.02 {
+	global:
+
+	rte_cryptodev_pmd_create_dev_name;
+
+} DPDK_16.11;