[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