From 352074b3a4b1518f3c1ec70865c407f135d8fa4d Mon Sep 17 00:00:00 2001 From: Gaetan Rivet Date: Mon, 12 Oct 2020 16:19:04 +0200 Subject: [PATCH] net/failsafe: fix state synchro cleanup During a hotplug attempt, failsafe will try to bring a subdevice that just appeared to its internal state. On error, the subdevice is marked for removal and will be cleaned up. However failsafe_dev_remove() only remove active devices. Devices that failed during probe will be stuck in DEV_PARSED state repeatedly. Consider all devices when doing a removal round, but limit burst control and stats saving to active devices. Fixes: 598fb8aec6f6 ("net/failsafe: support device removal") Cc: stable@dpdk.org Signed-off-by: Gaetan Rivet --- drivers/net/failsafe/failsafe_ether.c | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/drivers/net/failsafe/failsafe_ether.c b/drivers/net/failsafe/failsafe_ether.c index 7c68bbdec0..f18935a7e2 100644 --- a/drivers/net/failsafe/failsafe_ether.c +++ b/drivers/net/failsafe/failsafe_ether.c @@ -383,14 +383,23 @@ failsafe_dev_remove(struct rte_eth_dev *dev) struct sub_device *sdev; uint8_t i; - FOREACH_SUBDEV_STATE(sdev, i, dev, DEV_ACTIVE) - if (sdev->remove && fs_rxtx_clean(sdev)) { - if (fs_lock(dev, 1) != 0) - return; + FOREACH_SUBDEV(sdev, i, dev) { + if (!sdev->remove) + continue; + + /* Active devices must have finished their burst and + * their stats must be saved. + */ + if (sdev->state >= DEV_ACTIVE && + fs_rxtx_clean(sdev) == 0) + continue; + if (fs_lock(dev, 1) != 0) + return; + if (sdev->state >= DEV_ACTIVE) fs_dev_stats_save(sdev); - fs_dev_remove(sdev); - fs_unlock(dev, 1); - } + fs_dev_remove(sdev); + fs_unlock(dev, 1); + } } static int -- 2.20.1