Re: [net 04/12] net/mlx5: Avoid recovery in probe flows
From: Leon Romanovsky <leon@kernel.org>
Date: 2023-01-01 06:53:19
On Thu, Dec 29, 2022 at 10:29:58AM -0800, Saeed Mahameed wrote:
On 29 Dec 08:33, Leon Romanovsky wrote:quoted
On Wed, Dec 28, 2022 at 11:43:23AM -0800, Saeed Mahameed wrote:quoted
From: Shay Drory <redacted> Currently, recovery is done without considering whether the device is still in probe flow. This may lead to recovery before device have finished probed successfully. e.g.: while mlx5_init_one() is running. Recovery flow is using functionality that is loaded only by mlx5_init_one(), and there is no point in running recovery without mlx5_init_one() finished successfully. Fix it by waiting for probe flow to finish and checking whether the device is probed before trying to perform recovery. Fixes: 51d138c2610a ("net/mlx5: Fix health error state handling") Signed-off-by: Shay Drory <redacted> Reviewed-by: Moshe Shemesh <redacted> Signed-off-by: Saeed Mahameed <saeedm@nvidia.com> --- drivers/net/ethernet/mellanox/mlx5/core/health.c | 6 ++++++ 1 file changed, 6 insertions(+)diff --git a/drivers/net/ethernet/mellanox/mlx5/core/health.c b/drivers/net/ethernet/mellanox/mlx5/core/health.c index 86ed87d704f7..96417c5feed7 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/health.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/health.c@@ -674,6 +674,12 @@ static void mlx5_fw_fatal_reporter_err_work(struct work_struct *work) dev = container_of(priv, struct mlx5_core_dev, priv); devlink = priv_to_devlink(dev); + mutex_lock(&dev->intf_state_mutex); + if (test_bit(MLX5_DROP_NEW_HEALTH_WORK, &health->flags)) { + mlx5_core_err(dev, "health works are not permitted at this stage\n"); + return; + }
<...>
quoted
Or another solution is to start health polling only when init complete.Also very complex and very risky to do in rc. Health poll should be running on dynamic driver reloads, for example devlink reload, but not on first probe.. if we are going to start after probe then we will have to stop (sync) any health work before .remove, which is a locking nightmare.. we've been there before.
I afraid that my proposed solution distracted you. The real issue is that this patch can't be correct. Let's focus on MLX5_DROP_NEW_HEALTH_WORK bit. It is checked while holding different locks, so one of the locks is wrong and not needed. If MLX5_DROP_NEW_HEALTH_WORK bit can't be changed after/during queuing the work, the newly added check in mlx5_fw_fatal_reporter_err_work will be redundant. If MLX5_DROP_NEW_HEALTH_WORK bit can be changed after queuing the work. the check is racy and can have different results immediately after releasing intf_state_mutex. Thanks