[dpdk-dev] [PATCH v3 28/29] ethdev: reset all when releasing a port

Ferruh Yigit ferruh.yigit at intel.com
Wed Sep 30 14:17:07 CEST 2020


On 9/29/2020 5:35 PM, Ferruh Yigit wrote:
> On 9/29/2020 5:02 PM, Thomas Monjalon wrote:
>> 29/09/2020 17:50, Ferruh Yigit:
>>> On 9/29/2020 12:58 PM, Wang, Haiyue wrote:
>>>> From: Thomas Monjalon <thomas at monjalon.net>
>>>>> 29/09/2020 12:26, Maxime Coquelin:
>>>>>> On 9/29/20 1:14 AM, Thomas Monjalon wrote:
>>>>>>> The function rte_eth_dev_release_port() was resetting partially
>>>>>>> the struct rte_eth_dev. The drivers were completing it
>>>>>>> with more pointers set to NULL in the close or remove operations.
>>>>>>>
>>>>>>> A full memset is done so most of those assignments become useless.
>>>>> [...]
>>>>>> With this patch, I get following segfault at init time with Virtio PMD:
>>>>>>
>>>>>>           Program received signal SIGSEGV, Segmentation fault.
>>>>>>           0x0000000000854c9b in rte_eth_dev_callback_register (port_id=32,
>>>>>>               event=RTE_ETH_EVENT_UNKNOWN, cb_fn=0x4b24de
>>>>>> <eth_event_callback>,
>>>>>>               cb_arg=0x0) at ../lib/librte_ethdev/rte_ethdev.c:4042
>>>>>>           4042
>>>>>> TAILQ_INSERT_TAIL(&(dev->link_intr_cbs),
>>>>>
>>>>> Yes this is because after closing a port, everything is resetted,
>>>>> including .link_intr_cbs which is set only once in a constructor:
>>>>> http://git.dpdk.org/dpdk/commit/?id=9ec0b3869d8
>>>>>
>>>>> I can change this patch to selectively set pointers to NULL.
>>>>>
>>>>> Or if we prefer a big memset 0, we need to rework how RTE_ETH_ALL
>>>>> is managed to register a callback for any event.
>>>>> Instead of setting the callback for all ports, we could have
>>>>> a special catch-call callback list which is called for all events.
>>>>> This way we could revert initializing .link_intr_cbs in eth_dev_get().
>>>>>
>>>>>
>>>>
>>>> Move 'struct rte_eth_dev_cb_list link_intr_cbs' to the end of 'struct 
>>>> rte_eth_dev',
>>>> and starting from link_intr_cbs, these members will be kept after closed ? :-)
>>>>
>>>> memset(eth_dev, 0, offsetof(struct rte_eth_dev, link_intr_cbs));
>>>>
>>>
>>> This is similar version of a previous patch:
>>> https://patches.dpdk.org/patch/65795/
>>
>> I forgot this patch :)
>>
>>> That one is also waiting because I remember it was not safe for hotplug.
>>
>> I don't think there is a safety issue.
>> It makes harder to play with dangling pointers, which is good.
>> Note: the .device pointer was already resetted by
>> rte_eth_dev_pci_generic_remove(), and generalized in patch 1.
>>
> 
> As far as I remember, resetting '.device' in the 'close()' was causing some 
> issues on hot remove. Yes patch one already does it, I will test the hot remove 
> after close with it.
>

I didn't get any error with 1/29, will proceed with the patchset.

>>> Instead of a big memset, I am for selectively set pointers to NULL.
>>
>> I will prepare the patch with selective resets.
>>
>>
> 



More information about the dev mailing list