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

Thomas Monjalon thomas at monjalon.net
Tue Sep 29 12:36:26 CEST 2020


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().





More information about the dev mailing list