drivers/net: check process type in close operation
The secondary processes are not allowed to release shared resources. Only process-private resources should be freed in a secondary process. Most of the time, there is no process-private resource, so the close operation is just forbidden in a secondary process. After adding proper check in the port close functions, some redundant checks in the device remove functions are dropped. Signed-off-by: Thomas Monjalon <thomas@monjalon.net> Reviewed-by: Rosen Xu <rosen.xu@intel.com> Reviewed-by: Sachin Saxena <sachin.saxena@oss.nxp.com> Reviewed-by: Ajit Khaparde <ajit.khaparde@broadcom.com> Reviewed-by: Liron Himi <lironh@marvell.com> Reviewed-by: Haiyue Wang <haiyue.wang@intel.com> Acked-by: Jeff Guo <jia.guo@intel.com> Reviewed-by: Andrew Rybchenko <arybchenko@solarflare.com> Acked-by: Stephen Hemminger <stephen@networkplumber.org>
This commit is contained in:
parent
68f578bf9b
commit
3041049375
@ -821,6 +821,9 @@ eth_dev_close(struct rte_eth_dev *dev)
|
||||
struct pkt_rx_queue *rxq;
|
||||
int i;
|
||||
|
||||
if (rte_eal_process_type() != RTE_PROC_PRIMARY)
|
||||
return 0;
|
||||
|
||||
AF_XDP_LOG(INFO, "Closing AF_XDP ethdev on numa socket %u\n",
|
||||
rte_socket_id());
|
||||
|
||||
|
@ -680,6 +680,9 @@ eth_ark_dev_close(struct rte_eth_dev *dev)
|
||||
struct ark_adapter *ark = dev->data->dev_private;
|
||||
uint16_t i;
|
||||
|
||||
if (rte_eal_process_type() != RTE_PROC_PRIMARY)
|
||||
return 0;
|
||||
|
||||
if (ark->user_ext.dev_close)
|
||||
ark->user_ext.dev_close(dev,
|
||||
ark->user_data[dev->data->port_id]);
|
||||
|
@ -2107,6 +2107,9 @@ avp_dev_close(struct rte_eth_dev *eth_dev)
|
||||
struct avp_dev *avp = AVP_DEV_PRIVATE_TO_HW(eth_dev->data->dev_private);
|
||||
int ret;
|
||||
|
||||
if (rte_eal_process_type() != RTE_PROC_PRIMARY)
|
||||
return 0;
|
||||
|
||||
rte_spinlock_lock(&avp->lock);
|
||||
if (avp->flags & AVP_F_DETACHED) {
|
||||
PMD_DRV_LOG(ERR, "Operation not supported during VM live migration\n");
|
||||
|
@ -1408,6 +1408,9 @@ static int bnxt_dev_close_op(struct rte_eth_dev *eth_dev)
|
||||
{
|
||||
struct bnxt *bp = eth_dev->data->dev_private;
|
||||
|
||||
if (rte_eal_process_type() != RTE_PROC_PRIMARY)
|
||||
return 0;
|
||||
|
||||
/* cancel the recovery handler before remove dev */
|
||||
rte_eal_alarm_cancel(bnxt_dev_reset_and_resume, (void *)bp);
|
||||
rte_eal_alarm_cancel(bnxt_dev_recover, (void *)bp);
|
||||
|
@ -250,6 +250,9 @@ int bnxt_representor_uninit(struct rte_eth_dev *eth_dev)
|
||||
(struct bnxt_representor *)eth_dev->data->dev_private;
|
||||
uint16_t vf_id;
|
||||
|
||||
if (rte_eal_process_type() != RTE_PROC_PRIMARY)
|
||||
return 0;
|
||||
|
||||
PMD_DRV_LOG(DEBUG, "BNXT Port:%d VFR uninit\n", eth_dev->data->port_id);
|
||||
eth_dev->data->mac_addrs = NULL;
|
||||
eth_dev->dev_ops = NULL;
|
||||
|
@ -326,6 +326,9 @@ int cxgbe_dev_close(struct rte_eth_dev *eth_dev)
|
||||
|
||||
CXGBE_FUNC_TRACE();
|
||||
|
||||
if (rte_eal_process_type() != RTE_PROC_PRIMARY)
|
||||
return 0;
|
||||
|
||||
if (!(adapter->flags & FULL_INIT_DONE))
|
||||
return 0;
|
||||
|
||||
|
@ -762,6 +762,9 @@ eth_em_close(struct rte_eth_dev *dev)
|
||||
struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(dev);
|
||||
struct rte_intr_handle *intr_handle = &pci_dev->intr_handle;
|
||||
|
||||
if (rte_eal_process_type() != RTE_PROC_PRIMARY)
|
||||
return 0;
|
||||
|
||||
eth_em_stop(dev);
|
||||
adapter->stopped = 1;
|
||||
em_dev_free_queues(dev);
|
||||
|
@ -1535,6 +1535,9 @@ eth_igb_close(struct rte_eth_dev *dev)
|
||||
struct e1000_filter_info *filter_info =
|
||||
E1000_DEV_PRIVATE_TO_FILTER_INFO(dev->data->dev_private);
|
||||
|
||||
if (rte_eal_process_type() != RTE_PROC_PRIMARY)
|
||||
return 0;
|
||||
|
||||
eth_igb_stop(dev);
|
||||
|
||||
e1000_phy_hw_reset(hw);
|
||||
@ -3382,6 +3385,9 @@ igbvf_dev_close(struct rte_eth_dev *dev)
|
||||
|
||||
PMD_INIT_FUNC_TRACE();
|
||||
|
||||
if (rte_eal_process_type() != RTE_PROC_PRIMARY)
|
||||
return 0;
|
||||
|
||||
e1000_reset_hw(hw);
|
||||
|
||||
igbvf_dev_stop(dev);
|
||||
|
@ -506,6 +506,9 @@ static int ena_close(struct rte_eth_dev *dev)
|
||||
struct rte_intr_handle *intr_handle = &pci_dev->intr_handle;
|
||||
struct ena_adapter *adapter = dev->data->dev_private;
|
||||
|
||||
if (rte_eal_process_type() != RTE_PROC_PRIMARY)
|
||||
return 0;
|
||||
|
||||
if (adapter->state == ENA_ADAPTER_STATE_RUNNING)
|
||||
ena_stop(dev);
|
||||
adapter->state = ENA_ADAPTER_STATE_CLOSED;
|
||||
|
@ -551,6 +551,9 @@ enetc_dev_close(struct rte_eth_dev *dev)
|
||||
uint16_t i;
|
||||
|
||||
PMD_INIT_FUNC_TRACE();
|
||||
if (rte_eal_process_type() != RTE_PROC_PRIMARY)
|
||||
return 0;
|
||||
|
||||
enetc_dev_stop(dev);
|
||||
|
||||
for (i = 0; i < dev->data->nb_rx_queues; i++) {
|
||||
|
@ -451,6 +451,9 @@ static int enicpmd_dev_close(struct rte_eth_dev *eth_dev)
|
||||
struct enic *enic = pmd_priv(eth_dev);
|
||||
|
||||
ENICPMD_FUNC_TRACE();
|
||||
if (rte_eal_process_type() != RTE_PROC_PRIMARY)
|
||||
return 0;
|
||||
|
||||
enic_remove(enic);
|
||||
|
||||
return 0;
|
||||
|
@ -2785,6 +2785,8 @@ fm10k_dev_close(struct rte_eth_dev *dev)
|
||||
struct rte_intr_handle *intr_handle = &pdev->intr_handle;
|
||||
|
||||
PMD_INIT_FUNC_TRACE();
|
||||
if (rte_eal_process_type() != RTE_PROC_PRIMARY)
|
||||
return 0;
|
||||
|
||||
fm10k_mbx_lock(hw);
|
||||
hw->mac.ops.update_lport_state(hw, hw->mac.dglort_map,
|
||||
@ -3237,14 +3239,7 @@ static int
|
||||
eth_fm10k_dev_uninit(struct rte_eth_dev *dev)
|
||||
{
|
||||
PMD_INIT_FUNC_TRACE();
|
||||
|
||||
/* only uninitialize in the primary process */
|
||||
if (rte_eal_process_type() != RTE_PROC_PRIMARY)
|
||||
return 0;
|
||||
|
||||
/* safe to close dev here */
|
||||
fm10k_dev_close(dev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -2969,6 +2969,9 @@ static int hinic_dev_close(struct rte_eth_dev *dev)
|
||||
{
|
||||
struct hinic_nic_dev *nic_dev = HINIC_ETH_DEV_TO_PRIVATE_NIC_DEV(dev);
|
||||
|
||||
if (rte_eal_process_type() != RTE_PROC_PRIMARY)
|
||||
return 0;
|
||||
|
||||
if (rte_bit_relaxed_test_and_set32(HINIC_DEV_CLOSE,
|
||||
&nic_dev->dev_status)) {
|
||||
PMD_DRV_LOG(WARNING, "Device %s already closed",
|
||||
|
@ -2620,6 +2620,8 @@ i40e_dev_close(struct rte_eth_dev *dev)
|
||||
int retries = 0;
|
||||
|
||||
PMD_INIT_FUNC_TRACE();
|
||||
if (rte_eal_process_type() != RTE_PROC_PRIMARY)
|
||||
return 0;
|
||||
|
||||
ret = rte_eth_switch_domain_free(pf->switch_domain_id);
|
||||
if (ret)
|
||||
|
@ -2402,6 +2402,9 @@ i40evf_dev_close(struct rte_eth_dev *dev)
|
||||
struct i40e_hw *hw = I40E_DEV_PRIVATE_TO_HW(dev->data->dev_private);
|
||||
struct i40e_vf *vf = I40EVF_DEV_PRIVATE_TO_VF(dev->data->dev_private);
|
||||
|
||||
if (rte_eal_process_type() != RTE_PROC_PRIMARY)
|
||||
return 0;
|
||||
|
||||
i40evf_dev_stop(dev);
|
||||
i40e_dev_free_queues(dev);
|
||||
/*
|
||||
|
@ -1468,6 +1468,9 @@ iavf_dev_close(struct rte_eth_dev *dev)
|
||||
IAVF_DEV_PRIVATE_TO_ADAPTER(dev->data->dev_private);
|
||||
struct iavf_info *vf = IAVF_DEV_PRIVATE_TO_VF(dev->data->dev_private);
|
||||
|
||||
if (rte_eal_process_type() != RTE_PROC_PRIMARY)
|
||||
return 0;
|
||||
|
||||
iavf_dev_stop(dev);
|
||||
iavf_flow_flush(dev, NULL);
|
||||
iavf_flow_uninit(adapter);
|
||||
|
@ -2388,6 +2388,9 @@ ice_dev_close(struct rte_eth_dev *dev)
|
||||
struct ice_adapter *ad =
|
||||
ICE_DEV_PRIVATE_TO_ADAPTER(dev->data->dev_private);
|
||||
|
||||
if (rte_eal_process_type() != RTE_PROC_PRIMARY)
|
||||
return 0;
|
||||
|
||||
/* Since stop will make link down, then the link event will be
|
||||
* triggered, disable the irq firstly to avoid the port_infoe etc
|
||||
* resources deallocation causing the interrupt service thread
|
||||
|
@ -1175,6 +1175,8 @@ eth_igc_close(struct rte_eth_dev *dev)
|
||||
int retry = 0;
|
||||
|
||||
PMD_INIT_FUNC_TRACE();
|
||||
if (rte_eal_process_type() != RTE_PROC_PRIMARY)
|
||||
return 0;
|
||||
|
||||
if (!adapter->stopped)
|
||||
eth_igc_stop(dev);
|
||||
@ -1363,10 +1365,6 @@ static int
|
||||
eth_igc_dev_uninit(__rte_unused struct rte_eth_dev *eth_dev)
|
||||
{
|
||||
PMD_INIT_FUNC_TRACE();
|
||||
|
||||
if (rte_eal_process_type() != RTE_PROC_PRIMARY)
|
||||
return 0;
|
||||
|
||||
eth_igc_close(eth_dev);
|
||||
return 0;
|
||||
}
|
||||
|
@ -963,6 +963,8 @@ ionic_dev_close(struct rte_eth_dev *eth_dev)
|
||||
int err;
|
||||
|
||||
IONIC_PRINT_CALL();
|
||||
if (rte_eal_process_type() != RTE_PROC_PRIMARY)
|
||||
return 0;
|
||||
|
||||
err = ionic_lif_stop(lif);
|
||||
if (err) {
|
||||
|
@ -214,6 +214,9 @@ ipn3ke_rpst_dev_close(struct rte_eth_dev *dev)
|
||||
struct ipn3ke_hw *hw = IPN3KE_DEV_PRIVATE_TO_HW(dev);
|
||||
struct ipn3ke_rpst *rpst = IPN3KE_DEV_PRIVATE_TO_RPST(dev);
|
||||
|
||||
if (rte_eal_process_type() != RTE_PROC_PRIMARY)
|
||||
return 0;
|
||||
|
||||
if (hw->retimer.mac_type == IFPGA_RAWDEV_RETIMER_MAC_TYPE_10GE_XFI) {
|
||||
/* Disable the TX path */
|
||||
ipn3ke_xmac_tx_disable(hw, rpst->port_id, 0);
|
||||
|
@ -2995,6 +2995,8 @@ ixgbe_dev_close(struct rte_eth_dev *dev)
|
||||
int ret;
|
||||
|
||||
PMD_INIT_FUNC_TRACE();
|
||||
if (rte_eal_process_type() != RTE_PROC_PRIMARY)
|
||||
return 0;
|
||||
|
||||
ixgbe_pf_reset_hw(hw);
|
||||
|
||||
@ -5448,6 +5450,8 @@ ixgbevf_dev_close(struct rte_eth_dev *dev)
|
||||
struct rte_intr_handle *intr_handle = &pci_dev->intr_handle;
|
||||
|
||||
PMD_INIT_FUNC_TRACE();
|
||||
if (rte_eal_process_type() != RTE_PROC_PRIMARY)
|
||||
return 0;
|
||||
|
||||
ixgbe_reset_hw(hw);
|
||||
|
||||
|
@ -204,6 +204,9 @@ eth_kni_close(struct rte_eth_dev *eth_dev)
|
||||
struct pmd_internals *internals;
|
||||
int ret;
|
||||
|
||||
if (rte_eal_process_type() != RTE_PROC_PRIMARY)
|
||||
return 0;
|
||||
|
||||
eth_kni_dev_stop(eth_dev);
|
||||
|
||||
/* mac_addrs must not be freed alone because part of dev_private */
|
||||
|
@ -1555,6 +1555,9 @@ lio_dev_close(struct rte_eth_dev *eth_dev)
|
||||
{
|
||||
struct lio_device *lio_dev = LIO_DEV(eth_dev);
|
||||
|
||||
if (rte_eal_process_type() != RTE_PROC_PRIMARY)
|
||||
return 0;
|
||||
|
||||
lio_dev_info(lio_dev, "closing port %d\n", eth_dev->data->port_id);
|
||||
|
||||
if (lio_dev->intf_open)
|
||||
|
@ -376,6 +376,8 @@ mlx4_dev_close(struct rte_eth_dev *dev)
|
||||
struct mlx4_priv *priv = dev->data->dev_private;
|
||||
unsigned int i;
|
||||
|
||||
if (rte_eal_process_type() != RTE_PROC_PRIMARY)
|
||||
return 0;
|
||||
DEBUG("%p: closing device \"%s\"",
|
||||
(void *)dev,
|
||||
((priv->ctx != NULL) ? priv->ctx->device->name : ""));
|
||||
|
@ -435,6 +435,9 @@ mvneta_dev_close(struct rte_eth_dev *dev)
|
||||
struct mvneta_priv *priv = dev->data->dev_private;
|
||||
int i;
|
||||
|
||||
if (rte_eal_process_type() != RTE_PROC_PRIMARY)
|
||||
return 0;
|
||||
|
||||
if (priv->ppio)
|
||||
mvneta_dev_stop(dev);
|
||||
|
||||
|
@ -861,6 +861,9 @@ mrvl_dev_close(struct rte_eth_dev *dev)
|
||||
struct mrvl_priv *priv = dev->data->dev_private;
|
||||
size_t i;
|
||||
|
||||
if (rte_eal_process_type() != RTE_PROC_PRIMARY)
|
||||
return 0;
|
||||
|
||||
mrvl_flush_rx_queues(dev);
|
||||
mrvl_flush_tx_shadow_queues(dev);
|
||||
mrvl_flow_deinit(dev);
|
||||
|
@ -842,6 +842,8 @@ static int
|
||||
hn_dev_close(struct rte_eth_dev *dev)
|
||||
{
|
||||
PMD_INIT_FUNC_TRACE();
|
||||
if (rte_eal_process_type() != RTE_PROC_PRIMARY)
|
||||
return 0;
|
||||
|
||||
hn_vf_close(dev);
|
||||
hn_dev_free_queues(dev);
|
||||
|
@ -217,6 +217,9 @@ nfb_eth_dev_close(struct rte_eth_dev *dev)
|
||||
uint16_t nb_rx = dev->data->nb_rx_queues;
|
||||
uint16_t nb_tx = dev->data->nb_tx_queues;
|
||||
|
||||
if (rte_eal_process_type() != RTE_PROC_PRIMARY)
|
||||
return 0;
|
||||
|
||||
nfb_eth_dev_stop(dev);
|
||||
|
||||
nfb_nc_rxmac_deinit(internals->rxmac, internals->max_rxmac);
|
||||
|
@ -871,6 +871,9 @@ nfp_net_close(struct rte_eth_dev *dev)
|
||||
struct rte_pci_device *pci_dev;
|
||||
int i;
|
||||
|
||||
if (rte_eal_process_type() != RTE_PROC_PRIMARY)
|
||||
return 0;
|
||||
|
||||
PMD_INIT_LOG(DEBUG, "Close");
|
||||
|
||||
hw = NFP_NET_DEV_PRIVATE_TO_HW(dev->data->dev_private);
|
||||
|
@ -487,6 +487,8 @@ octeontx_dev_close(struct rte_eth_dev *dev)
|
||||
int ret;
|
||||
|
||||
PMD_INIT_FUNC_TRACE();
|
||||
if (rte_eal_process_type() != RTE_PROC_PRIMARY)
|
||||
return 0;
|
||||
|
||||
rte_event_dev_close(nic->evdev);
|
||||
|
||||
|
@ -396,6 +396,9 @@ pfe_eth_close(struct rte_eth_dev *dev)
|
||||
if (!g_pfe)
|
||||
return -1;
|
||||
|
||||
if (rte_eal_process_type() != RTE_PROC_PRIMARY)
|
||||
return 0;
|
||||
|
||||
pfe_eth_stop(dev);
|
||||
/* Close the device file for link status */
|
||||
pfe_eth_close_cdev(dev->data->dev_private);
|
||||
|
@ -318,6 +318,17 @@ sfc_dev_set_link_down(struct rte_eth_dev *dev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
sfc_eth_dev_secondary_clear_ops(struct rte_eth_dev *dev)
|
||||
{
|
||||
free(dev->process_private);
|
||||
dev->process_private = NULL;
|
||||
dev->dev_ops = NULL;
|
||||
dev->tx_pkt_prepare = NULL;
|
||||
dev->tx_pkt_burst = NULL;
|
||||
dev->rx_pkt_burst = NULL;
|
||||
}
|
||||
|
||||
static int
|
||||
sfc_dev_close(struct rte_eth_dev *dev)
|
||||
{
|
||||
@ -325,6 +336,11 @@ sfc_dev_close(struct rte_eth_dev *dev)
|
||||
|
||||
sfc_log_init(sa, "entry");
|
||||
|
||||
if (rte_eal_process_type() != RTE_PROC_PRIMARY) {
|
||||
sfc_eth_dev_secondary_clear_ops(dev);
|
||||
return 0;
|
||||
}
|
||||
|
||||
sfc_adapter_lock(sa);
|
||||
switch (sa->state) {
|
||||
case SFC_ADAPTER_STARTED:
|
||||
@ -2101,17 +2117,6 @@ sfc_eth_dev_secondary_init(struct rte_eth_dev *dev, uint32_t logtype_main)
|
||||
return rc;
|
||||
}
|
||||
|
||||
static void
|
||||
sfc_eth_dev_secondary_clear_ops(struct rte_eth_dev *dev)
|
||||
{
|
||||
free(dev->process_private);
|
||||
dev->process_private = NULL;
|
||||
dev->dev_ops = NULL;
|
||||
dev->tx_pkt_prepare = NULL;
|
||||
dev->tx_pkt_burst = NULL;
|
||||
dev->rx_pkt_burst = NULL;
|
||||
}
|
||||
|
||||
static void
|
||||
sfc_register_dp(void)
|
||||
{
|
||||
@ -2258,11 +2263,6 @@ sfc_eth_dev_init(struct rte_eth_dev *dev)
|
||||
static int
|
||||
sfc_eth_dev_uninit(struct rte_eth_dev *dev)
|
||||
{
|
||||
if (rte_eal_process_type() != RTE_PROC_PRIMARY) {
|
||||
sfc_eth_dev_secondary_clear_ops(dev);
|
||||
return 0;
|
||||
}
|
||||
|
||||
sfc_dev_close(dev);
|
||||
|
||||
return 0;
|
||||
|
@ -1163,6 +1163,9 @@ eth_dev_close(struct rte_eth_dev *dev)
|
||||
uint16_t nb_rx = dev->data->nb_rx_queues;
|
||||
uint16_t nb_tx = dev->data->nb_tx_queues;
|
||||
|
||||
if (rte_eal_process_type() != RTE_PROC_PRIMARY)
|
||||
return 0;
|
||||
|
||||
eth_dev_stop(dev);
|
||||
|
||||
free(internals->sze_dev_path);
|
||||
|
@ -1859,6 +1859,8 @@ nicvf_dev_close(struct rte_eth_dev *dev)
|
||||
struct nicvf *nic = nicvf_pmd_priv(dev);
|
||||
|
||||
PMD_INIT_FUNC_TRACE();
|
||||
if (rte_eal_process_type() != RTE_PROC_PRIMARY)
|
||||
return 0;
|
||||
|
||||
nicvf_dev_stop_cleanup(dev, true);
|
||||
nicvf_periodic_alarm_stop(nicvf_interrupt, dev);
|
||||
@ -2119,10 +2121,7 @@ static int
|
||||
nicvf_eth_dev_uninit(struct rte_eth_dev *dev)
|
||||
{
|
||||
PMD_INIT_FUNC_TRACE();
|
||||
|
||||
if (rte_eal_process_type() == RTE_PROC_PRIMARY)
|
||||
nicvf_dev_close(dev);
|
||||
|
||||
nicvf_dev_close(dev);
|
||||
return 0;
|
||||
}
|
||||
static int
|
||||
|
@ -1171,6 +1171,9 @@ eth_dev_close(struct rte_eth_dev *dev)
|
||||
struct internal_list *list;
|
||||
unsigned int i;
|
||||
|
||||
if (rte_eal_process_type() != RTE_PROC_PRIMARY)
|
||||
return 0;
|
||||
|
||||
internal = dev->data->dev_private;
|
||||
if (!internal)
|
||||
return 0;
|
||||
@ -1655,11 +1658,7 @@ rte_pmd_vhost_remove(struct rte_vdev_device *dev)
|
||||
if (eth_dev == NULL)
|
||||
return 0;
|
||||
|
||||
if (rte_eal_process_type() != RTE_PROC_PRIMARY)
|
||||
return rte_eth_dev_release_port(eth_dev);
|
||||
|
||||
eth_dev_close(eth_dev);
|
||||
|
||||
rte_eth_dev_release_port(eth_dev);
|
||||
|
||||
return 0;
|
||||
|
@ -711,6 +711,8 @@ virtio_dev_close(struct rte_eth_dev *dev)
|
||||
struct rte_intr_conf *intr_conf = &dev->data->dev_conf.intr_conf;
|
||||
|
||||
PMD_INIT_LOG(DEBUG, "virtio_dev_close");
|
||||
if (rte_eal_process_type() != RTE_PROC_PRIMARY)
|
||||
return 0;
|
||||
|
||||
if (!hw->opened)
|
||||
return 0;
|
||||
|
@ -889,6 +889,8 @@ static int
|
||||
vmxnet3_dev_close(struct rte_eth_dev *dev)
|
||||
{
|
||||
PMD_INIT_FUNC_TRACE();
|
||||
if (rte_eal_process_type() != RTE_PROC_PRIMARY)
|
||||
return 0;
|
||||
|
||||
vmxnet3_dev_stop(dev);
|
||||
vmxnet3_free_queues(dev);
|
||||
|
Loading…
Reference in New Issue
Block a user