From: Piotr Krzewinski <krzewinskip@gmail.com>
To: "Burakov, Anatoly" <anatoly.burakov@intel.com>,
Piotr Krzewinski <piotr.krzewinski@ericsson.com>,
Akhil Goyal <gakhil@marvell.com>,
Fan Zhang <fanzhang.oss@gmail.com>
Cc: dev@dpdk.org
Subject: Re: [PATCH] cryptodev: fix memory corruption in secondary process
Date: Fri, 27 Feb 2026 08:54:43 +0100 [thread overview]
Message-ID: <da7ab2ee-2a37-4536-92f2-5981840b7b81@gmail.com> (raw)
In-Reply-To: <431e978a-1763-43b0-a2c9-d285edbbfec8@intel.com>
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 <piotr.krzewinski@ericsson.com>
>> ---
>> 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 <anatoly.burakov@intel.com>
>
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);
>
>
next prev parent reply other threads:[~2026-02-27 7:54 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-02-26 13:57 [PATCH] cryptodev: fix memory corruption in secondary process Piotr Krzewinski
2026-02-26 14:53 ` Burakov, Anatoly
2026-02-27 7:54 ` Piotr Krzewinski [this message]
2026-03-10 5:54 ` [EXTERNAL] " Akhil Goyal
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=da7ab2ee-2a37-4536-92f2-5981840b7b81@gmail.com \
--to=krzewinskip@gmail.com \
--cc=anatoly.burakov@intel.com \
--cc=dev@dpdk.org \
--cc=fanzhang.oss@gmail.com \
--cc=gakhil@marvell.com \
--cc=piotr.krzewinski@ericsson.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox