net/vmxnet3: fix hot-unplug
The vmxnet3 driver can't call back into dev_close(), and possibly dev_stop(), in dev_uninit(). When dev_uninit() is called, anything that those routines would want to clean up has already been released. Further, for complete cleanup, it is necessary to release any of the queue resources during dev_close(). This allows a vmxnet3 device to be hot-unplugged without leaking queues. Also set RTE_ETH_DEV_CLOSE_REMOVE on close so that the port resources can be deallocated. Return EBUSY if remove is called before stop. Fixes: dfaff37fc46d ("vmxnet3: import new vmxnet3 poll mode driver implementation") Cc: stable@dpdk.org Signed-off-by: Brian Russell <brussell@brocade.com> Signed-off-by: Luca Boccassi <bluca@debian.org>
This commit is contained in:
parent
f9b0d1902c
commit
6c99085d97
@ -360,8 +360,10 @@ eth_vmxnet3_dev_uninit(struct rte_eth_dev *eth_dev)
|
|||||||
if (rte_eal_process_type() != RTE_PROC_PRIMARY)
|
if (rte_eal_process_type() != RTE_PROC_PRIMARY)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (hw->adapter_stopped == 0)
|
if (hw->adapter_stopped == 0) {
|
||||||
vmxnet3_dev_close(eth_dev);
|
PMD_INIT_LOG(DEBUG, "Device has not been closed.");
|
||||||
|
return -EBUSY;
|
||||||
|
}
|
||||||
|
|
||||||
eth_dev->dev_ops = NULL;
|
eth_dev->dev_ops = NULL;
|
||||||
eth_dev->rx_pkt_burst = NULL;
|
eth_dev->rx_pkt_burst = NULL;
|
||||||
@ -805,7 +807,7 @@ vmxnet3_dev_stop(struct rte_eth_dev *dev)
|
|||||||
PMD_INIT_FUNC_TRACE();
|
PMD_INIT_FUNC_TRACE();
|
||||||
|
|
||||||
if (hw->adapter_stopped == 1) {
|
if (hw->adapter_stopped == 1) {
|
||||||
PMD_INIT_LOG(DEBUG, "Device already closed.");
|
PMD_INIT_LOG(DEBUG, "Device already stopped.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -829,7 +831,6 @@ vmxnet3_dev_stop(struct rte_eth_dev *dev)
|
|||||||
/* reset the device */
|
/* reset the device */
|
||||||
VMXNET3_WRITE_BAR1_REG(hw, VMXNET3_REG_CMD, VMXNET3_CMD_RESET_DEV);
|
VMXNET3_WRITE_BAR1_REG(hw, VMXNET3_REG_CMD, VMXNET3_CMD_RESET_DEV);
|
||||||
PMD_INIT_LOG(DEBUG, "Device reset.");
|
PMD_INIT_LOG(DEBUG, "Device reset.");
|
||||||
hw->adapter_stopped = 0;
|
|
||||||
|
|
||||||
vmxnet3_dev_clear_queues(dev);
|
vmxnet3_dev_clear_queues(dev);
|
||||||
|
|
||||||
@ -839,6 +840,30 @@ vmxnet3_dev_stop(struct rte_eth_dev *dev)
|
|||||||
link.link_speed = ETH_SPEED_NUM_10G;
|
link.link_speed = ETH_SPEED_NUM_10G;
|
||||||
link.link_autoneg = ETH_LINK_FIXED;
|
link.link_autoneg = ETH_LINK_FIXED;
|
||||||
rte_eth_linkstatus_set(dev, &link);
|
rte_eth_linkstatus_set(dev, &link);
|
||||||
|
|
||||||
|
hw->adapter_stopped = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
vmxnet3_free_queues(struct rte_eth_dev *dev)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
PMD_INIT_FUNC_TRACE();
|
||||||
|
|
||||||
|
for (i = 0; i < dev->data->nb_rx_queues; i++) {
|
||||||
|
void *rxq = dev->data->rx_queues[i];
|
||||||
|
|
||||||
|
vmxnet3_dev_rx_queue_release(rxq);
|
||||||
|
}
|
||||||
|
dev->data->nb_rx_queues = 0;
|
||||||
|
|
||||||
|
for (i = 0; i < dev->data->nb_tx_queues; i++) {
|
||||||
|
void *txq = dev->data->tx_queues[i];
|
||||||
|
|
||||||
|
vmxnet3_dev_tx_queue_release(txq);
|
||||||
|
}
|
||||||
|
dev->data->nb_tx_queues = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -847,12 +872,16 @@ vmxnet3_dev_stop(struct rte_eth_dev *dev)
|
|||||||
static void
|
static void
|
||||||
vmxnet3_dev_close(struct rte_eth_dev *dev)
|
vmxnet3_dev_close(struct rte_eth_dev *dev)
|
||||||
{
|
{
|
||||||
struct vmxnet3_hw *hw = dev->data->dev_private;
|
|
||||||
|
|
||||||
PMD_INIT_FUNC_TRACE();
|
PMD_INIT_FUNC_TRACE();
|
||||||
|
|
||||||
vmxnet3_dev_stop(dev);
|
vmxnet3_dev_stop(dev);
|
||||||
hw->adapter_stopped = 1;
|
vmxnet3_free_queues(dev);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* flag to rte_eth_dev_close() that it should release the port resources
|
||||||
|
* (calling rte_eth_dev_release_port()) in addition to closing it.
|
||||||
|
*/
|
||||||
|
dev->data->dev_flags |= RTE_ETH_DEV_CLOSE_REMOVE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
Loading…
x
Reference in New Issue
Block a user