> 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]>
Applied to dpdk-next-crypto
Thanks.
    Fixes: d11b0f30df88 ("cryptodev: introduce API and framework for crypto 
devices")
    Cc: [email protected]

Reply via email to