[dpdk-dev] [PATCH v3 28/29] ethdev: reset all when releasing a port
Maxime Coquelin
maxime.coquelin at redhat.com
Tue Sep 29 12:26:48 CEST 2020
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.
>
> Signed-off-by: Thomas Monjalon <thomas at monjalon.net>
> ---
> drivers/net/ark/ark_ethdev.c | 3 ---
> drivers/net/atlantic/atl_ethdev.c | 4 ----
> drivers/net/axgbe/axgbe_ethdev.c | 3 ---
> drivers/net/bnxt/bnxt_ethdev.c | 4 ----
> drivers/net/bnxt/bnxt_reps.c | 1 -
> drivers/net/bonding/rte_eth_bond_pmd.c | 4 ----
> drivers/net/dpaa/dpaa_ethdev.c | 4 ----
> drivers/net/dpaa2/dpaa2_ethdev.c | 4 ----
> drivers/net/e1000/em_ethdev.c | 4 ----
> drivers/net/e1000/igb_ethdev.c | 8 --------
> drivers/net/ena/ena_ethdev.c | 5 -----
> drivers/net/fm10k/fm10k_ethdev.c | 4 ----
> drivers/net/hinic/hinic_pmd_ethdev.c | 4 ----
> drivers/net/hns3/hns3_ethdev.c | 4 ----
> drivers/net/hns3/hns3_ethdev_vf.c | 5 -----
> drivers/net/i40e/i40e_ethdev.c | 4 ----
> drivers/net/i40e/i40e_ethdev_vf.c | 4 ----
> drivers/net/iavf/iavf_ethdev.c | 4 ----
> drivers/net/ice/ice_dcf_ethdev.c | 4 ----
> drivers/net/ice/ice_ethdev.c | 4 ----
> drivers/net/ionic/ionic_ethdev.c | 5 -----
> drivers/net/ixgbe/ixgbe_ethdev.c | 8 --------
> drivers/net/liquidio/lio_ethdev.c | 4 ----
> drivers/net/netvsc/hn_ethdev.c | 4 ----
> drivers/net/octeontx/octeontx_ethdev.c | 3 ---
> drivers/net/qede/qede_ethdev.c | 4 ----
> drivers/net/sfc/sfc_ethdev.c | 7 +------
> drivers/net/tap/rte_eth_tap.c | 1 -
> drivers/net/virtio/virtio_ethdev.c | 4 ----
> drivers/net/vmxnet3/vmxnet3_ethdev.c | 5 -----
> lib/librte_ethdev/rte_ethdev.c | 5 +----
> 31 files changed, 2 insertions(+), 129 deletions(-)
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),
(gdb) bt full
#0 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
dev = 0x2fe9980 <rte_eth_devices>
user_cb = 0x1003b0300
next_port = 0
last_port = 31
#1 0x00000000004b268f in register_eth_event_callback ()
at ../app/test-pmd/testpmd.c:3111
ret = 0
event = RTE_ETH_EVENT_UNKNOWN
#2 0x00000000004b3a7e in main (argc=2, argv=0x7fffffffeb18)
at ../app/test-pmd/testpmd.c:3658
diag = 0
port_id = 0
count = 0
ret = -5584
(gdb) l 4042
4037 sizeof(struct
rte_eth_dev_callback), 0);
4038 if (user_cb != NULL) {
4039 user_cb->cb_fn = cb_fn;
4040 user_cb->cb_arg = cb_arg;
4041 user_cb->event = event;
4042
TAILQ_INSERT_TAIL(&(dev->link_intr_cbs),
4043
user_cb, next);
4044 } else {
4045
rte_spinlock_unlock(&rte_eth_dev_cb_lock);
4046
rte_eth_dev_callback_unregister(port_id, event,
(gdb) p rte_eth_devices[0]
$2 = {
rx_pkt_burst = 0x0,
tx_pkt_burst = 0x0,
tx_pkt_prepare = 0x0,
rx_queue_count = 0x0,
rx_descriptor_done = 0x1589664 <virtio_dev_rx_queue_done>,
rx_descriptor_status = 0x0,
tx_descriptor_status = 0x0,
data = 0x1003b3700,
process_private = 0x0,
dev_ops = 0x29621a0 <virtio_eth_dev_ops>,
device = 0x3174dc0,
intr_handle = 0x3174ea0,
link_intr_cbs = {
tqh_first = 0x0,
tqh_last = 0x0
},
post_rx_burst_cbs = {0x0 <repeats 1024 times>},
pre_tx_burst_cbs = {0x0 <repeats 1024 times>},
state = RTE_ETH_DEV_ATTACHED,
security_ctx = 0x0,
reserved_64s = {0, 0, 0, 0},
reserved_ptrs = {0x0, 0x0, 0x0, 0x0}
}
When reverted, it looks OK.
Thanks,
Maxime
More information about the dev
mailing list