cryptodev: fix checks related to device id
authorJulien Meunier <julien.meunier@nokia.com>
Wed, 16 Oct 2019 10:21:11 +0000 (13:21 +0300)
committerAkhil Goyal <akhil.goyal@nxp.com>
Wed, 23 Oct 2019 14:57:06 +0000 (16:57 +0200)
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>
lib/librte_cryptodev/rte_cryptodev.c
lib/librte_cryptodev/rte_cryptodev_pmd.h

index b16ef7b..89aa2ed 100644 (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;
        }
index defe05e..fba14f2 100644 (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 */