29/09/2020 17:50, Ferruh Yigit: > On 9/29/2020 12:58 PM, Wang, Haiyue wrote: > > From: Thomas Monjalon <tho...@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. > Instead of a big memset, I am for selectively set pointers to NULL. I will prepare the patch with selective resets.