Patch "net/mlx5: Cancel delayed recovery work when unloading the driver" has been added to the 4.9-stable tree
This is a note to let you know that I've just added the patch titled
net/mlx5: Cancel delayed recovery work when unloading the driver
to the 4.9-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
net-mlx5-cancel-delayed-recovery-work-when-unloading-the-driver.patch
and it can be found in the queue-4.9 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
2a0165a034ac024b60cca49c61e46f4afa2e4d98Mon Sep 17 00:00:00 2001
From: Mohamad Haj Yahia <[email protected]>
Date: Thu, 30 Mar 2017 17:09:00 +0300
Subject: net/mlx5: Cancel delayed recovery work when unloading the driver
From: Mohamad Haj Yahia <[email protected]>
commit 2a0165a034ac024b60cca49c61e46f4afa2e4d98 upstream.
Draining the health workqueue will ignore future health works including the one that report hardware failure and thus we can't enter error state Instead cancel the recovery flow and make sure only recovery flow won't be scheduled.
--- drivers/net/ethernet/mellanox/mlx5/core/health.c | 15 ++++++++++++++- drivers/net/ethernet/mellanox/mlx5/core/main.c | 2 +- include/linux/mlx5/driver.h | 1 + 3 files changed, 16 insertions(+), 2 deletions(-)
drivers/net/ethernet/mellanox/mlx5/core/health.c +14 -1
@@ -67,6 +67,7 @@ enum {enum {MLX5_DROP_NEW_HEALTH_WORK , +MLX5_DROP_NEW_RECOVERY_WORK , };static u8 get_nic_state (struct mlx5_core_dev *dev)
@@ -193,7 +194,7 @@ static void health_care(struct work_strumlx5_handle_bad_state (dev);spin_lock (&health->wq_lock); -if (!test_bit (MLX5_DROP_NEW_HEALTH_WORK , &health->flags)) +if (!test_bit (MLX5_DROP_NEW_RECOVERY_WORK , &health->flags))schedule_delayed_work (&health->recover_work, recover_delay);else dev_err(&dev->pdev->dev,
@@ -328,6 +329,7 @@ void mlx5_start_health_poll(struct mlx5_init_timer (&health->timer); health->sick =0 ;clear_bit (MLX5_DROP_NEW_HEALTH_WORK , &health->flags); +clear_bit (MLX5_DROP_NEW_RECOVERY_WORK , &health->flags); health->health = &dev->iseg->health; health->health_counter = &dev->iseg->health_counter;
@@ -350,11 +352,22 @@ void mlx5_drain_health_wq(struct mlx5_cospin_lock (&health->wq_lock);set_bit (MLX5_DROP_NEW_HEALTH_WORK , &health->flags); +set_bit (MLX5_DROP_NEW_RECOVERY_WORK , &health->flags);spin_unlock (&health->wq_lock);cancel_delayed_work_sync (&health->recover_work);cancel_work_sync (&health->work); } +void mlx5_drain_health_recovery (struct mlx5_core_dev *dev) +{ +struct mlx5_core_health *health = &dev->priv.health; + +spin_lock (&health->wq_lock); +set_bit (MLX5_DROP_NEW_RECOVERY_WORK , &health->flags); +spin_unlock (&health->wq_lock); +cancel_delayed_work_sync (&dev->priv.health.recover_work); +} +void mlx5_health_cleanup (struct mlx5_core_dev *dev) {struct mlx5_core_health *health = &dev->priv.health;
drivers/net/ethernet/mellanox/mlx5/core/main.c +1 -1
@@ -1169,7 +1169,7 @@ static int mlx5_unload_one(struct mlx5_cint err =0 ;if (cleanup) -mlx5_drain_health_wq (dev); +mlx5_drain_health_recovery (dev);mutex_lock (&dev->intf_state_mutex);if (test_bit (MLX5_INTERFACE_STATE_DOWN , &dev->intf_state)) {
include/linux/mlx5/driver.h +1 -0
@@ -788,6 +788,7 @@ int mlx5_health_init(struct mlx5_core_devoid mlx5_start_health_poll (struct mlx5_core_dev *dev);void mlx5_stop_health_poll (struct mlx5_core_dev *dev);void mlx5_drain_health_wq (struct mlx5_core_dev *dev); +void mlx5_drain_health_recovery (struct mlx5_core_dev *dev);int mlx5_buf_alloc_node (struct mlx5_core_dev *dev,int size,struct mlx5_buf *buf,int node);int mlx5_buf_alloc (struct mlx5_core_dev *dev,int size,struct mlx5_buf *buf);
Patches currently in stable-queue which might be from [email protected] are
queue-4.9/net-mlx5-cancel-delayed-recovery-work-when-unloading-the-driver.patch