cryptodev: fix checks related to device id

Each cryptodev are indexed with dev_id in the global rte_crypto_devices
variable. nb_devs is incremented / decremented each time a cryptodev is
created / deleted. The goal of nb_devs was to prevent the user to get an
invalid dev_id.

Let's imagine DPDK has configured N cryptodevs. If the cryptodev=1 is
removed at runtime, the latest cryptodev N cannot be accessible, because
nb_devs=N-1 with the current implementaion.

In order to prevent this kind of behavior, let's remove the check with
nb_devs and iterate in all the rte_crypto_devices elements: if data is
not NULL, that means a valid cryptodev is available.

Also, remove max_devs field and use RTE_CRYPTO_MAX_DEVS in order to
unify the code.

Fixes: d11b0f30df88 ("cryptodev: introduce API and framework for crypto devices")
Cc: stable@dpdk.org

Signed-off-by: Julien Meunier <julien.meunier@nokia.com>
Acked-by: Akhil Goyal <akhil.goyal@nxp.com>
This commit is contained in:
Julien Meunier 2019-10-16 13:21:11 +03:00 committed by Akhil Goyal
parent 88d664aa1c
commit 3dd4435cf4
2 changed files with 21 additions and 10 deletions

View File

@ -50,8 +50,7 @@ struct rte_cryptodev *rte_cryptodevs = rte_crypto_devices;
static struct rte_cryptodev_global cryptodev_globals = {
.devs = rte_crypto_devices,
.data = { NULL },
.nb_devs = 0,
.max_devs = RTE_CRYPTO_MAX_DEVS
.nb_devs = 0
};
/* spinlock for crypto device callbacks */
@ -512,7 +511,7 @@ rte_cryptodev_pmd_get_named_dev(const char *name)
if (name == NULL)
return NULL;
for (i = 0; i < cryptodev_globals.max_devs; i++) {
for (i = 0; i < RTE_CRYPTO_MAX_DEVS; i++) {
dev = &cryptodev_globals.devs[i];
if ((dev->attached == RTE_CRYPTODEV_ATTACHED) &&
@ -523,12 +522,21 @@ rte_cryptodev_pmd_get_named_dev(const char *name)
return NULL;
}
static inline uint8_t
rte_cryptodev_is_valid_device_data(uint8_t dev_id)
{
if (rte_crypto_devices[dev_id].data == NULL)
return 0;
return 1;
}
unsigned int
rte_cryptodev_pmd_is_valid_dev(uint8_t dev_id)
{
struct rte_cryptodev *dev = NULL;
if (dev_id >= cryptodev_globals.nb_devs)
if (!rte_cryptodev_is_valid_device_data(dev_id))
return 0;
dev = rte_cryptodev_pmd_get_dev(dev_id);
@ -547,12 +555,15 @@ rte_cryptodev_get_dev_id(const char *name)
if (name == NULL)
return -1;
for (i = 0; i < cryptodev_globals.nb_devs; i++)
for (i = 0; i < RTE_CRYPTO_MAX_DEVS; i++) {
if (!rte_cryptodev_is_valid_device_data(i))
continue;
if ((strcmp(cryptodev_globals.devs[i].data->name, name)
== 0) &&
(cryptodev_globals.devs[i].attached ==
RTE_CRYPTODEV_ATTACHED))
return i;
}
return -1;
}
@ -568,7 +579,7 @@ rte_cryptodev_device_count_by_driver(uint8_t driver_id)
{
uint8_t i, dev_count = 0;
for (i = 0; i < cryptodev_globals.max_devs; i++)
for (i = 0; i < RTE_CRYPTO_MAX_DEVS; i++)
if (cryptodev_globals.devs[i].driver_id == driver_id &&
cryptodev_globals.devs[i].attached ==
RTE_CRYPTODEV_ATTACHED)
@ -583,9 +594,10 @@ rte_cryptodev_devices_get(const char *driver_name, uint8_t *devices,
{
uint8_t i, count = 0;
struct rte_cryptodev *devs = cryptodev_globals.devs;
uint8_t max_devs = cryptodev_globals.max_devs;
for (i = 0; i < max_devs && count < nb_devices; i++) {
for (i = 0; i < RTE_CRYPTO_MAX_DEVS && count < nb_devices; i++) {
if (!rte_cryptodev_is_valid_device_data(i))
continue;
if (devs[i].attached == RTE_CRYPTODEV_ATTACHED) {
int cmp;
@ -1101,7 +1113,7 @@ rte_cryptodev_info_get(uint8_t dev_id, struct rte_cryptodev_info *dev_info)
{
struct rte_cryptodev *dev;
if (dev_id >= cryptodev_globals.nb_devs) {
if (!rte_cryptodev_pmd_is_valid_dev(dev_id)) {
CDEV_LOG_ERR("Invalid dev_id=%d", dev_id);
return;
}

View File

@ -61,7 +61,6 @@ struct rte_cryptodev_global {
struct rte_cryptodev_data *data[RTE_CRYPTO_MAX_DEVS];
/**< Device private data */
uint8_t nb_devs; /**< Number of devices found */
uint8_t max_devs; /**< Max number of devices */
};
/* Cryptodev driver, containing the driver ID */