diff options
author | hselasky <hselasky@FreeBSD.org> | 2018-03-26 20:35:12 +0000 |
---|---|---|
committer | hselasky <hselasky@FreeBSD.org> | 2018-03-26 20:35:12 +0000 |
commit | b4052cd108ec94d6594123ba91feda50267e67b7 (patch) | |
tree | 873b4cac8b70c0ed2fbaea196fe781a2b5688032 | |
parent | 145573f6aaaaa37b816fe03c3b4d11dade842034 (diff) | |
download | FreeBSD-src-b4052cd108ec94d6594123ba91feda50267e67b7.zip FreeBSD-src-b4052cd108ec94d6594123ba91feda50267e67b7.tar.gz |
MFC r330645:
Avoid calling sleeping function from the health poll thread in mlx5core.
linux commit c1d4d2e92ad670168a17a57dfa182a5a5baa72d4
Submitted by: Matthew Finlay <matt@mellanox.com>
Sponsored by: Mellanox Technologies
-rw-r--r-- | sys/dev/mlx5/mlx5_core/mlx5_health.c | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/sys/dev/mlx5/mlx5_core/mlx5_health.c b/sys/dev/mlx5/mlx5_core/mlx5_health.c index b46f182..eb77ea2 100644 --- a/sys/dev/mlx5/mlx5_core/mlx5_health.c +++ b/sys/dev/mlx5/mlx5_core/mlx5_health.c @@ -87,15 +87,23 @@ static int in_fatal(struct mlx5_core_dev *dev) void mlx5_enter_error_state(struct mlx5_core_dev *dev) { - if (dev->state == MLX5_DEVICE_STATE_INTERNAL_ERROR) + mutex_lock(&dev->intf_state_mutex); + if (dev->state == MLX5_DEVICE_STATE_INTERNAL_ERROR) { + goto unlock; return; + } mlx5_core_err(dev, "start\n"); - if (pci_channel_offline(dev->pdev) || in_fatal(dev)) + if (pci_channel_offline(dev->pdev) || in_fatal(dev)) { dev->state = MLX5_DEVICE_STATE_INTERNAL_ERROR; + mlx5_trigger_cmd_completions(dev); + } mlx5_core_event(dev, MLX5_DEV_EVENT_SYS_ERROR, 0); mlx5_core_err(dev, "end\n"); + +unlock: + mutex_unlock(&dev->intf_state_mutex); } static void mlx5_handle_bad_state(struct mlx5_core_dev *dev) @@ -213,7 +221,6 @@ static void poll_health(unsigned long data) return; if (dev->state == MLX5_DEVICE_STATE_INTERNAL_ERROR) { - mlx5_trigger_cmd_completions(dev); mod_timer(&health->timer, get_next_poll_jiffies()); return; } |