On 2/26/2026 3:53 PM, Burakov, Anatoly wrote:
> On 2/26/2026 2:57 PM, Piotr Krzewinski wrote:
>> 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.
> 
> This probably would be the case even if you didn't use `--no-pci` but instead 
> were using block-lists/allow-lists to only probe different devices in 
> secondary processes? Maybe the problem is more general than that.
> 
Most probably yes, I focused on --no-pci as it is where it hit me.
Current memzone naming scheme forces all applications to have same dev_id 
assignment so any changes in the list in secondary would be a problem.
Another solution could be to store the cryptodev data for all devices in single 
memzone, similar to ethdev "rte_eth_dev_data". But it seemed more complex and 
had other drawbacks.
>>
>> 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;
>> +}
> 
> Nitpicking, but why not return `int` and -1? Returning RTE_CRYPTO_MAX_DEVS 
> seems like an odd choice here. You can always cast the valid value to uint8_t 
> at the caller.
Aligned with rte_cryptodev_get_dev_id and rte_cryptodev_find_device_by_name.
Both are returning RTE_CRYPTO_MAX_DEVS when the device or free index is not 
found (though the first one also has -1 as an error condition in some cases).
> 
> That said,
> 
> Acked-by: Anatoly Burakov <[email protected]>
> 
Thanks for quick review!
Best Regards,
Piotr
>> +
>>   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);
> 
> 

Reply via email to