[dpdk-dev] [RFC V2] ethdev: fix issue that dev close in PMD calls twice
Huisong Li
lihuisong at huawei.com
Fri Aug 13 10:16:20 CEST 2021
在 2021/8/13 14:12, Thomas Monjalon 写道:
> 13/08/2021 04:11, Huisong Li:
>> Hi, all
>>
>> This patch can enhance the security of device uninstallation to
>> eliminate dependency on user usage methods.
>>
>> Can you check this patch?
>>
>>
>> 在 2021/8/3 10:30, Huisong Li 写道:
>>> Ethernet devices in DPDK can be released by rte_eth_dev_close() and
>>> rte_dev_remove(). These APIs both call xxx_dev_close() in PMD layer
>>> to uninstall hardware. However, the two APIs do not have explicit
>>> invocation restrictions. In other words, at the ethdev layer, it is
>>> possible to call rte_eth_dev_close() before calling rte_dev_remove()
>>> or rte_eal_hotplug_remove(). In such a bad scenario,
> It is not a bad scenario.
> If there is no more port for the device after calling close,
> the device should be removed automatically.
> Keep in mind "close" is for one port, "remove" is for the entire device
> which can have more than one port.
I know.
dev_close() is for removing an eth device. And rte_dev_remove() can be used
for removing the rte device and all its eth devices belonging to the rte
device.
In rte_dev_remove(), "remove" is executed in primary or one of secondary,
all eth devices having same pci address will be closed and removed.
>
>>> the primary
>>> process may be fine, but it may cause that xxx_dev_close() in the PMD
>>> layer will be called twice in the secondary process. So this patch
>>> fixes it.
> If a port is closed in primary, it should be the same in secondary.
>
>
>>> + /*
>>> + * The eth_dev->data->name doesn't be cleared by the secondary process,
>>> + * so above "eth_dev" isn't NULL after rte_eth_dev_close() called.
> This assumption is not clear. All should be closed together.
However, dev_close() does not have the feature similar to rte_dev_remove().
Namely, it is not guaranteed that all eth devices are closed together in
ethdev layer. It depends on app or user.
If the app does not close together, the operation of repeatedly
uninstalling an eth device in the secondary process
will be triggered when dev_close() is first called by one secondary
process, and then rte_dev_remove() is called.
So I think it should be avoided.
>
>>> + * Namely, whether "eth_dev" is NULL cannot be used to determine whether
>>> + * an ethdev port has been released.
>>> + * For both primary process and secondary process, eth_dev->state is
>>> + * RTE_ETH_DEV_UNUSED, which means the ethdev port has been released.
>>> + */
>>> + if (eth_dev->state == RTE_ETH_DEV_UNUSED) {
>>> + RTE_ETHDEV_LOG(INFO, "The ethdev port has been released.");
>>> + return 0;
>>> + }
>
>
> .
More information about the dev
mailing list