net/ixgbe: stop link setup alarm handler before start

We should stop alarm handler before resetting the HW to
avoid concurrent device reconfiguration.

Fixes: 0408f47ba4d6 ("net/ixgbe: fix busy polling while fiber link update")
CC: stable@dpdk.org

Signed-off-by: Ilya Maximets <i.maximets@samsung.com>
Tested-by: Anatoly Burakov <anatoly.burakov@intel.com>
Acked-by: Qi Zhang <qi.z.zhang@intel.com>
This commit is contained in:
Ilya Maximets 2018-11-08 13:24:01 +03:00 committed by Ferruh Yigit
parent 725f5dd0bf
commit 916193dda6

View File

@ -2549,6 +2549,9 @@ ixgbe_dev_start(struct rte_eth_dev *dev)
return -EINVAL;
}
/* Stop the link setup handler before resetting the HW. */
rte_eal_alarm_cancel(ixgbe_dev_setup_link_alarm_handler, dev);
/* disable uio/vfio intr/eventfd mapping */
rte_intr_disable(intr_handle);
@ -2731,8 +2734,6 @@ ixgbe_dev_start(struct rte_eth_dev *dev)
if (err)
goto error;
ixgbe_dev_link_update(dev, 0);
skip_link_setup:
if (rte_intr_allow_others(intr_handle)) {
@ -2768,6 +2769,12 @@ skip_link_setup:
"please call hierarchy_commit() "
"before starting the port");
/*
* Update link status right before return, because it may
* start link configuration process in a separate thread.
*/
ixgbe_dev_link_update(dev, 0);
return 0;
error:
@ -5061,6 +5068,9 @@ ixgbevf_dev_start(struct rte_eth_dev *dev)
PMD_INIT_FUNC_TRACE();
/* Stop the link setup handler before resetting the HW. */
rte_eal_alarm_cancel(ixgbe_dev_setup_link_alarm_handler, dev);
err = hw->mac.ops.reset_hw(hw);
if (err) {
PMD_INIT_LOG(ERR, "Unable to reset vf hardware (%d)", err);
@ -5096,8 +5106,6 @@ ixgbevf_dev_start(struct rte_eth_dev *dev)
ixgbevf_dev_rxtx_start(dev);
ixgbevf_dev_link_update(dev, 0);
/* check and configure queue intr-vector mapping */
if (rte_intr_cap_multiple(intr_handle) &&
dev->data->dev_conf.intr_conf.rxq) {
@ -5135,6 +5143,12 @@ ixgbevf_dev_start(struct rte_eth_dev *dev)
/* Re-enable interrupt for VF */
ixgbevf_intr_enable(dev);
/*
* Update link status right before return, because it may
* start link configuration process in a separate thread.
*/
ixgbevf_dev_link_update(dev, 0);
return 0;
}