When secondary process runs with --no-pci, it skips hardware device
probing, causing different cryptodev dev_id assignments than in primary.
Since memzone lookup is based on dev_id, it leads to secondary
attaching to wrong memzone and corrupting primary's device
data structures.

Fix by making secondary process search for devices by name in existing
memzones instead of using local dev_id allocation.

Signed-off-by: Piotr Krzewinski <[email protected]>
---
 lib/cryptodev/rte_cryptodev.c | 37 +++++++++++++++++++++++++++++++----
 1 file changed, 33 insertions(+), 4 deletions(-)

diff --git a/lib/cryptodev/rte_cryptodev.c b/lib/cryptodev/rte_cryptodev.c
index 7bddb154c2..50071935c2 100644
--- a/lib/cryptodev/rte_cryptodev.c
+++ b/lib/cryptodev/rte_cryptodev.c
@@ -1177,6 +1177,27 @@ rte_cryptodev_find_free_device_index(void)
        return RTE_CRYPTO_MAX_DEVS;
 }
 
+static uint8_t
+rte_cryptodev_find_device_by_name(const char *name)
+{
+       char mz_name[RTE_MEMZONE_NAMESIZE];
+       const struct rte_memzone *mz;
+       struct rte_cryptodev_data *data;
+       uint8_t dev_id;
+
+       for (dev_id = 0; dev_id < RTE_CRYPTO_MAX_DEVS; dev_id++) {
+               snprintf(mz_name, sizeof(mz_name), "rte_cryptodev_data_%u", 
dev_id);
+               mz = rte_memzone_lookup(mz_name);
+               if (mz == NULL)
+                       continue;
+
+               data = mz->addr;
+               if (strncmp(data->name, name, RTE_CRYPTODEV_NAME_MAX_LEN) == 0)
+                       return dev_id;
+       }
+       return RTE_CRYPTO_MAX_DEVS;
+}
+
 RTE_EXPORT_INTERNAL_SYMBOL(rte_cryptodev_pmd_allocate)
 struct rte_cryptodev *
 rte_cryptodev_pmd_allocate(const char *name, int socket_id)
@@ -1190,10 +1211,18 @@ rte_cryptodev_pmd_allocate(const char *name, int 
socket_id)
                return NULL;
        }
 
-       dev_id = rte_cryptodev_find_free_device_index();
-       if (dev_id == RTE_CRYPTO_MAX_DEVS) {
-               CDEV_LOG_ERR("Reached maximum number of crypto devices");
-               return NULL;
+       if (rte_eal_process_type() == RTE_PROC_SECONDARY) {
+               dev_id = rte_cryptodev_find_device_by_name(name);
+               if (dev_id == RTE_CRYPTO_MAX_DEVS) {
+                       CDEV_LOG_ERR("Device %s does not exist in primary 
process", name);
+                       return NULL;
+               }
+       } else {
+               dev_id = rte_cryptodev_find_free_device_index();
+               if (dev_id == RTE_CRYPTO_MAX_DEVS) {
+                       CDEV_LOG_ERR("Reached maximum number of crypto 
devices");
+                       return NULL;
+               }
        }
 
        cryptodev = rte_cryptodev_pmd_get_dev(dev_id);
-- 
2.34.1

Reply via email to